From 5b9fab62567abbe3affca4ae893eca897b490f5e Mon Sep 17 00:00:00 2001 From: Eduardo Date: Wed, 26 Feb 2025 16:55:45 +0100 Subject: [PATCH] updated to 4.4 there were also works on the inventory and the save system\n Also a new Event manager system for global signaling --- addons/gloot/LICENSE | 21 - addons/gloot/README.md | 16 + addons/gloot/core/README.md | 20 + addons/gloot/core/constraints/README.md | 12 + .../core/constraints/constraint_manager.gd | 289 ++--- .../constraints/constraint_manager.gd.uid | 1 + .../gloot/core/constraints/grid_constraint.gd | 372 +++--- .../core/constraints/grid_constraint.gd.uid | 1 + .../core/constraints/inventory_constraint.gd | 84 +- .../constraints/inventory_constraint.gd.uid | 1 + .../core/constraints/item_count_constraint.gd | 78 ++ .../constraints/item_count_constraint.gd.uid | 1 + addons/gloot/core/constraints/item_map.gd | 85 -- addons/gloot/core/constraints/quadtree.gd | 1 - addons/gloot/core/constraints/quadtree.gd.uid | 1 + .../core/constraints/stacks_constraint.gd | 312 ----- .../core/constraints/weight_constraint.gd | 110 +- .../core/constraints/weight_constraint.gd.uid | 1 + addons/gloot/core/inventory.gd | 507 ++++---- addons/gloot/core/inventory.gd.uid | 1 + addons/gloot/core/inventory_grid.gd | 97 -- addons/gloot/core/inventory_grid_stacked.gd | 72 -- addons/gloot/core/inventory_item.gd | 475 ++++---- addons/gloot/core/inventory_item.gd.uid | 1 + addons/gloot/core/inventory_stacked.gd | 100 -- addons/gloot/core/item_count.gd | 73 +- addons/gloot/core/item_count.gd.uid | 1 + addons/gloot/core/item_protoset.gd | 162 --- addons/gloot/core/item_ref_slot.gd | 186 --- addons/gloot/core/item_slot.gd | 152 +-- addons/gloot/core/item_slot.gd.uid | 1 + addons/gloot/core/item_slot_base.gd | 42 - addons/gloot/core/prototree/proto_tree.gd | 96 ++ addons/gloot/core/prototree/proto_tree.gd.uid | 1 + .../gloot/core/prototree/proto_tree_cache.gd | 22 + .../core/prototree/proto_tree_cache.gd.uid | 1 + addons/gloot/core/prototree/prototype.gd | 156 +++ addons/gloot/core/prototree/prototype.gd.uid | 1 + addons/gloot/core/stack_manager.gd | 296 +++++ addons/gloot/core/stack_manager.gd.uid | 1 + addons/gloot/core/utils.gd | 29 +- addons/gloot/core/utils.gd.uid | 1 + addons/gloot/core/verify.gd | 3 +- addons/gloot/core/verify.gd.uid | 1 + addons/gloot/editor/README.md | 17 + addons/gloot/editor/common/choice_filter.gd | 129 -- addons/gloot/editor/common/choice_filter.tscn | 31 - .../editor/common/choice_filter_test.tscn | 21 - addons/gloot/editor/common/dict_editor.gd | 32 +- addons/gloot/editor/common/dict_editor.gd.uid | 1 + addons/gloot/editor/common/dict_editor.tscn | 2 +- .../gloot/editor/common/editor_icons.gd.uid | 1 + .../gloot/editor/common/multivalue_editor.gd | 12 +- .../editor/common/multivalue_editor.gd.uid | 1 + .../gloot/editor/common/proto_tree_viewer.gd | 69 ++ .../editor/common/proto_tree_viewer.gd.uid | 1 + addons/gloot/editor/common/value_editor.gd | 176 +-- .../gloot/editor/common/value_editor.gd.uid | 1 + addons/gloot/editor/gloot_undo_redo.gd | 296 ----- .../inventory_editor/inventory_editor.gd | 153 ++- .../inventory_editor/inventory_editor.gd.uid | 1 + .../inventory_editor/inventory_editor.tscn | 64 +- .../inventory_editor/inventory_inspector.gd | 6 +- .../inventory_inspector.gd.uid | 1 + .../inventory_editor/inventory_inspector.tscn | 17 +- .../editor/inventory_inspector_plugin.gd | 48 +- .../editor/inventory_inspector_plugin.gd.uid | 1 + .../item_editor/edit_properties_button.gd | 61 - .../item_editor/edit_prototype_id_button.gd | 79 -- .../editor/item_editor/properties_editor.gd | 78 +- .../item_editor/properties_editor.gd.uid | 1 + .../editor/item_editor/prototype_id_editor.gd | 49 - .../item_editor/prototype_id_editor.tscn | 27 - .../item_slot_editor/item_ref_slot_button.gd | 67 -- .../item_slot_editor/item_slot_editor.gd | 86 +- .../item_slot_editor/item_slot_editor.gd.uid | 1 + .../item_slot_editor/item_slot_editor.tscn | 70 +- .../item_slot_editor/item_slot_inspector.gd | 6 +- .../item_slot_inspector.gd.uid | 1 + .../item_slot_editor/item_slot_inspector.tscn | 10 +- .../protoset_editor/edit_protoset_button.gd | 25 - .../protoset_editor/edit_protoset_button.tscn | 37 - .../editor/protoset_editor/protoset_editor.gd | 174 --- .../protoset_editor/protoset_editor.tscn | 155 --- addons/gloot/editor/undoables.gd | 54 + addons/gloot/editor/undoables.gd.uid | 1 + addons/gloot/gloot.gd | 7 +- addons/gloot/gloot.gd.uid | 1 + ...em_ref_slot.svg => icon_ctrl_capacity.svg} | 18 +- ...g.import => icon_ctrl_capacity.svg.import} | 8 +- .../gloot/images/icon_ctrl_inventory_item.svg | 83 ++ ...rt => icon_ctrl_inventory_item.svg.import} | 8 +- .../images/icon_ctrl_inventory_stacked.svg | 102 -- ...tory_grid.svg => icon_grid_constraint.svg} | 44 +- ...import => icon_grid_constraint.svg.import} | 8 +- .../images/icon_inventory_grid_stacked.svg | 193 --- .../gloot/images/icon_inventory_stacked.svg | 102 -- addons/gloot/images/icon_item.svg | 79 -- .../images/icon_item_count_constraint.svg | 72 ++ .../icon_item_count_constraint.svg.import | 37 + addons/gloot/images/icon_item_protoset.svg | 78 -- .../images/icon_item_ref_slot.svg.import | 37 - .../gloot/images/icon_weight_constraint.svg | 82 ++ ...port => icon_weight_constraint.svg.import} | 8 +- addons/gloot/plugin.cfg | 2 +- addons/gloot/ui/README.md | 20 + addons/gloot/ui/ctrl_dragable.gd | 81 -- .../gloot/ui/ctrl_draggable_inventory_item.gd | 86 ++ .../ui/ctrl_draggable_inventory_item.gd.uid | 1 + addons/gloot/ui/ctrl_drop_zone.gd | 30 - addons/gloot/ui/ctrl_inventory.gd | 252 ++-- addons/gloot/ui/ctrl_inventory.gd.uid | 1 + addons/gloot/ui/ctrl_inventory_capacity.gd | 135 +++ .../gloot/ui/ctrl_inventory_capacity.gd.uid | 1 + addons/gloot/ui/ctrl_inventory_grid.gd | 723 +++++++---- addons/gloot/ui/ctrl_inventory_grid.gd.uid | 1 + addons/gloot/ui/ctrl_inventory_grid_basic.gd | 377 +++--- .../gloot/ui/ctrl_inventory_grid_basic.gd.uid | 1 + addons/gloot/ui/ctrl_inventory_grid_ex.gd | 408 ------- ...trl_inventory_grid_field_style_normal.tres | 6 + .../ctrl_inventory_grid_style_background.tres | 6 + .../ctrl_inventory_grid_style_selection.tres | 9 + addons/gloot/ui/ctrl_inventory_item.gd | 117 ++ addons/gloot/ui/ctrl_inventory_item.gd.uid | 1 + addons/gloot/ui/ctrl_inventory_item_base.gd | 32 + .../gloot/ui/ctrl_inventory_item_base.gd.uid | 1 + addons/gloot/ui/ctrl_inventory_item_rect.gd | 167 --- addons/gloot/ui/ctrl_inventory_stacked.gd | 74 -- addons/gloot/ui/ctrl_inventory_universal.gd | 111 ++ .../gloot/ui/ctrl_inventory_universal.gd.uid | 1 + addons/gloot/ui/ctrl_item_slot.gd | 293 ++--- addons/gloot/ui/ctrl_item_slot.gd.uid | 1 + addons/gloot/ui/ctrl_item_slot_ex.gd | 61 - .../label_auto_sizer.gd.uid | 1 + .../label_font_auto_size_manager.gd.uid | 1 + addons/label_font_auto_sizer/plugin.gd.uid | 1 + .../rich_label_auto_sizer.gd.uid | 1 + .../2D-4.3/2d_example_scene.tscn | 442 +------ .../2d_follow_framed_example_scene.tscn | 449 +------ .../2D-4.3/2d_follow_group_example_scene.tscn | 448 +------ .../2D-4.3/2d_follow_path_example_scene.tscn | 447 +------ .../2D-4.3/2d_limit_example_scene.tscn | 445 +------ .../2D-4.3/2d_noise_example_scene.tscn | 289 +++++ .../2D-4.3/2d_tweening_example_scene.tscn | 442 +------ .../example_scenes/2D/2d_example_scene.tscn | 408 +------ .../2D/2d_follow_framed_example_scene.tscn | 410 +------ .../2D/2d_follow_group_example_scene.tscn | 413 +------ .../2D/2d_follow_path_example_scene.tscn | 406 +------ .../2D/2d_limit_example_scene.tscn | 414 +------ .../2D/2d_tweening_example_scene.tscn | 406 +------ .../2D/sub_scenes/playable_character_2d.tscn | 2 +- .../3D-4.4/3d_example_scene.tscn | 407 +++++++ .../3d_follow_framed_example_scene.tscn | 155 +++ .../3D-4.4/3d_follow_glued_example_scene.tscn | 209 ++++ .../3D-4.4/3d_follow_group_example_scene.tscn | 179 +++ .../3D-4.4/3d_follow_path_example_scene.tscn | 241 ++++ .../3d_follow_simple_example_scene.tscn | 162 +++ ...third_person_attribtues_example_scene.tscn | 218 ++++ .../3d_follow_third_person_example_scene.tscn | 185 +++ .../3D-4.4/3d_look_at_example_scene.tscn | 197 +++ .../3D-4.4/3d_noise_example_scene.tscn | 192 +++ .../3D-4.4/3d_tweening_example_scene.tscn | 286 +++++ .../sub_scenes/playable_character_3d.tscn | 31 + .../playable_character_third_person_3d.tscn | 43 + .../example_scenes/3D/3d_example_scene.tscn | 30 +- .../3D/3d_follow_framed_example_scene.tscn | 14 +- .../3D/3d_follow_glued_example_scene.tscn | 12 +- .../3D/3d_follow_group_example_scene.tscn | 10 +- .../3D/3d_follow_path_example_scene.tscn | 22 +- .../3D/3d_follow_simple_example_scene.tscn | 46 +- ...third_person_attribtues_example_scene.tscn | 216 ++++ .../3d_follow_third_person_example_scene.tscn | 44 +- .../3D/3d_look_at_example_scene.tscn | 16 +- .../3D/3d_noise_example_scene.tscn | 209 ++++ .../3D/3d_tweening_example_scene.tscn | 30 +- .../scripts/2D/2d_room_limit_tween.gd.uid | 1 + .../scripts/2D/2d_room_limit_tween_4.3.gd.uid | 1 + .../scripts/2D/2d_trigger_area.gd.uid | 1 + .../scripts/2D/player_character_body_2d.gd | 5 +- .../2D/player_character_body_2d.gd.uid | 1 + .../2D/player_character_body_2d_4.3.gd | 23 +- .../2D/player_character_body_2d_4.3.gd.uid | 1 + .../scripts/3D/3d_trigger_area.gd.uid | 1 + .../examples/scripts/3D/npc.gd.uid | 1 + .../examples/scripts/3D/path_follow.gd.uid | 1 + .../scripts/3D/player_controller.gd.uid | 1 + .../scripts/3D/player_controller_4.4.gd | 84 ++ .../scripts/3D/player_controller_4.4.gd.uid | 1 + .../3D/player_controller_first_person.gd | 54 + .../3D/player_controller_first_person.gd.uid | 1 + .../3D/player_controller_first_person_4.4.gd | 54 + .../player_controller_first_person_4.4.gd.uid | 1 + .../3D/player_controller_third_person.gd | 17 +- .../3D/player_controller_third_person.gd.uid | 1 + .../3D/player_controller_third_person_4.4.gd | 85 ++ .../player_controller_third_person_4.4.gd.uid | 1 + .../textures/2D/player_sprite.svg.import | 2 +- .../examples/textures/3D/target.png | Bin 0 -> 96068 bytes .../examples/textures/3D/target.png.import | 35 + .../fonts/Nunito-Black.ttf.import | 1 + .../fonts/Nunito-Regular.ttf.import | 1 + addons/phantom_camera/gizmos/custom_gizmo.gd | 22 +- .../phantom_camera/gizmos/custom_gizmo.gd.uid | 1 + .../gizmos/phantom_camera_gizmo_plugin_3d.gd | 1 + .../phantom_camera_gizmo_plugin_3d.gd.uid | 1 + ...om_camera_noise_emitter_gizmo_plugin_3d.gd | 29 + ...amera_noise_emitter_gizmo_plugin_3d.gd.uid | 1 + .../icons/phantom_camera_2d.svg.import | 5 +- .../icons/phantom_camera_3d.svg.import | 5 +- ...antom_camera_camera_3d_resource.svg.import | 2 +- .../icons/phantom_camera_noise_emitter_2d.svg | 4 + ...hantom_camera_noise_emitter_2d.svg.import} | 8 +- .../icons/phantom_camera_noise_emitter_3d.svg | 4 + ...phantom_camera_noise_emitter_3d.svg.import | 38 + .../phantom_camera_noise_emitter_gizmo.svg | 4 + ...ntom_camera_noise_emitter_gizmo.svg.import | 38 + .../icons/phantom_camera_noise_resource.svg | 5 + .../phantom_camera_noise_resource.svg.import} | 8 +- .../phantom_camera_inspector_plugin.gd.uid | 1 + addons/phantom_camera/panel/editor.gd.uid | 1 + .../panel/viewfinder/viewfinder_panel.tscn | 69 +- addons/phantom_camera/plugin.cfg | 2 +- addons/phantom_camera/plugin.gd | 49 +- addons/phantom_camera/plugin.gd.uid | 1 + .../managers/phantom_camera_manager.gd | 11 +- .../managers/phantom_camera_manager.gd.uid | 1 + .../updater/download_update_panel.gd.uid | 1 + .../scripts/panel/updater/update_button.gd | 4 + .../panel/updater/update_button.gd.uid | 1 + .../panel/updater/updater_constants.gd.uid | 1 + .../scripts/panel/viewfinder/viewfinder.gd | 23 +- .../panel/viewfinder/viewfinder.gd.uid | 1 + .../phantom_camera/phantom_camera_2d.gd | 697 +++++++---- .../phantom_camera/phantom_camera_2d.gd.uid | 1 + .../phantom_camera/phantom_camera_3d.gd | 1057 ++++++++++++----- .../phantom_camera/phantom_camera_3d.gd.uid | 1 + .../phantom_camera_constants.gd.uid | 1 + .../phantom_camera_noise_emitter_2d.gd | 264 ++++ .../phantom_camera_noise_emitter_2d.gd.uid | 1 + .../phantom_camera_noise_emitter_3d.gd | 266 +++++ .../phantom_camera_noise_emitter_3d.gd.uid | 1 + .../phantom_camera_host.gd | 891 ++++++++++---- .../phantom_camera_host.gd.uid | 1 + .../resources/camera_3d_resource.gd.uid | 1 + .../resources/phantom_camera_noise_2d.gd | 228 ++++ .../resources/phantom_camera_noise_2d.gd.uid | 1 + .../resources/phantom_camera_noise_3d.gd | 301 +++++ .../resources/phantom_camera_noise_3d.gd.uid | 1 + .../scripts/resources/tween_resource.gd.uid | 1 + addons/save_system/plugin_save_system.gd.uid | 1 + addons/save_system/save_system.gd.uid | 1 + .../save_system_test/save_system_test.gd.uid | 1 + .../save_system_test_resource.gd.uid | 1 + .../save_system_test_subresource.gd.uid | 1 + addons/scene_manager/Dissolve2d.gdshader.uid | 1 + addons/scene_manager/LICENSE | 9 - .../scene_manager/NodeFlagsInspectorPlugin.gd | 2 +- .../NodeFlagsInspectorPlugin.gd.uid | 1 + addons/scene_manager/README.md | 16 - addons/scene_manager/SceneManager.gd | 13 +- addons/scene_manager/SceneManager.gd.uid | 1 + addons/scene_manager/SceneManager.tscn | 26 +- .../SceneManagerConstants.gd.uid | 1 + .../scene_manager/SceneManagerPlugin.gd.uid | 1 + .../SingletonCheckProperty.gd.uid | 1 + .../SingletonNameProperty.gd.uid | 1 + addons/scene_manager/plugin.cfg | 2 +- addons/script-ide/Popup.gd.uid | 1 + addons/script-ide/plugin.gd.uid | 1 + assets/resources/save_resource.gd.uid | 1 + assets/resources/save_resource.tres | 2 +- i18n/en.po | 0 i18n/es_ES.po | 0 i18n/es_MX.po | 0 objects/item_protoset.json | 21 + objects/item_protoset.tres | 3 + project.godot | 15 +- scenes/components/item_protoset.json | 15 - scenes/components/item_protoset.tres | 18 - scenes/elements/door_scene_manager.tscn | 2 +- scenes/elements/player.tscn | 2 +- scenes/{ => level}/house_template.tscn | 20 +- scenes/{ => level}/main_level.tscn | 33 +- scenes/{interfaces => menu}/inventory.tscn | 86 +- scenes/{interfaces => menu}/pause_menu.tscn | 8 +- scenes/{interfaces => menu}/save_menu.tscn | 4 +- scripts/constants.gd | 4 +- scripts/constants.gd.uid | 1 + scripts/door_scene_manager.gd | 2 +- scripts/door_scene_manager.gd.uid | 1 + scripts/events.gd | 5 + scripts/events.gd.uid | 1 + scripts/globals.gd | 4 - scripts/globals.gd.uid | 1 + scripts/house_template.gd | 6 +- scripts/house_template.gd.uid | 1 + scripts/inventory.gd | 10 +- scripts/inventory.gd.uid | 1 + scripts/main_level.gd | 2 +- scripts/main_level.gd.uid | 1 + scripts/pause_menu.gd | 13 +- scripts/pause_menu.gd.uid | 1 + scripts/player.gd.uid | 1 + scripts/save_menu.gd.uid | 1 + {assets/shaders => vfx}/water.gdshader | 0 vfx/water.gdshader.uid | 1 + 306 files changed, 11496 insertions(+), 11796 deletions(-) delete mode 100644 addons/gloot/LICENSE create mode 100644 addons/gloot/README.md create mode 100644 addons/gloot/core/README.md create mode 100644 addons/gloot/core/constraints/README.md create mode 100644 addons/gloot/core/constraints/constraint_manager.gd.uid create mode 100644 addons/gloot/core/constraints/grid_constraint.gd.uid create mode 100644 addons/gloot/core/constraints/inventory_constraint.gd.uid create mode 100644 addons/gloot/core/constraints/item_count_constraint.gd create mode 100644 addons/gloot/core/constraints/item_count_constraint.gd.uid delete mode 100644 addons/gloot/core/constraints/item_map.gd create mode 100644 addons/gloot/core/constraints/quadtree.gd.uid delete mode 100644 addons/gloot/core/constraints/stacks_constraint.gd create mode 100644 addons/gloot/core/constraints/weight_constraint.gd.uid create mode 100644 addons/gloot/core/inventory.gd.uid delete mode 100644 addons/gloot/core/inventory_grid.gd delete mode 100644 addons/gloot/core/inventory_grid_stacked.gd create mode 100644 addons/gloot/core/inventory_item.gd.uid delete mode 100644 addons/gloot/core/inventory_stacked.gd create mode 100644 addons/gloot/core/item_count.gd.uid delete mode 100644 addons/gloot/core/item_protoset.gd delete mode 100644 addons/gloot/core/item_ref_slot.gd create mode 100644 addons/gloot/core/item_slot.gd.uid delete mode 100644 addons/gloot/core/item_slot_base.gd create mode 100644 addons/gloot/core/prototree/proto_tree.gd create mode 100644 addons/gloot/core/prototree/proto_tree.gd.uid create mode 100644 addons/gloot/core/prototree/proto_tree_cache.gd create mode 100644 addons/gloot/core/prototree/proto_tree_cache.gd.uid create mode 100644 addons/gloot/core/prototree/prototype.gd create mode 100644 addons/gloot/core/prototree/prototype.gd.uid create mode 100644 addons/gloot/core/stack_manager.gd create mode 100644 addons/gloot/core/stack_manager.gd.uid create mode 100644 addons/gloot/core/utils.gd.uid create mode 100644 addons/gloot/core/verify.gd.uid create mode 100644 addons/gloot/editor/README.md delete mode 100644 addons/gloot/editor/common/choice_filter.gd delete mode 100644 addons/gloot/editor/common/choice_filter.tscn delete mode 100644 addons/gloot/editor/common/choice_filter_test.tscn create mode 100644 addons/gloot/editor/common/dict_editor.gd.uid create mode 100644 addons/gloot/editor/common/editor_icons.gd.uid create mode 100644 addons/gloot/editor/common/multivalue_editor.gd.uid create mode 100644 addons/gloot/editor/common/proto_tree_viewer.gd create mode 100644 addons/gloot/editor/common/proto_tree_viewer.gd.uid create mode 100644 addons/gloot/editor/common/value_editor.gd.uid delete mode 100644 addons/gloot/editor/gloot_undo_redo.gd create mode 100644 addons/gloot/editor/inventory_editor/inventory_editor.gd.uid create mode 100644 addons/gloot/editor/inventory_editor/inventory_inspector.gd.uid create mode 100644 addons/gloot/editor/inventory_inspector_plugin.gd.uid delete mode 100644 addons/gloot/editor/item_editor/edit_properties_button.gd delete mode 100644 addons/gloot/editor/item_editor/edit_prototype_id_button.gd create mode 100644 addons/gloot/editor/item_editor/properties_editor.gd.uid delete mode 100644 addons/gloot/editor/item_editor/prototype_id_editor.gd delete mode 100644 addons/gloot/editor/item_editor/prototype_id_editor.tscn delete mode 100644 addons/gloot/editor/item_slot_editor/item_ref_slot_button.gd create mode 100644 addons/gloot/editor/item_slot_editor/item_slot_editor.gd.uid create mode 100644 addons/gloot/editor/item_slot_editor/item_slot_inspector.gd.uid delete mode 100644 addons/gloot/editor/protoset_editor/edit_protoset_button.gd delete mode 100644 addons/gloot/editor/protoset_editor/edit_protoset_button.tscn delete mode 100644 addons/gloot/editor/protoset_editor/protoset_editor.gd delete mode 100644 addons/gloot/editor/protoset_editor/protoset_editor.tscn create mode 100644 addons/gloot/editor/undoables.gd create mode 100644 addons/gloot/editor/undoables.gd.uid create mode 100644 addons/gloot/gloot.gd.uid rename addons/gloot/images/{icon_item_ref_slot.svg => icon_ctrl_capacity.svg} (68%) rename addons/gloot/images/{icon_item.svg.import => icon_ctrl_capacity.svg.import} (69%) create mode 100644 addons/gloot/images/icon_ctrl_inventory_item.svg rename addons/gloot/images/{icon_item_protoset.svg.import => icon_ctrl_inventory_item.svg.import} (68%) delete mode 100644 addons/gloot/images/icon_ctrl_inventory_stacked.svg rename addons/gloot/images/{icon_inventory_grid.svg => icon_grid_constraint.svg} (74%) rename addons/gloot/images/{icon_inventory_grid.svg.import => icon_grid_constraint.svg.import} (68%) delete mode 100644 addons/gloot/images/icon_inventory_grid_stacked.svg delete mode 100644 addons/gloot/images/icon_inventory_stacked.svg delete mode 100644 addons/gloot/images/icon_item.svg create mode 100644 addons/gloot/images/icon_item_count_constraint.svg create mode 100644 addons/gloot/images/icon_item_count_constraint.svg.import delete mode 100644 addons/gloot/images/icon_item_protoset.svg delete mode 100644 addons/gloot/images/icon_item_ref_slot.svg.import create mode 100644 addons/gloot/images/icon_weight_constraint.svg rename addons/gloot/images/{icon_inventory_stacked.svg.import => icon_weight_constraint.svg.import} (68%) create mode 100644 addons/gloot/ui/README.md delete mode 100644 addons/gloot/ui/ctrl_dragable.gd create mode 100644 addons/gloot/ui/ctrl_draggable_inventory_item.gd create mode 100644 addons/gloot/ui/ctrl_draggable_inventory_item.gd.uid delete mode 100644 addons/gloot/ui/ctrl_drop_zone.gd create mode 100644 addons/gloot/ui/ctrl_inventory.gd.uid create mode 100644 addons/gloot/ui/ctrl_inventory_capacity.gd create mode 100644 addons/gloot/ui/ctrl_inventory_capacity.gd.uid create mode 100644 addons/gloot/ui/ctrl_inventory_grid.gd.uid create mode 100644 addons/gloot/ui/ctrl_inventory_grid_basic.gd.uid delete mode 100644 addons/gloot/ui/ctrl_inventory_grid_ex.gd create mode 100644 addons/gloot/ui/ctrl_inventory_grid_field_style_normal.tres create mode 100644 addons/gloot/ui/ctrl_inventory_grid_style_background.tres create mode 100644 addons/gloot/ui/ctrl_inventory_grid_style_selection.tres create mode 100644 addons/gloot/ui/ctrl_inventory_item.gd create mode 100644 addons/gloot/ui/ctrl_inventory_item.gd.uid create mode 100644 addons/gloot/ui/ctrl_inventory_item_base.gd create mode 100644 addons/gloot/ui/ctrl_inventory_item_base.gd.uid delete mode 100644 addons/gloot/ui/ctrl_inventory_item_rect.gd delete mode 100644 addons/gloot/ui/ctrl_inventory_stacked.gd create mode 100644 addons/gloot/ui/ctrl_inventory_universal.gd create mode 100644 addons/gloot/ui/ctrl_inventory_universal.gd.uid create mode 100644 addons/gloot/ui/ctrl_item_slot.gd.uid delete mode 100644 addons/gloot/ui/ctrl_item_slot_ex.gd create mode 100644 addons/label_font_auto_sizer/label_auto_sizer.gd.uid create mode 100644 addons/label_font_auto_sizer/label_font_auto_size_manager.gd.uid create mode 100644 addons/label_font_auto_sizer/plugin.gd.uid create mode 100644 addons/label_font_auto_sizer/rich_label_auto_sizer.gd.uid create mode 100644 addons/phantom_camera/examples/example_scenes/2D-4.3/2d_noise_example_scene.tscn create mode 100644 addons/phantom_camera/examples/example_scenes/3D-4.4/3d_example_scene.tscn create mode 100644 addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_framed_example_scene.tscn create mode 100644 addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_glued_example_scene.tscn create mode 100644 addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_group_example_scene.tscn create mode 100644 addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_path_example_scene.tscn create mode 100644 addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_simple_example_scene.tscn create mode 100644 addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_third_person_attribtues_example_scene.tscn create mode 100644 addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_third_person_example_scene.tscn create mode 100644 addons/phantom_camera/examples/example_scenes/3D-4.4/3d_look_at_example_scene.tscn create mode 100644 addons/phantom_camera/examples/example_scenes/3D-4.4/3d_noise_example_scene.tscn create mode 100644 addons/phantom_camera/examples/example_scenes/3D-4.4/3d_tweening_example_scene.tscn create mode 100644 addons/phantom_camera/examples/example_scenes/3D-4.4/sub_scenes/playable_character_3d.tscn create mode 100644 addons/phantom_camera/examples/example_scenes/3D-4.4/sub_scenes/playable_character_third_person_3d.tscn create mode 100644 addons/phantom_camera/examples/example_scenes/3D/3d_follow_third_person_attribtues_example_scene.tscn create mode 100644 addons/phantom_camera/examples/example_scenes/3D/3d_noise_example_scene.tscn create mode 100644 addons/phantom_camera/examples/scripts/2D/2d_room_limit_tween.gd.uid create mode 100644 addons/phantom_camera/examples/scripts/2D/2d_room_limit_tween_4.3.gd.uid create mode 100644 addons/phantom_camera/examples/scripts/2D/2d_trigger_area.gd.uid create mode 100644 addons/phantom_camera/examples/scripts/2D/player_character_body_2d.gd.uid create mode 100644 addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd.uid create mode 100644 addons/phantom_camera/examples/scripts/3D/3d_trigger_area.gd.uid create mode 100644 addons/phantom_camera/examples/scripts/3D/npc.gd.uid create mode 100644 addons/phantom_camera/examples/scripts/3D/path_follow.gd.uid create mode 100644 addons/phantom_camera/examples/scripts/3D/player_controller.gd.uid create mode 100644 addons/phantom_camera/examples/scripts/3D/player_controller_4.4.gd create mode 100644 addons/phantom_camera/examples/scripts/3D/player_controller_4.4.gd.uid create mode 100644 addons/phantom_camera/examples/scripts/3D/player_controller_first_person.gd create mode 100644 addons/phantom_camera/examples/scripts/3D/player_controller_first_person.gd.uid create mode 100644 addons/phantom_camera/examples/scripts/3D/player_controller_first_person_4.4.gd create mode 100644 addons/phantom_camera/examples/scripts/3D/player_controller_first_person_4.4.gd.uid create mode 100644 addons/phantom_camera/examples/scripts/3D/player_controller_third_person.gd.uid create mode 100644 addons/phantom_camera/examples/scripts/3D/player_controller_third_person_4.4.gd create mode 100644 addons/phantom_camera/examples/scripts/3D/player_controller_third_person_4.4.gd.uid create mode 100644 addons/phantom_camera/examples/textures/3D/target.png create mode 100644 addons/phantom_camera/examples/textures/3D/target.png.import create mode 100644 addons/phantom_camera/gizmos/custom_gizmo.gd.uid create mode 100644 addons/phantom_camera/gizmos/phantom_camera_gizmo_plugin_3d.gd.uid create mode 100644 addons/phantom_camera/gizmos/phantom_camera_noise_emitter_gizmo_plugin_3d.gd create mode 100644 addons/phantom_camera/gizmos/phantom_camera_noise_emitter_gizmo_plugin_3d.gd.uid create mode 100644 addons/phantom_camera/icons/phantom_camera_noise_emitter_2d.svg rename addons/{gloot/images/icon_ctrl_inventory_stacked.svg.import => phantom_camera/icons/phantom_camera_noise_emitter_2d.svg.import} (65%) create mode 100644 addons/phantom_camera/icons/phantom_camera_noise_emitter_3d.svg create mode 100644 addons/phantom_camera/icons/phantom_camera_noise_emitter_3d.svg.import create mode 100644 addons/phantom_camera/icons/phantom_camera_noise_emitter_gizmo.svg create mode 100644 addons/phantom_camera/icons/phantom_camera_noise_emitter_gizmo.svg.import create mode 100644 addons/phantom_camera/icons/phantom_camera_noise_resource.svg rename addons/{gloot/images/icon_inventory_grid_stacked.svg.import => phantom_camera/icons/phantom_camera_noise_resource.svg.import} (66%) create mode 100644 addons/phantom_camera/inspector/phantom_camera_inspector_plugin.gd.uid create mode 100644 addons/phantom_camera/panel/editor.gd.uid create mode 100644 addons/phantom_camera/plugin.gd.uid create mode 100644 addons/phantom_camera/scripts/managers/phantom_camera_manager.gd.uid create mode 100644 addons/phantom_camera/scripts/panel/updater/download_update_panel.gd.uid create mode 100644 addons/phantom_camera/scripts/panel/updater/update_button.gd.uid create mode 100644 addons/phantom_camera/scripts/panel/updater/updater_constants.gd.uid create mode 100644 addons/phantom_camera/scripts/panel/viewfinder/viewfinder.gd.uid create mode 100644 addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd.uid create mode 100644 addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd.uid create mode 100644 addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd.uid create mode 100644 addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_2d.gd create mode 100644 addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_2d.gd.uid create mode 100644 addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_3d.gd create mode 100644 addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_3d.gd.uid create mode 100644 addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd.uid create mode 100644 addons/phantom_camera/scripts/resources/camera_3d_resource.gd.uid create mode 100644 addons/phantom_camera/scripts/resources/phantom_camera_noise_2d.gd create mode 100644 addons/phantom_camera/scripts/resources/phantom_camera_noise_2d.gd.uid create mode 100644 addons/phantom_camera/scripts/resources/phantom_camera_noise_3d.gd create mode 100644 addons/phantom_camera/scripts/resources/phantom_camera_noise_3d.gd.uid create mode 100644 addons/phantom_camera/scripts/resources/tween_resource.gd.uid create mode 100644 addons/save_system/plugin_save_system.gd.uid create mode 100644 addons/save_system/save_system.gd.uid create mode 100644 addons/save_system/save_system_test/save_system_test.gd.uid create mode 100644 addons/save_system/save_system_test/save_system_test_resource.gd.uid create mode 100644 addons/save_system/save_system_test/save_system_test_subresource.gd.uid create mode 100644 addons/scene_manager/Dissolve2d.gdshader.uid delete mode 100644 addons/scene_manager/LICENSE create mode 100644 addons/scene_manager/NodeFlagsInspectorPlugin.gd.uid delete mode 100644 addons/scene_manager/README.md create mode 100644 addons/scene_manager/SceneManager.gd.uid create mode 100644 addons/scene_manager/SceneManagerConstants.gd.uid create mode 100644 addons/scene_manager/SceneManagerPlugin.gd.uid create mode 100644 addons/scene_manager/SingletonCheckProperty.gd.uid create mode 100644 addons/scene_manager/SingletonNameProperty.gd.uid create mode 100644 addons/script-ide/Popup.gd.uid create mode 100644 addons/script-ide/plugin.gd.uid create mode 100644 assets/resources/save_resource.gd.uid create mode 100644 i18n/en.po create mode 100644 i18n/es_ES.po create mode 100644 i18n/es_MX.po create mode 100644 objects/item_protoset.json create mode 100644 objects/item_protoset.tres delete mode 100644 scenes/components/item_protoset.json delete mode 100644 scenes/components/item_protoset.tres rename scenes/{ => level}/house_template.tscn (99%) rename scenes/{ => level}/main_level.tscn (94%) rename scenes/{interfaces => menu}/inventory.tscn (60%) rename scenes/{interfaces => menu}/pause_menu.tscn (86%) rename scenes/{interfaces => menu}/save_menu.tscn (95%) create mode 100644 scripts/constants.gd.uid create mode 100644 scripts/door_scene_manager.gd.uid create mode 100644 scripts/events.gd create mode 100644 scripts/events.gd.uid create mode 100644 scripts/globals.gd.uid create mode 100644 scripts/house_template.gd.uid create mode 100644 scripts/inventory.gd.uid create mode 100644 scripts/main_level.gd.uid create mode 100644 scripts/pause_menu.gd.uid create mode 100644 scripts/player.gd.uid create mode 100644 scripts/save_menu.gd.uid rename {assets/shaders => vfx}/water.gdshader (100%) create mode 100644 vfx/water.gdshader.uid diff --git a/addons/gloot/LICENSE b/addons/gloot/LICENSE deleted file mode 100644 index e9b4efd..0000000 --- a/addons/gloot/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 Peter Kish - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/addons/gloot/README.md b/addons/gloot/README.md new file mode 100644 index 0000000..6825acb --- /dev/null +++ b/addons/gloot/README.md @@ -0,0 +1,16 @@ +# GLoot Directory Contents + +## Directories + +| Directory | Description | +| --------- | ----------- | +| `core` | Core GLoot functionality. Contains classes like `Inventory`, `InventoryItem`, `ProtoTree` etc. | +| `editor` | Code that will exclusively be run in the editor. Contains implementations of the inventory editor, item editor, item slot editor etc. | +| `images` | Images/icons used by the pluigin. | +| `ui` | UI control classes like `CtrlInventory`, `CtrlInventoryGrid` etc. | + +## Files + +| File | Description | +| ---------- | ----------- | +| `gloot.gd` | GLoot `EditorPlugin` implementation | \ No newline at end of file diff --git a/addons/gloot/core/README.md b/addons/gloot/core/README.md new file mode 100644 index 0000000..d613bb4 --- /dev/null +++ b/addons/gloot/core/README.md @@ -0,0 +1,20 @@ +# Core Directory Contents + +## Directories + +| Directory | Description | +| ------------- | ----------- | +| `constraints` | Constraint implementations (`WeightConstraint`, `GridConstraint` and `ItemCountConstraint`) | +| `prototree` | Prototree related code (`Prototype` and `ProtoTree`) | + +## Files + +| File | Description | +| ------------------- | ----------- | +| `inventory_item.gd` | `InventoryItem` implementation. | +| `inventory.gd` | `Inventory` implementation. | +| `item_count.gd` | A helper script for item count arithmetics that support infinity. | +| `item_slot.gd` | `ItemSlot` implementation. | +| `stack_manager.gd` | A helper script for managing item stacks. | +| `utils.gd` | Miscellaneous helper utility functions. | +| `verify.gd` | A helper script for data verification. | diff --git a/addons/gloot/core/constraints/README.md b/addons/gloot/core/constraints/README.md new file mode 100644 index 0000000..f44041b --- /dev/null +++ b/addons/gloot/core/constraints/README.md @@ -0,0 +1,12 @@ +# Constraints Directory Contents + +## Files + +| File | Description | +| ------------------- | ----------- | +| `constraint_manager.gd` | Helper script for managing inventory constraints. | +| `grid_constraint.gd` | `GridConstraint` implementation. | +| `inventory_constraint.gd` | Inventory constraint base class (`InventoryConstraint`). | +| `item_count_constraint.gd` | `ItemCountConstraint` implementation. | +| `quadtree.gd` | Implements quad-trees used in `GridConstraint` for organizing items in a 2d space. | +| `weight_constraint.gd` | `WeightConstraint` implementation. | diff --git a/addons/gloot/core/constraints/constraint_manager.gd b/addons/gloot/core/constraints/constraint_manager.gd index 82a038b..de343dc 100644 --- a/addons/gloot/core/constraints/constraint_manager.gd +++ b/addons/gloot/core/constraints/constraint_manager.gd @@ -1,264 +1,131 @@ extends RefCounted -const KEY_WEIGHT_CONSTRAINT = "weight_constraint" -const KEY_STACKS_CONSTRAINT = "stacks_constraint" -const KEY_GRID_CONSTRAINT = "grid_constraint" - -const Verify = preload("res://addons/gloot/core/verify.gd") -const WeightConstraint = preload("res://addons/gloot/core/constraints/weight_constraint.gd") -const StacksConstraint = preload("res://addons/gloot/core/constraints/stacks_constraint.gd") -const GridConstraint = preload("res://addons/gloot/core/constraints/grid_constraint.gd") - -var _weight_constraint: WeightConstraint = null -var _stacks_constraint: StacksConstraint = null -var _grid_constraint: GridConstraint = null -var inventory: Inventory = null : - set(new_inventory): - assert(new_inventory != null, "Can't set inventory to null!") - assert(inventory == null, "Inventory already set!") - inventory = new_inventory - if _weight_constraint != null: - _weight_constraint.inventory = inventory - if _stacks_constraint != null: - _stacks_constraint.inventory = inventory - if _grid_constraint != null: - _grid_constraint.inventory = inventory - - -enum Configuration {WSG, WS, WG, SG, W, S, G, VANILLA} +signal constraint_changed(constraint: InventoryConstraint) +const _Verify = preload("res://addons/gloot/core/verify.gd") +const _Utils = preload("res://addons/gloot/core/utils.gd") +const _ItemCount = preload("res://addons/gloot/core/item_count.gd") -func _init(inventory_: Inventory) -> void: - inventory = inventory_ - - -func _on_item_added(item: InventoryItem) -> void: - assert(_enforce_constraints(item), "Failed to enforce constraints!") +const _KEY_CONSTRAINT_NAME: String = "name" +const _KEY_CONSTRAINT_DATA: String = "data" - # Enforcing constraints can result in the item being removed from the inventory - # (e.g. when it's merged with another item stack) - if !is_instance_valid(item.get_inventory()) || item.is_queued_for_deletion(): - item = null - - if _weight_constraint != null: - _weight_constraint._on_item_added(item) - if _stacks_constraint != null: - _stacks_constraint._on_item_added(item) - if _grid_constraint != null: - _grid_constraint._on_item_added(item) +var inventory: Inventory = null +var _constraints: Array[InventoryConstraint] = [] -func _on_item_removed(item: InventoryItem) -> void: - if _weight_constraint != null: - _weight_constraint._on_item_removed(item) - if _stacks_constraint != null: - _stacks_constraint._on_item_removed(item) - if _grid_constraint != null: - _grid_constraint._on_item_removed(item) - +func _init(inventory_: Inventory) -> void: + inventory = inventory_ + if !is_instance_valid(inventory): + return -func _on_item_property_changed(item: InventoryItem, property_name: String) -> void: - if _weight_constraint != null: - _weight_constraint._on_item_property_changed(item, property_name) - if _stacks_constraint != null: - _stacks_constraint._on_item_property_changed(item, property_name) - if _grid_constraint != null: - _grid_constraint._on_item_property_changed(item, property_name) +func is_empty() -> bool: + return _constraints.is_empty() -func _on_pre_item_swap(item1: InventoryItem, item2: InventoryItem) -> bool: - if _weight_constraint != null && !_weight_constraint._on_pre_item_swap(item1, item2): - return false - if _stacks_constraint != null && !_stacks_constraint._on_pre_item_swap(item1, item2): - return false - if _grid_constraint != null && !_grid_constraint._on_pre_item_swap(item1, item2): - return false - return true +func register_constraint(constraint: InventoryConstraint) -> void: + _constraints.append(constraint) + _Utils.safe_connect(constraint.changed, _on_constraint_changed.bind(constraint)) -func _on_post_item_swap(item1: InventoryItem, item2: InventoryItem) -> void: - if _weight_constraint != null: - _weight_constraint._on_post_item_swap(item1, item2) - if _stacks_constraint != null: - _stacks_constraint._on_post_item_swap(item1, item2) - if _grid_constraint != null: - _grid_constraint._on_post_item_swap(item1, item2) - - -func _enforce_constraints(item: InventoryItem) -> bool: - match get_configuration(): - Configuration.G: - return _grid_constraint.move_item_to_free_spot(item) - Configuration.WG: - return _grid_constraint.move_item_to_free_spot(item) - Configuration.SG: - if _grid_constraint.move_item_to_free_spot(item): - return true - _stacks_constraint.pack_item(item) - Configuration.WSG: - if _grid_constraint.move_item_to_free_spot(item): - return true - _stacks_constraint.pack_item(item) - return true +func unregister_constraint(constraint: InventoryConstraint) -> void: + _constraints.erase(constraint) + _Utils.safe_disconnect(constraint.changed, _on_constraint_changed.bind(constraint)) -func get_configuration() -> int: - if _weight_constraint && _stacks_constraint && _grid_constraint: - return Configuration.WSG +func _on_constraint_changed(constraint: InventoryConstraint) -> void: + constraint_changed.emit(constraint) - if _weight_constraint && _stacks_constraint: - return Configuration.WS - if _weight_constraint && _grid_constraint: - return Configuration.WG +func _on_item_added(item: InventoryItem) -> void: + for constraint in _constraints: + constraint._on_item_added(item) - if _stacks_constraint && _grid_constraint: - return Configuration.SG - if _weight_constraint: - return Configuration.W +func _on_item_removed(item: InventoryItem) -> void: + for constraint in _constraints: + constraint._on_item_removed(item) - if _stacks_constraint: - return Configuration.S - if _grid_constraint: - return Configuration.G +func _on_item_property_changed(item: InventoryItem, property: String) -> void: + for constraint in _constraints: + constraint._on_item_property_changed(item, property) - return Configuration.VANILLA +func _on_pre_item_swap(item1: InventoryItem, item2: InventoryItem) -> bool: + for constraint in _constraints: + if !constraint._on_pre_item_swap(item1, item2): + return false + return true -func get_space_for(item: InventoryItem) -> ItemCount: - match get_configuration(): - Configuration.W: - return _weight_constraint.get_space_for(item) - Configuration.S: - return _stacks_constraint.get_space_for(item) - Configuration.G: - return _grid_constraint.get_space_for(item) - Configuration.WS: - return _ws_get_space_for(item) - Configuration.WG: - return ItemCount.min(_grid_constraint.get_space_for(item), _weight_constraint.get_space_for(item)) - Configuration.SG: - return _sg_get_space_for(item) - Configuration.WSG: - return ItemCount.min(_sg_get_space_for(item), _ws_get_space_for(item)) - return ItemCount.inf() +func _on_post_item_swap(item1: InventoryItem, item2: InventoryItem) -> void: + for constraint in _constraints: + constraint._on_post_item_swap(item1, item2) -func _ws_get_space_for(item: InventoryItem) -> ItemCount: - var stack_size := ItemCount.new(_stacks_constraint.get_item_stack_size(item)) - var result := _weight_constraint.get_space_for(item).div(stack_size) - return result +func _get_constraints() -> Array[InventoryConstraint]: + return _constraints -func _sg_get_space_for(item: InventoryItem) -> ItemCount: - var grid_space := _grid_constraint.get_space_for(item) - var max_stack_size := ItemCount.new(_stacks_constraint.get_item_max_stack_size(item)) - var stack_size := ItemCount.new(_stacks_constraint.get_item_stack_size(item)) - var free_stacks_space := _stacks_constraint.get_free_stack_space_for(item) - return grid_space.mul(max_stack_size).add(free_stacks_space).div(stack_size) +func get_space_for(item: InventoryItem) -> _ItemCount: + var min := _ItemCount.inf() + for constraint in _constraints: + var space_for_item: _ItemCount = _ItemCount.new(constraint.get_space_for(item)) + if space_for_item.lt(min): + min = space_for_item + return min func has_space_for(item: InventoryItem) -> bool: - match get_configuration(): - Configuration.W: - return _weight_constraint.has_space_for(item) - Configuration.S: - return _stacks_constraint.has_space_for(item) - Configuration.G: - return _grid_constraint.has_space_for(item) - Configuration.WS: - return _weight_constraint.has_space_for(item) - Configuration.WG: - return _weight_constraint.has_space_for(item) && _grid_constraint.has_space_for(item) - Configuration.SG: - return _sg_has_space_for(item) - Configuration.WSG: - return _sg_has_space_for(item) && _weight_constraint.has_space_for(item) - + for constraint in _constraints: + if !constraint.has_space_for(item): + return false return true -func _sg_has_space_for(item: InventoryItem) -> bool: - if _grid_constraint.has_space_for(item): - return true - var stack_size := ItemCount.new(_stacks_constraint.get_item_stack_size(item)) - var free_stacks_space := _stacks_constraint.get_free_stack_space_for(item) - return free_stacks_space.ge(stack_size) - - -func enable_weight_constraint(capacity: float = 0.0) -> void: - assert(_weight_constraint == null, "Weight constraint is already enabled") - _weight_constraint = WeightConstraint.new(inventory) - _weight_constraint.capacity = capacity - - -func enable_stacks_constraint() -> void: - assert(_stacks_constraint == null, "Stacks constraint is already enabled") - _stacks_constraint = StacksConstraint.new(inventory) - - -func enable_grid_constraint(size: Vector2i = GridConstraint.DEFAULT_SIZE) -> void: - assert(_grid_constraint == null, "Grid constraint is already enabled") - _grid_constraint = GridConstraint.new(inventory) - _grid_constraint.size = size - - -func get_weight_constraint() -> WeightConstraint: - return _weight_constraint - - -func get_stacks_constraint() -> StacksConstraint: - return _stacks_constraint - - -func get_grid_constraint() -> GridConstraint: - return _grid_constraint +func get_constraint(script: Script) -> InventoryConstraint: + for constraint in _constraints: + if constraint.get_script() == script: + return constraint + return null func reset() -> void: - if get_weight_constraint(): - get_weight_constraint().reset() - if get_stacks_constraint(): - get_stacks_constraint().reset() - if get_grid_constraint(): - get_grid_constraint().reset() + while !_constraints.is_empty(): + var constraint := _constraints.pop_back() + inventory.remove_child(constraint) + constraint.free() func serialize() -> Dictionary: var result := {} - if get_weight_constraint(): - result[KEY_WEIGHT_CONSTRAINT] = get_weight_constraint().serialize() - if get_stacks_constraint(): - result[KEY_STACKS_CONSTRAINT] = get_stacks_constraint().serialize() - if get_grid_constraint(): - result[KEY_GRID_CONSTRAINT] = get_grid_constraint().serialize() + for constraint in _constraints: + result[constraint.get_script().resource_path] = { + _KEY_CONSTRAINT_NAME: constraint.name, + _KEY_CONSTRAINT_DATA: constraint.serialize() + } return result func deserialize(source: Dictionary) -> bool: - if !Verify.dict(source, false, KEY_WEIGHT_CONSTRAINT, TYPE_DICTIONARY): - return false - if !Verify.dict(source, false, KEY_STACKS_CONSTRAINT, TYPE_DICTIONARY): - return false - if !Verify.dict(source, false, KEY_GRID_CONSTRAINT, TYPE_DICTIONARY): - return false + for constraint_script_path in source: + if !_Verify.dict(source[constraint_script_path], true, _KEY_CONSTRAINT_NAME, [TYPE_STRING, TYPE_STRING_NAME]): + return false + if !_Verify.dict(source[constraint_script_path], true, _KEY_CONSTRAINT_DATA, TYPE_DICTIONARY): + return false reset() - if source.has(KEY_WEIGHT_CONSTRAINT): - if !get_weight_constraint().deserialize(source[KEY_WEIGHT_CONSTRAINT]): - return false - if source.has(KEY_STACKS_CONSTRAINT): - if !get_stacks_constraint().deserialize(source[KEY_STACKS_CONSTRAINT]): - return false - if source.has(KEY_GRID_CONSTRAINT): - if !get_grid_constraint().deserialize(source[KEY_GRID_CONSTRAINT]): - return false + for constraint_script_path in source: + var constraint_script = load(constraint_script_path) + var new_constraint: InventoryConstraint = constraint_script.new() + new_constraint.name = source[constraint_script_path].name + new_constraint.deserialize(source[constraint_script_path].data) + inventory.add_child(new_constraint) + if Engine.is_editor_hint(): + new_constraint.owner = inventory.get_tree().edited_scene_root return true diff --git a/addons/gloot/core/constraints/constraint_manager.gd.uid b/addons/gloot/core/constraints/constraint_manager.gd.uid new file mode 100644 index 0000000..bc440d5 --- /dev/null +++ b/addons/gloot/core/constraints/constraint_manager.gd.uid @@ -0,0 +1 @@ +uid://bcmjj8jnlmkvt diff --git a/addons/gloot/core/constraints/grid_constraint.gd b/addons/gloot/core/constraints/grid_constraint.gd index 9a57c8f..2118354 100644 --- a/addons/gloot/core/constraints/grid_constraint.gd +++ b/addons/gloot/core/constraints/grid_constraint.gd @@ -1,28 +1,34 @@ -extends "res://addons/gloot/core/constraints/inventory_constraint.gd" - -signal size_changed - -const Verify = preload("res://addons/gloot/core/verify.gd") -const GridConstraint = preload("res://addons/gloot/core/constraints/grid_constraint.gd") -const StacksConstraint = preload("res://addons/gloot/core/constraints/stacks_constraint.gd") -const QuadTree = preload("res://addons/gloot/core/constraints/quadtree.gd") -const Utils = preload("res://addons/gloot/core/utils.gd") - -# TODO: Replace KEY_WIDTH and KEY_HEIGHT with KEY_SIZE -const KEY_WIDTH: String = "width" -const KEY_HEIGHT: String = "height" -const KEY_SIZE: String = "size" -const KEY_ROTATED: String = "rotated" -const KEY_POSITIVE_ROTATION: String = "positive_rotation" -const KEY_GRID_POSITION: String = "grid_position" +@tool +@icon("res://addons/gloot/images/icon_grid_constraint.svg") +extends InventoryConstraint +class_name GridConstraint +## A constraint that limits the inventory to a 2d grid of a given size. +## +## The constraint implements a grid-based inventory of a configurable size. + +const _Verify = preload("res://addons/gloot/core/verify.gd") +const _QuadTree = preload("res://addons/gloot/core/constraints/quadtree.gd") +const _Utils = preload("res://addons/gloot/core/utils.gd") + +## Default size of the 2d grid. const DEFAULT_SIZE: Vector2i = Vector2i(10, 10) -var _swap_position := Vector2i.ZERO -var _quad_tree := QuadTree.new(size) +const _KEY_SIZE: String = "size" +const _KEY_ROTATED: String = "rotated" +const _KEY_POSITIVE_ROTATION: String = "positive_rotation" +const _KEY_ITEM_POSITIONS: String = "item_positions" +const _KEY_INSERTION_PRIORITY: String = "insertion_priority" -@export var size: Vector2i = DEFAULT_SIZE : +enum {INSERTION_PRIORITY_HORIZONTAL = 0, INSERTION_PRIORITY_VERTICAL = 1} + +var _swap_positions: Array[Vector2i] +var _item_positions := {} +var _quad_tree := _QuadTree.new(size) +var _inventory_set_stack: Array[Callable] + +## The size of the 2d grid. +@export var size: Vector2i = DEFAULT_SIZE: set(new_size): - assert(inventory, "Inventory not set!") assert(new_size.x > 0, "Inventory width must be positive!") assert(new_size.y > 0, "Inventory height must be positive!") var old_size = size @@ -32,82 +38,89 @@ var _quad_tree := QuadTree.new(size) size = old_size if size != old_size: _refresh_quad_tree() - size_changed.emit() + changed.emit() +## Insertion priority. Defines whether items will be stacked horizontally-first or vertically-first when inserted into +## the 2d grid. +@export_enum("Horizontal", "Vertical") var insertion_priority: int = INSERTION_PRIORITY_VERTICAL: + set(new_insertion_priority): + if new_insertion_priority == insertion_priority: + return + insertion_priority = new_insertion_priority + changed.emit() + + +func _push_inventory_set_operation(c: Callable) -> void: + _inventory_set_stack.push_back(c) func _refresh_quad_tree() -> void: - _quad_tree = QuadTree.new(size) + _quad_tree = _QuadTree.new(size) + if !is_instance_valid(inventory): + return for item in inventory.get_items(): _quad_tree.add(get_item_rect(item), item) func _on_inventory_set() -> void: + _item_positions.clear() + while !_inventory_set_stack.is_empty(): + _inventory_set_stack.pop_back().call() _refresh_quad_tree() func _on_item_added(item: InventoryItem) -> void: if item == null: return - _quad_tree.add(get_item_rect(item), item) + if move_item_to_free_spot(item): + _quad_tree.add(get_item_rect(item), item) + else: + inventory.pack_item(item) func _on_item_removed(item: InventoryItem) -> void: _quad_tree.remove(item) + _item_positions.erase(item) -func _on_item_property_changed(item: InventoryItem, property_name: String) -> void: - var relevant_properties = [ - KEY_SIZE, - KEY_ROTATED, - KEY_WIDTH, - KEY_HEIGHT, - KEY_GRID_POSITION, - ] - if property_name in relevant_properties: - _quad_tree.remove(item) - _quad_tree.add(get_item_rect(item), item) +func _on_item_property_changed(item: InventoryItem, property: String) -> void: + if property == _KEY_SIZE: + _refresh_quad_tree() func _on_pre_item_swap(item1: InventoryItem, item2: InventoryItem) -> bool: - if !_size_check(item1, item2): - return false - - if inventory.has_item(item1): - _swap_position = get_item_position(item1) - elif inventory.has_item(item2): - _swap_position = get_item_position(item2) - return true - - -func _size_check(item1: InventoryItem, item2: InventoryItem) -> bool: var inv1 = item1.get_inventory() - var grid_constraint1: GridConstraint = null - if is_instance_valid(inv1): - grid_constraint1 = inv1._constraint_manager.get_grid_constraint() var inv2 = item2.get_inventory() + var grid_constraint1: GridConstraint = null var grid_constraint2: GridConstraint = null + var pos1 = Vector2i.ZERO + var pos2 = Vector2i.ZERO + if is_instance_valid(inv1): + grid_constraint1 = inv1.get_constraint(GridConstraint) + if is_instance_valid(grid_constraint1): + pos1 = grid_constraint1.get_item_position(item1) if is_instance_valid(inv2): - grid_constraint2 = inv2._constraint_manager.get_grid_constraint() - + grid_constraint2 = inv2.get_constraint(GridConstraint) + if is_instance_valid(grid_constraint2): + pos2 = grid_constraint2.get_item_position(item2) + + _swap_positions = [pos1, pos2] if is_instance_valid(grid_constraint1) || is_instance_valid(grid_constraint2): return get_item_size(item1) == get_item_size(item2) return true func _on_post_item_swap(item1: InventoryItem, item2: InventoryItem) -> void: - var has1 := inventory.has_item(item1) - var has2 := inventory.has_item(item2) - if has1 && has2: - var temp_pos = get_item_position(item1) - _move_item_to_unsafe(item1, get_item_position(item2)) - _move_item_to_unsafe(item2, temp_pos) - elif has1: - move_item_to(item1, _swap_position) - elif has2: - move_item_to(item2, _swap_position) + const ITEM1_IDX = 0 + const ITEM2_IDX = 1 + if is_instance_valid(item1.get_inventory()) && is_instance_valid(item1.get_inventory().get_constraint(GridConstraint)): + item1.get_inventory().get_constraint(GridConstraint).set_item_position_unsafe(item1, _swap_positions[ITEM2_IDX]) + if is_instance_valid(item2.get_inventory()) && is_instance_valid(item2.get_inventory().get_constraint(GridConstraint)): + item2.get_inventory().get_constraint(GridConstraint).set_item_position_unsafe(item2, _swap_positions[ITEM1_IDX]) func _bounds_broken() -> bool: + if !is_instance_valid(inventory): + return false for item in inventory.get_items(): if !rect_free(get_item_rect(item), item): return true @@ -115,40 +128,56 @@ func _bounds_broken() -> bool: return false +## Returns the position of the given item on the 2d grid. func get_item_position(item: InventoryItem) -> Vector2i: - return item.get_property(KEY_GRID_POSITION, Vector2i.ZERO) + if !_item_positions.has(item): + return Vector2i.ZERO + return _item_positions[item] -# TODO: Consider making a static "unsafe" version of this +## Sets the position of the given item on the 2d grid. func set_item_position(item: InventoryItem, new_position: Vector2i) -> bool: var new_rect := Rect2i(new_position, get_item_size(item)) if inventory.has_item(item) and !rect_free(new_rect, item): return false - item.set_property(KEY_GRID_POSITION, new_position) + set_item_position_unsafe(item, new_position) return true +## Sets the position of the given item on the 2d grid without any validity checks (somewhat faster than +## set_item_position). +func set_item_position_unsafe(item: InventoryItem, new_position: Vector2i) -> void: + if new_position == get_item_position(item): + return + + _item_positions[item] = new_position + _refresh_quad_tree() + changed.emit() + + +## Returns the size of the given item (i.e. the `size` property). func get_item_size(item: InventoryItem) -> Vector2i: - var result: Vector2i + var result: Vector2i = item.get_property(_KEY_SIZE, Vector2i.ONE) if is_item_rotated(item): - result.x = item.get_property(KEY_HEIGHT, 1) - result.y = item.get_property(KEY_WIDTH, 1) - else: - result.x = item.get_property(KEY_WIDTH, 1) - result.y = item.get_property(KEY_HEIGHT, 1) + var temp := result.x + result.x = result.y + result.y = temp return result +## Checks wether the given item is rotated (i.e. whether the `rotated` property is set). static func is_item_rotated(item: InventoryItem) -> bool: - return item.get_property(KEY_ROTATED, false) + return item.get_property(_KEY_ROTATED, false) +## Checks wether the given item has positive rotation. static func is_item_rotation_positive(item: InventoryItem) -> bool: - return item.get_property(KEY_POSITIVE_ROTATION, false) + return item.get_property(_KEY_POSITIVE_ROTATION, false) # TODO: Consider making a static "unsafe" version of this +## Sets the size of the given item (i.e. the `size` property). func set_item_size(item: InventoryItem, new_size: Vector2i) -> bool: if new_size.x < 1 || new_size.y < 1: return false @@ -157,11 +186,11 @@ func set_item_size(item: InventoryItem, new_size: Vector2i) -> bool: if inventory.has_item(item) and !rect_free(new_rect, item): return false - item.set_property(KEY_WIDTH, new_size.x) - item.set_property(KEY_HEIGHT, new_size.y) + item.set_property(_KEY_SIZE, new_size) return true +## Sets the rotation of the given item (i.e. the `rotated` property). func set_item_rotation(item: InventoryItem, rotated: bool) -> bool: if is_item_rotated(item) == rotated: return false @@ -169,24 +198,27 @@ func set_item_rotation(item: InventoryItem, rotated: bool) -> bool: return false if rotated: - item.set_property(KEY_ROTATED, true) + item.set_property(_KEY_ROTATED, true) else: - item.clear_property(KEY_ROTATED) + item.clear_property(_KEY_ROTATED) return true +## Rotates the given item (i.e. toggles the `rotated` property). func rotate_item(item: InventoryItem) -> bool: return set_item_rotation(item, !is_item_rotated(item)) +## Sets the rotation direction of the given item (positive or negative, i.e. sets the `positive_rotation` property). static func set_item_rotation_direction(item: InventoryItem, positive: bool) -> void: if positive: - item.set_property(KEY_POSITIVE_ROTATION, true) + item.set_property(_KEY_POSITIVE_ROTATION, true) else: - item.clear_property(KEY_POSITIVE_ROTATION) + item.clear_property(_KEY_POSITIVE_ROTATION) +## Checks if the given item can be rotated. func can_rotate_item(item: InventoryItem) -> bool: var rotated_rect := get_item_rect(item) var temp := rotated_rect.size.x @@ -195,12 +227,15 @@ func can_rotate_item(item: InventoryItem) -> bool: return rect_free(rotated_rect, item) +## Returns a rectangle constructed from the position and size of the given item. func get_item_rect(item: InventoryItem) -> Rect2i: var item_pos := get_item_position(item) var item_size := get_item_size(item) return Rect2i(item_pos, item_size) +## Sets the position and size of the given item based on the given rectangle. Returns `false` if the new position and +## size cannot be applied to the item. func set_item_rect(item: InventoryItem, new_rect: Rect2i) -> bool: if !rect_free(new_rect, item): return false @@ -213,27 +248,12 @@ func set_item_rect(item: InventoryItem, new_rect: Rect2i) -> bool: func _get_prototype_size(prototype_id: String) -> Vector2i: assert(inventory != null, "Inventory not set!") - assert(inventory.item_protoset != null, "Inventory protoset is null!") - var width: int = inventory.item_protoset.get_prototype_property(prototype_id, KEY_WIDTH, 1) - var height: int = inventory.item_protoset.get_prototype_property(prototype_id, KEY_HEIGHT, 1) - return Vector2i(width, height) - - -func _is_sorted() -> bool: - assert(inventory != null, "Inventory not set!") - for item1 in inventory.get_items(): - for item2 in inventory.get_items(): - if item1 == item2: - continue - - var rect1: Rect2i = get_item_rect(item1) - var rect2: Rect2i = get_item_rect(item2) - if rect1.intersects(rect2): - return false; - - return true + assert(inventory.protoset != null, "Inventory protoset is null!") + var size: Vector2i = inventory.get_prototree().get_prototype_property(prototype_id, _KEY_SIZE, Vector2i.ONE) + return size +## Adds the given item to the inventory and sets its position. func add_item_at(item: InventoryItem, position: Vector2i) -> bool: assert(inventory != null, "Inventory not set!") @@ -242,12 +262,14 @@ func add_item_at(item: InventoryItem, position: Vector2i) -> bool: if rect_free(rect): if not inventory.add_item(item): return false - assert(move_item_to(item, position), "Can't move the item to the given place!") + var success = move_item_to(item, position) + assert(success, "Can't move the item to the given place!") return true return false +## Creates and adds the given item to the inventory and sets its position. func create_and_add_item_at(prototype_id: String, position: Vector2i) -> InventoryItem: assert(inventory != null, "Inventory not set!") var item_rect := Rect2i(position, _get_prototype_size(prototype_id)) @@ -265,6 +287,7 @@ func create_and_add_item_at(prototype_id: String, position: Vector2i) -> Invento return item +## Returns the item at the given grid position. Returns `null` if no item can be found at that position. func get_item_at(position: Vector2i) -> InventoryItem: assert(inventory != null, "Inventory not set!") var first = _quad_tree.get_first(position) @@ -273,6 +296,7 @@ func get_item_at(position: Vector2i) -> InventoryItem: return first.metadata +## Returns an array of items under the given rectangle. func get_items_under(rect: Rect2i) -> Array[InventoryItem]: assert(inventory != null, "Inventory not set!") var result: Array[InventoryItem] @@ -283,18 +307,20 @@ func get_items_under(rect: Rect2i) -> Array[InventoryItem]: return result +## Moves the given item to a new position. Returns `false` if the item cannot be moved. func move_item_to(item: InventoryItem, position: Vector2i) -> bool: assert(inventory != null, "Inventory not set!") var item_size := get_item_size(item) var rect := Rect2i(position, item_size) if rect_free(rect, item): - _move_item_to_unsafe(item, position) - inventory.contents_changed.emit() + set_item_position_unsafe(item, position) + changed.emit() return true return false +## Moves the given item to a free spot. Returns `false` if no free spot can be found. func move_item_to_free_spot(item: InventoryItem) -> bool: if rect_free(get_item_rect(item), item): return true @@ -303,28 +329,7 @@ func move_item_to_free_spot(item: InventoryItem) -> bool: if not free_place.success: return false - _move_item_to_unsafe(item, free_place.position) - return true - - -func _move_item_to_unsafe(item: InventoryItem, position: Vector2i) -> void: - item.set_property(KEY_GRID_POSITION, position) - if item.get_property(KEY_GRID_POSITION) == Vector2i.ZERO: - item.clear_property(KEY_GRID_POSITION) - - -func transfer_to(item: InventoryItem, destination: GridConstraint, position: Vector2i) -> bool: - assert(inventory != null, "Inventory not set!") - assert(destination.inventory != null, "Destination inventory not set!") - var item_size = get_item_size(item) - var rect := Rect2i(position, item_size) - if destination.rect_free(rect) && destination.add_item_at(item, position): - return true - - if _merge_to(item, destination, position): - return true - - return InventoryItem.swap(item, destination.get_item_at(position)) + return move_item_to(item, free_place.position) func _merge_to(item: InventoryItem, destination: GridConstraint, position: Vector2i) -> bool: @@ -332,17 +337,14 @@ func _merge_to(item: InventoryItem, destination: GridConstraint, position: Vecto if item_dst == null: return false - return inventory._constraint_manager.get_stacks_constraint().join_stacks(item_dst, item) - + return item.merge_into(item_dst) + func _get_mergable_item_at(item: InventoryItem, position: Vector2i) -> InventoryItem: - if inventory._constraint_manager.get_stacks_constraint() == null: - return null - var rect := Rect2i(position, get_item_size(item)) var mergable_items := _get_mergable_items_under(item, rect) for mergable_item in mergable_items: - if inventory._constraint_manager.get_stacks_constraint().stacks_joinable(item, mergable_item): + if item.can_merge_into(mergable_item): return mergable_item return null @@ -353,12 +355,14 @@ func _get_mergable_items_under(item: InventoryItem, rect: Rect2i) -> Array[Inven for item_dst in get_items_under(rect): if item_dst == item: continue - if StacksConstraint.items_mergable(item_dst, item): + if item.can_merge_into(item_dst): result.append(item_dst) return result +## Checks if the given rectangle is free (i.e. no items can be found under it). The `exception` item will be disregarded +## during the check, if set. func rect_free(rect: Rect2i, exception: InventoryItem = null) -> bool: assert(inventory != null, "Inventory not set!") @@ -373,16 +377,31 @@ func rect_free(rect: Rect2i, exception: InventoryItem = null) -> bool: # TODO: Check if this is needed after adding find_free_space +## Finds a place for the given item. The `exception` item will be disregarded during the search, if set. Returns a +## dictionary containing two fields: `success` and `position`. `success` will be set to `false` if not free place can be +## found and to `true` otherwise. If `success` is true the `position` field contains the resulting coordinates. func find_free_place(item: InventoryItem, exception: InventoryItem = null) -> Dictionary: var result := {success = false, position = Vector2i(-1, -1)} var item_size = get_item_size(item) - for x in range(size.x - (item_size.x - 1)): + + var check_position := func(pos: Vector2i) -> bool: + var rect := Rect2i(pos, item_size) + if rect_free(rect, exception): + result.success = true + result.position = pos + return true + return false + + if insertion_priority == INSERTION_PRIORITY_VERTICAL: + for x in range(size.x - (item_size.x - 1)): + for y in range(size.y - (item_size.y - 1)): + if check_position.call(Vector2i(x, y)): + return result + else: for y in range(size.y - (item_size.y - 1)): - var rect := Rect2i(Vector2i(x, y), item_size) - if rect_free(rect, exception): - result.success = true - result.position = Vector2i(x, y) - return result + for x in range(size.x - (item_size.x - 1)): + if check_position.call(Vector2i(x, y)): + return result return result @@ -393,6 +412,7 @@ func _compare_items(item1: InventoryItem, item2: InventoryItem) -> bool: return rect1.get_area() > rect2.get_area() +## Sorts the inventory based on item size. func sort() -> bool: assert(inventory != null, "Inventory not set!") @@ -402,7 +422,7 @@ func sort() -> bool: item_array.sort_custom(_compare_items) for item in item_array: - _move_item_to_unsafe(item, -get_item_size(item)) + set_item_position_unsafe(item, -get_item_size(item)) for item in item_array: var free_place := find_free_place(item) @@ -413,28 +433,46 @@ func sort() -> bool: return true -func _sort_if_needed() -> void: - if !_is_sorted() || _bounds_broken(): - sort() +## Returns the number of times this constraint can receive the given item. +func get_space_for(item: InventoryItem) -> int: + var result = _get_free_space_for(item) * item.get_max_stack_size() + for i in inventory.get_items(): + if item.can_merge_into(i, true): + result += i.get_free_stack_space() + + return result -func get_space_for(item: InventoryItem) -> ItemCount: - var occupied_rects: Array[Rect2i] - var item_size = get_item_size(item) +func _get_free_space_for(item: InventoryItem) -> int: + var item_size = get_item_size(item) + var occupied_rects: Array[Rect2i] var free_space := find_free_space(item_size, occupied_rects) + while free_space.success: occupied_rects.append(Rect2i(free_space.position, item_size)) free_space = find_free_space(item_size, occupied_rects) - return ItemCount.new(occupied_rects.size()) - + return occupied_rects.size() + +## Checks if the constraint can receive the given item. func has_space_for(item: InventoryItem) -> bool: - var item_size = get_item_size(item) - return find_free_space(item_size).success + var item_size = get_item_size(item) + + if find_free_space(item_size).success: + return true + + var total_free_stack_space = 0 + for i in inventory.get_items(): + if item.compatible_with(i): + total_free_stack_space += i.get_free_stack_space() + return total_free_stack_space >= item.get_stack_size() # TODO: Check if find_free_place is needed +## Finds a place for the given item with regard to the given occupied rectangles. Returns a dictionary containing two +## fields: `success` and `position`. `success` will be set to `false` if not free place can be found and to `true` +## otherwise. If `success` is true the `position` field contains the resulting coordinates. func find_free_space(item_size: Vector2i, occupied_rects: Array[Rect2i] = []) -> Dictionary: var result := {success = false, position = Vector2i(-1, -1)} for x in range(size.x - (item_size.x - 1)): @@ -455,27 +493,61 @@ static func _rect_intersects_rect_array(rect: Rect2i, occupied_rects: Array[Rect return false +## Resets the constraint, i.e. sets its size to default (`Vector2i(10, 10)`). func reset() -> void: size = DEFAULT_SIZE + _quad_tree = _QuadTree.new(size) + _item_positions.clear() + insertion_priority = INSERTION_PRIORITY_VERTICAL +## Serializes the constraint into a `Dictionary`. func serialize() -> Dictionary: var result := {} # Store Vector2i as string to make JSON conversion easier later - result[KEY_SIZE] = var_to_str(size) + result[_KEY_SIZE] = var_to_str(size) + result[_KEY_ITEM_POSITIONS] = _serialize_item_positions() + if insertion_priority == INSERTION_PRIORITY_HORIZONTAL: + result[_KEY_INSERTION_PRIORITY] = int(insertion_priority) + + return result + +func _serialize_item_positions() -> Dictionary: + var result = {} + for item in _item_positions.keys(): + var str_item_index := var_to_str(inventory.get_item_index(item)) + var str_item_position = var_to_str(_item_positions[item]) + result[str_item_index] = str_item_position return result +## Loads the constraint data from the given `Dictionary`. func deserialize(source: Dictionary) -> bool: - if !Verify.dict(source, true, KEY_SIZE, TYPE_STRING): + if !_Verify.dict(source, true, _KEY_SIZE, TYPE_STRING) || \ + !_Verify.dict(source, false, _KEY_INSERTION_PRIORITY, [TYPE_INT, TYPE_FLOAT]): return false reset() - var s: Vector2i = Utils.str_to_var(source[KEY_SIZE]) - self.size = s + # Queue this part of the deserialization for later if the inventory is still not set + if is_instance_valid(inventory): + _deserialize_item_positions(source[_KEY_ITEM_POSITIONS]) + else: + _push_inventory_set_operation(_deserialize_item_positions.bind(source[_KEY_ITEM_POSITIONS].duplicate())) + + size = _Utils.str_to_var(source[_KEY_SIZE]) + if source.has(_KEY_INSERTION_PRIORITY): + insertion_priority = int(source[_KEY_INSERTION_PRIORITY]) return true + +func _deserialize_item_positions(source: Dictionary) -> bool: + for str_item_index in source.keys(): + var item_index: int = _Utils.str_to_var(str_item_index) + var item := inventory.get_items()[item_index] + var item_position = _Utils.str_to_var(source[str_item_index]) + set_item_position_unsafe(item, item_position) + return true diff --git a/addons/gloot/core/constraints/grid_constraint.gd.uid b/addons/gloot/core/constraints/grid_constraint.gd.uid new file mode 100644 index 0000000..13e9fe0 --- /dev/null +++ b/addons/gloot/core/constraints/grid_constraint.gd.uid @@ -0,0 +1 @@ +uid://rk48gcn3clet diff --git a/addons/gloot/core/constraints/inventory_constraint.gd b/addons/gloot/core/constraints/inventory_constraint.gd index 77f2dfc..f006ac0 100644 --- a/addons/gloot/core/constraints/inventory_constraint.gd +++ b/addons/gloot/core/constraints/inventory_constraint.gd @@ -1,67 +1,99 @@ -extends Object - -var inventory: Inventory = null : +@tool +extends Node +class_name InventoryConstraint +## Base inventory constraint class. +## +## Base inventory constraint class which implements some basic constraint functionality and defines methods that can be +## overridden. + +## Emitted when the state of the constraint has changed. +signal changed + +## Reference to an inventory that this constraint belongs to. +var inventory: Inventory = null: set(new_inventory): - assert(new_inventory != null, "Can't set inventory to null!") - assert(inventory == null, "Inventory already set!") inventory = new_inventory - _on_inventory_set() + if is_instance_valid(inventory): + _on_inventory_set() -func _init(inventory_: Inventory) -> void: - inventory = inventory_ +func _notification(what: int) -> void: + if what == NOTIFICATION_PARENTED: + _on_parented(get_parent()) + elif what == NOTIFICATION_UNPARENTED: + _on_unparented() -# Override this -func get_space_for(item: InventoryItem) -> ItemCount: - return ItemCount.zero() +func _on_parented(parent: Node) -> void: + if parent is Inventory: + inventory = parent + inventory._on_constraint_added(self) + else: + inventory = null + update_configuration_warnings() -# Override this -func has_space_for(item:InventoryItem) -> bool: - return false +func _on_unparented() -> void: + if inventory == null: + return + inventory._on_constraint_removed(self) + inventory = null + update_configuration_warnings() -# Override this -func reset() -> void: - pass +func _get_configuration_warnings() -> PackedStringArray: + if inventory == null: + return PackedStringArray([ + "InventoryConstraint nodes only serve to provide constraints to Inventory nodes. Please only use them as " \ + + "children of Inventory nodes."]) + return PackedStringArray() + + +## Returns the number of times this constraint can receive the given item. +func get_space_for(item: InventoryItem) -> int: + return 0 + + +## Checks if the constraint can receive the given item. +func has_space_for(item: InventoryItem) -> bool: + return false -# Override this +## Serializes the constraint into a `Dictionary`. func serialize() -> Dictionary: return {} -# Override this +## Loads the constraint data from the given `Dictionary`. func deserialize(source: Dictionary) -> bool: return true -# Override this +## Called when constraint inventory is set/changed. func _on_inventory_set() -> void: pass -# Override this +## Called when an item is added to the inventory. func _on_item_added(item: InventoryItem) -> void: pass -# Override this +## Called when an item is removed from the inventory. func _on_item_removed(item: InventoryItem) -> void: pass -# Override this -func _on_item_property_changed(item: InventoryItem, property_name: String) -> void: +## Called when an item property has changed. +func _on_item_property_changed(item: InventoryItem, property: String) -> void: pass -# Override this +## Called before the two given items are swapped. func _on_pre_item_swap(item1: InventoryItem, item2: InventoryItem) -> bool: return true -# Override this +## Called after the two given items have been swapped. func _on_post_item_swap(item1: InventoryItem, item2: InventoryItem) -> void: pass diff --git a/addons/gloot/core/constraints/inventory_constraint.gd.uid b/addons/gloot/core/constraints/inventory_constraint.gd.uid new file mode 100644 index 0000000..52c7f95 --- /dev/null +++ b/addons/gloot/core/constraints/inventory_constraint.gd.uid @@ -0,0 +1 @@ +uid://ywmav23pfy8k diff --git a/addons/gloot/core/constraints/item_count_constraint.gd b/addons/gloot/core/constraints/item_count_constraint.gd new file mode 100644 index 0000000..d4f5f72 --- /dev/null +++ b/addons/gloot/core/constraints/item_count_constraint.gd @@ -0,0 +1,78 @@ +@tool +@icon("res://addons/gloot/images/icon_item_count_constraint.svg") +extends InventoryConstraint +class_name ItemCountConstraint +## A constraint that limits the inventory to a given item stack count. +## +## The constraint implements a count-based inventory where the total number of item stacks cannot exceed the configured +## capacity of the inventory. + +const _Verify = preload("res://addons/gloot/core/verify.gd") + +## Default capacity. +const DEFAULT_CAPACITY = 1 + +const _KEY_CAPACITY: String = "capacity" + +## Maximum number of item stacks the inventory can hold. +@export var capacity: int = DEFAULT_CAPACITY: + set(new_capacity): + if new_capacity < 1: + new_capacity = 1 + if new_capacity == capacity: + return + if new_capacity > 0.0 && get_occupied_space() > new_capacity: + return + capacity = new_capacity + changed.emit() + + +## Returns the number of item stacks that can be added to the inventory. +func get_free_space() -> int: + return max(0, capacity - get_occupied_space()) + + +## Returns the total number of item stacks in the inventory. +func get_occupied_space() -> int: + if !is_instance_valid(inventory): + return 0 + return inventory.get_item_count() + + +## Returns the number of times this constraint can receive the given item. +func get_space_for(item: InventoryItem) -> int: + var free_stack_space := 0 + for i in inventory.get_items(): + if item.can_merge_into(i): + free_stack_space += i.get_free_stack_space() + + var free_space = get_free_space() * item.get_max_stack_size() + return free_stack_space + free_space + + +## Checks if the constraint can receive the given item. +func has_space_for(item: InventoryItem) -> bool: + return get_occupied_space() < capacity || get_space_for(item) > 0 + + +## Resets the constraint, i.e. sets its capacity to default (`1`). +func reset() -> void: + capacity = DEFAULT_CAPACITY + + +## Serializes the constraint into a `Dictionary`. +func serialize() -> Dictionary: + var result := {} + result[_KEY_CAPACITY] = capacity + return result + + +## Loads the constraint data from the given `Dictionary`. +func deserialize(source: Dictionary) -> bool: + if !_Verify.dict(source, true, _KEY_CAPACITY, [TYPE_INT, TYPE_FLOAT]): + return false + + reset() + capacity = source[_KEY_CAPACITY] + + return true diff --git a/addons/gloot/core/constraints/item_count_constraint.gd.uid b/addons/gloot/core/constraints/item_count_constraint.gd.uid new file mode 100644 index 0000000..86a3809 --- /dev/null +++ b/addons/gloot/core/constraints/item_count_constraint.gd.uid @@ -0,0 +1 @@ +uid://catvy2gpuw1gg diff --git a/addons/gloot/core/constraints/item_map.gd b/addons/gloot/core/constraints/item_map.gd deleted file mode 100644 index eee718b..0000000 --- a/addons/gloot/core/constraints/item_map.gd +++ /dev/null @@ -1,85 +0,0 @@ -var map: Array -var _free_fields: int -var free_fields : - get: - return _free_fields - set(new_free_fields): - assert(false, "free_fields is read-only!") - - -func _init(size: Vector2i) -> void: - resize(size) - - -func resize(size: Vector2i) -> void: - map = [] - map.resize(size.x) - for i in map.size(): - map[i] = [] - map[i].resize(size.y) - _free_fields = size.x * size.y - - -func fill_rect(rect: Rect2i, value) -> void: - assert(value != null, "Can't fill with null!") - _fill_rect_unsafe(rect, value) - - -func _fill_rect_unsafe(rect: Rect2i, value) -> void: - for x in range(rect.size.x): - for y in range(rect.size.y): - var map_coords := Vector2i(rect.position.x + x, rect.position.y + y) - if !contains(map_coords): - continue - if map[map_coords.x][map_coords.y] != value: - if value == null: - _free_fields += 1 - else: - _free_fields -= 1 - map[map_coords.x][map_coords.y] = value - - -func clear_rect(rect: Rect2i) -> void: - _fill_rect_unsafe(rect, null) - - -func print() -> void: - if map.is_empty(): - return - var output: String - var size = get_size() - for j in range(size.y): - for i in range(size.x): - if map[i][j]: - output = output + "x" - else: - output = output + "." - output = output + "\n" - print(output + "\n") - - -func clear() -> void: - for column in map: - column.fill(null) - var size = get_size() - _free_fields = size.x * size.y - - -func contains(position: Vector2i) -> bool: - if map.is_empty(): - return false - - var size = get_size() - return (position.x >= 0) && (position.y >= 0) && (position.x < size.x) && (position.y < size.y) - - -func get_field(position: Vector2i): - assert(contains(position), "%s out of bounds!" % position) - return map[position.x][position.y] - - -func get_size() -> Vector2i: - if map.is_empty(): - return Vector2i.ZERO - return Vector2i(map.size(), map[0].size()) - diff --git a/addons/gloot/core/constraints/quadtree.gd b/addons/gloot/core/constraints/quadtree.gd index b610e78..7e11d64 100644 --- a/addons/gloot/core/constraints/quadtree.gd +++ b/addons/gloot/core/constraints/quadtree.gd @@ -1,4 +1,3 @@ - class QtRect: var rect: Rect2i var metadata: Variant diff --git a/addons/gloot/core/constraints/quadtree.gd.uid b/addons/gloot/core/constraints/quadtree.gd.uid new file mode 100644 index 0000000..0d8c5d6 --- /dev/null +++ b/addons/gloot/core/constraints/quadtree.gd.uid @@ -0,0 +1 @@ +uid://c8wauomqxb5j6 diff --git a/addons/gloot/core/constraints/stacks_constraint.gd b/addons/gloot/core/constraints/stacks_constraint.gd deleted file mode 100644 index 705162e..0000000 --- a/addons/gloot/core/constraints/stacks_constraint.gd +++ /dev/null @@ -1,312 +0,0 @@ -extends "res://addons/gloot/core/constraints/inventory_constraint.gd" - -const WeightConstraint = preload("res://addons/gloot/core/constraints/weight_constraint.gd") -const GridConstraint = preload("res://addons/gloot/core/constraints/grid_constraint.gd") - -const KEY_STACK_SIZE: String = "stack_size" -const KEY_MAX_STACK_SIZE: String = "max_stack_size" - -const DEFAULT_STACK_SIZE: int = 1 -# TODO: Consider making the default max stack size 1 -const DEFAULT_MAX_STACK_SIZE: int = 100 - -enum MergeResult {SUCCESS = 0, FAIL, PARTIAL} - - -# TODO: Check which util functions can be made private -# TODO: Consider making these util methods work with ItemCount -static func _get_free_stack_space(item: InventoryItem) -> int: - assert(item != null, "item is null!") - return get_item_max_stack_size(item) - get_item_stack_size(item) - - -static func _has_custom_property(item: InventoryItem, property: String, value) -> bool: - assert(item != null, "item is null!") - return item.properties.has(property) && item.properties[property] == value; - - -static func get_item_stack_size(item: InventoryItem) -> int: - assert(item != null, "item is null!") - return item.get_property(KEY_STACK_SIZE, DEFAULT_STACK_SIZE) - - -static func get_item_max_stack_size(item: InventoryItem) -> int: - assert(item != null, "item is null!") - return item.get_property(KEY_MAX_STACK_SIZE, DEFAULT_MAX_STACK_SIZE) - - -static func set_item_stack_size(item: InventoryItem, stack_size: int) -> bool: - assert(item != null, "item is null!") - assert(stack_size >= 0, "stack_size can't be negative!") - if stack_size > get_item_max_stack_size(item): - return false - if stack_size == 0: - var inventory: Inventory = item.get_inventory() - if inventory != null: - inventory.remove_item(item) - item.queue_free() - return true - item.set_property(KEY_STACK_SIZE, stack_size) - return true - - -static func set_item_max_stack_size(item: InventoryItem, max_stack_size: int) -> void: - assert(item != null, "item is null!") - assert(max_stack_size > 0, "max_stack_size can't be less than 1!") - item.set_property(KEY_MAX_STACK_SIZE, max_stack_size) - - -static func get_prototype_stack_size(protoset: ItemProtoset, prototype_id: String) -> int: - assert(protoset != null, "protoset is null!") - return protoset.get_prototype_property(prototype_id, KEY_STACK_SIZE, 1.0) - - -static func get_prototype_max_stack_size(protoset: ItemProtoset, prototype_id: String) -> int: - assert(protoset != null, "protoset is null!") - return protoset.get_prototype_property(prototype_id, KEY_MAX_STACK_SIZE, 1.0) - - -func get_mergable_items(item: InventoryItem) -> Array[InventoryItem]: - assert(inventory != null, "Inventory not set!") - assert(item != null, "item is null!") - - var result: Array[InventoryItem] = [] - - for i in inventory.get_items(): - if i == item: - continue - if !items_mergable(i, item): - continue - - result.append(i) - - return result - - -static func items_mergable(item_1: InventoryItem, item_2: InventoryItem) -> bool: - # Two item stacks are mergable if they have the same prototype ID and neither of the two contain - # custom properties that the other one doesn't have (except for "stack_size", "max_stack_size", - # "grid_position", or "weight"). - assert(item_1 != null, "item_1 is null!") - assert(item_2 != null, "item_2 is null!") - - var ignore_properies: Array[String] = [ - KEY_STACK_SIZE, - KEY_MAX_STACK_SIZE, - GridConstraint.KEY_GRID_POSITION, - WeightConstraint.KEY_WEIGHT - ] - - if item_1.prototype_id != item_2.prototype_id: - return false - - for property in item_1.properties.keys(): - if property in ignore_properies: - continue - if !_has_custom_property(item_2, property, item_1.properties[property]): - return false - - for property in item_2.properties.keys(): - if property in ignore_properies: - continue - if !_has_custom_property(item_1, property, item_2.properties[property]): - return false - - return true - - -func add_item_automerge( - item: InventoryItem, - ignore_properies: Array[String] = [] -) -> bool: - assert(item != null, "Item is null!") - assert(inventory != null, "Inventory not set!") - if !inventory._constraint_manager.has_space_for(item): - return false - - var target_items = get_mergable_items(item) - for target_item in target_items: - if _merge_stacks(target_item, item) == MergeResult.SUCCESS: - return true - - assert(inventory.add_item(item)) - return true - - -static func _merge_stacks(item_dst: InventoryItem, item_src: InventoryItem) -> int: - assert(item_dst != null, "item_dst is null!") - assert(item_src != null, "item_src is null!") - assert(items_mergable(item_dst, item_src), "Items must be mergable!") - - var src_size: int = get_item_stack_size(item_src) - assert(src_size > 0, "Item stack size must be greater than 0!") - - var dst_size: int = get_item_stack_size(item_dst) - var dst_max_size: int = get_item_max_stack_size(item_dst) - var free_dst_stack_space: int = dst_max_size - dst_size - if free_dst_stack_space <= 0: - return MergeResult.FAIL - - assert(set_item_stack_size(item_src, max(src_size - free_dst_stack_space, 0))) - assert(set_item_stack_size(item_dst, min(dst_size + src_size, dst_max_size))) - - if free_dst_stack_space >= src_size: - return MergeResult.SUCCESS - - return MergeResult.PARTIAL - - -static func split_stack(item: InventoryItem, new_stack_size: int) -> InventoryItem: - assert(item != null, "item is null!") - assert(new_stack_size >= 1, "New stack size must be greater or equal to 1!") - - var stack_size = get_item_stack_size(item) - assert(stack_size > 1, "Size of the item stack must be greater than 1!") - assert( - new_stack_size < stack_size, - "New stack size must be smaller than the original stack size!" - ) - - var new_item = item.duplicate() - if new_item.get_parent(): - new_item.get_parent().remove_child(new_item) - - assert(set_item_stack_size(new_item, new_stack_size)) - assert(set_item_stack_size(item, stack_size - new_stack_size)) - return new_item - - -# TODO: Rename this -func split_stack_safe(item: InventoryItem, new_stack_size: int) -> InventoryItem: - assert(inventory != null, "inventory is null!") - assert(inventory.has_item(item), "The inventory does not contain the given item!") - - var new_item = split_stack(item, new_stack_size) - if new_item: - assert(inventory.add_item(new_item)) - return new_item - - -static func join_stacks( - item_dst: InventoryItem, - item_src: InventoryItem -) -> bool: - if item_dst == null || item_src == null: - return false - - if (!stacks_joinable(item_dst, item_src)): - return false - - # TODO: Check if this can be an assertion - _merge_stacks(item_dst, item_src) - return true - - -static func stacks_joinable( - item_dst: InventoryItem, - item_src: InventoryItem -) -> bool: - assert(item_dst != null, "item_dst is null!") - assert(item_src != null, "item_src is null!") - - if not items_mergable(item_dst, item_src): - return false - - var dst_free_space = _get_free_stack_space(item_dst) - if dst_free_space < get_item_stack_size(item_src): - return false - - return true - - -func get_space_for(item: InventoryItem) -> ItemCount: - return ItemCount.inf() - - -func has_space_for(item: InventoryItem) -> bool: - return true - - -func get_free_stack_space_for(item: InventoryItem) -> ItemCount: - assert(inventory != null, "Inventory not set!") - - var item_count = ItemCount.zero() - var mergable_items = get_mergable_items(item) - for mergable_item in mergable_items: - var free_stack_space := _get_free_stack_space(mergable_item) - item_count.add(ItemCount.new(free_stack_space)) - return item_count - - -static func pack_item(item: InventoryItem) -> void: - if !is_instance_valid(item.get_inventory()): - return - - var sc := item.get_inventory()._constraint_manager.get_stacks_constraint() - if sc == null: - return - - var mergable_items = sc.get_mergable_items(item) - for mergable_item in mergable_items: - var merge_result := _merge_stacks(mergable_item, item) - if merge_result == MergeResult.SUCCESS: - return - - -func transfer_autosplit(item: InventoryItem, destination: Inventory) -> InventoryItem: - assert(inventory._constraint_manager.get_configuration() == destination._constraint_manager.get_configuration()) - if inventory.transfer(item, destination): - return item - - var stack_size := get_item_stack_size(item) - if stack_size <= 1: - return null - - var item_count := _get_space_for_single_item(destination, item) - assert(!item_count.eq(ItemCount.inf()), "Item count shouldn't be infinite!") - - if item_count.le(ItemCount.zero()): - return null - - var new_item: InventoryItem = split_stack(item, item_count.count) - assert(new_item != null) - - assert(destination.add_item(new_item)) - return new_item - - -func _get_space_for_single_item(inventory: Inventory, item: InventoryItem) -> ItemCount: - var single_item := item.duplicate() - assert(set_item_stack_size(single_item, 1)) - var count := inventory._constraint_manager.get_space_for(single_item) - single_item.free() - return count - - -func transfer_autosplitmerge(item: InventoryItem, destination: Inventory) -> bool: - if destination._constraint_manager.has_space_for(item): - # No need for splitting - return transfer_automerge(item, destination) - - var item_count := _get_space_for_single_item(destination, item) - if item_count.eq(ItemCount.zero()): - return false - var new_item: InventoryItem = split_stack(item, item_count.count) - assert(transfer_automerge(new_item, destination)) - return true - - -func transfer_automerge(item: InventoryItem, destination: Inventory) -> bool: - assert(inventory._constraint_manager.get_configuration() == destination._constraint_manager.get_configuration()) - - if !destination._constraint_manager.has_space_for(item): - return false - for i in destination.get_items(): - if items_mergable(i, item): - _merge_stacks(i, item) - if item.is_queued_for_deletion(): - # Stack size reached 0 - return true - assert(destination.add_item(item)) - return true - diff --git a/addons/gloot/core/constraints/weight_constraint.gd b/addons/gloot/core/constraints/weight_constraint.gd index 84b3cf5..5d60e34 100644 --- a/addons/gloot/core/constraints/weight_constraint.gd +++ b/addons/gloot/core/constraints/weight_constraint.gd @@ -1,37 +1,40 @@ -extends "res://addons/gloot/core/constraints/inventory_constraint.gd" +@tool +@icon("res://addons/gloot/images/icon_weight_constraint.svg") +extends InventoryConstraint +class_name WeightConstraint +## A constraint that limits the inventory to a given weight capacity. +## +## The constraint implements a weight-based inventory where the total sum of the item weights cannot exceed the +## configured capacity of the inventory. -signal capacity_changed -signal occupied_space_changed +## Default capacity. +const DEFAULT_CAPACITY: float = 1.0 -const KEY_WEIGHT: String = "weight" -const KEY_CAPACITY: String = "capacity" -const KEY_OCCUPIED_SPACE: String = "occupied_space" +const _KEY_WEIGHT: String = "weight" +const _KEY_CAPACITY: String = "capacity" +const _KEY_OCCUPIED_SPACE: String = "occupied_space" -const Verify = preload("res://addons/gloot/core/verify.gd") -const StacksConstraint = preload("res://addons/gloot/core/constraints/stacks_constraint.gd") +const _Verify = preload("res://addons/gloot/core/verify.gd") -var capacity: float : +## Maximum weight the inventory can hold. +@export var capacity: float = DEFAULT_CAPACITY: set(new_capacity): if new_capacity < 0.0: new_capacity = 0.0 if new_capacity == capacity: return - if new_capacity > 0.0 && occupied_space > new_capacity: + if new_capacity > 0.0 && _occupied_space > new_capacity: return capacity = new_capacity - capacity_changed.emit() + changed.emit() var _occupied_space: float -var occupied_space: float : - get: - return _occupied_space - set(new_occupied_space): - assert(false, "occupied_space is read-only!") -func _init(inventory: Inventory) -> void: - super._init(inventory) +## Returns the total sum of the item weights. +func get_occupied_space() -> float: + return _occupied_space func _on_inventory_set() -> void: @@ -46,12 +49,8 @@ func _on_item_removed(item: InventoryItem) -> void: _calculate_occupied_space() -func _on_item_property_changed(item: InventoryItem, property_name: String) -> void: - var relevant_properties = [ - KEY_WEIGHT, - StacksConstraint.KEY_STACK_SIZE, - ] - if property_name in relevant_properties: +func _on_item_property_changed(item: InventoryItem, property: String) -> void: + if property == _KEY_WEIGHT || property == Inventory._KEY_STACK_SIZE: _calculate_occupied_space() @@ -64,25 +63,16 @@ static func _can_swap(item_dst: InventoryItem, item_src: InventoryItem) -> bool: if !is_instance_valid(inv): return true - var weight_constraint = inv._constraint_manager.get_weight_constraint() + var weight_constraint = inv._constraint_manager.get_constraint(WeightConstraint) if !is_instance_valid(weight_constraint): return true - if weight_constraint.has_unlimited_capacity(): - return true - - var space_needed: float = weight_constraint.occupied_space - get_item_weight(item_dst) + get_item_weight(item_src) + var space_needed: float = weight_constraint._occupied_space - get_item_weight(item_dst) + get_item_weight(item_src) return space_needed <= weight_constraint.capacity -func has_unlimited_capacity() -> bool: - return capacity == 0.0 - - +## Returns the available space in the inventory. func get_free_space() -> float: - if has_unlimited_capacity(): - return capacity - var free_space: float = capacity - _occupied_space if free_space < 0.0: free_space = 0.0 @@ -92,70 +82,68 @@ func get_free_space() -> float: func _calculate_occupied_space() -> void: var old_occupied_space = _occupied_space _occupied_space = 0.0 - for item in inventory.get_items(): - _occupied_space += get_item_weight(item) + if is_instance_valid(inventory): + for item in inventory.get_items(): + _occupied_space += get_item_weight(item) if _occupied_space != old_occupied_space: - emit_signal("occupied_space_changed") + changed.emit() if !Engine.is_editor_hint(): - assert(has_unlimited_capacity() || _occupied_space <= capacity, "Inventory overflow!") + assert(_occupied_space <= capacity, "Inventory overflow!") static func _get_item_unit_weight(item: InventoryItem) -> float: - var weight = item.get_property(KEY_WEIGHT, 1.0) + var weight = item.get_property(_KEY_WEIGHT, 1.0) return weight +## Returns the weight of the given item (i.e. the `weight` property). static func get_item_weight(item: InventoryItem) -> float: if item == null: return -1.0 - return StacksConstraint.get_item_stack_size(item) * _get_item_unit_weight(item) + # TODO: Handle infinity? + return item.get_stack_size() * _get_item_unit_weight(item) +## Sets the weight of the given item (i.e. the `weight` property). static func set_item_weight(item: InventoryItem, weight: float) -> void: assert(weight >= 0.0, "Item weight must be greater or equal to 0!") - item.set_property(KEY_WEIGHT, weight) + item.set_property(_KEY_WEIGHT, weight) -func get_space_for(item: InventoryItem) -> ItemCount: - if has_unlimited_capacity(): - return ItemCount.inf() - var unit_weight := _get_item_unit_weight(item) - return ItemCount.new(floor(get_free_space() / unit_weight)) +## Returns the number of times this constraint can receive the given item. +func get_space_for(item: InventoryItem) -> int: + return floor(get_free_space() / _get_item_unit_weight(item)) +## Checks if the constraint can receive the given item. func has_space_for(item: InventoryItem) -> bool: - if has_unlimited_capacity(): - return true var item_weight := get_item_weight(item) return get_free_space() >= item_weight +## Resets the constraint, i.e. sets its capacity to default (`1.0`). func reset() -> void: - capacity = 0.0 + capacity = DEFAULT_CAPACITY +## Serializes the constraint into a `Dictionary`. func serialize() -> Dictionary: var result := {} - result[KEY_CAPACITY] = capacity - # TODO: Check if this is needed - result[KEY_OCCUPIED_SPACE] = _occupied_space + result[_KEY_CAPACITY] = capacity return result +## Loads the constraint data from the given `Dictionary`. func deserialize(source: Dictionary) -> bool: - if !Verify.dict(source, true, KEY_CAPACITY, TYPE_FLOAT) ||\ - !Verify.dict(source, true, KEY_OCCUPIED_SPACE, TYPE_FLOAT): + if !_Verify.dict(source, true, _KEY_CAPACITY, TYPE_FLOAT): return false reset() - capacity = source[KEY_CAPACITY] - # TODO: Check if this is needed - _occupied_space = source[KEY_OCCUPIED_SPACE] + capacity = source[_KEY_CAPACITY] + _calculate_occupied_space() return true - - diff --git a/addons/gloot/core/constraints/weight_constraint.gd.uid b/addons/gloot/core/constraints/weight_constraint.gd.uid new file mode 100644 index 0000000..e28dffb --- /dev/null +++ b/addons/gloot/core/constraints/weight_constraint.gd.uid @@ -0,0 +1 @@ +uid://3e0y8fv4t2bg diff --git a/addons/gloot/core/inventory.gd b/addons/gloot/core/inventory.gd index 53627a1..1195601 100644 --- a/addons/gloot/core/inventory.gd +++ b/addons/gloot/core/inventory.gd @@ -2,328 +2,377 @@ @icon("res://addons/gloot/images/icon_inventory.svg") extends Node class_name Inventory +## Basic stack-based inventory class. +## +## Supports basic inventory operations (adding, removing, transferring items etc.). Can contain an unlimited amount of item stacks. + +signal item_added(item: InventoryItem) ## Emitted when an item has been added to the inventory. +signal item_removed(item: InventoryItem) ## Emitted when an item has been removed from the inventory. +signal item_property_changed(item: InventoryItem, property: String) ## Emitted when a property of an item inside the inventory has been changed. +signal item_moved(item: InventoryItem) ## Emitted when an item has moved to a new index. +signal protoset_changed ## Emitted when the protoset property has changed. +signal constraint_added(constraint: InventoryConstraint) ## Emitted when a new constraint has been added to the inventory. +signal constraint_removed(constraint: InventoryConstraint) ## Emitted when a constraint has been removed from the inventory. +signal constraint_changed(constraint: InventoryConstraint) ## Emitted when an inventory constraint has changed. + +const _StackManager = preload("res://addons/gloot/core/stack_manager.gd") +const _ConstraintManager = preload("res://addons/gloot/core/constraints/constraint_manager.gd") +const _Utils = preload("res://addons/gloot/core/utils.gd") +const _ItemCount = preload("res://addons/gloot/core/item_count.gd") +const _Verify = preload("res://addons/gloot/core/verify.gd") +const _ProtoTreeCache = preload("res://addons/gloot/core/prototree/proto_tree_cache.gd") + +const _KEY_NODE_NAME: String = "node_name" +const _KEY_PROTOSET: String = "protoset" +const _KEY_CONSTRAINTS: String = "constraints" +const _KEY_ITEMS: String = "items" +const _KEY_STACK_SIZE = _StackManager._KEY_STACK_SIZE +const _KEY_MAX_STACK_SIZE = _StackManager._KEY_MAX_STACK_SIZE + +## A JSON resource containing prototype information. +@export var protoset: JSON: + set(new_protoset): + if new_protoset == protoset: + return + clear() + _disconnect_protoset_signals() + protoset = new_protoset + _prototree = _ProtoTreeCache.get_cached(protoset) + _connect_protoset_signals() + protoset_changed.emit() + update_configuration_warnings() + +var _prototree := _ProtoTreeCache.get_empty() -signal item_added(item) -signal item_removed(item) -signal item_modified(item) -signal item_property_changed(item, property_name) -signal contents_changed -signal protoset_changed - -const ConstraintManager = preload("res://addons/gloot/core/constraints/constraint_manager.gd") - -@export var item_protoset: ItemProtoset: - set(new_item_protoset): - if new_item_protoset == item_protoset: - return - clear() - _disconnect_protoset_signals() - item_protoset = new_item_protoset - _connect_protoset_signals() - protoset_changed.emit() - update_configuration_warnings() var _items: Array[InventoryItem] = [] -var _constraint_manager: ConstraintManager = null +var _constraint_manager: _ConstraintManager = null +var _serialized_format: Dictionary: + set(new_serialized_format): + _serialized_format = new_serialized_format -const KEY_NODE_NAME: String = "node_name" -const KEY_ITEM_PROTOSET: String = "item_protoset" -const KEY_CONSTRAINTS: String = "constraints" -const KEY_ITEMS: String = "items" -const Verify = preload("res://addons/gloot/core/verify.gd") + +## Returns the inventory prototree parsed from the protoset JSON resource. +func get_prototree() -> ProtoTree: + # TODO: Consider returning null when protoset is null + return _prototree func _disconnect_protoset_signals() -> void: - if !is_instance_valid(item_protoset): - return - item_protoset.changed.disconnect(_on_protoset_changed) + if !is_instance_valid(protoset): + return + protoset.changed.disconnect(_on_protoset_changed) func _connect_protoset_signals() -> void: - if !is_instance_valid(item_protoset): - return - item_protoset.changed.connect(_on_protoset_changed) + if !is_instance_valid(protoset): + return + protoset.changed.connect(_on_protoset_changed) func _on_protoset_changed() -> void: - protoset_changed.emit() - + protoset_changed.emit() -func _get_configuration_warnings() -> PackedStringArray: - if item_protoset == null: - return PackedStringArray([ - "This inventory node has no protoset. Set the 'item_protoset' field to be able to " \ - + "populate the inventory with items."]) - return PackedStringArray() + +func _get_property_list(): + return [ + { + "name": "_serialized_format", + "type": TYPE_DICTIONARY, + "usage": PROPERTY_USAGE_STORAGE + }, + ] -static func _get_item_script() -> Script: - return preload("inventory_item.gd") +func _update_serialized_format() -> void: + if Engine.is_editor_hint(): + _serialized_format = serialize() -func _enter_tree(): - for child in get_children(): - if not child is InventoryItem: - continue - if has_item(child): - continue - _items.append(child) +func _get_configuration_warnings() -> PackedStringArray: + if protoset == null: + return PackedStringArray([ + "This inventory node has no prototree. Set the 'protoset' field to be able to " \ + + "populate the inventory with items."]) + return PackedStringArray() func _init() -> void: - _constraint_manager = ConstraintManager.new(self) + _constraint_manager = _ConstraintManager.new(self) + _constraint_manager.constraint_changed.connect(_on_constraint_changed) -func _ready() -> void: - for item in get_items(): - _connect_item_signals(item) +func _on_constraint_changed(constraint: InventoryConstraint) -> void: + _update_serialized_format() + constraint_changed.emit(constraint) -func _on_item_added(item: InventoryItem) -> void: - _items.append(item) - contents_changed.emit() - _connect_item_signals(item) - if _constraint_manager: - _constraint_manager._on_item_added(item) - item_added.emit(item) +func _ready() -> void: + renamed.connect(_update_serialized_format) + if !_serialized_format.is_empty(): + deserialize(_serialized_format) -func _on_item_removed(item: InventoryItem) -> void: - _items.erase(item) - contents_changed.emit() - _disconnect_item_signals(item) - if _constraint_manager: - _constraint_manager._on_item_removed(item) - item_removed.emit(item) + for item in get_items(): + _connect_item_signals(item) +## Moves the item at the given index in the inventory to a new index. func move_item(from: int, to: int) -> void: - assert(from >= 0) - assert(from < _items.size()) - assert(to >= 0) - assert(to < _items.size()) - if from == to: - return + assert(from >= 0) + assert(from < _items.size()) + assert(to >= 0) + assert(to < _items.size()) + if from == to: + return - var item = _items[from] - _items.remove_at(from) - _items.insert(to, item) + var item = _items[from] + _items.remove_at(from) + _items.insert(to, item) + _update_serialized_format() - contents_changed.emit() + item_moved.emit() +## Returns the index of the given item in the inventory. func get_item_index(item: InventoryItem) -> int: - return _items.find(item) + return _items.find(item) +## Returns the number of items in the inventory. func get_item_count() -> int: - return _items.size() + return _items.size() func _connect_item_signals(item: InventoryItem) -> void: - if !item.protoset_changed.is_connected(_emit_item_modified): - item.protoset_changed.connect(_emit_item_modified.bind(item)) - if !item.prototype_id_changed.is_connected(_emit_item_modified): - item.prototype_id_changed.connect(_emit_item_modified.bind(item)) - if !item.properties_changed.is_connected(_emit_item_modified): - item.properties_changed.connect(_emit_item_modified.bind(item)) - if !item.property_changed.is_connected(_on_item_property_changed): - item.property_changed.connect(_on_item_property_changed.bind(item)) - + _Utils.safe_connect(item.property_changed, _on_item_property_changed.bind(item)) -func _disconnect_item_signals(item:InventoryItem) -> void: - if item.protoset_changed.is_connected(_emit_item_modified): - item.protoset_changed.disconnect(_emit_item_modified) - if item.prototype_id_changed.is_connected(_emit_item_modified): - item.prototype_id_changed.disconnect(_emit_item_modified) - if item.properties_changed.is_connected(_emit_item_modified): - item.properties_changed.disconnect(_emit_item_modified) - if item.property_changed.is_connected(_on_item_property_changed): - item.property_changed.disconnect(_on_item_property_changed.bind(item)) +func _disconnect_item_signals(item: InventoryItem) -> void: + _Utils.safe_disconnect(item.property_changed, _on_item_property_changed) -func _emit_item_modified(item: InventoryItem) -> void: - item_modified.emit(item) - -func _on_item_property_changed(property_name: String, item: InventoryItem) -> void: - _constraint_manager._on_item_property_changed(item, property_name) - item_property_changed.emit(item, property_name) +func _on_item_property_changed(property: String, item: InventoryItem) -> void: + _update_serialized_format() + _constraint_manager._on_item_property_changed(item, property) + item_property_changed.emit(item, property) +## Returns an array containing all the items in the inventory. func get_items() -> Array[InventoryItem]: - return _items + return _items +## Checks if the inventory contains the given item. func has_item(item: InventoryItem) -> bool: - return item in _items + return item in _items +## Adds the given item to the inventory. func add_item(item: InventoryItem) -> bool: - if !can_add_item(item): - return false - - if item.get_parent(): - item.get_parent().remove_child(item) - - # HACK: In case of InventoryGridStacked we can end up adding the item and - # removing it immediately, after a successful pack() call (in case the grid - # constraint has no space for the item). This causes some errors because - # Godot still tries to call the ENTER_TREE notification. To avoid that, we - # call transfer_automerge(), which should be able to pack the item without - # adding it first. - var gc := _constraint_manager.get_grid_constraint() - var sc := _constraint_manager.get_stacks_constraint() - if gc != null && sc != null && !gc.has_space_for(item): - assert(sc.transfer_automerge(item, self)) - else: - add_child(item) - - if Engine.is_editor_hint() && !item.is_queued_for_deletion(): - item.owner = get_tree().edited_scene_root - return true + if !can_add_item(item): + return false + if item.get_inventory() != null: + item.get_inventory().remove_item(item) -func can_add_item(item: InventoryItem) -> bool: - if item == null || has_item(item): - return false - - if !can_hold_item(item): - return false - - if !_constraint_manager.has_space_for(item): - return false + _items.append(item) + _update_serialized_format() + item._inventory = self + _connect_item_signals(item) + _constraint_manager._on_item_added(item) + # Adding an item can result in the item being freed (e.g. when it's merged with another item stack) + if !is_instance_valid(item): + item = null + item_added.emit(item) + return true - return true +## Checks if the given item can be added to the inventory. +func can_add_item(item: InventoryItem) -> bool: + if item == null || has_item(item): + return false + + if !_constraint_manager.has_space_for(item): + return false -func can_hold_item(item: InventoryItem) -> bool: - return true + return true +## Creates an `InventoryItem` based on the given prototype ID adds it to the inventory. Returns `null` if the item +## cannot be added. func create_and_add_item(prototype_id: String) -> InventoryItem: - var item: InventoryItem = InventoryItem.new() - item.protoset = item_protoset - item.prototype_id = prototype_id - if add_item(item): - return item - else: - item.free() - return null + var item: InventoryItem = InventoryItem.new(protoset, prototype_id) + if add_item(item): + return item + else: + return null +## Removes the given item from the inventory. Returns `false` if the item is not inside the inventory. func remove_item(item: InventoryItem) -> bool: - if !_can_remove_item(item): - return false + if !_can_remove_item(item): + return false - remove_child(item) - return true + _items.erase(item) + _update_serialized_format() + item._inventory = null + _disconnect_item_signals(item) + _constraint_manager._on_item_removed(item) + item_removed.emit(item) + return true func _can_remove_item(item: InventoryItem) -> bool: - return item != null && has_item(item) + return item != null && has_item(item) -func remove_all_items() -> void: - while get_child_count() > 0: - remove_child(get_child(0)) - _items = [] +## Returns the first found item with the given prototype ID. +func get_item_with_prototype_id(prototype_id: String) -> InventoryItem: + for item in get_items(): + if !is_instance_valid(item.get_prototype()): + continue + if item.get_prototype().get_prototype_id() == prototype_id: + return item + + return null -func get_item_by_id(prototype_id: String) -> InventoryItem: - for item in get_items(): - if item.prototype_id == prototype_id: - return item - - return null +## Returns an array of all the items with the given prototype ID. +func get_items_with_prototype_id(prototype_id: String) -> Array[InventoryItem]: + var result: Array[InventoryItem] = [] + for item in get_items(): + if !is_instance_valid(item.get_prototype()): + continue + if item.get_prototype().get_prototype_id() == prototype_id: + result.append(item) + + return result -func get_items_by_id(prototype_id: String) -> Array[InventoryItem]: - var result: Array[InventoryItem] = [] - for item in get_items(): - if item.prototype_id == prototype_id: - result.append(item) - - return result +## Checks if the inventory has an item with the given prototype ID. +func has_item_with_prototype_id(prototype_id: String) -> bool: + return get_item_with_prototype_id(prototype_id) != null -func has_item_by_id(prototype_id: String) -> bool: - return get_item_by_id(prototype_id) != null +func _on_constraint_added(constraint: InventoryConstraint) -> void: + _constraint_manager.register_constraint(constraint) + constraint_added.emit(constraint) + +func _on_constraint_removed(constraint: InventoryConstraint) -> void: + _constraint_manager.unregister_constraint(constraint) + constraint_removed.emit(constraint) -func transfer(item: InventoryItem, destination: Inventory) -> bool: - return destination.add_item(item) +## Returns the inventory constraint of the given type (script). Returns `null` if the inventory has no constraints of +## that type. +func get_constraint(script: Script) -> InventoryConstraint: + return _constraint_manager.get_constraint(script) + +## Removes all items from the inventory and sets its protoset to `null`. func reset() -> void: - clear() - item_protoset = null - _constraint_manager.reset() + clear() + protoset = null +## Removes all the items from the inventory. func clear() -> void: - for item in get_items(): - item.queue_free() - remove_all_items() + while _items.size() > 0: + remove_item(_items[0]) + _update_serialized_format() +## Serializes the inventory into a `Dictionary`. func serialize() -> Dictionary: - var result: Dictionary = {} + var result: Dictionary = {} + + if protoset == null || _constraint_manager == null: + return result - result[KEY_NODE_NAME] = name as String - result[KEY_ITEM_PROTOSET] = _serialize_item_protoset(item_protoset) - result[KEY_CONSTRAINTS] = _constraint_manager.serialize() - if !get_items().is_empty(): - result[KEY_ITEMS] = [] - for item in get_items(): - result[KEY_ITEMS].append(item.serialize()) + result[_KEY_NODE_NAME] = name as String + result[_KEY_PROTOSET] = _serialize_protoset(protoset) + if !_constraint_manager.is_empty(): + result[_KEY_CONSTRAINTS] = _constraint_manager.serialize() + if !get_items().is_empty(): + result[_KEY_ITEMS] = [] + for item in get_items(): + result[_KEY_ITEMS].append(item.serialize()) - return result + return result -static func _serialize_item_protoset(item_protoset: ItemProtoset) -> String: - if !is_instance_valid(item_protoset): - return "" - elif item_protoset.resource_path.is_empty(): - return item_protoset.json_data - else: - return item_protoset.resource_path +static func _serialize_protoset(protoset: JSON) -> String: + if !is_instance_valid(protoset): + return "" + elif protoset.resource_path.is_empty(): + return protoset.stringify(protoset.data) + else: + return protoset.resource_path +## Loads the inventory data from the given `Dictionary`. func deserialize(source: Dictionary) -> bool: - if !Verify.dict(source, true, KEY_NODE_NAME, TYPE_STRING) ||\ - !Verify.dict(source, true, KEY_ITEM_PROTOSET, TYPE_STRING) ||\ - !Verify.dict(source, false, KEY_ITEMS, TYPE_ARRAY, TYPE_DICTIONARY) ||\ - !Verify.dict(source, false, KEY_CONSTRAINTS, TYPE_DICTIONARY): - return false - - clear() - item_protoset = null - - if !source[KEY_NODE_NAME].is_empty() && source[KEY_NODE_NAME] != name: - name = source[KEY_NODE_NAME] - item_protoset = _deserialize_item_protoset(source[KEY_ITEM_PROTOSET]) - # TODO: Check return value: - if source.has(KEY_CONSTRAINTS): - _constraint_manager.deserialize(source[KEY_CONSTRAINTS]) - if source.has(KEY_ITEMS): - var items = source[KEY_ITEMS] - for item_dict in items: - var item = _get_item_script().new() - # TODO: Check return value: - item.deserialize(item_dict) - assert(add_item(item), "Failed to add item '%s'. Inventory full?" % item.prototype_id) - - return true - - -static func _deserialize_item_protoset(data: String) -> ItemProtoset: - if data.is_empty(): - return null - elif data.begins_with("res://"): - return load(data) - else: - var protoset := ItemProtoset.new() - protoset.json_data = data - return protoset + if !_Verify.dict(source, true, _KEY_NODE_NAME, TYPE_STRING) || \ + !_Verify.dict(source, true, _KEY_PROTOSET, TYPE_STRING) || \ + !_Verify.dict(source, false, _KEY_ITEMS, TYPE_ARRAY, TYPE_DICTIONARY) || \ + !_Verify.dict(source, false, _KEY_CONSTRAINTS, TYPE_DICTIONARY): + return false + + clear() + protoset = null + + if !source[_KEY_NODE_NAME].is_empty() && source[_KEY_NODE_NAME] != name: + name = source[_KEY_NODE_NAME] + protoset = _Utils._deserialize_protoset(source[_KEY_PROTOSET]) + # TODO: Check return value: + if source.has(_KEY_ITEMS): + var items = source[_KEY_ITEMS] + for item_dict in items: + var item = InventoryItem.new() + # TODO: Check return value: + item.deserialize(item_dict) + var success = add_item(item) + assert(success, "Failed to add item '%s'. Inventory full?" % item.get_title()) + if source.has(_KEY_CONSTRAINTS): + if !_constraint_manager.deserialize(source[_KEY_CONSTRAINTS]): + return false + + return true + + +## Splits the given item stack into two within the inventory. `new_stack_size` defines the size of the new stack, +## which is added to the inventory. Returns `null` if the split cannot be performed or if the new stack cannot be added +## to the inventory. +func split_stack(item: InventoryItem, new_stack_size: int) -> InventoryItem: + return _StackManager.inv_split_stack(self, item, _ItemCount.new(new_stack_size)) + + +## Merges the `item_src` item stack into the `item_dst` stack which is inside the inventory. If `item_dst` doesn't have +## enough stack space and `split_source` is set to `true`, `item_src` will be split and only partially merged. Returns +## `false` if the merge cannot be performed. +func merge_stacks(item_dst: InventoryItem, item_src: InventoryItem, split_source: bool = false) -> bool: + return _StackManager.inv_merge_stack(self, item_dst, item_src, split_source) + + +## Adds the given item to the inventory and merges it with all compatible items. Returns `false` if the item cannot be +## added. +func add_item_automerge(item: InventoryItem) -> bool: + return _StackManager.inv_add_automerge(self, item) + + +## Adds the given item to the inventory, splitting it if there is not enough space for the whole stack. +func add_item_autosplit(item: InventoryItem) -> bool: + return _StackManager.inv_add_autosplit(self, item) + + +## A combination of `add_item_autosplit` and `add_item_automerge`. Adds the given item stack into the inventory, splitting it up +## and joining it with available item stacks, as needed. +func add_item_autosplitmerge(item: InventoryItem) -> bool: + return _StackManager.inv_add_autosplitmerge(self, item) + +## Merges the given item with all compatible items in the same inventory. +func pack_item(item: InventoryItem) -> void: + return _StackManager.inv_pack_stack(self, item) diff --git a/addons/gloot/core/inventory.gd.uid b/addons/gloot/core/inventory.gd.uid new file mode 100644 index 0000000..bfa7c27 --- /dev/null +++ b/addons/gloot/core/inventory.gd.uid @@ -0,0 +1 @@ +uid://bxtv6f17pkdmm diff --git a/addons/gloot/core/inventory_grid.gd b/addons/gloot/core/inventory_grid.gd deleted file mode 100644 index 4e519eb..0000000 --- a/addons/gloot/core/inventory_grid.gd +++ /dev/null @@ -1,97 +0,0 @@ -@tool -@icon("res://addons/gloot/images/icon_inventory_grid.svg") -extends Inventory -class_name InventoryGrid - -signal size_changed - -const DEFAULT_SIZE: Vector2i = Vector2i(10, 10) - -@export var size: Vector2i = DEFAULT_SIZE : - get: - if _constraint_manager == null: - return DEFAULT_SIZE - if _constraint_manager.get_grid_constraint() == null: - return DEFAULT_SIZE - return _constraint_manager.get_grid_constraint().size - set(new_size): - _constraint_manager.get_grid_constraint().size = new_size - - -func _init() -> void: - super._init() - _constraint_manager.enable_grid_constraint() - _constraint_manager.get_grid_constraint().size_changed.connect(func(): size_changed.emit()) - - -func get_item_position(item: InventoryItem) -> Vector2i: - return _constraint_manager.get_grid_constraint().get_item_position(item) - - -func get_item_size(item: InventoryItem) -> Vector2i: - return _constraint_manager.get_grid_constraint().get_item_size(item) - - -func get_item_rect(item: InventoryItem) -> Rect2i: - return _constraint_manager.get_grid_constraint().get_item_rect(item) - - -func set_item_rotation(item: InventoryItem, rotated: bool) -> bool: - return _constraint_manager.get_grid_constraint().set_item_rotation(item, rotated) - - -func rotate_item(item: InventoryItem) -> bool: - return _constraint_manager.get_grid_constraint().rotate_item(item) - - -func is_item_rotated(item: InventoryItem) -> bool: - return _constraint_manager.get_grid_constraint().is_item_rotated(item) - - -func can_rotate_item(item: InventoryItem) -> bool: - return _constraint_manager.get_grid_constraint().can_rotate_item(item) - - -func set_item_rotation_direction(item: InventoryItem, positive: bool) -> void: - _constraint_manager.set_item_rotation_direction(item, positive) - - -func is_item_rotation_positive(item: InventoryItem) -> bool: - return _constraint_manager.get_grid_constraint().is_item_rotation_positive(item) - - -func add_item_at(item: InventoryItem, position: Vector2i) -> bool: - return _constraint_manager.get_grid_constraint().add_item_at(item, position) - - -func create_and_add_item_at(prototype_id: String, position: Vector2i) -> InventoryItem: - return _constraint_manager.get_grid_constraint().create_and_add_item_at(prototype_id, position) - - -func get_item_at(position: Vector2i) -> InventoryItem: - return _constraint_manager.get_grid_constraint().get_item_at(position) - - -func get_items_under(rect: Rect2i) -> Array[InventoryItem]: - return _constraint_manager.get_grid_constraint().get_items_under(rect) - - -func move_item_to(item: InventoryItem, position: Vector2i) -> bool: - return _constraint_manager.get_grid_constraint().move_item_to(item, position) - - -func transfer_to(item: InventoryItem, destination: Inventory, position: Vector2i) -> bool: - return _constraint_manager.get_grid_constraint().transfer_to(item, destination._constraint_manager.get_grid_constraint(), position) - - -func rect_free(rect: Rect2i, exception: InventoryItem = null) -> bool: - return _constraint_manager.get_grid_constraint().rect_free(rect, exception) - - -func find_free_place(item: InventoryItem) -> Dictionary: - return _constraint_manager.get_grid_constraint().find_free_place(item) - - -func sort() -> bool: - return _constraint_manager.get_grid_constraint().sort() - diff --git a/addons/gloot/core/inventory_grid_stacked.gd b/addons/gloot/core/inventory_grid_stacked.gd deleted file mode 100644 index 934775a..0000000 --- a/addons/gloot/core/inventory_grid_stacked.gd +++ /dev/null @@ -1,72 +0,0 @@ -@tool -@icon("res://addons/gloot/images/icon_inventory_grid_stacked.svg") -extends InventoryGrid -class_name InventoryGridStacked - -const StacksConstraint = preload("res://addons/gloot/core/constraints/stacks_constraint.gd") - - -func _init() -> void: - super._init() - _constraint_manager.enable_stacks_constraint() - - -func has_place_for(item: InventoryItem) -> bool: - return _constraint_manager.has_space_for(item) - - -func add_item_automerge(item: InventoryItem) -> bool: - return _constraint_manager.get_stacks_constraint().add_item_automerge(item) - - -func split(item: InventoryItem, new_stack_size: int) -> InventoryItem: - return _constraint_manager.get_stacks_constraint().split_stack_safe(item, new_stack_size) - - -func join(item_dst: InventoryItem, item_src: InventoryItem) -> bool: - return _constraint_manager.get_stacks_constraint().join_stacks(item_dst, item_src) - - -static func get_item_stack_size(item: InventoryItem) -> int: - return StacksConstraint.get_item_stack_size(item) - - -static func set_item_stack_size(item: InventoryItem, new_stack_size: int) -> bool: - return StacksConstraint.set_item_stack_size(item, new_stack_size) - - -static func get_item_max_stack_size(item: InventoryItem) -> int: - return StacksConstraint.get_item_max_stack_size(item) - - -static func set_item_max_stack_size(item: InventoryItem, new_stack_size: int) -> void: - StacksConstraint.set_item_max_stack_size(item, new_stack_size) - - -func get_prototype_stack_size(prototype_id: String) -> int: - return _constraint_manager.get_stacks_constraint().get_prototype_stack_size(item_protoset, prototype_id) - - -func get_prototype_max_stack_size(prototype_id: String) -> int: - return _constraint_manager.get_stacks_constraint().get_prototype_max_stack_size(item_protoset, prototype_id) - - -func transfer_automerge(item: InventoryItem, destination: Inventory) -> bool: - return _constraint_manager.get_stacks_constraint().transfer_automerge(item, destination) - - -func transfer_autosplitmerge(item: InventoryItem, destination: Inventory) -> bool: - return _constraint_manager.get_stacks_constraint().transfer_autosplitmerge(item, destination) - - -static func pack(item: InventoryItem) -> void: - return StacksConstraint.pack_item(item) - - -func transfer_to(item: InventoryItem, destination: Inventory, position: Vector2i) -> bool: - return _constraint_manager.get_grid_constraint().transfer_to(item, destination._constraint_manager.get_grid_constraint(), position) - - -func _get_mergable_item_at(item: InventoryItem, position: Vector2i) -> InventoryItem: - return _constraint_manager.get_grid_constraint()._get_mergable_item_at(item, position) - diff --git a/addons/gloot/core/inventory_item.gd b/addons/gloot/core/inventory_item.gd index 8e8919a..cc854af 100644 --- a/addons/gloot/core/inventory_item.gd +++ b/addons/gloot/core/inventory_item.gd @@ -1,297 +1,267 @@ @tool @icon("res://addons/gloot/images/icon_item.svg") -extends Node +extends RefCounted class_name InventoryItem - -signal protoset_changed -signal prototype_id_changed -signal properties_changed -signal property_changed(property_name) -signal added_to_inventory(inventory) -signal removed_from_inventory(inventory) -signal equipped_in_slot(item_slot) -signal removed_from_slot(item_slot) - -const Utils = preload("res://addons/gloot/core/utils.gd") - -@export var protoset: ItemProtoset : +## Stack-based inventory item class. +## +## It is based on an item prototype from an prototree. Can hold additional properties. The default stack size and +## maximum stack size is 1, which can be changed by setting the `stack_size` and `maximum_stack_size` properties inside +## the prototype or directly inside the item. + +const _StackManager = preload("res://addons/gloot/core/stack_manager.gd") +const _Verify = preload("res://addons/gloot/core/verify.gd") +const _Utils = preload("res://addons/gloot/core/utils.gd") +const _ItemCount = preload("res://addons/gloot/core/item_count.gd") +const _ProtoTreeCache = preload("res://addons/gloot/core/prototree/proto_tree_cache.gd") + +signal property_changed(property_name: String) ## Emitted when an item property has changed. + +## A JSON resource containing prototype information. +var protoset: JSON: set(new_protoset): if new_protoset == protoset: return - if (_inventory != null) && (new_protoset != _inventory.item_protoset): + if (_inventory != null) && (new_protoset != _inventory.protoset): return _disconnect_protoset_signals() protoset = new_protoset + _prototree = _ProtoTreeCache.get_cached(protoset) + _on_prototree_changed() _connect_protoset_signals() + +var _prototree: ProtoTree = _ProtoTreeCache.get_empty() +var _prototype: Prototype = null +var _properties: Dictionary - # Reset the prototype ID (pick the first prototype from the protoset) - if protoset && protoset._prototypes && protoset._prototypes.keys().size() > 0: - prototype_id = protoset._prototypes.keys()[0] - else: - prototype_id = "" - - protoset_changed.emit() - update_configuration_warnings() - -@export var prototype_id: String : - set(new_prototype_id): - if new_prototype_id == prototype_id: - return - if protoset == null && !new_prototype_id.is_empty(): - return - if (protoset != null) && (!protoset.has_prototype(new_prototype_id)): - return - prototype_id = new_prototype_id - _reset_properties() - update_configuration_warnings() - prototype_id_changed.emit() - -@export var properties: Dictionary : - set(new_properties): - properties = new_properties - properties_changed.emit() - update_configuration_warnings() - -var _inventory: Inventory : +var _inventory: Inventory: set(new_inventory): if new_inventory == _inventory: return _inventory = new_inventory if _inventory: - protoset = _inventory.item_protoset -var _item_slot: ItemSlot + protoset = _inventory.protoset -const KEY_PROTOSET: String = "protoset" -const KEY_PROTOTYE_ID: String = "prototype_id" -const KEY_PROPERTIES: String = "properties" -const KEY_NODE_NAME: String = "node_name" -const KEY_TYPE: String = "type" -const KEY_VALUE: String = "value" +const _KEY_PROTOSET: String = "protoset" +const _KEY_PROTOTYPE_ID: String = "prototype_id" +const _KEY_PROPERTIES: String = "properties" +const _KEY_TYPE: String = "type" +const _KEY_VALUE: String = "value" -const KEY_IMAGE: String = "image" -const KEY_NAME: String = "name" +const _KEY_IMAGE: String = "image" +const _KEY_NAME: String = "name" -const Verify = preload("res://addons/gloot/core/verify.gd") func _connect_protoset_signals() -> void: - if protoset == null: + if !is_instance_valid(protoset): return + protoset.changed.connect(_on_protoset_changed) func _disconnect_protoset_signals() -> void: - if protoset == null: + if !is_instance_valid(protoset): return - protoset.changed.disconnect(_on_protoset_changed) - -func _on_protoset_changed() -> void: - update_configuration_warnings() + protoset.changed.disconnect(_on_protoset_changed) -func _get_configuration_warnings() -> PackedStringArray: - if !protoset: - return PackedStringArray() +func _init(protoset_: JSON = null, prototype_id: String = "") -> void: + protoset = protoset_ + if _prototree.has_prototype(prototype_id): + _prototype = _prototree.get_prototype(prototype_id) - if !protoset.has_prototype(prototype_id): - return PackedStringArray(["Undefined prototype '%s'. Check the item protoset!" % prototype_id]) - return PackedStringArray() +func _on_protoset_changed() -> void: + _prototree.deserialize(protoset) + _on_prototree_changed() -func _reset_properties() -> void: - if !protoset || prototype_id.is_empty(): - properties = {} +func _on_prototree_changed() -> void: + if protoset == null: + _prototype = null return - # Reset (erase) all properties from the current prototype but preserve the rest - var prototype: Dictionary = protoset.get_prototype(prototype_id) - var keys: Array = properties.keys().duplicate() - for property in keys: - if prototype.has(property): - properties.erase(property) - - -func _notification(what): - if what == NOTIFICATION_PARENTED: - _on_parented(get_parent()) - elif what == NOTIFICATION_UNPARENTED: - _on_unparented() - - -func _on_parented(parent: Node) -> void: - if parent is Inventory: - _on_added_to_inventory(parent as Inventory) - else: - _inventory = null - - if parent is ItemSlot: - _link_to_slot(parent as ItemSlot) - else: - _unlink_from_slot() - - -func _on_added_to_inventory(inventory: Inventory) -> void: - assert(inventory != null) - _inventory = inventory - - added_to_inventory.emit(_inventory) - _inventory._on_item_added(self) - - -func _on_unparented() -> void: - if _inventory: - _on_removed_from_inventory(_inventory) - _inventory = null + if _prototype == null: + # Pick the first one from the prototree + var prototypes := _prototree.get_prototypes() + if prototypes.size() > 0: + _prototype = prototypes[0] + else: + _prototype = null + return - _unlink_from_slot() + _prototype = _prototree.get_prototype(_prototype.get_prototype_id()) -func _on_removed_from_inventory(inventory: Inventory) -> void: - if inventory: - removed_from_inventory.emit(inventory) - inventory._on_item_removed(self) +## Returns the inventory prototree parsed from the protoset JSON resource. +func get_prototree() -> ProtoTree: + return _prototree -func _link_to_slot(item_slot: ItemSlot) -> void: - _item_slot = item_slot - _item_slot._on_item_added(self) - equipped_in_slot.emit(item_slot) +## Returns the item prototype. +func get_prototype() -> Prototype: + return _prototype -func _unlink_from_slot() -> void: - if _item_slot == null: - return - var temp_slot := _item_slot - _item_slot = null - temp_slot._on_item_removed() - removed_from_slot.emit(temp_slot) +## Returns a duplicate of the item. +func duplicate() -> InventoryItem: + var result := InventoryItem.new(protoset, _prototype.get_prototype_id()) + result._properties = _properties.duplicate() + return result +## Returns the `Inventory` this item belongs to, or `null` if it is not inside an inventory. func get_inventory() -> Inventory: return _inventory -func get_item_slot() -> ItemSlot: - return _item_slot - - +## Swaps the two given items. Returns `false` if the items cannot be swapped. static func swap(item1: InventoryItem, item2: InventoryItem) -> bool: if item1 == null || item2 == null || item1 == item2: return false - var owner1 = item1.get_inventory() - if owner1 == null: - owner1 = item1.get_item_slot() - var owner2 = item2.get_inventory() - if owner2 == null: - owner2 = item2.get_item_slot() - if owner1 == null || owner2 == null: + var inv1 = item1.get_inventory() + var inv2 = item2.get_inventory() + if inv1 == null || inv2 == null: return false - if owner1 is Inventory: - if !owner1._constraint_manager._on_pre_item_swap(item1, item2): - return false - if owner2 is Inventory && owner1 != owner2: - if !owner2._constraint_manager._on_pre_item_swap(item1, item2): + if !inv1._constraint_manager._on_pre_item_swap(item1, item2): + return false + if inv1 != inv2: + if !inv2._constraint_manager._on_pre_item_swap(item1, item2): return false - var idx1 = _remove_item_from_owner(item1, owner1) - var idx2 = _remove_item_from_owner(item2, owner2) - if !_add_item_to_owner(item1, owner2, idx2): - _add_item_to_owner(item1, owner1, idx1) - _add_item_to_owner(item2, owner2, idx2) + var idx1 = inv1.get_item_index(item1) + var idx2 = inv2.get_item_index(item2) + inv1.remove_item(item1) + inv2.remove_item(item2) + + if !inv2.add_item(item1): + inv1.add_item(item1) + inv1.move_item(inv1.get_item_index(item1), idx1) + inv2.add_item(item2) + inv2.move_item(inv2.get_item_index(item2), idx2) return false - if !_add_item_to_owner(item2, owner1, idx1): - _add_item_to_owner(item1, owner1, idx1) - _add_item_to_owner(item2, owner2, idx2) + if !inv1.add_item(item2): + inv1.add_item(item1) + inv1.move_item(inv1.get_item_index(item1), idx1) + inv2.add_item(item2) + inv2.move_item(inv2.get_item_index(item2), idx2) return false + inv2.move_item(inv2.get_item_index(item1), idx2) + inv1.move_item(inv1.get_item_index(item2), idx1) - if owner1 is Inventory: - owner1._constraint_manager._on_post_item_swap(item1, item2) - if owner2 is Inventory && owner1 != owner2: - owner2._constraint_manager._on_post_item_swap(item1, item2) + if inv1 is Inventory: + inv1._constraint_manager._on_post_item_swap(item1, item2) + if inv2 is Inventory && inv1 != inv2: + inv2._constraint_manager._on_post_item_swap(item1, item2) return true; -static func _remove_item_from_owner(item: InventoryItem, item_owner) -> int: - if item_owner is Inventory: - var inventory := (item_owner as Inventory) - var item_idx = inventory.get_item_index(item) - inventory.remove_item(item) - return item_idx - - # TODO: Consider removing/deprecating ItemSlot.remember_source_inventory - var item_slot := (item_owner as ItemSlot) - var temp_remember_source_inventory = item_slot.remember_source_inventory - item_slot.remember_source_inventory = false - item_slot.clear() - item_slot.remember_source_inventory = temp_remember_source_inventory - return 0 - - -static func _add_item_to_owner(item: InventoryItem, item_owner, index: int) -> bool: - if item_owner is Inventory: - var inventory := (item_owner as Inventory) - if inventory.add_item(item): - inventory.move_item(inventory.get_item_index(item), index) - return true - return false - return (item_owner as ItemSlot).equip(item) +static func _add_item_to_inventory(item: InventoryItem, inventory: Inventory, index: int) -> bool: + if inventory.add_item(item): + inventory.move_item(inventory.get_item_index(item), index) + return true + return false + + +## Checks if the item has the given property. +func has_property(property_name: String) -> bool: + if _properties.has(property_name): + return true + if _prototype != null && _prototype.has_property(property_name): + return true + return false +## Returns the given item property. If the item does not define the item property, `default_value` is returned. func get_property(property_name: String, default_value = null) -> Variant: - # Note: The protoset editor still doesn't support arrays and dictionaries, - # but those can still be added via JSON definitions or via code. - if properties.has(property_name): - var value = properties[property_name] + if _properties.has(property_name): + var value = _properties[property_name] if typeof(value) == TYPE_DICTIONARY || typeof(value) == TYPE_ARRAY: return value.duplicate() return value - if protoset && protoset.prototype_has_property(prototype_id, property_name): - var value = protoset.get_prototype_property(prototype_id, property_name, default_value) + if _prototype != null && _prototype.has_property(property_name): + var value = _prototype.get_property(property_name, default_value) if typeof(value) == TYPE_DICTIONARY || typeof(value) == TYPE_ARRAY: return value.duplicate() return value - + + if _properties.has(property_name): + return _properties[property_name] + if _prototype != null && _prototree.get_prototypes().is_empty(): + return _prototype.get_property(property_name, default_value) return default_value +## Sets the given item property to the given value. func set_property(property_name: String, value) -> void: - if properties.has(property_name) && properties[property_name] == value: + if get_property(property_name) == value: return - properties[property_name] = value - property_changed.emit(property_name) - properties_changed.emit() + if _prototype != null && _prototype.has_property(property_name): + if _prototype.get_property(property_name) == value && _properties.has(property_name): + _properties.erase(property_name) + property_changed.emit(property_name) + return + + if value == null: + if _properties.has(property_name): + _properties.erase(property_name) + property_changed.emit(property_name) + else: + _properties[property_name] = value + property_changed.emit(property_name) + +## Clears (un-defines) the given item property. func clear_property(property_name: String) -> void: - if properties.has(property_name): - properties.erase(property_name) + if _properties.has(property_name): + _properties.erase(property_name) property_changed.emit(property_name) - properties_changed.emit() +## Returns an array of properties that the item overrides. +func get_overridden_properties() -> Array: + return _properties.keys().duplicate() + + +## Returns an array of item properties (includes prototype properties). +func get_properties() -> Array: + if _prototype != null: + return _Utils.array_union(_properties.keys(), _prototype.get_properties().keys()) + else: + return _properties.keys() + + +## Checks if the item overrides the given property. +func is_property_overridden(property_name) -> bool: + return _properties.has(property_name) + + +## Resets item data. Clears its properties and sets its protoset to `null`. func reset() -> void: protoset = null - prototype_id = "" - properties = {} + _properties = {} +## Serializes the item into a `Dictionary`. func serialize() -> Dictionary: var result: Dictionary = {} - result[KEY_NODE_NAME] = name as String - result[KEY_PROTOSET] = Inventory._serialize_item_protoset(protoset) - result[KEY_PROTOTYE_ID] = prototype_id - if !properties.is_empty(): - result[KEY_PROPERTIES] = {} - for property_name in properties.keys(): - result[KEY_PROPERTIES][property_name] = _serialize_property(property_name) + result[_KEY_PROTOSET] = Inventory._serialize_protoset(protoset) + if _prototype != null: + result[_KEY_PROTOTYPE_ID] = str(_prototype.get_prototype_id()) + else: + result[_KEY_PROTOTYPE_ID] = "" + if !_properties.is_empty(): + result[_KEY_PROPERTIES] = {} + for property_name in _properties.keys(): + result[_KEY_PROPERTIES][property_name] = _serialize_property(property_name) return result @@ -299,33 +269,33 @@ func serialize() -> Dictionary: func _serialize_property(property_name: String) -> Dictionary: # Store all properties as strings for JSON support. var result: Dictionary = {} - var property_value = properties[property_name] + var property_value = _properties[property_name] var property_type = typeof(property_value) result = { - KEY_TYPE: property_type, - KEY_VALUE: var_to_str(property_value) + _KEY_TYPE: property_type, + _KEY_VALUE: var_to_str(property_value) } return result; +## Loads the item data from the given `Dictionary`. func deserialize(source: Dictionary) -> bool: - if !Verify.dict(source, true, KEY_NODE_NAME, TYPE_STRING) ||\ - !Verify.dict(source, true, KEY_PROTOSET, TYPE_STRING) ||\ - !Verify.dict(source, true, KEY_PROTOTYE_ID, TYPE_STRING) ||\ - !Verify.dict(source, false, KEY_PROPERTIES, TYPE_DICTIONARY): + if !_Verify.dict(source, true, _KEY_PROTOSET, TYPE_STRING) || \ + !_Verify.dict(source, true, _KEY_PROTOTYPE_ID, TYPE_STRING) || \ + !_Verify.dict(source, false, _KEY_PROPERTIES, TYPE_DICTIONARY): return false reset() - if !source[KEY_NODE_NAME].is_empty() && source[KEY_NODE_NAME] != name: - name = source[KEY_NODE_NAME] - protoset = Inventory._deserialize_item_protoset(source[KEY_PROTOSET]) - prototype_id = source[KEY_PROTOTYE_ID] - if source.has(KEY_PROPERTIES): - for key in source[KEY_PROPERTIES].keys(): - properties[key] = _deserialize_property(source[KEY_PROPERTIES][key]) - if properties[key] == null: - properties = {} + # TODO: Check return values + protoset = _Utils._deserialize_protoset(source[_KEY_PROTOSET]) + _prototype = _prototree.get_prototype(source[_KEY_PROTOTYPE_ID]) + if source.has(_KEY_PROPERTIES): + for key in source[_KEY_PROPERTIES].keys(): + var value = _deserialize_property(source[_KEY_PROPERTIES][key]) + set_property(key, value) + if value == null: + _properties = {} return false return true @@ -333,18 +303,20 @@ func deserialize(source: Dictionary) -> bool: func _deserialize_property(data: Dictionary): # Properties are stored as strings for JSON support. - var result = Utils.str_to_var(data[KEY_VALUE]) - var expected_type: int = data[KEY_TYPE] + var result = _Utils.str_to_var(data[_KEY_VALUE]) + var expected_type: int = data[_KEY_TYPE] var property_type: int = typeof(result) if property_type != expected_type: print("Property has unexpected type: %s. Expected: %s" % - [Verify.type_names[property_type], Verify.type_names[expected_type]]) + [_Verify.type_names[property_type], _Verify.type_names[expected_type]]) return null return result +## Helper function for retrieving the item texture. It checks the image item property and loads it as a texture, if +## available. func get_texture() -> Texture2D: - var texture_path = get_property(KEY_IMAGE) + var texture_path = get_property(_KEY_IMAGE) if texture_path && texture_path != "" && ResourceLoader.exists(texture_path): var texture = load(texture_path) if texture is Texture2D: @@ -352,9 +324,64 @@ func get_texture() -> Texture2D: return null +## Helper function for retrieving the item title. It checks the name item property and uses it as the title, if +## available. Otherwise, prototype_id is returned as title. func get_title() -> String: - var title = get_property(KEY_NAME, prototype_id) - if !(title is String): - title = prototype_id + var title = get_property(_KEY_NAME, null) + if title is String: + return title + if is_instance_valid(_prototype): + return _prototype.get_prototype_id() + return "" + + +## Returns the stack size. +func get_stack_size() -> int: + return _StackManager.get_item_stack_size(self).count + + +## Returns the maximum stack size. +func get_max_stack_size() -> int: + return _StackManager.get_item_max_stack_size(self).count + + +## Sets the stack size. +func set_stack_size(stack_size: int) -> bool: + return _StackManager.set_item_stack_size(self, _ItemCount.new(stack_size)) + + +## Sets the maximum stack size. +func set_max_stack_size(max_stack_size: int) -> void: + _StackManager.set_item_max_stack_size(self, _ItemCount.new(max_stack_size)) + + +## Merges the item stack into the `item_dst` stack. If `item_dst` doesn't have enough stack space and `split` is set to +## `true`, the stack will be split and only partially merged. Returns `false` if the merge cannot be performed. +func merge_into(item_dst: InventoryItem, split: bool = false) -> bool: + return _StackManager.merge_stacks(item_dst, self, split) + + +## Checks if the item stack can be merged into `item_dst` with, or without splitting (`split` parameter). +func can_merge_into(item_dst: InventoryItem, split: bool = false) -> bool: + return _StackManager.can_merge_stacks(item_dst, self, split) + + +## Checks if the item stack is compatible for merging with `item_dst`. +func compatible_with(item_dst: InventoryItem) -> bool: + return _StackManager.stacks_compatible(self, item_dst) + + +## Returns the free stack space in the item stack (maximum_stack_size - stack_size). +func get_free_stack_space() -> int: + return _StackManager.get_free_stack_space(self).count + + +## Splits the item stack into two and returns a reference to the new stack. `new_stack_size` defines the size of the new +## stack. Returns `null` if the split cannot be performed. +func split(new_stack_size: int) -> InventoryItem: + return _StackManager.split_stack(self, _ItemCount.new(new_stack_size)) + - return title +## Checks if the item stack can be split using the given new stack size. +func can_split(new_stack_size: int) -> bool: + return _StackManager.can_split_stack(self, _ItemCount.new(new_stack_size)) diff --git a/addons/gloot/core/inventory_item.gd.uid b/addons/gloot/core/inventory_item.gd.uid new file mode 100644 index 0000000..a79bb3e --- /dev/null +++ b/addons/gloot/core/inventory_item.gd.uid @@ -0,0 +1 @@ +uid://ck2rwh6t6ek8p diff --git a/addons/gloot/core/inventory_stacked.gd b/addons/gloot/core/inventory_stacked.gd deleted file mode 100644 index cca608f..0000000 --- a/addons/gloot/core/inventory_stacked.gd +++ /dev/null @@ -1,100 +0,0 @@ -@tool -@icon("res://addons/gloot/images/icon_inventory_stacked.svg") -extends Inventory -class_name InventoryStacked - -const StacksConstraint = preload("res://addons/gloot/core/constraints/stacks_constraint.gd") - -signal capacity_changed -signal occupied_space_changed - -@export var capacity: float : - get: - if _constraint_manager == null: - return 0.0 - if _constraint_manager.get_weight_constraint() == null: - return 0.0 - return _constraint_manager.get_weight_constraint().capacity - set(new_capacity): - _constraint_manager.get_weight_constraint().capacity = new_capacity -var occupied_space: float : - get: - if _constraint_manager == null: - return 0.0 - if _constraint_manager.get_weight_constraint() == null: - return 0.0 - return _constraint_manager.get_weight_constraint().occupied_space - set(new_occupied_space): - assert(false, "occupied_space is read-only!") - - -func _init() -> void: - super._init() - _constraint_manager.enable_weight_constraint() - _constraint_manager.enable_stacks_constraint() - _constraint_manager.get_weight_constraint().capacity_changed.connect(func(): capacity_changed.emit()) - _constraint_manager.get_weight_constraint().occupied_space_changed.connect(func(): occupied_space_changed.emit()) - - -func has_unlimited_capacity() -> bool: - return _constraint_manager.get_weight_constraint().has_unlimited_capacity() - - -func get_free_space() -> float: - return _constraint_manager.get_weight_constraint().get_free_space() - - -func has_place_for(item: InventoryItem) -> bool: - return _constraint_manager.has_space_for(item) - - -func add_item_automerge(item: InventoryItem) -> bool: - return _constraint_manager.get_stacks_constraint().add_item_automerge(item) - - -func split(item: InventoryItem, new_stack_size: int) -> InventoryItem: - return _constraint_manager.get_stacks_constraint().split_stack_safe(item, new_stack_size) - - -static func join(item_dst: InventoryItem, item_src: InventoryItem) -> bool: - return StacksConstraint.join_stacks(item_dst, item_src) - - -static func get_item_stack_size(item: InventoryItem) -> int: - return StacksConstraint.get_item_stack_size(item) - - -static func set_item_stack_size(item: InventoryItem, new_stack_size: int) -> bool: - return StacksConstraint.set_item_stack_size(item, new_stack_size) - - -static func get_item_max_stack_size(item: InventoryItem) -> int: - return StacksConstraint.get_item_max_stack_size(item) - - -static func set_item_max_stack_size(item: InventoryItem, new_stack_size: int) -> void: - StacksConstraint.set_item_max_stack_size(item, new_stack_size) - - -func get_prototype_stack_size(prototype_id: String) -> int: - return StacksConstraint.get_prototype_stack_size(item_protoset, prototype_id) - - -func get_prototype_max_stack_size(prototype_id: String) -> int: - return StacksConstraint.get_prototype_max_stack_size(item_protoset, prototype_id) - - -func transfer_autosplit(item: InventoryItem, destination: InventoryStacked) -> bool: - return _constraint_manager.get_stacks_constraint().transfer_autosplit(item, destination) != null - - -func transfer_automerge(item: InventoryItem, destination: InventoryStacked) -> bool: - return _constraint_manager.get_stacks_constraint().transfer_automerge(item, destination) - - -func transfer_autosplitmerge(item: InventoryItem, destination: InventoryStacked) -> bool: - return _constraint_manager.get_stacks_constraint().transfer_autosplitmerge(item, destination) - - -static func pack(item: InventoryItem) -> void: - return StacksConstraint.pack_item(item) diff --git a/addons/gloot/core/item_count.gd b/addons/gloot/core/item_count.gd index 4e3493c..a8e7163 100644 --- a/addons/gloot/core/item_count.gd +++ b/addons/gloot/core/item_count.gd @@ -1,8 +1,9 @@ -class_name ItemCount +const _ItemCount = preload("res://addons/gloot/core/item_count.gd") const Inf: int = -1 -@export var count: int = 0 : +## The item count as an integer (-1 equals infinity). +@export var count: int = 0: set(new_count): if new_count < 0: new_count = -1 @@ -15,11 +16,13 @@ func _init(count_: int = 0) -> void: count = count_ +## Checks if the count is infinite. func is_inf() -> bool: return count < 0 -func add(item_count_: ItemCount) -> ItemCount: +## Adds the given _ItemCount to the current one and returns the result. +func add(item_count_: _ItemCount) -> _ItemCount: if item_count_.is_inf(): count = Inf elif !self.is_inf(): @@ -28,7 +31,19 @@ func add(item_count_: ItemCount) -> ItemCount: return self -func mul(item_count_: ItemCount) -> ItemCount: +## Subtracts the given _ItemCount from the current one and returns the result. +func sub(item_count_: _ItemCount) -> _ItemCount: + assert(!item_count_.gt(self), "Can't subtract a count greater than self!") + if item_count_.is_inf(): + count = 0 + elif !self.is_inf(): + count -= item_count_.count + + return self + + +## Multiplies the given _ItemCount with the current one and returns the result. +func mul(item_count_: _ItemCount) -> _ItemCount: if (count == 0): return self if item_count_.is_inf(): @@ -44,7 +59,8 @@ func mul(item_count_: ItemCount) -> ItemCount: return self -func div(item_count_: ItemCount) -> ItemCount: +## Divides the current _ItemCount with the given one and returns the result. +func div(item_count_: _ItemCount) -> _ItemCount: assert(item_count_.count > 0 || item_count_.is_inf(), "Can't devide by zero!") if (count == 0): return self @@ -61,15 +77,17 @@ func div(item_count_: ItemCount) -> ItemCount: return self -func eq(item_count_: ItemCount) -> bool: +## Check if the item count is equal with the given item count. +func eq(item_count_: _ItemCount) -> bool: return item_count_.count == count -func less(item_count_: ItemCount) -> bool: +## Check if the item count is less than the given item count. +func lt(item_count_: _ItemCount) -> bool: if item_count_.is_inf(): if self.is_inf(): return false - return true + return true if self.is_inf(): return false @@ -77,15 +95,17 @@ func less(item_count_: ItemCount) -> bool: return count < item_count_.count -func le(item_count_: ItemCount) -> bool: - return self.less(item_count_) || self.eq(item_count_) +## Check if the item count is less or equal than the given item count. +func le(item_count_: _ItemCount) -> bool: + return self.lt(item_count_) || self.eq(item_count_) -func gt(item_count_: ItemCount) -> bool: +## Check if the item count is greater than the given item count. +func gt(item_count_: _ItemCount) -> bool: if item_count_.is_inf(): if self.is_inf(): return false - return false + return false if self.is_inf(): return true @@ -93,22 +113,37 @@ func gt(item_count_: ItemCount) -> bool: return count > item_count_.count -func ge(item_count_: ItemCount) -> bool: +## Check if the item count is greater or equal than the given item count. +func ge(item_count_: _ItemCount) -> bool: return self.gt(item_count_) || self.eq(item_count_) -static func min(item_count_l: ItemCount, item_count_r: ItemCount) -> ItemCount: - if item_count_l.less(item_count_r): +## Returns the smaller item count out of the two. +static func min(item_count_l: _ItemCount, item_count_r: _ItemCount) -> _ItemCount: + if item_count_l.lt(item_count_r): return item_count_l return item_count_r -static func inf() -> ItemCount: - return ItemCount.new(Inf) +## Returns an infinite item count. +static func inf() -> _ItemCount: + return _ItemCount.new(Inf) + + +## Returns an item count if 0. +static func zero() -> _ItemCount: + return _ItemCount.new(0) -static func zero() -> ItemCount: - return ItemCount.new(0) +## Returns an item count if 1. +static func one() -> _ItemCount: + return _ItemCount.new(1) + + +func _to_string() -> String: + if self.is_inf(): + return "INF" + return str(count) # TODO: Implement max() diff --git a/addons/gloot/core/item_count.gd.uid b/addons/gloot/core/item_count.gd.uid new file mode 100644 index 0000000..5aacf7f --- /dev/null +++ b/addons/gloot/core/item_count.gd.uid @@ -0,0 +1 @@ +uid://b06sm2con2bxy diff --git a/addons/gloot/core/item_protoset.gd b/addons/gloot/core/item_protoset.gd deleted file mode 100644 index 86e9f85..0000000 --- a/addons/gloot/core/item_protoset.gd +++ /dev/null @@ -1,162 +0,0 @@ -@tool -@icon("res://addons/gloot/images/icon_item_protoset.svg") -class_name ItemProtoset -extends Resource - -const Utils = preload("res://addons/gloot/core/utils.gd") - -const KEY_ID: String = "id" - -@export_multiline var json_data: String : - set(new_json_data): - json_data = new_json_data - if !json_data.is_empty(): - parse(json_data) - _save() - -var _prototypes: Dictionary = {} : - set(new_prototypes): - _prototypes = new_prototypes - _update_json_data() - _save() - - -func parse(json: String) -> void: - _prototypes.clear() - - var test_json_conv: JSON = JSON.new() - assert(test_json_conv.parse(json) == OK, "Failed to parse JSON!") - var parse_result = test_json_conv.data - assert(parse_result is Array, "JSON file must contain an array!") - - for prototype in parse_result: - assert(prototype is Dictionary, "Item prototype must be a dictionary!") - assert(prototype.has(KEY_ID), "Item prototype must have an '%s' property!" % KEY_ID) - assert(prototype[KEY_ID] is String, "'%s' property must be a string!" % KEY_ID) - - var id = prototype[KEY_ID] - assert(!_prototypes.has(id), "Item prototype ID '%s' already in use!" % id) - _prototypes[id] = prototype - _unstringify_prototype(_prototypes[id]) - - -func _to_json() -> String: - var result: Array[Dictionary] - for prototype_id in _prototypes.keys(): - result.append(get_prototype(prototype_id)) - - for prototype in result: - _stringify_prototype(prototype) - - var indent = "\t" - if ProjectSettings.get_setting("gloot/JSON_serialization/indent_using_spaces", true): - indent = "" - for i in ProjectSettings.get_setting("gloot/JSON_serialization/indent_size", 4): - indent += " " - - return JSON.stringify( - result, - indent, - ProjectSettings.get_setting("gloot/JSON_serialization/sort_keys", true), - ProjectSettings.get_setting("gloot/JSON_serialization/full_precision", false), - ) - - -func _stringify_prototype(prototype: Dictionary) -> void: - for key in prototype.keys(): - var type = typeof(prototype[key]) - if (type != TYPE_STRING) and (type != TYPE_FLOAT): - prototype[key] = var_to_str(prototype[key]) - - -func _unstringify_prototype(prototype: Dictionary) -> void: - for key in prototype.keys(): - var type = typeof(prototype[key]) - if type == TYPE_STRING: - var variant = Utils.str_to_var(prototype[key]) - if variant != null: - prototype[key] = variant - - -func _update_json_data() -> void: - json_data = _to_json() - - -func _save() -> void: - if !Engine.is_editor_hint(): - return - emit_changed() - if !resource_path.is_empty(): - ResourceSaver.save(self) - - -func get_prototype(id: StringName) -> Variant: - assert(has_prototype(id), "No prototype with ID: %s" % id) - return _prototypes[id] - - -func add_prototype(id: String) -> void: - assert(!has_prototype(id), "Prototype with ID already exists") - _prototypes[id] = {KEY_ID: id} - _update_json_data() - _save() - - -func remove_prototype(id: String) -> void: - assert(has_prototype(id), "No prototype with ID: %s" % id) - _prototypes.erase(id) - _update_json_data() - _save() - - -func duplicate_prototype(id: String) -> void: - assert(has_prototype(id), "No prototype with ID: %s" % id) - var new_id = "%s_duplicate" % id - var new_dict = _prototypes[id].duplicate() - new_dict[KEY_ID] = new_id - _prototypes[new_id] = new_dict - _update_json_data() - _save() - - -func rename_prototype(id: String, new_id: String) -> void: - assert(has_prototype(id), "No prototype with ID: %s" % id) - assert(!has_prototype(new_id), "Prototype with ID already exists") - add_prototype(new_id) - _prototypes[new_id] = _prototypes[id].duplicate() - _prototypes[new_id][KEY_ID] = new_id - remove_prototype(id) - _update_json_data() - _save() - - -func set_prototype_properties(id: String, new_properties: Dictionary) -> void: - _prototypes[id] = new_properties - _update_json_data() - _save() - - -func has_prototype(id: String) -> bool: - return _prototypes.has(id) - - -func set_prototype_property(id: String, property_name: String, value) -> void: - assert(has_prototype(id), "No prototype with ID: %s" % id) - var prototype = get_prototype(id) - prototype[property_name] = value - - -func get_prototype_property(id: String, property_name: String, default_value = null) -> Variant: - if has_prototype(id): - var prototype = get_prototype(id) - if !prototype.is_empty() && prototype.has(property_name): - return prototype[property_name] - - return default_value - - -func prototype_has_property(id: String, property_name: String) -> bool: - if has_prototype(id): - return get_prototype(id).has(property_name) - - return false diff --git a/addons/gloot/core/item_ref_slot.gd b/addons/gloot/core/item_ref_slot.gd deleted file mode 100644 index e83f6d8..0000000 --- a/addons/gloot/core/item_ref_slot.gd +++ /dev/null @@ -1,186 +0,0 @@ -@tool -@icon("res://addons/gloot/images/icon_item_ref_slot.svg") -class_name ItemRefSlot -extends "res://addons/gloot/core/item_slot_base.gd" - -signal inventory_changed - -const Verify = preload("res://addons/gloot/core/verify.gd") -const KEY_ITEM_INDEX: String = "item_index" -const EMPTY_SLOT = -1 - -@export var inventory_path: NodePath : - set(new_inv_path): - if inventory_path == new_inv_path: - return - inventory_path = new_inv_path - update_configuration_warnings() - _set_inventory_from_path(inventory_path) - -var _wr_item: WeakRef = weakref(null) -var _wr_inventory: WeakRef = weakref(null) -@export var _equipped_item: int = EMPTY_SLOT : set = _set_equipped_item_index -var inventory: Inventory = null : - get = _get_inventory, set = _set_inventory - - -func _get_configuration_warnings() -> PackedStringArray: - if inventory_path.is_empty(): - return PackedStringArray([ - "Inventory path not set! Inventory path needs to point to an inventory node, so " +\ - "items from that inventory can be equipped in the slot."]) - return PackedStringArray() - - -func _set_equipped_item_index(new_value: int) -> void: - _equipped_item = new_value - equip_by_index(new_value) - - -func _ready() -> void: - _set_inventory_from_path(inventory_path) - equip_by_index(_equipped_item) - - -func _set_inventory_from_path(path: NodePath) -> bool: - if path.is_empty(): - return false - - var node: Node = null - - if is_inside_tree(): - node = get_node_or_null(inventory_path) - - if node == null || !(node is Inventory): - return false - - clear() - _set_inventory(node) - return true - - -func _set_inventory(inventory: Inventory) -> void: - if inventory == _wr_inventory.get_ref(): - return - - if _get_inventory() != null: - _disconnect_inventory_signals() - - clear() - _wr_inventory = weakref(inventory) - inventory_changed.emit() - - if _get_inventory() != null: - _connect_inventory_signals() - - -func _connect_inventory_signals() -> void: - if _get_inventory() == null: - return - - if !_get_inventory().item_removed.is_connected(_on_item_removed): - _get_inventory().item_removed.connect(_on_item_removed) - - -func _disconnect_inventory_signals() -> void: - if _get_inventory() == null: - return - - if _get_inventory().item_removed.is_connected(_on_item_removed): - _get_inventory().item_removed.disconnect(_on_item_removed) - - -func _on_item_removed(item: InventoryItem) -> void: - clear() - - -func _get_inventory() -> Inventory: - return _wr_inventory.get_ref() - - -func equip(item: InventoryItem) -> bool: - if !can_hold_item(item): - return false - - if _wr_item.get_ref() == item: - return false - - if get_item() != null && !clear(): - return false - - _wr_item = weakref(item) - _equipped_item = _get_inventory().get_item_index(item) - item_equipped.emit() - return true - - -func equip_by_index(index: int) -> bool: - if _get_inventory() == null: - return false - if index < 0: - return false - if index >= _get_inventory().get_item_count(): - return false - return equip(_get_inventory().get_items()[index]) - - -func clear() -> bool: - if get_item() == null: - return false - - _wr_item = weakref(null) - _equipped_item = EMPTY_SLOT - cleared.emit() - return true - - -func get_item() -> InventoryItem: - return _wr_item.get_ref() - - -func can_hold_item(item: InventoryItem) -> bool: - if item == null: - return false - - if _get_inventory() == null || !_get_inventory().has_item(item): - return false - - return true - - -func reset() -> void: - clear() - - -func serialize() -> Dictionary: - var result: Dictionary = {} - var item : InventoryItem = _wr_item.get_ref() - - if item != null && item.get_inventory() != null: - result[KEY_ITEM_INDEX] = item.get_inventory().get_item_index(item) - - return result - - -func deserialize(source: Dictionary) -> bool: - if !Verify.dict(source, false, KEY_ITEM_INDEX, [TYPE_INT, TYPE_FLOAT]): - return false - - reset() - - if source.has(KEY_ITEM_INDEX): - var item_index: int = source[KEY_ITEM_INDEX] - if !_equip_item_with_index(item_index): - return false - - return true - - -func _equip_item_with_index(item_index: int) -> bool: - if _get_inventory() == null: - return false - if item_index >= _get_inventory().get_item_count(): - return false - equip(_get_inventory().get_items()[item_index]) - return true - diff --git a/addons/gloot/core/item_slot.gd b/addons/gloot/core/item_slot.gd index e780217..f264e6f 100644 --- a/addons/gloot/core/item_slot.gd +++ b/addons/gloot/core/item_slot.gd @@ -1,130 +1,140 @@ @tool @icon("res://addons/gloot/images/icon_item_slot.svg") class_name ItemSlot -extends "res://addons/gloot/core/item_slot_base.gd" - -signal protoset_changed - -const Verify = preload("res://addons/gloot/core/verify.gd") -const KEY_ITEM: String = "item" - -@export var item_protoset: ItemProtoset: - set(new_item_protoset): - if new_item_protoset == item_protoset: +extends Node +## An item slot that can hold an inventory item. +## +## An item slot that can hold an inventory item. + +signal protoset_changed ## Emitted when the protoset property has been changed. +signal item_equipped ## Emitted when an item is placed in the slot. +signal cleared ## Emitted when the slot is cleared.Emitted when the slot is cleared. + +const _Verify = preload("res://addons/gloot/core/verify.gd") +const _KEY_ITEM: String = "item" + +## A JSON resource containing prototype information. +@export var protoset: JSON: + set(new_protoset): + if new_protoset == protoset: return - if _item: - _item = null - item_protoset = new_item_protoset + protoset = new_protoset + if is_instance_valid(_inventory): + _inventory.protoset = protoset protoset_changed.emit() update_configuration_warnings() -@export var remember_source_inventory: bool = true +var _inventory: Inventory = null: + set(new_inventory): + if new_inventory == _inventory: + return + _disconnect_inventory_signals() + _inventory = new_inventory + _connect_inventory_signals() + + +func _connect_inventory_signals() -> void: + if !is_instance_valid(_inventory): + return + _inventory.item_added.connect(_on_item_added) + _inventory.item_removed.connect(_on_item_removed) -var _wr_source_inventory: WeakRef = weakref(null) -var _item: InventoryItem + +func _disconnect_inventory_signals() -> void: + if !is_instance_valid(_inventory): + return + _inventory.item_added.disconnect(_on_item_added) + _inventory.item_removed.disconnect(_on_item_removed) + + +func _init() -> void: + _inventory = Inventory.new() + _inventory.protoset = protoset + var item_count_constraint := ItemCountConstraint.new() + _inventory.add_child(item_count_constraint) + add_child(_inventory) + + +func _on_item_added(item: InventoryItem) -> void: + item_equipped.emit() + + +func _on_item_removed(item: InventoryItem) -> void: + cleared.emit() func _get_configuration_warnings() -> PackedStringArray: - if item_protoset == null: + if protoset == null: return PackedStringArray([ - "This item slot has no protoset. Set the 'item_protoset' field to be able to equip items."]) + "This item slot has no protoset. Set the 'protoset' field to be able to equip items."]) return PackedStringArray() +## Equips the given inventory item in the slot. If the slot already contains an item, clear() will be called first. +## Returns false if the clear call fails, the slot can't hold the given item, or already holds the given item. Returns +## true otherwise. func equip(item: InventoryItem) -> bool: if !can_hold_item(item): return false - if item.get_parent() == self: - return false - if get_item() != null && !clear(): return false - _wr_source_inventory = weakref(item.get_inventory()) + if item.get_inventory() != null: + item.get_inventory().remove_item(item) - if item.get_parent(): - item.get_parent().remove_child(item) - - add_child(item) - if Engine.is_editor_hint(): - item.owner = get_tree().edited_scene_root + _inventory.add_item(item) return true -func _on_item_added(item: InventoryItem) -> void: - _item = item - item_equipped.emit() - - +## Clears the item slot. Returns false if there's no item in the slot. func clear() -> bool: - return _clear_impl(remember_source_inventory) - - -func _clear_impl(return_item: bool) -> bool: if get_item() == null: return false - if return_item && _return_item_to_source_inventory(): - return true - - remove_child(get_item()) + _inventory.clear() return true -func _return_item_to_source_inventory() -> bool: - var inventory: Inventory = (_wr_source_inventory.get_ref() as Inventory) - if inventory != null: - if inventory.add_item(get_item()): - return true - return false - - -func _on_item_removed() -> void: - _item = null - _wr_source_inventory = weakref(null) - cleared.emit() - - +## Returns the equipped item or `null` if there's no item in the slot. func get_item() -> InventoryItem: - return _item + if _inventory.get_item_count() == 0: + return null + return _inventory.get_items()[0] +## Checks if the slot can hold the given item, i.e. the slot uses the same protoset as the item and the item is not +## `null`. func can_hold_item(item: InventoryItem) -> bool: - assert(item_protoset != null, "Item protoset not set!") + assert(protoset != null, "Item protoset not set!") if item == null: return false - if item_protoset != item.protoset: + if protoset != item.protoset: return false return true -func reset() -> void: - if _item: - _item.queue_free() - _clear_impl(false) - - +## Serializes the item slot into a `Dictionary`. func serialize() -> Dictionary: var result: Dictionary = {} - if _item != null: - result[KEY_ITEM] = _item.serialize() + if get_item() != null: + result[_KEY_ITEM] = get_item().serialize() return result +## Loads the item slot data from the given `Dictionary`. func deserialize(source: Dictionary) -> bool: - if !Verify.dict(source, false, KEY_ITEM, [TYPE_DICTIONARY]): + if !_Verify.dict(source, false, _KEY_ITEM, [TYPE_DICTIONARY]): return false - reset() + clear() - if source.has(KEY_ITEM): + if source.has(_KEY_ITEM): var item := InventoryItem.new() - if !item.deserialize(source[KEY_ITEM]): + if !item.deserialize(source[_KEY_ITEM]): return false equip(item) return true - diff --git a/addons/gloot/core/item_slot.gd.uid b/addons/gloot/core/item_slot.gd.uid new file mode 100644 index 0000000..a09274d --- /dev/null +++ b/addons/gloot/core/item_slot.gd.uid @@ -0,0 +1 @@ +uid://dhlhquhwb0h0d diff --git a/addons/gloot/core/item_slot_base.gd b/addons/gloot/core/item_slot_base.gd deleted file mode 100644 index 0c9679e..0000000 --- a/addons/gloot/core/item_slot_base.gd +++ /dev/null @@ -1,42 +0,0 @@ -@tool -@icon("res://addons/gloot/images/icon_item_slot.svg") -class_name ItemSlotBase -extends Node - -signal item_equipped -signal cleared - - -# Override this -func equip(item: InventoryItem) -> bool: - return false - - -# Override this -func clear() -> bool: - return false - - -# Override this -func get_item() -> InventoryItem: - return null - - -# Override this -func can_hold_item(item: InventoryItem) -> bool: - return false - - -# Override this -func reset() -> void: - pass - - -# Override this -func serialize() -> Dictionary: - return {} - - -# Override this -func deserialize(source: Dictionary) -> bool: - return false \ No newline at end of file diff --git a/addons/gloot/core/prototree/proto_tree.gd b/addons/gloot/core/prototree/proto_tree.gd new file mode 100644 index 0000000..8b4c205 --- /dev/null +++ b/addons/gloot/core/prototree/proto_tree.gd @@ -0,0 +1,96 @@ +class_name ProtoTree +extends RefCounted +## A prototype tree (prototree). +## +## A tree structure of prototypes with a root prototype that can have a number of child prototypes. + +const _Utils = preload("res://addons/gloot/core/utils.gd") + +var _root := Prototype.new("ROOT") + + +## Returns the root prototype. +func get_root() -> Prototype: + return _root + + +## Creates a child prototype for the root prototype. +func create_prototype(prototype_id: String) -> Prototype: + return _root.inherit(prototype_id) + + +## Returns the prototype with the given ID. +func get_prototype(prototype_id: String) -> Prototype: + return _root.get_derived_prototype(prototype_id) + + +## Returns an array of all child prototypes of the root. +func get_prototypes() -> Array: + return _root.get_derived_prototypes() + + +## Checks if the prototree contains the prototype with the given ID. +func has_prototype(prototype_id: String) -> bool: + return _root.is_inherited_by(prototype_id) + + +## Checks if the prototype with the given ID has the given property defined. +func prototype_has_property(prototype_id: String, property: String) -> bool: + if !has_prototype(prototype_id): + return false + return _root.get_derived_prototype(prototype_id).has_property(property) + + +## Returns the given property of the prototype with the given ID. If the prototype does not have the property defined, +## `default_value` is returned. +func get_prototype_property(prototype_id: String, property: String, default_value: Variant = null) -> Variant: + if has_prototype(prototype_id): + var prototype = get_prototype(prototype_id) + if prototype.has_property(property): + return prototype.get_property(property) + + return default_value + + +## Clears the prototree by clearing the roots properties and child prototypes. +func clear() -> void: + _root._clear() + + +## Checks if the prototree is empty (the root has no properties and no child prototypes). +func is_empty() -> bool: + return _root.get_properties().is_empty() && _root.get_derived_prototypes().is_empty() + + +## Parses the given JSON resource into a prototree. Returns `false` if parsing fails. +func deserialize(json: JSON) -> bool: + clear() + if !is_instance_valid(json): + return false + if json.data == null: + return false + if json.data.is_empty(): + return true + for prototype_id in json.data.keys(): + var base: Prototype = null + var prototype_dict = json.data[prototype_id] + if prototype_dict.has("inherits"): + base = _root.get_derived_prototype(prototype_dict["inherits"]) + else: + base = _root + + if base == null: + clear() + return false + var new_protototype = base.inherit(prototype_id) + assert(new_protototype) + for property in prototype_dict.keys(): + if typeof(prototype_dict[property]) == TYPE_STRING: + var value = _Utils.str_to_var(prototype_dict[property]) + if value == null: + new_protototype.set_property(property, prototype_dict[property]) + else: + new_protototype.set_property(property, value) + else: + new_protototype.set_property(property, prototype_dict[property]) + return true diff --git a/addons/gloot/core/prototree/proto_tree.gd.uid b/addons/gloot/core/prototree/proto_tree.gd.uid new file mode 100644 index 0000000..23e5040 --- /dev/null +++ b/addons/gloot/core/prototree/proto_tree.gd.uid @@ -0,0 +1 @@ +uid://sw487eanji4w diff --git a/addons/gloot/core/prototree/proto_tree_cache.gd b/addons/gloot/core/prototree/proto_tree_cache.gd new file mode 100644 index 0000000..02485eb --- /dev/null +++ b/addons/gloot/core/prototree/proto_tree_cache.gd @@ -0,0 +1,22 @@ +@tool + +static var _cache: Dictionary = {} +static var _empty: ProtoTree = ProtoTree.new() + + +static func get_cached(key: JSON) -> ProtoTree: + if Engine.is_editor_hint(): + var result := ProtoTree.new() + result.deserialize(key) + return result + + if _cache.has(key): + return _cache[key] + else: + _cache[key] = ProtoTree.new() + _cache[key].deserialize(key) + return _cache[key] + + +static func get_empty() -> ProtoTree: + return _empty diff --git a/addons/gloot/core/prototree/proto_tree_cache.gd.uid b/addons/gloot/core/prototree/proto_tree_cache.gd.uid new file mode 100644 index 0000000..0798d7d --- /dev/null +++ b/addons/gloot/core/prototree/proto_tree_cache.gd.uid @@ -0,0 +1 @@ +uid://bqgnjnqjte3f diff --git a/addons/gloot/core/prototree/prototype.gd b/addons/gloot/core/prototree/prototype.gd new file mode 100644 index 0000000..9bac966 --- /dev/null +++ b/addons/gloot/core/prototree/prototype.gd @@ -0,0 +1,156 @@ +class_name Prototype +extends RefCounted +## An item prototype. +## +## An item prototype contains a set of properties and is identified with an ID string. It can also contain other "child" +## prototypes as part of a prototype tree (prototree). + +const _KEY_PROPERTIES = "properties" +const _KEY_PROTOTYPES = "prototypes" + +var _id: String +var _properties: Dictionary +var _parent: Prototype +var _prototypes: Dictionary + + +func _init(id: String) -> void: + _id = id + + +## Returns the prototype ID string. +func get_id() -> String: + return _id + + +## Checks if the prototype inherits the prototype with the given ID. +func inherits(prototype_id: String) -> bool: + var x = self + while x: + if x._id == prototype_id: + return true + x = x._parent + return false + + +func _defines_or_overrides_property(property: String) -> bool: + return _properties.has(property) + + +## Checks if the prototype inherits the given property. +func inherits_property(property: String) -> bool: + if is_instance_valid(_parent): + return _parent.has_property(property) + return false + + +## Checks if the prototype defines the given property. +func defines_property(property: String) -> bool: + return _defines_or_overrides_property(property) && !inherits_property(property) + + +## Checks if the prototype overrides the given property. +func overrides_property(property: String) -> bool: + return _defines_or_overrides_property(property) && inherits_property(property) + + +## Checks if the prototype has the given property (either by defining, inheriting or overriding it). +func has_property(property: String) -> bool: + if _defines_or_overrides_property(property): + return true + if is_instance_valid(_parent): + return _parent.has_property(property) + return false + + +## Returns the value of the given property. If the prototype does not have the property, `default_value` is returned. +func get_property(property: String, default_value: Variant = null) -> Variant: + if _properties.has(property): + return _properties[property] + if is_instance_valid(_parent): + return _parent.get_property(property) + return default_value + + +## Returns a `Dictionary` of all prototype properties (defined, inherited or overridden). +func get_properties() -> Dictionary: + var result := _properties.duplicate() + if !is_instance_valid(_parent): + return result + + result.merge(_parent.get_properties()) + return result + + +## Sets the given property for the prototype. +func set_property(property: String, value: Variant): + if get_property(property) == value: + return + _properties[property] = value + + +## Checks if the prototype contains the prototype with the given ID within the prototype tree. +func is_inherited_by(prototype_id: String) -> bool: + return _find_derived_prototype(prototype_id) != null + + +## Creates a child prototype with the given ID that inherits the prototype. +func inherit(prototype_id: String) -> Prototype: + # TODO: Consider using a prototype as input + assert(!is_inherited_by(prototype_id), "'%s' already inherits '%s'" % [prototype_id, _id]) + var new_prototype := Prototype.new(prototype_id) + new_prototype._parent = self + _prototypes[prototype_id] = new_prototype + return new_prototype + + +## Returns the derived prototype with the given ID. +func get_derived_prototype(prototype_id: String) -> Prototype: + assert(!prototype_id.is_empty(), "Invalid prototype ID (empty string)!") + var result := _find_derived_prototype(prototype_id) + assert(result != null, "Derived prototype not found: '%s'" % prototype_id) + return result + + +func _find_derived_prototype(prototype_id: String) -> Prototype: + if _prototypes.has(prototype_id): + return _prototypes[prototype_id] + for p in _prototypes: + var prototype: Prototype = _prototypes[p]._find_derived_prototype(prototype_id) + if is_instance_valid(prototype): + return prototype + return null + + +## Returns the ID of the prototype. +func get_prototype_id() -> String: + return _id + + +func _is_root() -> bool: + return !is_instance_valid(_parent) + + +## Returns an array of all derived prototypes. +func get_derived_prototypes() -> Array: + return _prototypes.values().duplicate() + + +## Removes the derived prototype with the given ID. +func remove_derived_prototype(prototype_id: String) -> void: + var prototype = get_derived_prototype(prototype_id) + var parent = prototype._parent + assert(parent != null, "Derived prototype has no parent!") + parent._prototypes.erase(prototype.get_id()) + + +func _get_root() -> Prototype: + var root = self + while is_instance_valid(root._parent): + root = root._parent + return root + + +func _clear() -> void: + _properties.clear() + _prototypes.clear() diff --git a/addons/gloot/core/prototree/prototype.gd.uid b/addons/gloot/core/prototree/prototype.gd.uid new file mode 100644 index 0000000..f5e5d64 --- /dev/null +++ b/addons/gloot/core/prototree/prototype.gd.uid @@ -0,0 +1 @@ +uid://dihy7hdpnvxgi diff --git a/addons/gloot/core/stack_manager.gd b/addons/gloot/core/stack_manager.gd new file mode 100644 index 0000000..ef2ee0b --- /dev/null +++ b/addons/gloot/core/stack_manager.gd @@ -0,0 +1,296 @@ +const _ItemCount = preload("res://addons/gloot/core/item_count.gd") + +const _KEY_STACK_SIZE: String = "stack_size" +const _KEY_MAX_STACK_SIZE: String = "max_stack_size" + +const DEFAULT_STACK_SIZE: int = 1 +const DEFAULT_MAX_STACK_SIZE: int = 1 + + +static func get_item_stack_size(item: InventoryItem) -> _ItemCount: + assert(item != null, "item is null!") + var stack_size: int = item.get_property(_KEY_STACK_SIZE, DEFAULT_STACK_SIZE) + return _ItemCount.new(stack_size) + + +static func get_item_max_stack_size(item: InventoryItem) -> _ItemCount: + assert(item != null, "item is null!") + var max_stack_size: int = item.get_property(_KEY_MAX_STACK_SIZE, DEFAULT_MAX_STACK_SIZE) + return _ItemCount.new(max_stack_size) + + +static func set_item_stack_size(item: InventoryItem, stack_size: _ItemCount) -> bool: + assert(item != null, "item is null!") + assert(stack_size != null, "stack_size is null!") + if stack_size.gt(get_item_max_stack_size(item)): + return false + if stack_size.eq(_ItemCount.new(0)): + var inventory: Inventory = item.get_inventory() + if inventory != null: + inventory.remove_item(item) + item.set_property(_KEY_STACK_SIZE, stack_size.count) + return true + + +static func set_item_max_stack_size(item: InventoryItem, max_stack_size: _ItemCount) -> void: + assert(item != null, "item is null!") + assert(max_stack_size != null, "max_stack_size is null!") + item.set_property(_KEY_MAX_STACK_SIZE, max_stack_size.count) + + +static func get_prototype_stack_size(prototree: ProtoTree, prototype_id: String) -> _ItemCount: + assert(prototree != null, "prototree is null!") + var stack_size: int = prototree.get_prototype_property(prototype_id, _KEY_STACK_SIZE, DEFAULT_STACK_SIZE) + return _ItemCount.new(stack_size) + + +static func get_prototype_max_stack_size(prototree: ProtoTree, prototype_id: String) -> _ItemCount: + assert(prototree != null, "prototree is null!") + var max_stack_size: int = prototree.get_prototype_property(prototype_id, _KEY_MAX_STACK_SIZE, DEFAULT_MAX_STACK_SIZE) + return _ItemCount.new(max_stack_size) + + +static func stacks_compatible(item_1: InventoryItem, item_2: InventoryItem) -> bool: + # Two item stacks are compatible for merging if they have the same prototype and neither of the two contain + # overridden properties that the other one doesn't have (except for "stack_size", "max_stack_size"). + assert(item_1 != null, "item_1 is null!") + assert(item_2 != null, "item_2 is null!") + + var ignore_properies: Array[String] = [ + _KEY_STACK_SIZE, + _KEY_MAX_STACK_SIZE + ] + + if !item_1.get_prototype().get_prototype_id() == item_2.get_prototype().get_prototype_id(): + return false + + for property in item_1.get_overridden_properties(): + if property in ignore_properies: + continue + if !item_2.is_property_overridden(property) || item_2.get_property(property) != item_1.get_property(property): + return false + + for property in item_2.get_overridden_properties(): + if property in ignore_properies: + continue + if !item_1.is_property_overridden(property) || item_1.get_property(property) != item_2.get_property(property): + return false + + return true + + +static func merge_stacks(item_dst: InventoryItem, item_src: InventoryItem, split_source: bool = false) -> bool: + if split_source: + return _merge_stacks_split_source(item_dst, item_src) + return _merge_stacks(item_dst, item_src) + + +static func can_merge_stacks(item_dst: InventoryItem, item_src: InventoryItem, split_source: bool = false) -> bool: + if split_source: + return _can_merge_stacks_split_source(item_dst, item_src) + return _can_merge_stacks(item_dst, item_src) + + +static func _merge_stacks(item_dst: InventoryItem, item_src: InventoryItem) -> bool: + assert(item_dst != null, "item_dst is null!") + assert(item_src != null, "item_src is null!") + + if item_dst == item_src: + return false + + if !_can_merge_stacks(item_dst, item_src): + return false + + var src_size := get_item_stack_size(item_src) + set_item_stack_size(item_src, _ItemCount.zero()) + set_item_stack_size(item_dst, get_item_stack_size(item_dst).add(src_size)) + return true + + +static func _can_merge_stacks(item_dst: InventoryItem, item_src: InventoryItem) -> bool: + if !stacks_compatible(item_dst, item_src): + return false + + var src_size: _ItemCount = get_item_stack_size(item_src) + var dst_size := get_item_stack_size(item_dst) + var free_dst_stack_space := get_free_stack_space(item_dst) + + if free_dst_stack_space.eq(_ItemCount.zero()): + return false + if src_size.gt(free_dst_stack_space): + return false + return true + + +static func _merge_stacks_split_source(item_dst: InventoryItem, item_src: InventoryItem) -> bool: + assert(item_dst != null, "item_dst is null!") + assert(item_src != null, "item_src is null!") + + if !_can_merge_stacks_split_source(item_dst, item_src): + return false + if _merge_stacks(item_dst, item_src): + return true + + var free_dst_stack_space := get_free_stack_space(item_dst) + var new_stack := split_stack(item_src, free_dst_stack_space) + var success = _merge_stacks(item_dst, new_stack) + assert(success, "Failed to merge stacks!") + return true + + +static func _can_merge_stacks_split_source(item_dst: InventoryItem, item_src: InventoryItem) -> bool: + assert(item_dst != null, "item_dst is null!") + assert(item_src != null, "item_src is null!") + if item_dst == item_src: + return false + if !stacks_compatible(item_dst, item_src): + return false + return !get_free_stack_space(item_dst).eq(_ItemCount.zero()) + + +static func get_free_stack_space(item: InventoryItem) -> _ItemCount: + assert(item != null, "item is null!") + return get_item_max_stack_size(item).sub(get_item_stack_size(item)) + + +static func split_stack(item: InventoryItem, new_stack_size: _ItemCount) -> InventoryItem: + if !can_split_stack(item, new_stack_size): + return null + + var new_item := item.duplicate() + set_item_stack_size(item, get_item_stack_size(item).sub(new_stack_size)) + set_item_stack_size(new_item, new_stack_size) + return new_item + + +static func can_split_stack(item: InventoryItem, new_stack_size: _ItemCount) -> bool: + if get_item_stack_size(item).gt(new_stack_size): + return true + return false + + +static func inv_split_stack(inv: Inventory, item: InventoryItem, new_stack_size: _ItemCount) -> InventoryItem: + assert(inv.has_item(item), "Inventory must contain item!") + + var old_item_stack_size := get_item_stack_size(item) + var new_stack := split_stack(item, new_stack_size) + if new_stack == null: + return null + + if !inv.add_item(new_stack): + set_item_stack_size(item, old_item_stack_size) + return null + + return new_stack + + +static func inv_merge_stack(inv: Inventory, item_dst: InventoryItem, item_src: InventoryItem, split_source: bool = false) -> bool: + if split_source: + return _inv_merge_stack_split_source(inv, item_dst, item_src) + return _inv_merge_stack(inv, item_dst, item_src) + + +static func _inv_merge_stack(inv: Inventory, item_dst: InventoryItem, item_src: InventoryItem) -> bool: + assert(inv.has_item(item_dst), "Inventory must contain item_dst!") + + if !inv.has_item(item_src) && !inv.can_add_item(item_src): + return false + + if !merge_stacks(item_dst, item_src): + return false + + var inv_src := item_src.get_inventory() + if is_instance_valid(inv_src): + inv_src.remove_item(item_src) + return true + + +static func _inv_merge_stack_split_source(inv: Inventory, item_dst: InventoryItem, item_src: InventoryItem) -> bool: + assert(inv.has_item(item_dst), "Inventory must contain item_dst!") + + if !stacks_compatible(item_dst, item_src): + return false + + # item_dst and item_src are in the same inventory + if inv.has_item(item_src): + return merge_stacks(item_dst, item_src, true) + + # item_dst and item_src are in different inventories + if inv._constraint_manager.has_space_for(item_src): + _merge_stacks_split_source(item_dst, item_src) + return true + + var receivable_stack_size := _ItemCount.min(get_free_stack_space(item_dst), inv._constraint_manager.get_space_for(item_src)) + if receivable_stack_size.eq(_ItemCount.zero()): + return false + var src_stack_size := get_item_stack_size(item_src) + if receivable_stack_size.ge(src_stack_size): + # No splitting of item_src is needed + var success = _inv_merge_stack(inv, item_dst, item_src) + assert(success, "Failed to merge stacks!") + return true + + # Need to split item_src + var partial_stack := split_stack(item_src, receivable_stack_size) + assert(partial_stack != null) + var success = merge_stacks(item_dst, partial_stack) + assert(success, "Failed to merge stacks!") + return true + + +static func inv_add_automerge(inv: Inventory, item: InventoryItem) -> bool: + assert(!inv.has_item(item), "Inventory must not contain item!") + + if !inv._constraint_manager.has_space_for(item): + return false + var success = inv.add_item(item) + assert(success, "Failed to add item!") + inv_pack_stack(inv, item) + return true + + +static func inv_add_autosplit(inv: Inventory, item: InventoryItem) -> bool: + if inv.add_item(item): + return true + + var space_for_item := inv._constraint_manager.get_space_for(item) + if space_for_item.eq(_ItemCount.zero()): + return false + + var new_stack := split_stack(item, space_for_item) + assert(new_stack) + var success = inv.add_item(new_stack) + assert(success, "Failed to add item!") + return true + + +static func inv_add_autosplitmerge(inv: Inventory, item: InventoryItem) -> bool: + assert(!inv.has_item(item), "Inventory must not contain item!") + + if inv._constraint_manager.has_space_for(item): + inv.add_item(item) + inv_pack_stack(inv, item) + return true + + if !_inv_has_space_for_single_item(inv, item): + return false + + for i in inv.get_items(): + _merge_stacks_split_source(i, item) + if get_item_stack_size(item).eq(_ItemCount.zero()): + return true + inv.add_item(item) + return true + + +static func _inv_has_space_for_single_item(inv: Inventory, item: InventoryItem) -> bool: + var test_item := item.duplicate() + set_item_stack_size(test_item, _ItemCount.one()) + return inv._constraint_manager.has_space_for(test_item) + + +static func inv_pack_stack(inv: Inventory, item: InventoryItem) -> void: + for mergable_item in inv.get_items(): + if !can_merge_stacks(mergable_item, item, true): + continue + merge_stacks(mergable_item, item, true) diff --git a/addons/gloot/core/stack_manager.gd.uid b/addons/gloot/core/stack_manager.gd.uid new file mode 100644 index 0000000..d844ab8 --- /dev/null +++ b/addons/gloot/core/stack_manager.gd.uid @@ -0,0 +1 @@ +uid://b7wnv2qfxvu8o diff --git a/addons/gloot/core/utils.gd b/addons/gloot/core/utils.gd index a4294ea..95a8b3e 100644 --- a/addons/gloot/core/utils.gd +++ b/addons/gloot/core/utils.gd @@ -1,7 +1,16 @@ +static func safe_connect(s: Signal, c: Callable) -> void: + if !s.is_connected(c): + s.connect(c) + + +static func safe_disconnect(s: Signal, c: Callable) -> void: + if s.is_connected(c): + s.disconnect(c) + static func str_to_var(s: String) -> Variant: var variant = str_to_var(s) - # str_to_var considers all strings that start with a digit convertable to + # str_to_var considers all strings that start with a digit convertible to # int/float (which is not consistent with String.is_valid_int and # String.is_valid_float). if typeof(variant) == TYPE_INT && !s.is_valid_int(): @@ -9,3 +18,21 @@ static func str_to_var(s: String) -> Variant: if typeof(variant) == TYPE_FLOAT && !s.is_valid_float(): variant = null return variant + + +static func array_union(a: Array, b: Array) -> Array: + var result: Array = a.duplicate() + for x in b: + if not x in result: + result.push_back(x) + return result + + +static func _deserialize_protoset(data: String) -> JSON: + assert(!data.is_empty(), "Invalid protoset data (empty string)!") + if data.begins_with("res://"): + return load(data) + else: + var prototree := JSON.new() + prototree.parse(data) + return prototree diff --git a/addons/gloot/core/utils.gd.uid b/addons/gloot/core/utils.gd.uid new file mode 100644 index 0000000..3c8f0f3 --- /dev/null +++ b/addons/gloot/core/utils.gd.uid @@ -0,0 +1 @@ +uid://cl86i2lo5k6s diff --git a/addons/gloot/core/verify.gd b/addons/gloot/core/verify.gd index db6679d..446a446 100644 --- a/addons/gloot/core/verify.gd +++ b/addons/gloot/core/verify.gd @@ -1,4 +1,3 @@ - const type_names: Array = [ "null", "bool", @@ -79,7 +78,7 @@ static func create_var(type: int): return Basis() TYPE_TRANSFORM3D: return Transform3D() - TYPE_PROJECTION : + TYPE_PROJECTION: return Projection() TYPE_COLOR: return Color() diff --git a/addons/gloot/core/verify.gd.uid b/addons/gloot/core/verify.gd.uid new file mode 100644 index 0000000..631e9f0 --- /dev/null +++ b/addons/gloot/core/verify.gd.uid @@ -0,0 +1 @@ +uid://br7rpdsj2gwtr diff --git a/addons/gloot/editor/README.md b/addons/gloot/editor/README.md new file mode 100644 index 0000000..cb13d88 --- /dev/null +++ b/addons/gloot/editor/README.md @@ -0,0 +1,17 @@ +# Editor Directory Contents + +## Directories + +| Directory | Description | +| ------------------ | ----------- | +| `common` | Editor functionality commonly used by the rest of the editor-related code. | +| `inventory_editor` | Inventory editor implementation. | +| `item_editor` | Item editor implementation. | +| `item_slot_editor` | Slot editor implementation. | + +## Files + +| Directory | Description | +| -------------------------------- | ----------- | +| `inventory_inspector_plugin.gd` | GLoot `EditorInspectorPlugin` class implementation. | +| `undoables.gd` | Helper script for executing undoable operations in the editor. | \ No newline at end of file diff --git a/addons/gloot/editor/common/choice_filter.gd b/addons/gloot/editor/common/choice_filter.gd deleted file mode 100644 index 77d51a6..0000000 --- a/addons/gloot/editor/common/choice_filter.gd +++ /dev/null @@ -1,129 +0,0 @@ -@tool -extends Control - -signal choice_picked(value_index) -signal choice_selected(value_index) - - -@onready var lbl_filter: Label = $HBoxContainer/Label -@onready var line_edit: LineEdit = $HBoxContainer/LineEdit -@onready var item_list: ItemList = $ItemList -@onready var btn_pick: Button = $Button -@export var pick_button_visible: bool = true : - set(new_pick_button_visible): - pick_button_visible = new_pick_button_visible - if btn_pick: - btn_pick.visible = pick_button_visible -@export var pick_text: String : - set(new_pick_text): - pick_text = new_pick_text - if btn_pick: - btn_pick.text = pick_text -@export var pick_icon: Texture2D : - set(new_pick_icon): - pick_icon = new_pick_icon - if btn_pick: - btn_pick.icon = pick_icon -@export var filter_text: String = "Filter:" : - set(new_filter_text): - filter_text = new_filter_text - if lbl_filter: - lbl_filter.text = filter_text -@export var filter_icon: Texture2D : - set(new_filter_icon): - filter_icon = new_filter_icon - if line_edit: - line_edit.right_icon = filter_icon -@export var values: Array[String] - - -func refresh() -> void: - _clear() - _populate() - - -func _clear() -> void: - if item_list: - item_list.clear() - - -func _populate() -> void: - if line_edit == null || item_list == null: - return - - if values == null || values.size() == 0: - return - - for value_index in range(values.size()): - var value = values[value_index] - assert(value is String, "values must be an array of strings!") - - if !line_edit.text.is_empty() && !(line_edit.text.to_lower() in value.to_lower()): - continue - - item_list.add_item(value) - item_list.set_item_metadata(item_list.get_item_count() - 1, value_index) - - -func _ready() -> void: - btn_pick.pressed.connect(_on_btn_pick) - line_edit.text_changed.connect(_on_filter_text_changed) - item_list.item_activated.connect(_on_item_activated) - item_list.item_selected.connect(_on_item_selected) - refresh() - if btn_pick: - btn_pick.text = pick_text - btn_pick.icon = pick_icon - btn_pick.visible = pick_button_visible - if lbl_filter: - lbl_filter.text = filter_text - if line_edit: - line_edit.right_icon = filter_icon - - -func _on_btn_pick() -> void: - var selected_items: PackedInt32Array = item_list.get_selected_items() - if selected_items.size() == 0: - return - - var selected_item = selected_items[0] - var selected_value_index = item_list.get_item_metadata(selected_item) - choice_picked.emit(selected_value_index) - - -func _on_filter_text_changed(_new_text: String) -> void: - refresh() - - -func _on_item_activated(index: int) -> void: - var selected_value_index = item_list.get_item_metadata(index) - choice_picked.emit(selected_value_index) - - -func _on_item_selected(index: int) -> void: - var selected_value_index = item_list.get_item_metadata(index) - choice_selected.emit(selected_value_index) - - -func get_selected_item() -> int: - var selected := item_list.get_selected_items() - if selected.size() > 0: - return item_list.get_item_metadata(selected[0]) - return -1 - - -func get_selected_text() -> String: - var selected := get_selected_item() - if selected >= 0: - return values[selected] - - return "" - - -func set_values(new_values: Array) -> void: - values.clear() - for new_value in new_values: - if typeof(new_value) == TYPE_STRING: - values.push_back(new_value) - - refresh() diff --git a/addons/gloot/editor/common/choice_filter.tscn b/addons/gloot/editor/common/choice_filter.tscn deleted file mode 100644 index 561f8bb..0000000 --- a/addons/gloot/editor/common/choice_filter.tscn +++ /dev/null @@ -1,31 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://dj577duf8yjeb"] - -[ext_resource type="Script" path="res://addons/gloot/editor/common/choice_filter.gd" id="1"] - -[node name="ChoiceFilter" type="VBoxContainer"] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -size_flags_horizontal = 3 -size_flags_vertical = 3 -script = ExtResource("1") - -[node name="HBoxContainer" type="HBoxContainer" parent="."] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="Label" type="Label" parent="HBoxContainer"] -layout_mode = 2 -text = "Filter:" - -[node name="LineEdit" type="LineEdit" parent="HBoxContainer"] -layout_mode = 2 -size_flags_horizontal = 3 -clear_button_enabled = true - -[node name="ItemList" type="ItemList" parent="."] -layout_mode = 2 -size_flags_vertical = 3 - -[node name="Button" type="Button" parent="."] -layout_mode = 2 diff --git a/addons/gloot/editor/common/choice_filter_test.tscn b/addons/gloot/editor/common/choice_filter_test.tscn deleted file mode 100644 index 062709d..0000000 --- a/addons/gloot/editor/common/choice_filter_test.tscn +++ /dev/null @@ -1,21 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://rfjw5a8ppj1b"] - -[ext_resource type="PackedScene" uid="uid://dj577duf8yjeb" path="res://addons/gloot/editor/common/choice_filter.tscn" id="1"] - -[node name="Control" type="Control"] -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="ChoiceFilter" parent="." instance=ExtResource("1")] -layout_mode = 0 -anchors_preset = 0 -anchor_right = 0.0 -anchor_bottom = 0.0 -offset_right = 217.0 -offset_bottom = 267.0 -pick_text = "Pick" -values = Array[String](["foo", "bar", "baz"]) diff --git a/addons/gloot/editor/common/dict_editor.gd b/addons/gloot/editor/common/dict_editor.gd index 3801161..f1bbbee 100644 --- a/addons/gloot/editor/common/dict_editor.gd +++ b/addons/gloot/editor/common/dict_editor.gd @@ -1,12 +1,12 @@ @tool extends Control -signal value_changed(key, value) -signal value_removed(key) +signal value_changed(key: String, value: Variant) +signal value_removed(key: String) -const Verify = preload("res://addons/gloot/core/verify.gd") -const ValueEditor = preload("res://addons/gloot/editor/common/value_editor.gd") -const supported_types: Array[int] = [ +const _Verify = preload("res://addons/gloot/core/verify.gd") +const _ValueEditor = preload("res://addons/gloot/editor/common/value_editor.gd") +const _supported_types: Array[int] = [ TYPE_BOOL, TYPE_INT, TYPE_FLOAT, @@ -32,23 +32,23 @@ const supported_types: Array[int] = [ @onready var opt_type = $VBoxContainer/HBoxContainer/OptType @onready var btn_add = $VBoxContainer/HBoxContainer/BtnAdd -@export var dictionary: Dictionary : +@export var dictionary: Dictionary: set(new_dictionary): dictionary = new_dictionary refresh() -@export var color_map: Dictionary : +@export var color_map: Dictionary: set(new_color_map): color_map = new_color_map refresh() -@export var remove_button_map: Dictionary : +@export var remove_button_map: Dictionary: set(new_remove_button_map): remove_button_map = new_remove_button_map refresh() -@export var immutable_keys: Array[String] : +@export var immutable_keys: Array[String]: set(new_immutable_keys): immutable_keys = new_immutable_keys refresh() -@export var default_color: Color = Color.WHITE : +@export var default_color: Color = Color.WHITE: set(new_default_color): default_color = new_default_color refresh() @@ -75,7 +75,7 @@ func _on_text_entered(_new_text: String) -> void: func _add_dict_field(name: String, type: int) -> bool: if (name.is_empty() || type < 0 || dictionary.has(name)): return false - dictionary[name] = Verify.create_var(type) + dictionary[name] = _Verify.create_var(type) return true @@ -92,9 +92,9 @@ func refresh() -> void: func _refresh_add_property() -> void: - for type in supported_types: - opt_type.add_item(Verify.type_names[type], type) - opt_type.select(supported_types.find(TYPE_STRING)) + for type in _supported_types: + opt_type.add_item(_Verify.type_names[type], type) + opt_type.select(_supported_types.find(TYPE_STRING)) func _clear() -> void: @@ -122,7 +122,7 @@ func _add_key(key: String, color: Color) -> void: var value = dictionary[key] _add_label(key, color) - _add_label(Verify.type_names[typeof(dictionary[key])], color) + _add_label(_Verify.type_names[typeof(dictionary[key])], color) _add_value_editor(key) _add_remove_button(key) @@ -136,7 +136,7 @@ func _add_label(key: String, color: Color) -> void: func _add_value_editor(key: String) -> void: - var value_editor: Control = ValueEditor.new() + var value_editor: Control = _ValueEditor.new() value_editor.value = dictionary[key] value_editor.size_flags_horizontal = SIZE_EXPAND_FILL value_editor.enabled = (not key in immutable_keys) diff --git a/addons/gloot/editor/common/dict_editor.gd.uid b/addons/gloot/editor/common/dict_editor.gd.uid new file mode 100644 index 0000000..d63c570 --- /dev/null +++ b/addons/gloot/editor/common/dict_editor.gd.uid @@ -0,0 +1 @@ +uid://bj07u7wpynpva diff --git a/addons/gloot/editor/common/dict_editor.tscn b/addons/gloot/editor/common/dict_editor.tscn index f43fc71..c06b05c 100644 --- a/addons/gloot/editor/common/dict_editor.tscn +++ b/addons/gloot/editor/common/dict_editor.tscn @@ -62,8 +62,8 @@ size_flags_horizontal = 3 [node name="OptType" type="OptionButton" parent="VBoxContainer/HBoxContainer"] layout_mode = 2 -item_count = 14 selected = 3 +item_count = 14 popup/item_0/text = "bool" popup/item_0/id = 1 popup/item_1/text = "int" diff --git a/addons/gloot/editor/common/editor_icons.gd.uid b/addons/gloot/editor/common/editor_icons.gd.uid new file mode 100644 index 0000000..d9d9e1a --- /dev/null +++ b/addons/gloot/editor/common/editor_icons.gd.uid @@ -0,0 +1 @@ +uid://bxx5vlfqbqk6u diff --git a/addons/gloot/editor/common/multivalue_editor.gd b/addons/gloot/editor/common/multivalue_editor.gd index cd789ab..9005696 100644 --- a/addons/gloot/editor/common/multivalue_editor.gd +++ b/addons/gloot/editor/common/multivalue_editor.gd @@ -1,14 +1,14 @@ extends GridContainer -signal value_changed(value_index) +signal value_changed(value_index: int) -const Utils = preload("res://addons/gloot/core/utils.gd") +const _Utils = preload("res://addons/gloot/core/utils.gd") -var values: Array = [] : +var values: Array = []: set(new_values): assert(!is_inside_tree(), "Can't set values once the node is inside a tree") values = new_values -var titles: Array = [] : +var titles: Array = []: set(new_titles): assert(!is_inside_tree(), "Can't set titles once the node is inside a tree") titles = new_titles @@ -45,9 +45,11 @@ func _on_line_edit_value_entered(_text: String, line_edit: LineEdit, idx: int) - func _on_line_edit_focus_exited(line_edit: LineEdit, idx: int) -> void: - var value = Utils.str_to_var(line_edit.text) + var value = _Utils.str_to_var(line_edit.text) if typeof(value) != type: line_edit.text = var_to_str(values[idx]) return + if value == values[idx]: + return values[idx] = value value_changed.emit(idx) diff --git a/addons/gloot/editor/common/multivalue_editor.gd.uid b/addons/gloot/editor/common/multivalue_editor.gd.uid new file mode 100644 index 0000000..fb04325 --- /dev/null +++ b/addons/gloot/editor/common/multivalue_editor.gd.uid @@ -0,0 +1 @@ +uid://chgvb05fxa4ai diff --git a/addons/gloot/editor/common/proto_tree_viewer.gd b/addons/gloot/editor/common/proto_tree_viewer.gd new file mode 100644 index 0000000..e142373 --- /dev/null +++ b/addons/gloot/editor/common/proto_tree_viewer.gd @@ -0,0 +1,69 @@ +@tool +extends Tree + +signal prototype_activated(prototype: Prototype) + +@export var protoset: JSON = null: + set(new_protoset): + if new_protoset == protoset: + return + _disconnect_json_signals() + protoset = new_protoset + _proto_tree.clear() + _connect_json_signals() + _proto_tree.deserialize(protoset) + _queue_refresh() + + +var _proto_tree := ProtoTree.new() +var _refresh_queued := false + + +func _connect_json_signals() -> void: + if !is_instance_valid(protoset): + return + protoset.changed.connect(_queue_refresh) + + +func _disconnect_json_signals() -> void: + if !is_instance_valid(protoset): + return + protoset.changed.disconnect(_queue_refresh) + + +func _queue_refresh() -> void: + _refresh_queued = true + + +func _process(_delta: float) -> void: + if _refresh_queued: + _refresh() + _refresh_queued = false + + +func _refresh() -> void: + clear() + var root_tree_item = create_item(null) + root_tree_item.set_text(0, _proto_tree.get_root().get_id()) + root_tree_item.set_metadata(0, _proto_tree.get_root()) + _traverse(_proto_tree.get_root(), root_tree_item) + + +func _traverse(prototype: Prototype, tree_item: TreeItem) -> void: + for subprototype in prototype.get_derived_prototypes(): + var subitem = create_item(tree_item) + subitem.set_text(0, subprototype.get_id()) + subitem.set_metadata(0, subprototype) + _traverse(subprototype, subitem) + + +func _ready() -> void: + item_activated.connect(func(): + prototype_activated.emit(get_selected().get_metadata(0)) + ) + + +func get_selected_prototype() -> Prototype: + if get_selected() == null: + return null + return get_selected().get_metadata(0) diff --git a/addons/gloot/editor/common/proto_tree_viewer.gd.uid b/addons/gloot/editor/common/proto_tree_viewer.gd.uid new file mode 100644 index 0000000..06b470b --- /dev/null +++ b/addons/gloot/editor/common/proto_tree_viewer.gd.uid @@ -0,0 +1 @@ +uid://kudxphm4j8m7 diff --git a/addons/gloot/editor/common/value_editor.gd b/addons/gloot/editor/common/value_editor.gd index 1fa69c9..5d348e9 100644 --- a/addons/gloot/editor/common/value_editor.gd +++ b/addons/gloot/editor/common/value_editor.gd @@ -2,10 +2,10 @@ extends MarginContainer signal value_changed -const MultivalueEditor = preload("res://addons/gloot/editor/common/multivalue_editor.gd") -const Utils = preload("res://addons/gloot/core/utils.gd") +const _MultivalueEditor = preload("res://addons/gloot/editor/common/multivalue_editor.gd") +const _Utils = preload("res://addons/gloot/core/utils.gd") -var value : +var value: set(new_value): value = new_value call_deferred("_refresh") @@ -74,10 +74,12 @@ func _on_line_edit_value_entered(_text: String, line_edit: LineEdit) -> void: func _on_line_edit_focus_exited(line_edit: LineEdit) -> void: - var new_value = Utils.str_to_var(line_edit.text) + var new_value = _Utils.str_to_var(line_edit.text) if typeof(new_value) != typeof(value): line_edit.text = var_to_str(value) return + if new_value == value: + return value = new_value value_changed.emit() @@ -92,6 +94,8 @@ func _create_color_picker() -> ColorPickerButton: func _on_color_picked(picker: ColorPickerButton) -> void: + if picker.color == value: + return value = picker.color value_changed.emit() @@ -106,128 +110,124 @@ func _create_checkbox() -> CheckButton: func _on_checkbox(checkbox: CheckButton) -> void: + if checkbox.button_pressed == value: + return value = checkbox.button_pressed value_changed.emit() func _create_v2_editor() -> Control: - var values = [value.x, value.y] - var titles = ["X", "Y"] - var v2_editor = _create_multifloat_editor(2, enabled, values, titles, _on_v2_value_changed) + var values := [value.x, value.y] + var titles := ["X", "Y"] + var value_converter := func(values: Array): + return Vector2(values[0], values[1]) + var v2_editor = _create_multifloat_editor(2, enabled, values, titles, value_converter) return v2_editor func _create_v2i_editor() -> Control: - var values = [value.x, value.y] - var titles = ["X", "Y"] - var v2_editor = _create_multiint_editor(2, enabled, values, titles, _on_v2_value_changed) + var values := [value.x, value.y] + var titles := ["X", "Y"] + var value_converter := func(values: Array): + return Vector2i(values[0], values[1]) + var v2_editor = _create_multiint_editor(2, enabled, values, titles, value_converter) return v2_editor -func _on_v2_value_changed(_idx: int, v2_editor: Control) -> void: - value.x = v2_editor.values[0] - value.y = v2_editor.values[1] - value_changed.emit() - - func _create_v3_editor() -> Control: - var values = [value.x, value.y, value.z] - var titles = ["X", "Y", "Z"] - var v3_editor = _create_multifloat_editor(3, enabled, values, titles, _on_v3_value_changed) + var values := [value.x, value.y, value.z] + var titles := ["X", "Y", "Z"] + var value_converter := func(values: Array): + return Vector3(values[0], values[1], values[2]) + var v3_editor = _create_multifloat_editor(3, enabled, values, titles, value_converter) return v3_editor func _create_v3i_editor() -> Control: - var values = [value.x, value.y, value.z] - var titles = ["X", "Y", "Z"] - var v3_editor = _create_multiint_editor(3, enabled, values, titles, _on_v3_value_changed) + var values := [value.x, value.y, value.z] + var titles := ["X", "Y", "Z"] + var value_converter := func(values: Array): + return Vector3i(values[0], values[1], values[2]) + var v3_editor = _create_multiint_editor(3, enabled, values, titles, value_converter) return v3_editor -func _on_v3_value_changed(_idx: int, v3_editor: Control) -> void: - value.x = v3_editor.values[0] - value.y = v3_editor.values[1] - value.z = v3_editor.values[2] - value_changed.emit() - - func _create_r2_editor() -> Control: - var values = [value.position.x, value.position.y, value.size.x, value.size.y] - var titles = ["Position X", "Position Y", "Size X", "Size Y"] - var r2_editor = _create_multifloat_editor(2, enabled, values, titles, _on_r2_value_changed) + var values := [value.position.x, value.position.y, value.size.x, value.size.y] + var titles := ["Position X", "Position Y", "Size X", "Size Y"] + var value_converter := func(values: Array): + return Rect2( + values[0], + values[1], + values[2], + values[3]) + var r2_editor = _create_multifloat_editor(2, enabled, values, titles, value_converter) return r2_editor func _create_r2i_editor() -> Control: - var values = [value.position.x, value.position.y, value.size.x, value.size.y] - var titles = ["Position X", "Position Y", "Size X", "Size Y"] - var r2_editor = _create_multiint_editor(2, enabled, values, titles, _on_r2_value_changed) + var values := [value.position.x, value.position.y, value.size.x, value.size.y] + var titles := ["Position X", "Position Y", "Size X", "Size Y"] + var value_converter := func(values: Array): + return Rect2i( + values[0], + values[1], + values[2], + values[3]) + var r2_editor = _create_multiint_editor(2, enabled, values, titles, value_converter) return r2_editor -func _on_r2_value_changed(_idx: int, r2_editor: Control) -> void: - value.position.x = r2_editor.values[0] - value.position.y = r2_editor.values[1] - value.size.x = r2_editor.values[2] - value.size.y = r2_editor.values[3] - value_changed.emit() - - func _create_plane_editor() -> Control: - var values = [value.x, value.y, value.z, value.d] - var titles = ["X", "Y", "Z", "D"] - var editor = _create_multifloat_editor(2, enabled, values, titles, _on_plane_value_changed) + var values := [value.x, value.y, value.z, value.d] + var titles := ["A", "B", "C", "D"] + var value_converter := func(values: Array): + return Plane( + values[0], + values[1], + values[2], + values[3]) + var editor = _create_multifloat_editor(2, enabled, values, titles, value_converter) return editor -func _on_plane_value_changed(_idx: int, plane_editor: Control) -> void: - value.x = plane_editor.values[0] - value.y = plane_editor.values[1] - value.z = plane_editor.values[2] - value.d = plane_editor.values[3] - value_changed.emit() - - func _create_quat_editor() -> Control: - var values = [value.x, value.y, value.z, value.w] - var titles = ["X", "Y", "Z", "W"] - var editor = _create_multifloat_editor(2, enabled, values, titles, _on_quat_value_changed) + var values := [value.x, value.y, value.z, value.w] + var titles := ["X", "Y", "Z", "W"] + var value_converter := func(values: Array): + return Quaternion( + values[0], + values[1], + values[2], + values[3]) + var editor = _create_multifloat_editor(2, enabled, values, titles, value_converter) return editor -func _on_quat_value_changed(_idx: int, quat_editor: Control) -> void: - value.x = quat_editor.values[0] - value.y = quat_editor.values[1] - value.z = quat_editor.values[2] - value.d = quat_editor.values[3] - value_changed.emit() - - func _create_aabb_editor() -> Control: - var values = [value.position.x, value.position.y, value.position.z, \ + var values := [value.position.x, value.position.y, value.position.z, \ value.size.x, value.size.y, value.size.z] - var titles = ["Position X", "Position Y", "Position Z", "Size X", "Size Y", "Size Z"] - var editor = _create_multifloat_editor(3, enabled, values, titles, _on_aabb_value_changed) + var titles := ["Position X", "Position Y", "Position Z", "Size X", "Size Y", "Size Z"] + var value_converter := func(values: Array): + var result: AABB + result.position.x = values[0] + result.position.y = values[1] + result.position.z = values[2] + result.size.x = values[3] + result.size.y = values[4] + result.size.z = values[5] + return result + var editor = _create_multifloat_editor(3, enabled, values, titles, value_converter) return editor -func _on_aabb_value_changed(_idx: int, aabb_editor: Control) -> void: - value.position.x = aabb_editor.values[0] - value.position.y = aabb_editor.values[1] - value.position.z = aabb_editor.values[2] - value.size.x = aabb_editor.values[3] - value.size.y = aabb_editor.values[4] - value.size.z = aabb_editor.values[5] - value_changed.emit() - - func _create_multifloat_editor( columns: int, enabled: bool, values: Array, titles: Array, - value_changed_handler: Callable) -> Control: - return _create_multivalue_editor(columns, enabled, TYPE_FLOAT, values, titles, value_changed_handler) + value_converter: Callable) -> Control: + return _create_multivalue_editor(columns, enabled, TYPE_FLOAT, values, titles, value_converter) func _create_multiint_editor( @@ -235,8 +235,8 @@ func _create_multiint_editor( enabled: bool, values: Array, titles: Array, - value_changed_handler: Callable) -> Control: - return _create_multivalue_editor(columns, enabled, TYPE_INT, values, titles, value_changed_handler) + value_converter: Callable) -> Control: + return _create_multivalue_editor(columns, enabled, TYPE_INT, values, titles, value_converter) func _create_multivalue_editor( @@ -245,15 +245,21 @@ func _create_multivalue_editor( type: int, values: Array, titles: Array, - value_changed_handler: Callable) -> Control: - var multivalue_editor = MultivalueEditor.new() + value_converter: Callable) -> Control: + var multivalue_editor = _MultivalueEditor.new() multivalue_editor.columns = columns multivalue_editor.enabled = enabled multivalue_editor.type = type multivalue_editor.values = values multivalue_editor.titles = titles _expand_control(multivalue_editor) - multivalue_editor.value_changed.connect(value_changed_handler.bind(multivalue_editor)) + multivalue_editor.value_changed.connect(func(_idx: int): + var new_value = value_converter.call(multivalue_editor.values) + if new_value == value: + return + value = new_value + value_changed.emit() + ) return multivalue_editor diff --git a/addons/gloot/editor/common/value_editor.gd.uid b/addons/gloot/editor/common/value_editor.gd.uid new file mode 100644 index 0000000..7bd9c14 --- /dev/null +++ b/addons/gloot/editor/common/value_editor.gd.uid @@ -0,0 +1 @@ +uid://b27rj7hee5e7w diff --git a/addons/gloot/editor/gloot_undo_redo.gd b/addons/gloot/editor/gloot_undo_redo.gd deleted file mode 100644 index efe6090..0000000 --- a/addons/gloot/editor/gloot_undo_redo.gd +++ /dev/null @@ -1,296 +0,0 @@ -@tool -extends Object - -const GlootUndoRedo = preload("res://addons/gloot/editor/gloot_undo_redo.gd") - - -static func _get_undo_redo_manager(): - var gloot = load("res://addons/gloot/gloot.gd") - assert(gloot.instance()) - var undo_redo_manager = gloot.instance().get_undo_redo() - assert(undo_redo_manager) - return undo_redo_manager - - -static func add_inventory_item(inventory: Inventory, prototype_id: String) -> void: - var undo_redo_manager = _get_undo_redo_manager() - - var old_inv_state := inventory.serialize() - if inventory.create_and_add_item(prototype_id) == null: - return - var new_inv_state := inventory.serialize() - - undo_redo_manager.create_action("Add Inventory Item") - undo_redo_manager.add_do_method(GlootUndoRedo, "_set_inventory", inventory, new_inv_state) - undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_inventory", inventory, old_inv_state) - undo_redo_manager.commit_action() - - -static func remove_inventory_item(inventory: Inventory, item: InventoryItem) -> void: - var undo_redo_manager = _get_undo_redo_manager() - - var old_inv_state := inventory.serialize() - if !inventory.remove_item(item): - return - var new_inv_state := inventory.serialize() - - undo_redo_manager.create_action("Remove Inventory Item") - undo_redo_manager.add_do_method(GlootUndoRedo, "_set_inventory", inventory, new_inv_state) - undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_inventory", inventory, old_inv_state) - undo_redo_manager.commit_action() - - -static func remove_inventory_items(inventory: Inventory, items: Array[InventoryItem]) -> void: - var undo_redo_manager = _get_undo_redo_manager() - - var old_inv_state := inventory.serialize() - for item in items: - assert(inventory.remove_item(item)) - var new_inv_state := inventory.serialize() - - undo_redo_manager.create_action("Remove Inventory Items") - undo_redo_manager.add_do_method(GlootUndoRedo, "_set_inventory", inventory, new_inv_state) - undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_inventory", inventory, old_inv_state) - undo_redo_manager.commit_action() - - -static func set_item_properties(item: InventoryItem, new_properties: Dictionary) -> void: - var undo_redo_manager = _get_undo_redo_manager() - - var inventory: Inventory = item.get_inventory() - if inventory: - undo_redo_manager.create_action("Set item properties") - undo_redo_manager.add_do_method(GlootUndoRedo, "_set_item_properties", inventory, inventory.get_item_index(item), new_properties) - undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_item_properties", inventory, inventory.get_item_index(item), item.properties) - undo_redo_manager.commit_action() - else: - undo_redo_manager.create_action("Set item properties") - undo_redo_manager.add_undo_property(item, "properties", item.properties) - undo_redo_manager.add_do_property(item, "properties", new_properties) - undo_redo_manager.commit_action() - - -static func set_item_prototype_id(item: InventoryItem, new_prototype_id: String) -> void: - var undo_redo_manager = _get_undo_redo_manager() - - var inventory: Inventory = item.get_inventory() - if inventory: - undo_redo_manager.create_action("Set prototype_id") - undo_redo_manager.add_do_method(GlootUndoRedo, "_set_item_prototype_id", inventory, inventory.get_item_index(item), new_prototype_id) - undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_item_prototype_id", inventory, inventory.get_item_index(item), item.prototype_id) - undo_redo_manager.commit_action() - else: - undo_redo_manager.create_action("Set prototype_id") - undo_redo_manager.add_undo_property(item, "prototype_id", item.prototype_id) - undo_redo_manager.add_do_property(item, "prototype_id", new_prototype_id) - undo_redo_manager.commit_action() - - -static func _set_inventory(inventory: Inventory, inventory_data: Dictionary) -> void: - inventory.deserialize(inventory_data) - - -static func _set_item_prototype_id(inventory: Inventory, item_index: int, new_prototype_id: String): - assert(item_index < inventory.get_item_count()) - inventory.get_items()[item_index].prototype_id = new_prototype_id - - -static func _set_item_properties(inventory: Inventory, item_index: int, new_properties: Dictionary): - assert(item_index < inventory.get_item_count()) - inventory.get_items()[item_index].properties = new_properties.duplicate() - - -static func equip_item_in_item_slot(item_slot: ItemSlotBase, item: InventoryItem) -> void: - var undo_redo_manager = _get_undo_redo_manager() - - var old_slot_state := item_slot.serialize() - if !item_slot.equip(item): - return - var new_slot_state := item_slot.serialize() - - undo_redo_manager.create_action("Equip Inventory Item") - undo_redo_manager.add_do_method(GlootUndoRedo, "_set_item_slot", item_slot, new_slot_state) - undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_item_slot", item_slot, old_slot_state) - undo_redo_manager.commit_action() - - -static func clear_item_slot(item_slot: ItemSlotBase) -> void: - var undo_redo_manager = _get_undo_redo_manager() - - var old_slot_state := item_slot.serialize() - if !item_slot.clear(): - return - var new_slot_state := item_slot.serialize() - - undo_redo_manager.create_action("Clear Inventory Item") - undo_redo_manager.add_do_method(GlootUndoRedo, "_set_item_slot", item_slot, new_slot_state) - undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_item_slot", item_slot, old_slot_state) - undo_redo_manager.commit_action() - - -static func _set_item_slot(item_slot: ItemSlotBase, item_slot_data: Dictionary) -> void: - item_slot.deserialize(item_slot_data) - - -static func move_inventory_item(inventory: InventoryGrid, item: InventoryItem, to: Vector2i) -> void: - var undo_redo_manager = _get_undo_redo_manager() - - var old_position := inventory.get_item_position(item) - if old_position == to: - return - var item_index := inventory.get_item_index(item) - - undo_redo_manager.create_action("Move Inventory Item") - undo_redo_manager.add_do_method(GlootUndoRedo, "_move_item", inventory, item_index, to) - undo_redo_manager.add_undo_method(GlootUndoRedo, "_move_item", inventory, item_index, old_position) - undo_redo_manager.commit_action() - - -static func swap_inventory_items(item1: InventoryItem, item2: InventoryItem) -> void: - - var undo_redo_manager = _get_undo_redo_manager() - - var inventories: Array[Inventory] = [item1.get_inventory(), item2.get_inventory()] - var old_inv_states: Array[Dictionary] = [{}, {}] - var new_inv_states: Array[Dictionary] = [{}, {}] - old_inv_states[0] = inventories[0].serialize() - old_inv_states[1] = inventories[1].serialize() - if !InventoryItem.swap(item1, item2): - return - new_inv_states[0] = inventories[0].serialize() - new_inv_states[1] = inventories[1].serialize() - - undo_redo_manager.create_action("Swap Inventory Items") - undo_redo_manager.add_do_method(GlootUndoRedo, "_set_inventories", inventories, new_inv_states) - undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_inventories", inventories, old_inv_states) - undo_redo_manager.commit_action() - - -static func _set_inventories(inventories: Array[Inventory], inventory_data: Array[Dictionary]) -> void: - assert(inventories.size() == inventory_data.size()) - for i in range(inventories.size()): - inventories[i].deserialize(inventory_data[i]) - - -static func rotate_inventory_item(inventory: InventoryGrid, item: InventoryItem) -> void: - var undo_redo_manager = _get_undo_redo_manager() - - if !inventory.can_rotate_item(item): - return - - var old_rotation := inventory.is_item_rotated(item) - var item_index := inventory.get_item_index(item) - - undo_redo_manager.create_action("Rotate Inventory Item") - undo_redo_manager.add_do_method(GlootUndoRedo, "_set_item_rotation", inventory, item_index, !old_rotation) - undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_item_rotation", inventory, item_index, old_rotation) - undo_redo_manager.commit_action() - - -static func _move_item(inventory: InventoryGrid, item_index: int, to: Vector2i) -> void: - assert(item_index >= 0 && item_index < inventory.get_item_count()) - var item = inventory.get_items()[item_index] - inventory.move_item_to(item, to) - - -static func _set_item_rotation(inventory: InventoryGrid, item_index: int, rotation: bool) -> void: - assert(item_index >= 0 && item_index < inventory.get_item_count()) - var item = inventory.get_items()[item_index] - inventory.set_item_rotation(item, rotation) - - -static func join_inventory_items( - inventory: InventoryGridStacked, - item_dst: InventoryItem, - item_src: InventoryItem -) -> void: - var undo_redo_manager = _get_undo_redo_manager() - - var old_inv_state := inventory.serialize() - if !inventory.join(item_dst, item_src): - return - var new_inv_state := inventory.serialize() - - undo_redo_manager.create_action("Join Inventory Items") - undo_redo_manager.add_do_method(GlootUndoRedo, "_set_inventory", inventory, new_inv_state) - undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_inventory", inventory, old_inv_state) - undo_redo_manager.commit_action() - - -static func rename_prototype(protoset: ItemProtoset, id: String, new_id: String) -> void: - var undo_redo_manager = _get_undo_redo_manager() - - var old_prototypes = _prototypes_deep_copy(protoset) - - undo_redo_manager.create_action("Rename Prototype") - undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_prototypes", protoset, old_prototypes) - undo_redo_manager.add_do_method(protoset, "rename_prototype", id, new_id) - undo_redo_manager.commit_action() - - -static func add_prototype(protoset: ItemProtoset, id: String) -> void: - var undo_redo_manager = _get_undo_redo_manager() - - var old_prototypes = _prototypes_deep_copy(protoset) - - undo_redo_manager.create_action("Add Prototype") - undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_prototypes", protoset, old_prototypes) - undo_redo_manager.add_do_method(protoset, "add_prototype", id) - undo_redo_manager.commit_action() - - -static func remove_prototype(protoset: ItemProtoset, id: String) -> void: - var undo_redo_manager = _get_undo_redo_manager() - - var old_prototypes = _prototypes_deep_copy(protoset) - - undo_redo_manager.create_action("Remove Prototype") - undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_prototypes", protoset, old_prototypes) - undo_redo_manager.add_do_method(protoset, "remove_prototype", id) - undo_redo_manager.commit_action() - - -static func duplicate_prototype(protoset: ItemProtoset, id: String) -> void: - var undo_redo_manager = _get_undo_redo_manager() - - var old_prototypes = _prototypes_deep_copy(protoset) - - undo_redo_manager.create_action("Duplicate Prototype") - undo_redo_manager.add_undo_method(GlootUndoRedo, "_set_prototypes", protoset, old_prototypes) - undo_redo_manager.add_do_method(protoset, "duplicate_prototype", id) - undo_redo_manager.commit_action() - - -static func _prototypes_deep_copy(protoset: ItemProtoset) -> Dictionary: - var result = protoset._prototypes.duplicate() - for prototype_id in result.keys(): - result[prototype_id] = protoset._prototypes[prototype_id].duplicate() - return result - - -static func _set_prototypes(protoset: ItemProtoset, prototypes: Dictionary) -> void: - protoset._prototypes = prototypes - - -static func set_prototype_properties(protoset: ItemProtoset, - prototype_id: String, - new_properties: Dictionary) -> void: - var undo_redo_manager = _get_undo_redo_manager() - assert(protoset.has_prototype(prototype_id)) - var old_properties = protoset.get_prototype(prototype_id).duplicate() - - undo_redo_manager.create_action("Set prototype properties") - undo_redo_manager.add_undo_method( - protoset, - "set_prototype_properties", - prototype_id, - old_properties - ) - undo_redo_manager.add_do_method( - protoset, - "set_prototype_properties", - prototype_id, - new_properties - ) - undo_redo_manager.commit_action() - diff --git a/addons/gloot/editor/inventory_editor/inventory_editor.gd b/addons/gloot/editor/inventory_editor/inventory_editor.gd index 0fb7d51..eadba5b 100644 --- a/addons/gloot/editor/inventory_editor/inventory_editor.gd +++ b/addons/gloot/editor/inventory_editor/inventory_editor.gd @@ -1,127 +1,168 @@ @tool extends Control -const GlootUndoRedo = preload("res://addons/gloot/editor/gloot_undo_redo.gd") -const EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") - -@onready var hsplit_container = $HSplitContainer -@onready var prototype_id_filter = $HSplitContainer/ChoiceFilter -@onready var inventory_control_container = $HSplitContainer/VBoxContainer -@onready var btn_edit = $HSplitContainer/VBoxContainer/HBoxContainer/BtnEdit -@onready var btn_remove = $HSplitContainer/VBoxContainer/HBoxContainer/BtnRemove -@onready var scroll_container = $HSplitContainer/VBoxContainer/ScrollContainer -var inventory: Inventory : +const _Undoables = preload("res://addons/gloot/editor/undoables.gd") +const _EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") +const _PropertiesEditor = preload("res://addons/gloot/editor/item_editor/properties_editor.tscn") +const _POPUP_SIZE = Vector2i(800, 300) + +var inventory: Inventory: set(new_inventory): + if inventory == new_inventory: + return disconnect_inventory_signals() inventory = new_inventory connect_inventory_signals() _refresh() var _inventory_control: Control +var _inventory_container: Control +var _properties_editor: Window func connect_inventory_signals(): if !inventory: return - if inventory is InventoryStacked: - inventory.capacity_changed.connect(_refresh) - if inventory is InventoryGrid: - inventory.size_changed.connect(_refresh) + inventory.constraint_changed.connect(_on_constraint_changed) inventory.protoset_changed.connect(_refresh) + inventory.constraint_added.connect(_on_constraint_changed) + inventory.constraint_removed.connect(_on_constraint_changed) - if !inventory.item_protoset: + if !inventory.protoset: return - inventory.item_protoset.changed.connect(_refresh) + inventory.protoset.changed.connect(_refresh) func disconnect_inventory_signals(): if !inventory: return - if inventory is InventoryStacked: - inventory.capacity_changed.disconnect(_refresh) - if inventory is InventoryGrid: - inventory.size_changed.disconnect(_refresh) + inventory.constraint_changed.disconnect(_on_constraint_changed) inventory.protoset_changed.disconnect(_refresh) + inventory.constraint_added.disconnect(_on_constraint_changed) + inventory.constraint_removed.disconnect(_on_constraint_changed) - if !inventory.item_protoset: + if !inventory.protoset: return - inventory.item_protoset.changed.disconnect(_refresh) + inventory.protoset.changed.disconnect(_refresh) + + +func _on_constraint_changed(constraint: InventoryConstraint) -> void: + _refresh() func _refresh() -> void: - if !is_inside_tree() || inventory == null || inventory.item_protoset == null: + if !is_inside_tree() || inventory == null || inventory.protoset == null: return # Remove the inventory control, if present - if _inventory_control: - scroll_container.remove_child(_inventory_control) - _inventory_control.queue_free() - _inventory_control = null + if _inventory_container: + %ScrollContainer.remove_child(_inventory_container) + _inventory_container.queue_free() + _inventory_container = null # Create the appropriate inventory control and populate it - if inventory is InventoryGrid: + _inventory_container = _create_inventory_container() + %ScrollContainer.add_child(_inventory_container) + + %PrototreeViewer.protoset = inventory.protoset + + +func _create_inventory_container() -> Control: + var vbox_container: Control = VBoxContainer.new() + vbox_container.size_flags_horizontal = SIZE_EXPAND_FILL + vbox_container.size_flags_vertical = SIZE_EXPAND_FILL + var capacity_control: CtrlInventoryCapacity = null + + if inventory.get_constraint(GridConstraint) != null: _inventory_control = CtrlInventoryGrid.new() - _inventory_control.grid_color = Color.GRAY - _inventory_control.draw_selections = true - elif inventory is InventoryStacked: - _inventory_control = CtrlInventoryStacked.new() - elif inventory is Inventory: + else: _inventory_control = CtrlInventory.new() _inventory_control.size_flags_horizontal = SIZE_EXPAND_FILL _inventory_control.size_flags_vertical = SIZE_EXPAND_FILL _inventory_control.inventory = inventory _inventory_control.inventory_item_activated.connect(_on_inventory_item_activated) - _inventory_control.inventory_item_context_activated.connect(_on_inventory_item_context_activated) + _inventory_control.inventory_item_clicked.connect(_on_inventory_item_clicked) - scroll_container.add_child(_inventory_control) + if inventory.get_constraint(WeightConstraint) != null: + capacity_control = CtrlInventoryCapacity.new() + capacity_control.inventory = inventory - # Set prototype_id_filter values - prototype_id_filter.set_values(inventory.item_protoset._prototypes.keys()) + if _inventory_control: + vbox_container.add_child(_inventory_control) + if capacity_control: + vbox_container.add_child(capacity_control) + + return vbox_container func _on_inventory_item_activated(item: InventoryItem) -> void: - GlootUndoRedo.remove_inventory_item(inventory, item) + _Undoables.undoable_action(inventory, "Remove Inventory Item", func(): + return inventory.remove_item(item) + ) -func _on_inventory_item_context_activated(item: InventoryItem) -> void: - GlootUndoRedo.rotate_inventory_item(inventory, item) +func _on_inventory_item_clicked(item: InventoryItem, at_position: Vector2, mouse_button_index: int) -> void: + if mouse_button_index != MOUSE_BUTTON_RIGHT: + return + _Undoables.undoable_action(inventory, "Rotate Inventory Item", func(): + var grid_constraint: GridConstraint = inventory.get_constraint(GridConstraint) + if grid_constraint == null: + return false + var rotated = grid_constraint.is_item_rotated(item) + return grid_constraint.set_item_rotation(item, !rotated) + ) func _ready() -> void: - prototype_id_filter.pick_icon = EditorIcons.get_icon("Add") - prototype_id_filter.filter_icon = EditorIcons.get_icon("Search") - btn_edit.icon = EditorIcons.get_icon("Edit") - btn_remove.icon = EditorIcons.get_icon("Remove") - - prototype_id_filter.choice_picked.connect(_on_prototype_id_picked) - btn_edit.pressed.connect(_on_btn_edit) - btn_remove.pressed.connect(_on_btn_remove) + %BtnAdd.icon = _EditorIcons.get_icon("Add") + %BtnEdit.icon = _EditorIcons.get_icon("Edit") + %BtnRemove.icon = _EditorIcons.get_icon("Remove") + + %PrototreeViewer.prototype_activated.connect(_on_prototype_activated) + %BtnAdd.pressed.connect(_on_btn_add) + %BtnEdit.pressed.connect(_on_btn_edit) + %BtnRemove.pressed.connect(_on_btn_remove) _refresh() -func _on_prototype_id_picked(index: int) -> void: - var prototype_id = prototype_id_filter.values[index] - GlootUndoRedo.add_inventory_item(inventory, prototype_id) +func _on_prototype_activated(prototype: Prototype) -> void: + _Undoables.undoable_action(inventory, "Add Inventory Item", func(): + return (inventory.create_and_add_item(str(prototype.get_prototype_id())) != null) + ) + + +func _on_btn_add() -> void: + var prototype: Prototype = %PrototreeViewer.get_selected_prototype() + if prototype == null: + return + _Undoables.undoable_action(inventory, "Add Inventory Item", func(): + return (inventory.create_and_add_item(str(prototype.get_prototype_id())) != null) + ) func _on_btn_edit() -> void: var selected_item: InventoryItem = _inventory_control.get_selected_inventory_item() - if selected_item != null: - # Call it deferred, so that the control can clean up - call_deferred("_select_node", selected_item) + if selected_item == null: + return + if _properties_editor == null: + _properties_editor = _PropertiesEditor.instantiate() + add_child(_properties_editor) + _properties_editor.item = selected_item + _properties_editor.popup_centered(_POPUP_SIZE) func _on_btn_remove() -> void: var selected_items: Array[InventoryItem] = _inventory_control.get_selected_inventory_items() for selected_item in selected_items: if selected_item != null: - GlootUndoRedo.remove_inventory_item(inventory, selected_item) + _Undoables.undoable_action(inventory, "Remove Inventory Item", func(): + return inventory.remove_item(selected_item) + ) static func _select_node(node: Node) -> void: EditorInterface.get_selection().clear() EditorInterface.get_selection().add_node(node) EditorInterface.edit_node(node) - diff --git a/addons/gloot/editor/inventory_editor/inventory_editor.gd.uid b/addons/gloot/editor/inventory_editor/inventory_editor.gd.uid new file mode 100644 index 0000000..5ff777c --- /dev/null +++ b/addons/gloot/editor/inventory_editor/inventory_editor.gd.uid @@ -0,0 +1 @@ +uid://clm312t8h4uxq diff --git a/addons/gloot/editor/inventory_editor/inventory_editor.tscn b/addons/gloot/editor/inventory_editor/inventory_editor.tscn index f67fa23..ed3dfbd 100644 --- a/addons/gloot/editor/inventory_editor/inventory_editor.tscn +++ b/addons/gloot/editor/inventory_editor/inventory_editor.tscn @@ -1,7 +1,43 @@ -[gd_scene load_steps=3 format=3 uid="uid://c6e4cxvjdxhdo"] +[gd_scene load_steps=9 format=3 uid="uid://c6e4cxvjdxhdo"] -[ext_resource type="PackedScene" uid="uid://dj577duf8yjeb" path="res://addons/gloot/editor/common/choice_filter.tscn" id="1"] [ext_resource type="Script" path="res://addons/gloot/editor/inventory_editor/inventory_editor.gd" id="2"] +[ext_resource type="Script" path="res://addons/gloot/editor/common/proto_tree_viewer.gd" id="2_sflgi"] + +[sub_resource type="Image" id="Image_317m2"] +data = { +"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), +"format": "RGBA8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id="ImageTexture_fm4sg"] +image = SubResource("Image_317m2") + +[sub_resource type="Image" id="Image_3bkis"] +data = { +"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 182, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 180, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 171, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 170, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 234, 224, 224, 224, 234, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 85, 225, 225, 225, 85, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), +"format": "RGBA8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id="ImageTexture_gpbyr"] +image = SubResource("Image_3bkis") + +[sub_resource type="Image" id="Image_1y8m2"] +data = { +"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 227, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 225, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 73, 224, 224, 224, 226, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 225, 226, 226, 226, 70, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), +"format": "RGBA8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id="ImageTexture_wo0ku"] +image = SubResource("Image_1y8m2") [node name="InventoryEditor" type="Control"] layout_mode = 3 @@ -19,10 +55,23 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -[node name="ChoiceFilter" parent="HSplitContainer" instance=ExtResource("1")] +[node name="VBoxContainer2" type="VBoxContainer" parent="HSplitContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="PrototreeViewer" type="Tree" parent="HSplitContainer/VBoxContainer2"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +hide_root = true +script = ExtResource("2_sflgi") + +[node name="BtnAdd" type="Button" parent="HSplitContainer/VBoxContainer2"] +unique_name_in_owner = true layout_mode = 2 -pick_text = "Add" -filter_text = "Filter Prototypes:" +text = "Add" +icon = SubResource("ImageTexture_fm4sg") [node name="VBoxContainer" type="VBoxContainer" parent="HSplitContainer"] layout_mode = 2 @@ -30,6 +79,7 @@ size_flags_horizontal = 3 size_flags_vertical = 3 [node name="ScrollContainer" type="ScrollContainer" parent="HSplitContainer/VBoxContainer"] +unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 @@ -38,11 +88,15 @@ size_flags_vertical = 3 layout_mode = 2 [node name="BtnEdit" type="Button" parent="HSplitContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 3 text = "Edit" +icon = SubResource("ImageTexture_gpbyr") [node name="BtnRemove" type="Button" parent="HSplitContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 3 text = "Remove" +icon = SubResource("ImageTexture_wo0ku") diff --git a/addons/gloot/editor/inventory_editor/inventory_inspector.gd b/addons/gloot/editor/inventory_editor/inventory_inspector.gd index 8ffcea7..d405ab3 100644 --- a/addons/gloot/editor/inventory_editor/inventory_inspector.gd +++ b/addons/gloot/editor/inventory_editor/inventory_inspector.gd @@ -1,14 +1,14 @@ @tool extends Control -const EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") +const _EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") @onready var inventory_editor: Control = $HBoxContainer/InventoryEditor @onready var btn_expand: Button = $HBoxContainer/BtnExpand @onready var _window_dialog: Window = $Window @onready var _inventory_editor: Control = $Window/MarginContainer/InventoryEditor -var inventory: Inventory : +var inventory: Inventory: set(new_inventory): inventory = new_inventory if inventory_editor: @@ -23,7 +23,7 @@ func _ready() -> void: if inventory_editor: inventory_editor.inventory = inventory _apply_editor_settings() - btn_expand.icon = EditorIcons.get_icon("DistractionFree") + btn_expand.icon = _EditorIcons.get_icon("DistractionFree") btn_expand.pressed.connect(on_btn_expand) _window_dialog.close_requested.connect(func(): _window_dialog.hide()) diff --git a/addons/gloot/editor/inventory_editor/inventory_inspector.gd.uid b/addons/gloot/editor/inventory_editor/inventory_inspector.gd.uid new file mode 100644 index 0000000..441f88d --- /dev/null +++ b/addons/gloot/editor/inventory_editor/inventory_inspector.gd.uid @@ -0,0 +1 @@ +uid://cg4p1lf3cmckg diff --git a/addons/gloot/editor/inventory_editor/inventory_inspector.tscn b/addons/gloot/editor/inventory_editor/inventory_inspector.tscn index db8edf2..fb7113b 100644 --- a/addons/gloot/editor/inventory_editor/inventory_inspector.tscn +++ b/addons/gloot/editor/inventory_editor/inventory_inspector.tscn @@ -1,10 +1,22 @@ -[gd_scene load_steps=3 format=3 uid="uid://bef418tvtf7h6"] +[gd_scene load_steps=5 format=3 uid="uid://bef418tvtf7h6"] [ext_resource type="PackedScene" uid="uid://c6e4cxvjdxhdo" path="res://addons/gloot/editor/inventory_editor/inventory_editor.tscn" id="1"] [ext_resource type="Script" path="res://addons/gloot/editor/inventory_editor/inventory_inspector.gd" id="2"] +[sub_resource type="Image" id="Image_1eklb"] +data = { +"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 4, 255, 255, 255, 4, 255, 255, 255, 4, 255, 255, 255, 4, 255, 255, 255, 3, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 123, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 127, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 135, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 140, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 213, 232, 232, 232, 22, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 24, 224, 224, 224, 216, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 136, 224, 224, 224, 213, 224, 224, 224, 255, 224, 224, 224, 213, 232, 232, 232, 22, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 24, 224, 224, 224, 216, 224, 224, 224, 255, 224, 224, 224, 210, 224, 224, 224, 138, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 126, 255, 255, 255, 0, 232, 232, 232, 22, 224, 224, 224, 213, 224, 224, 224, 255, 226, 226, 226, 103, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 107, 224, 224, 224, 255, 224, 224, 224, 210, 230, 230, 230, 20, 255, 255, 255, 0, 225, 225, 225, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 232, 232, 232, 22, 226, 226, 226, 103, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 105, 230, 230, 230, 20, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 24, 224, 224, 224, 107, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 109, 232, 232, 232, 22, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 127, 255, 255, 255, 0, 224, 224, 224, 24, 224, 224, 224, 216, 224, 224, 224, 255, 224, 224, 224, 105, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 109, 224, 224, 224, 255, 224, 224, 224, 213, 232, 232, 232, 22, 255, 255, 255, 0, 224, 224, 224, 129, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 140, 224, 224, 224, 216, 224, 224, 224, 255, 224, 224, 224, 210, 230, 230, 230, 20, 255, 255, 255, 0, 255, 255, 255, 0, 232, 232, 232, 22, 224, 224, 224, 213, 224, 224, 224, 255, 224, 224, 224, 213, 225, 225, 225, 142, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 210, 230, 230, 230, 20, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 232, 232, 232, 22, 224, 224, 224, 213, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 138, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 142, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 129, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), +"format": "RGBA8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id="ImageTexture_jr7hk"] +image = SubResource("Image_1eklb") + [node name="InventoryInspector" type="Control"] -custom_minimum_size = Vector2(0, 200) +custom_minimum_size = Vector2(0, 300) layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -29,6 +41,7 @@ size_flags_vertical = 3 [node name="BtnExpand" type="Button" parent="HBoxContainer"] layout_mode = 2 +icon = SubResource("ImageTexture_jr7hk") [node name="Window" type="Window" parent="."] title = "Edit Inventory" diff --git a/addons/gloot/editor/inventory_inspector_plugin.gd b/addons/gloot/editor/inventory_inspector_plugin.gd index fa09e9f..e461ee3 100644 --- a/addons/gloot/editor/inventory_inspector_plugin.gd +++ b/addons/gloot/editor/inventory_inspector_plugin.gd @@ -1,51 +1,25 @@ extends EditorInspectorPlugin -const EditProtosetButton = preload("res://addons/gloot/editor/protoset_editor/edit_protoset_button.tscn") -const InventoryInspector = preload("res://addons/gloot/editor/inventory_editor/inventory_inspector.tscn") -const ItemSlotInspector = preload("res://addons/gloot/editor/item_slot_editor/item_slot_inspector.tscn") -const ItemRefSlotButton = preload("res://addons/gloot/editor/item_slot_editor/item_ref_slot_button.gd") -const EditPropertiesButton = preload("res://addons/gloot/editor/item_editor/edit_properties_button.gd") -const EditPrototypeIdButton = preload("res://addons/gloot/editor/item_editor/edit_prototype_id_button.gd") +const _InventoryInspector = preload("res://addons/gloot/editor/inventory_editor/inventory_inspector.tscn") +const _ItemSlotInspector = preload("res://addons/gloot/editor/item_slot_editor/item_slot_inspector.tscn") func _can_handle(object: Object) -> bool: - return (object is Inventory) || \ - (object is InventoryItem) || \ - (object is ItemSlot) || \ - (object is ItemRefSlot) || \ - (object is ItemProtoset) + return (object is Inventory) || (object is ItemSlot) func _parse_begin(object: Object) -> void: + if Engine.is_editor_hint() && object.get_class() == "EditorDebuggerRemoteObject": + # _parse_begin is called for a EditorDebuggerRemoteObject when inspecting + # a remote node and causes errors when trying to access Inventory/ItemSlot + # properties. + return + if object is Inventory: - var inventory_inspector := InventoryInspector.instantiate() + var inventory_inspector := _InventoryInspector.instantiate() inventory_inspector.init(object as Inventory) add_custom_control(inventory_inspector) if object is ItemSlot: - var item_slot_inspector := ItemSlotInspector.instantiate() + var item_slot_inspector := _ItemSlotInspector.instantiate() item_slot_inspector.init(object as ItemSlot) add_custom_control(item_slot_inspector) - if object is ItemProtoset: - var edit_protoset_button := EditProtosetButton.instantiate() - edit_protoset_button.init(object as ItemProtoset) - add_custom_control(edit_protoset_button) - - -func _parse_property(object: Object, - type: Variant.Type, - name: String, - hint: PropertyHint, - hint_string: String, - usage: int, - wide: bool) -> bool: - if (object is InventoryItem) && name == "properties": - add_property_editor(name, EditPropertiesButton.new()) - return true - if (object is InventoryItem) && name == "prototype_id": - add_property_editor(name, EditPrototypeIdButton.new()) - return true - if (object is ItemRefSlot) && name == "_equipped_item": - add_property_editor(name, ItemRefSlotButton.new()) - return true - return false - diff --git a/addons/gloot/editor/inventory_inspector_plugin.gd.uid b/addons/gloot/editor/inventory_inspector_plugin.gd.uid new file mode 100644 index 0000000..29c4aed --- /dev/null +++ b/addons/gloot/editor/inventory_inspector_plugin.gd.uid @@ -0,0 +1 @@ +uid://bfn7j0n1qo2ym diff --git a/addons/gloot/editor/item_editor/edit_properties_button.gd b/addons/gloot/editor/item_editor/edit_properties_button.gd deleted file mode 100644 index e0d5342..0000000 --- a/addons/gloot/editor/item_editor/edit_properties_button.gd +++ /dev/null @@ -1,61 +0,0 @@ -extends EditorProperty - -const EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") -const PropertiesEditor = preload("res://addons/gloot/editor/item_editor/properties_editor.tscn") -const POPUP_SIZE = Vector2i(800, 300) - -var current_value: Dictionary -var updating: bool = false -var _btn_prototype_id: Button -var _properties_editor: Window - - -func _init(): - _properties_editor = PropertiesEditor.instantiate() - add_child(_properties_editor) - - _btn_prototype_id = Button.new() - _btn_prototype_id.text = "Edit Properties" - _btn_prototype_id.pressed.connect(_on_btn_edit) - _btn_prototype_id.icon = EditorIcons.get_icon("Edit") - add_child(_btn_prototype_id) - - -func _ready() -> void: - var item: InventoryItem = get_edited_object() - if !item: - return - _properties_editor.item = item - item.properties_changed.connect(update_property) - - if !item.protoset: - return - item.protoset.changed.connect(_on_protoset_changed) - - _refresh_button() - - -func _on_btn_edit() -> void: - _properties_editor.popup_centered(POPUP_SIZE) - - -func update_property() -> void: - var new_value = get_edited_object()[get_edited_property()] - if new_value == current_value: - return - - updating = true - current_value = new_value - updating = false - - -func _on_protoset_changed() -> void: - _refresh_button() - - -func _refresh_button() -> void: - var item: InventoryItem = get_edited_object() - if !item || !item.protoset: - return - _btn_prototype_id.disabled = !item.protoset.has_prototype(item.prototype_id) - diff --git a/addons/gloot/editor/item_editor/edit_prototype_id_button.gd b/addons/gloot/editor/item_editor/edit_prototype_id_button.gd deleted file mode 100644 index 1e3b6a3..0000000 --- a/addons/gloot/editor/item_editor/edit_prototype_id_button.gd +++ /dev/null @@ -1,79 +0,0 @@ -extends EditorProperty - - -const PrototypeIdEditor = preload("res://addons/gloot/editor/item_editor/prototype_id_editor.tscn") -const POPUP_SIZE = Vector2i(300, 300) -const COLOR_INVALID = Color.RED -var current_value: String -var updating: bool = false -var _prototype_id_editor: Window -var _btn_prototype_id: Button - - -func _init(): - _prototype_id_editor = PrototypeIdEditor.instantiate() - add_child(_prototype_id_editor) - - _btn_prototype_id = Button.new() - _btn_prototype_id.text = "Prototype ID" - _btn_prototype_id.pressed.connect(_on_btn_prototype_id) - add_child(_btn_prototype_id) - - -func _ready() -> void: - var item: InventoryItem = get_edited_object() - _prototype_id_editor.item = item - item.prototype_id_changed.connect(_refresh_button) - if item.protoset: - item.protoset.changed.connect(_refresh_button) - _refresh_button() - - -func _on_btn_prototype_id() -> void: - # TODO: Figure out how to show a popup at mouse position - # _window_dialog.popup(Rect2i(_get_popup_at_mouse_position(POPUP_SIZE), POPUP_SIZE)) - _prototype_id_editor.popup_centered(POPUP_SIZE) - - -func _get_popup_at_mouse_position(size: Vector2i) -> Vector2i: - var global_mouse_pos: Vector2i = Vector2i(get_global_mouse_position()) - var local_mouse_pos: Vector2i = global_mouse_pos + \ - DisplayServer.window_get_position(DisplayServer.MAIN_WINDOW_ID) - - # Prevent the popup from positioning partially out of screen - var screen_size: Vector2i = DisplayServer.screen_get_size(DisplayServer.SCREEN_OF_MAIN_WINDOW) - var popup_pos: Vector2i - popup_pos.x = clamp(local_mouse_pos.x, 0, screen_size.x - size.x) - popup_pos.y = clamp(local_mouse_pos.y, 0, screen_size.y - size.y) - - return popup_pos - - -func update_property() -> void: - var new_value = get_edited_object()[get_edited_property()] - if new_value == current_value: - return - - updating = true - current_value = new_value - _refresh_button() - updating = false - - -func _refresh_button() -> void: - var item: InventoryItem = get_edited_object() - _btn_prototype_id.text = item.prototype_id - _btn_prototype_id.disabled = false - if item.protoset == null: - _btn_prototype_id.disabled = true - return - - if !item.protoset.has_prototype(item.prototype_id): - _btn_prototype_id.add_theme_color_override("font_color", COLOR_INVALID) - _btn_prototype_id.add_theme_color_override("font_color_hover", COLOR_INVALID) - _btn_prototype_id.tooltip_text = "Invalid prototype ID!" - else: - _btn_prototype_id.remove_theme_color_override("font_color") - _btn_prototype_id.remove_theme_color_override("font_color_hover") - _btn_prototype_id.tooltip_text = "" - diff --git a/addons/gloot/editor/item_editor/properties_editor.gd b/addons/gloot/editor/item_editor/properties_editor.gd index 0ccee74..79fe8e4 100644 --- a/addons/gloot/editor/item_editor/properties_editor.gd +++ b/addons/gloot/editor/item_editor/properties_editor.gd @@ -1,24 +1,19 @@ @tool extends Window -const GlootUndoRedo = preload("res://addons/gloot/editor/gloot_undo_redo.gd") -const GridConstraint = preload("res://addons/gloot/core/constraints/grid_constraint.gd") -const DictEditor = preload("res://addons/gloot/editor/common/dict_editor.tscn") -const EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") -const COLOR_OVERRIDDEN = Color.GREEN -const COLOR_INVALID = Color.RED -var IMMUTABLE_KEYS: Array[String] = [ItemProtoset.KEY_ID, GridConstraint.KEY_GRID_POSITION] +const _Undoables = preload("res://addons/gloot/editor/undoables.gd") +const _DictEditor = preload("res://addons/gloot/editor/common/dict_editor.tscn") +const _EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") +const _COLOR_OVERRIDDEN = Color.GREEN +const _COLOR_INVALID = Color.RED @onready var _margin_container: MarginContainer = $"MarginContainer" @onready var _dict_editor: Control = $"MarginContainer/DictEditor" -var item: InventoryItem = null : +var item: InventoryItem = null: set(new_item): if new_item == null: return - assert(item == null, "Item already set!") item = new_item - if item.protoset: - item.protoset.changed.connect(_refresh) _refresh() @@ -31,38 +26,28 @@ func _ready() -> void: func _on_value_changed(key: String, new_value) -> void: - var new_properties = item.properties.duplicate() - new_properties[key] = new_value - - var item_prototype: Dictionary = item.protoset.get_prototype(item.prototype_id) - if item_prototype.has(key) && (item_prototype[key] == new_value): - new_properties.erase(key) - - if new_properties.hash() == item.properties.hash(): - return - - GlootUndoRedo.set_item_properties(item, new_properties) - _refresh() + _Undoables.undoable_action(item, "Set Item Property", func(): + item.set_property(key, new_value) + return true + ) + # TODO: Figure out why this is needed + _refresh.call_deferred() func _on_value_removed(key: String) -> void: - var new_properties = item.properties.duplicate() - new_properties.erase(key) - - if new_properties.hash() == item.properties.hash(): - return - - GlootUndoRedo.set_item_properties(item, new_properties) + _Undoables.undoable_action(item, "Clear Item Property", func(): + item.clear_property(key) + return true + ) _refresh() func _refresh() -> void: if _dict_editor.btn_add: - _dict_editor.btn_add.icon = EditorIcons.get_icon("Add") + _dict_editor.btn_add.icon = _EditorIcons.get_icon("Add") _dict_editor.dictionary = _get_dictionary() _dict_editor.color_map = _get_color_map() _dict_editor.remove_button_map = _get_remove_button_map() - _dict_editor.immutable_keys = IMMUTABLE_KEYS _dict_editor.refresh() @@ -70,15 +55,15 @@ func _get_dictionary() -> Dictionary: if item == null: return {} - if !item.protoset: + if item.get_prototree().is_empty(): return {} - if !item.protoset.has_prototype(item.prototype_id): + if !item.get_prototree().has_prototype(item.get_prototype().get_prototype_id()): return {} - var result: Dictionary = item.protoset.get_prototype(item.prototype_id).duplicate() - for key in item.properties.keys(): - result[key] = item.properties[key] + var result: Dictionary = item.get_prototype().get_properties() + for key in item.get_properties(): + result[key] = item.get_property(key) return result @@ -86,16 +71,14 @@ func _get_color_map() -> Dictionary: if item == null: return {} - if !item.protoset: + if item.get_prototree().is_empty(): return {} var result: Dictionary = {} var dictionary: Dictionary = _get_dictionary() for key in dictionary.keys(): - if item.properties.has(key): - result[key] = COLOR_OVERRIDDEN - if key == ItemProtoset.KEY_ID && !item.protoset.has_prototype(dictionary[key]): - result[key] = COLOR_INVALID + if item.is_property_overridden(key): + result[key] = _COLOR_OVERRIDDEN return result @@ -104,20 +87,19 @@ func _get_remove_button_map() -> Dictionary: if item == null: return {} - if !item.protoset: + if item.get_prototree().is_empty(): return {} var result: Dictionary = {} var dictionary: Dictionary = _get_dictionary() for key in dictionary.keys(): result[key] = {} - if item.protoset.get_prototype(item.prototype_id).has(key): + if item.has_property(key): result[key]["text"] = "" - result[key]["icon"] = EditorIcons.get_icon("Reload") + result[key]["icon"] = _EditorIcons.get_icon("Reload") else: result[key]["text"] = "" - result[key]["icon"] = EditorIcons.get_icon("Remove") + result[key]["icon"] = _EditorIcons.get_icon("Remove") - result[key]["disabled"] = (not key in item.properties) or (key in IMMUTABLE_KEYS) + result[key]["disabled"] = not item.is_property_overridden(key) return result - diff --git a/addons/gloot/editor/item_editor/properties_editor.gd.uid b/addons/gloot/editor/item_editor/properties_editor.gd.uid new file mode 100644 index 0000000..55fd0e9 --- /dev/null +++ b/addons/gloot/editor/item_editor/properties_editor.gd.uid @@ -0,0 +1 @@ +uid://1taagfx52uw5 diff --git a/addons/gloot/editor/item_editor/prototype_id_editor.gd b/addons/gloot/editor/item_editor/prototype_id_editor.gd deleted file mode 100644 index ed7f6a8..0000000 --- a/addons/gloot/editor/item_editor/prototype_id_editor.gd +++ /dev/null @@ -1,49 +0,0 @@ -@tool -extends Window - -const GlootUndoRedo = preload("res://addons/gloot/editor/gloot_undo_redo.gd") -const ChoiceFilter = preload("res://addons/gloot/editor/common/choice_filter.tscn") -const EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") -const POPUP_MARGIN = 10 - -@onready var _margin_container: MarginContainer = $"MarginContainer" -@onready var _choice_filter: Control = $"MarginContainer/ChoiceFilter" -var item: InventoryItem = null : - set(new_item): - if new_item == null: - return - assert(item == null, "Item already set!") - item = new_item - if item.protoset: - item.protoset.changed.connect(_refresh) - _refresh() - - -func _ready() -> void: - _choice_filter.filter_icon = EditorIcons.get_icon("Search") - about_to_popup.connect(func(): _refresh()) - close_requested.connect(func(): hide()) - _choice_filter.choice_picked.connect(func(value_index: int): _on_choice_picked(value_index)) - hide() - - -func _on_choice_picked(value_index: int) -> void: - assert(item, "Item not set!") - var new_prototype_id = _choice_filter.values[value_index] - if new_prototype_id != item.prototype_id: - GlootUndoRedo.set_item_prototype_id(item, new_prototype_id) - hide() - - -func _refresh() -> void: - _choice_filter.values.clear() - _choice_filter.values.append_array(_get_prototype_ids()) - _choice_filter.refresh() - - -func _get_prototype_ids() -> Array: - if item == null || !item.protoset: - return [] - - return item.protoset._prototypes.keys() - diff --git a/addons/gloot/editor/item_editor/prototype_id_editor.tscn b/addons/gloot/editor/item_editor/prototype_id_editor.tscn deleted file mode 100644 index c73b651..0000000 --- a/addons/gloot/editor/item_editor/prototype_id_editor.tscn +++ /dev/null @@ -1,27 +0,0 @@ -[gd_scene load_steps=3 format=3 uid="uid://bb341bh2pdb6u"] - -[ext_resource type="Script" path="res://addons/gloot/editor/item_editor/prototype_id_editor.gd" id="1_a8scy"] -[ext_resource type="PackedScene" uid="uid://dj577duf8yjeb" path="res://addons/gloot/editor/common/choice_filter.tscn" id="1_prwl8"] - -[node name="PrototypeIdEditor" type="Window"] -title = "Select Prototype ID" -size = Vector2i(300, 300) -visible = false -exclusive = true -script = ExtResource("1_a8scy") - -[node name="MarginContainer" type="MarginContainer" parent="."] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -theme_override_constants/margin_left = 10 -theme_override_constants/margin_top = 10 -theme_override_constants/margin_right = 10 -theme_override_constants/margin_bottom = 10 - -[node name="ChoiceFilter" parent="MarginContainer" instance=ExtResource("1_prwl8")] -layout_mode = 2 -pick_text = "Select" -filter_text = "Filter Prototypes:" diff --git a/addons/gloot/editor/item_slot_editor/item_ref_slot_button.gd b/addons/gloot/editor/item_slot_editor/item_ref_slot_button.gd deleted file mode 100644 index 0e1abfe..0000000 --- a/addons/gloot/editor/item_slot_editor/item_ref_slot_button.gd +++ /dev/null @@ -1,67 +0,0 @@ -extends EditorProperty - -const GlootUndoRedo = preload("res://addons/gloot/editor/gloot_undo_redo.gd") - -var updating: bool = false -var _option_button: OptionButton - - -func _init(): - _option_button = OptionButton.new() - add_child(_option_button) - add_focusable(_option_button) - _option_button.item_selected.connect(_on_item_selected) - - -func _ready() -> void: - var item_ref_slot: ItemRefSlot = get_edited_object() - item_ref_slot.inventory_changed.connect(_refresh_option_button) - item_ref_slot.item_equipped.connect(_refresh_option_button) - item_ref_slot.cleared.connect(_refresh_option_button) - _refresh_option_button() - - -func _refresh_option_button() -> void: - _clear_option_button() - _populate_option_button() - - -func _clear_option_button() -> void: - _option_button.clear() - _option_button.add_item("None") - _option_button.set_item_metadata(0, null) - _option_button.select(0) - - -func _populate_option_button() -> void: - if !get_edited_object(): - return - - var item_ref_slot: ItemRefSlot = get_edited_object() - if !item_ref_slot.inventory: - return - - var equipped_item_index := 0 - for item in item_ref_slot.inventory.get_items(): - _option_button.add_icon_item(item.get_texture(), item.get_title()) - var option_item_index = _option_button.get_item_count() - 1 - _option_button.set_item_metadata(option_item_index, item) - if item == item_ref_slot.get_item(): - equipped_item_index = option_item_index - - _option_button.select(equipped_item_index) - - -func _on_item_selected(item_index: int) -> void: - if !get_edited_object() || updating: - return - - updating = true - var item_ref_slot: ItemRefSlot = get_edited_object() - var selected_item: InventoryItem = _option_button.get_item_metadata(item_index) - if item_ref_slot.get_item() != selected_item: - if selected_item == null: - GlootUndoRedo.clear_item_slot(item_ref_slot) - else: - GlootUndoRedo.equip_item_in_item_slot(item_ref_slot, selected_item) - updating = false diff --git a/addons/gloot/editor/item_slot_editor/item_slot_editor.gd b/addons/gloot/editor/item_slot_editor/item_slot_editor.gd index a162103..e531c31 100644 --- a/addons/gloot/editor/item_slot_editor/item_slot_editor.gd +++ b/addons/gloot/editor/item_slot_editor/item_slot_editor.gd @@ -1,24 +1,22 @@ @tool extends Control -const GlootUndoRedo = preload("res://addons/gloot/editor/gloot_undo_redo.gd") -const EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") +const _Undoables = preload("res://addons/gloot/editor/undoables.gd") +const _EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") +const _PropertiesEditor = preload("res://addons/gloot/editor/item_editor/properties_editor.tscn") +const _POPUP_SIZE = Vector2i(800, 300) -@onready var hsplit_container = $HSplitContainer -@onready var prototype_id_filter = $HSplitContainer/ChoiceFilter -@onready var btn_edit = $HSplitContainer/VBoxContainer/HBoxContainer/BtnEdit -@onready var btn_clear = $HSplitContainer/VBoxContainer/HBoxContainer/BtnClear -@onready var ctrl_item_slot = $HSplitContainer/VBoxContainer/CtrlItemSlot - -var item_slot: ItemSlot : +var item_slot: ItemSlot: set(new_item_slot): disconnect_item_slot_signals() item_slot = new_item_slot - ctrl_item_slot.item_slot = item_slot + %CtrlItemSlot.item_slot = item_slot connect_item_slot_signals() _refresh() +var _properties_editor: Window + func connect_item_slot_signals(): if !item_slot: @@ -27,9 +25,9 @@ func connect_item_slot_signals(): item_slot.item_equipped.connect(_refresh) item_slot.cleared.connect(_refresh) - if !item_slot.item_protoset: + if !item_slot.protoset: return - item_slot.item_protoset.changed.connect(_refresh) + item_slot.protoset.changed.connect(_refresh) item_slot.protoset_changed.connect(_refresh) @@ -40,9 +38,9 @@ func disconnect_item_slot_signals(): item_slot.item_equipped.disconnect(_refresh) item_slot.cleared.disconnect(_refresh) - if !item_slot.item_protoset: + if !item_slot.protoset: return - item_slot.item_protoset.changed.disconnect(_refresh) + item_slot.protoset.changed.disconnect(_refresh) item_slot.protoset_changed.disconnect(_refresh) @@ -51,25 +49,24 @@ func init(item_slot_: ItemSlot) -> void: func _refresh() -> void: - if !is_inside_tree() || item_slot == null || item_slot.item_protoset == null: + if !is_inside_tree() || item_slot == null || item_slot.protoset == null: return - prototype_id_filter.set_values(item_slot.item_protoset._prototypes.keys()) + %PrototreeViewer.protoset = item_slot.protoset func _ready() -> void: _apply_editor_settings() - prototype_id_filter.pick_icon = EditorIcons.get_icon("Add") - prototype_id_filter.filter_icon = EditorIcons.get_icon("Search") - btn_edit.icon = EditorIcons.get_icon("Edit") - btn_clear.icon = EditorIcons.get_icon("Remove") + %BtnAdd.icon = _EditorIcons.get_icon("Add") + %BtnEdit.icon = _EditorIcons.get_icon("Edit") + %BtnClear.icon = _EditorIcons.get_icon("Remove") - prototype_id_filter.choice_picked.connect(_on_prototype_id_picked) - btn_edit.pressed.connect(_on_btn_edit) - btn_clear.pressed.connect(_on_btn_clear) + %PrototreeViewer.prototype_activated.connect(_on_prototype_activated) + %BtnAdd.pressed.connect(_on_btn_add) + %BtnEdit.pressed.connect(_on_btn_edit) + %BtnClear.pressed.connect(_on_btn_clear) - ctrl_item_slot.item_slot = item_slot - _refresh() + %CtrlItemSlot.item_slot = item_slot func _apply_editor_settings() -> void: @@ -77,30 +74,41 @@ func _apply_editor_settings() -> void: custom_minimum_size.y = control_height -func _on_prototype_id_picked(index: int) -> void: - var prototype_id = prototype_id_filter.values[index] - var item := InventoryItem.new() - if item_slot.get_item() != null: - item_slot.get_item().queue_free() - item.protoset = item_slot.item_protoset - item.prototype_id = prototype_id - GlootUndoRedo.equip_item_in_item_slot(item_slot, item) +func _on_prototype_activated(prototype: Prototype) -> void: + var item := InventoryItem.new(item_slot.protoset, prototype.get_prototype_id()) + _Undoables.undoable_action(item_slot, "Equip item", func(): + return item_slot.equip(item) + ) + + +func _on_btn_add() -> void: + var prototype: Prototype = %PrototreeViewer.get_selected_prototype() + if prototype == null: + return + var item := InventoryItem.new(item_slot.protoset, prototype.get_prototype_id()) + _Undoables.undoable_action(item_slot, "Equip item", func(): + return item_slot.equip(item) + ) func _on_btn_edit() -> void: - if item_slot.get_item() != null: - # Call it deferred, so that the control can clean up - call_deferred("_select_node", item_slot.get_item()) + if item_slot.get_item() == null: + return + if _properties_editor == null: + _properties_editor = _PropertiesEditor.instantiate() + add_child(_properties_editor) + _properties_editor.item = item_slot.get_item() + _properties_editor.popup_centered(_POPUP_SIZE) func _on_btn_clear() -> void: if item_slot.get_item() != null: - item_slot.get_item().queue_free() - GlootUndoRedo.clear_item_slot(item_slot) + _Undoables.undoable_action(item_slot, "Clear slot", func(): + return item_slot.clear() + ) static func _select_node(node: Node) -> void: EditorInterface.get_selection().clear() EditorInterface.get_selection().add_node(node) EditorInterface.edit_node(node) - diff --git a/addons/gloot/editor/item_slot_editor/item_slot_editor.gd.uid b/addons/gloot/editor/item_slot_editor/item_slot_editor.gd.uid new file mode 100644 index 0000000..d59ba41 --- /dev/null +++ b/addons/gloot/editor/item_slot_editor/item_slot_editor.gd.uid @@ -0,0 +1 @@ +uid://uepjmhric6qw diff --git a/addons/gloot/editor/item_slot_editor/item_slot_editor.tscn b/addons/gloot/editor/item_slot_editor/item_slot_editor.tscn index 67a00ff..ed09180 100644 --- a/addons/gloot/editor/item_slot_editor/item_slot_editor.tscn +++ b/addons/gloot/editor/item_slot_editor/item_slot_editor.tscn @@ -1,10 +1,10 @@ -[gd_scene load_steps=12 format=3 uid="uid://bgs0xwufm4k6k"] +[gd_scene load_steps=10 format=3 uid="uid://bgs0xwufm4k6k"] [ext_resource type="Script" path="res://addons/gloot/editor/item_slot_editor/item_slot_editor.gd" id="1_d7a2m"] -[ext_resource type="PackedScene" uid="uid://dj577duf8yjeb" path="res://addons/gloot/editor/common/choice_filter.tscn" id="2_lcnj8"] -[ext_resource type="Script" path="res://addons/gloot/ui/ctrl_item_slot.gd" id="3_421wi"] +[ext_resource type="Script" path="res://addons/gloot/editor/common/proto_tree_viewer.gd" id="2_ilkw0"] +[ext_resource type="Script" path="res://addons/gloot/ui/ctrl_item_slot.gd" id="3_6ewrx"] -[sub_resource type="Image" id="Image_ktvjb"] +[sub_resource type="Image" id="Image_jy8n2"] data = { "data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), "format": "RGBA8", @@ -13,22 +13,10 @@ data = { "width": 16 } -[sub_resource type="ImageTexture" id="ImageTexture_t45ni"] -image = SubResource("Image_ktvjb") +[sub_resource type="ImageTexture" id="ImageTexture_d7qa0"] +image = SubResource("Image_jy8n2") -[sub_resource type="Image" id="Image_rhg3a"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 68, 224, 224, 224, 184, 224, 224, 224, 240, 224, 224, 224, 232, 224, 224, 224, 186, 227, 227, 227, 62, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 129, 224, 224, 224, 254, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 122, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 68, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 123, 224, 224, 224, 32, 224, 224, 224, 33, 225, 225, 225, 125, 224, 224, 224, 254, 224, 224, 224, 254, 226, 226, 226, 69, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 184, 224, 224, 224, 255, 224, 224, 224, 123, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 125, 224, 224, 224, 255, 225, 225, 225, 174, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 240, 224, 224, 224, 255, 231, 231, 231, 31, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 226, 226, 226, 35, 224, 224, 224, 255, 224, 224, 224, 233, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 232, 224, 224, 224, 255, 224, 224, 224, 32, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 228, 228, 228, 37, 224, 224, 224, 255, 224, 224, 224, 228, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 186, 224, 224, 224, 255, 224, 224, 224, 123, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 130, 224, 224, 224, 255, 224, 224, 224, 173, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 62, 224, 224, 224, 255, 224, 224, 224, 254, 225, 225, 225, 126, 225, 225, 225, 34, 227, 227, 227, 36, 224, 224, 224, 131, 224, 224, 224, 255, 224, 224, 224, 255, 226, 226, 226, 77, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 122, 224, 224, 224, 254, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 210, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 226, 226, 226, 69, 225, 225, 225, 174, 224, 224, 224, 233, 224, 224, 224, 228, 224, 224, 224, 173, 226, 226, 226, 77, 224, 224, 224, 210, 224, 224, 224, 255, 224, 224, 224, 210, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 210, 224, 224, 224, 255, 224, 224, 224, 210, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 210, 224, 224, 224, 255, 224, 224, 224, 210, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 210, 224, 224, 224, 227, 225, 225, 225, 34, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 225, 225, 225, 34, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_3hnnf"] -image = SubResource("Image_rhg3a") - -[sub_resource type="Image" id="Image_8ww1c"] +[sub_resource type="Image" id="Image_scp5p"] data = { "data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 182, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 180, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 171, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 170, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 234, 224, 224, 224, 234, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 85, 225, 225, 225, 85, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), "format": "RGBA8", @@ -37,10 +25,10 @@ data = { "width": 16 } -[sub_resource type="ImageTexture" id="ImageTexture_yqex5"] -image = SubResource("Image_8ww1c") +[sub_resource type="ImageTexture" id="ImageTexture_pue5h"] +image = SubResource("Image_scp5p") -[sub_resource type="Image" id="Image_240jw"] +[sub_resource type="Image" id="Image_v1pv7"] data = { "data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 227, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 225, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 73, 224, 224, 224, 226, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 225, 226, 226, 226, 70, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), "format": "RGBA8", @@ -49,11 +37,11 @@ data = { "width": 16 } -[sub_resource type="ImageTexture" id="ImageTexture_ip6wh"] -image = SubResource("Image_240jw") +[sub_resource type="ImageTexture" id="ImageTexture_srjiv"] +image = SubResource("Image_v1pv7") [node name="ItemSlotEditor" type="Control"] -custom_minimum_size = Vector2(0, 200) +custom_minimum_size = Vector2(0, 300) layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -69,12 +57,23 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -[node name="ChoiceFilter" parent="HSplitContainer" instance=ExtResource("2_lcnj8")] +[node name="VBoxContainer2" type="VBoxContainer" parent="HSplitContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="PrototreeViewer" type="Tree" parent="HSplitContainer/VBoxContainer2"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +hide_root = true +script = ExtResource("2_ilkw0") + +[node name="BtnAdd" type="Button" parent="HSplitContainer/VBoxContainer2"] +unique_name_in_owner = true layout_mode = 2 -pick_text = "Equip" -pick_icon = SubResource("ImageTexture_t45ni") -filter_text = "Filter Prototypes:" -filter_icon = SubResource("ImageTexture_3hnnf") +text = "Add" +icon = SubResource("ImageTexture_d7qa0") [node name="VBoxContainer" type="VBoxContainer" parent="HSplitContainer"] layout_mode = 2 @@ -82,22 +81,25 @@ size_flags_horizontal = 3 size_flags_vertical = 3 [node name="CtrlItemSlot" type="Control" parent="HSplitContainer/VBoxContainer"] -custom_minimum_size = Vector2(32, 32) +unique_name_in_owner = true layout_mode = 2 size_flags_vertical = 3 -script = ExtResource("3_421wi") +script = ExtResource("3_6ewrx") +icon_stretch_mode = 5 [node name="HBoxContainer" type="HBoxContainer" parent="HSplitContainer/VBoxContainer"] layout_mode = 2 [node name="BtnEdit" type="Button" parent="HSplitContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 3 text = "Edit" -icon = SubResource("ImageTexture_yqex5") +icon = SubResource("ImageTexture_pue5h") [node name="BtnClear" type="Button" parent="HSplitContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 3 text = "Clear" -icon = SubResource("ImageTexture_ip6wh") +icon = SubResource("ImageTexture_srjiv") diff --git a/addons/gloot/editor/item_slot_editor/item_slot_inspector.gd b/addons/gloot/editor/item_slot_editor/item_slot_inspector.gd index ed0d07b..d1d990d 100644 --- a/addons/gloot/editor/item_slot_editor/item_slot_inspector.gd +++ b/addons/gloot/editor/item_slot_editor/item_slot_inspector.gd @@ -1,14 +1,14 @@ @tool extends Control -const EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") +const _EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") @onready var item_slot_editor: Control = $HBoxContainer/ItemSlotEditor @onready var btn_expand: Button = $HBoxContainer/BtnExpand @onready var _window_dialog: Window = $Window @onready var _item_slot_editor: Control = $Window/MarginContainer/ItemSlotEditor -var item_slot: ItemSlot : +var item_slot: ItemSlot: set(new_item_slot): item_slot = new_item_slot if item_slot_editor: @@ -23,7 +23,7 @@ func _ready() -> void: if item_slot_editor: item_slot_editor.item_slot = item_slot _apply_editor_settings() - btn_expand.icon = EditorIcons.get_icon("DistractionFree") + btn_expand.icon = _EditorIcons.get_icon("DistractionFree") btn_expand.pressed.connect(on_btn_expand) _window_dialog.close_requested.connect(func(): _window_dialog.hide()) diff --git a/addons/gloot/editor/item_slot_editor/item_slot_inspector.gd.uid b/addons/gloot/editor/item_slot_editor/item_slot_inspector.gd.uid new file mode 100644 index 0000000..817eb2f --- /dev/null +++ b/addons/gloot/editor/item_slot_editor/item_slot_inspector.gd.uid @@ -0,0 +1 @@ +uid://taqvou1w60nm diff --git a/addons/gloot/editor/item_slot_editor/item_slot_inspector.tscn b/addons/gloot/editor/item_slot_editor/item_slot_inspector.tscn index d5fcc8f..a085090 100644 --- a/addons/gloot/editor/item_slot_editor/item_slot_inspector.tscn +++ b/addons/gloot/editor/item_slot_editor/item_slot_inspector.tscn @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://addons/gloot/editor/item_slot_editor/item_slot_inspector.gd" id="1_4gsgr"] [ext_resource type="PackedScene" uid="uid://bgs0xwufm4k6k" path="res://addons/gloot/editor/item_slot_editor/item_slot_editor.tscn" id="2_ysqy6"] -[sub_resource type="Image" id="Image_ump51"] +[sub_resource type="Image" id="Image_1eklb"] data = { "data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 4, 255, 255, 255, 4, 255, 255, 255, 4, 255, 255, 255, 4, 255, 255, 255, 3, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 123, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 127, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 135, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 140, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 213, 232, 232, 232, 22, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 24, 224, 224, 224, 216, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 136, 224, 224, 224, 213, 224, 224, 224, 255, 224, 224, 224, 213, 232, 232, 232, 22, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 24, 224, 224, 224, 216, 224, 224, 224, 255, 224, 224, 224, 210, 224, 224, 224, 138, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 126, 255, 255, 255, 0, 232, 232, 232, 22, 224, 224, 224, 213, 224, 224, 224, 255, 226, 226, 226, 103, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 107, 224, 224, 224, 255, 224, 224, 224, 210, 230, 230, 230, 20, 255, 255, 255, 0, 225, 225, 225, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 232, 232, 232, 22, 226, 226, 226, 103, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 105, 230, 230, 230, 20, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 24, 224, 224, 224, 107, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 109, 232, 232, 232, 22, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 127, 255, 255, 255, 0, 224, 224, 224, 24, 224, 224, 224, 216, 224, 224, 224, 255, 224, 224, 224, 105, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 109, 224, 224, 224, 255, 224, 224, 224, 213, 232, 232, 232, 22, 255, 255, 255, 0, 224, 224, 224, 129, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 140, 224, 224, 224, 216, 224, 224, 224, 255, 224, 224, 224, 210, 230, 230, 230, 20, 255, 255, 255, 0, 255, 255, 255, 0, 232, 232, 232, 22, 224, 224, 224, 213, 224, 224, 224, 255, 224, 224, 224, 213, 225, 225, 225, 142, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 210, 230, 230, 230, 20, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 232, 232, 232, 22, 224, 224, 224, 213, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 138, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 142, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 129, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), "format": "RGBA8", @@ -12,11 +12,11 @@ data = { "width": 16 } -[sub_resource type="ImageTexture" id="ImageTexture_eojh7"] -image = SubResource("Image_ump51") +[sub_resource type="ImageTexture" id="ImageTexture_jr7hk"] +image = SubResource("Image_1eklb") [node name="ItemSlotInspector" type="Control"] -custom_minimum_size = Vector2(0, 200) +custom_minimum_size = Vector2(0, 300) layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -40,7 +40,7 @@ size_flags_horizontal = 3 [node name="BtnExpand" type="Button" parent="HBoxContainer"] layout_mode = 2 -icon = SubResource("ImageTexture_eojh7") +icon = SubResource("ImageTexture_jr7hk") [node name="Window" type="Window" parent="."] title = "Edit Item Slot" diff --git a/addons/gloot/editor/protoset_editor/edit_protoset_button.gd b/addons/gloot/editor/protoset_editor/edit_protoset_button.gd deleted file mode 100644 index 408ff63..0000000 --- a/addons/gloot/editor/protoset_editor/edit_protoset_button.gd +++ /dev/null @@ -1,25 +0,0 @@ -@tool -extends Button - -const EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") - -@onready var window_dialog: Window = $"%Window" -@onready var protoset_editor: Control = $"%ProtosetEditor" - -var protoset: ItemProtoset : - set(new_protoset): - protoset = new_protoset - if protoset_editor: - protoset_editor.protoset = protoset - - -func init(protoset_: ItemProtoset) -> void: - protoset = protoset_ - - -func _ready() -> void: - icon = EditorIcons.get_icon("Edit") - window_dialog.close_requested.connect(func(): protoset.notify_property_list_changed()) - protoset_editor.protoset = protoset - pressed.connect(func(): window_dialog.popup_centered(window_dialog.size)) - diff --git a/addons/gloot/editor/protoset_editor/edit_protoset_button.tscn b/addons/gloot/editor/protoset_editor/edit_protoset_button.tscn deleted file mode 100644 index 57d03d3..0000000 --- a/addons/gloot/editor/protoset_editor/edit_protoset_button.tscn +++ /dev/null @@ -1,37 +0,0 @@ -[gd_scene load_steps=5 format=3 uid="uid://bjme7iuv3j6yb"] - -[ext_resource type="PackedScene" uid="uid://cyj0avrwjowl" path="res://addons/gloot/editor/protoset_editor/protoset_editor.tscn" id="1"] -[ext_resource type="Script" path="res://addons/gloot/editor/protoset_editor/edit_protoset_button.gd" id="2"] - -[sub_resource type="Image" id="Image_tnk37"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 182, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 180, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 171, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 170, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 234, 224, 224, 224, 234, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 85, 225, 225, 225, 85, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_18gso"] -image = SubResource("Image_tnk37") - -[node name="EditProtosetButton" type="Button"] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -text = "Edit Protoset" -icon = SubResource("ImageTexture_18gso") -script = ExtResource("2") - -[node name="Window" type="Window" parent="."] -unique_name_in_owner = true -title = "Edit Protoset" -size = Vector2i(1000, 600) -visible = false -exclusive = true -min_size = Vector2i(800, 200) - -[node name="ProtosetEditor" parent="Window" instance=ExtResource("1")] -unique_name_in_owner = true diff --git a/addons/gloot/editor/protoset_editor/protoset_editor.gd b/addons/gloot/editor/protoset_editor/protoset_editor.gd deleted file mode 100644 index f880efc..0000000 --- a/addons/gloot/editor/protoset_editor/protoset_editor.gd +++ /dev/null @@ -1,174 +0,0 @@ -@tool -extends Control - -const GlootUndoRedo = preload("res://addons/gloot/editor/gloot_undo_redo.gd") -const EditorIcons = preload("res://addons/gloot/editor/common/editor_icons.gd") - -@onready var prototype_filter = $"%PrototypeFilter" -@onready var property_editor = $"%PropertyEditor" -@onready var txt_prototype_id = $"%TxtPrototypeName" -@onready var btn_add_prototype = $"%BtnAddPrototype" -@onready var btn_duplicate_prototype = $"%BtnDuplicatePrototype" -@onready var btn_remove_prototype = $"%BtnRemovePrototype" -@onready var btn_rename_prototype = $"%BtnRenamePrototype" - -var protoset: ItemProtoset : - set(new_protoset): - protoset = new_protoset - if protoset: - protoset.changed.connect(_on_protoset_changed) - _refresh() -var selected_prototype_id: String = "" - - -func _ready() -> void: - prototype_filter.choice_selected.connect(_on_prototype_selected) - property_editor.value_changed.connect(_on_property_changed) - property_editor.value_removed.connect(_on_property_removed) - txt_prototype_id.text_changed.connect(_on_prototype_id_changed) - txt_prototype_id.text_submitted.connect(_on_prototype_id_entered) - btn_add_prototype.pressed.connect(_on_btn_add_prototype) - btn_duplicate_prototype.pressed.connect(_on_btn_duplicate_prototype) - btn_rename_prototype.pressed.connect(_on_btn_rename_prototype) - btn_remove_prototype.pressed.connect(_on_btn_remove_prototype) - - btn_add_prototype.icon = EditorIcons.get_icon("Add") - btn_duplicate_prototype.icon = EditorIcons.get_icon("Duplicate") - btn_rename_prototype.icon = EditorIcons.get_icon("Edit") - btn_remove_prototype.icon = EditorIcons.get_icon("Remove") - prototype_filter.filter_icon = EditorIcons.get_icon("Search") - _refresh() - - -func _refresh() -> void: - if !visible: - return - - _clear() - _populate() - _refresh_btn_add_prototype() - _refresh_btn_rename_prototype() - _refresh_btn_remove_prototype() - _refresh_btn_duplicate_prototype() - _inspect_prototype_id(selected_prototype_id) - - -func _clear() -> void: - prototype_filter.values.clear() - property_editor.dictionary.clear() - property_editor.refresh() - - -func _populate() -> void: - if protoset: - # TODO: Avoid accessing "private" members (_prototypes) - prototype_filter.set_values(protoset._prototypes.keys().duplicate()) - - -func _refresh_btn_add_prototype() -> void: - btn_add_prototype.disabled = txt_prototype_id.text.is_empty() ||\ - protoset.has_prototype(txt_prototype_id.text) - - -func _refresh_btn_rename_prototype() -> void: - btn_rename_prototype.disabled = txt_prototype_id.text.is_empty() ||\ - protoset.has_prototype(txt_prototype_id.text) - - -func _refresh_btn_remove_prototype() -> void: - btn_remove_prototype.disabled = prototype_filter.get_selected_text().is_empty() - - -func _refresh_btn_duplicate_prototype() -> void: - btn_duplicate_prototype.disabled = prototype_filter.get_selected_text().is_empty() - - -func _on_protoset_changed() -> void: - _refresh() - - -func _on_prototype_selected(index: int) -> void: - selected_prototype_id = prototype_filter.values[index] - _inspect_prototype_id(selected_prototype_id) - _refresh_btn_remove_prototype() - _refresh_btn_duplicate_prototype() - - -func _inspect_prototype_id(prototype_id: String) -> void: - if !protoset || !protoset.has_prototype(prototype_id): - return - - var prototype: Dictionary = protoset.get_prototype(prototype_id).duplicate() - - property_editor.dictionary = prototype - property_editor.immutable_keys = [ItemProtoset.KEY_ID] as Array[String] - property_editor.remove_button_map = {} - - for property_name in prototype.keys(): - property_editor.set_remove_button_config(property_name, { - "text": "", - "disabled": property_name == ItemProtoset.KEY_ID, - "icon": EditorIcons.get_icon("Remove"), - }) - - -func _on_property_changed(property_name: String, new_value) -> void: - if selected_prototype_id.is_empty(): - return - var new_properties = protoset.get_prototype(selected_prototype_id).duplicate() - new_properties[property_name] = new_value - - if new_properties.hash() == protoset.get_prototype(selected_prototype_id).hash(): - return - - GlootUndoRedo.set_prototype_properties(protoset, selected_prototype_id, new_properties) - - -func _on_property_removed(property_name: String) -> void: - if selected_prototype_id.is_empty(): - return - var new_properties = protoset.get_prototype(selected_prototype_id).duplicate() - new_properties.erase(property_name) - - GlootUndoRedo.set_prototype_properties(protoset, selected_prototype_id, new_properties) - - -func _on_prototype_id_changed(_prototype_id: String) -> void: - _refresh_btn_add_prototype() - _refresh_btn_rename_prototype() - - -func _on_prototype_id_entered(prototype_id: String) -> void: - _add_prototype_id(prototype_id) - - -func _on_btn_add_prototype() -> void: - _add_prototype_id(txt_prototype_id.text) - - -func _on_btn_duplicate_prototype() -> void: - GlootUndoRedo.duplicate_prototype(protoset, selected_prototype_id) - - -func _on_btn_rename_prototype() -> void: - if selected_prototype_id.is_empty(): - return - - GlootUndoRedo.rename_prototype(protoset, - selected_prototype_id, - txt_prototype_id.text) - txt_prototype_id.text = "" - - -func _add_prototype_id(prototype_id: String) -> void: - GlootUndoRedo.add_prototype(protoset, prototype_id) - txt_prototype_id.text = "" - - -func _on_btn_remove_prototype() -> void: - if selected_prototype_id.is_empty(): - return - - var prototype_id = selected_prototype_id - if !prototype_id.is_empty(): - GlootUndoRedo.remove_prototype(protoset, prototype_id) diff --git a/addons/gloot/editor/protoset_editor/protoset_editor.tscn b/addons/gloot/editor/protoset_editor/protoset_editor.tscn deleted file mode 100644 index 77aca4e..0000000 --- a/addons/gloot/editor/protoset_editor/protoset_editor.tscn +++ /dev/null @@ -1,155 +0,0 @@ -[gd_scene load_steps=14 format=3 uid="uid://cyj0avrwjowl"] - -[ext_resource type="PackedScene" uid="uid://dj577duf8yjeb" path="res://addons/gloot/editor/common/choice_filter.tscn" id="1"] -[ext_resource type="PackedScene" uid="uid://digtudobrw3xb" path="res://addons/gloot/editor/common/dict_editor.tscn" id="2"] -[ext_resource type="Script" path="res://addons/gloot/editor/protoset_editor/protoset_editor.gd" id="3"] - -[sub_resource type="Image" id="Image_3d3lf"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 68, 224, 224, 224, 184, 224, 224, 224, 240, 224, 224, 224, 232, 224, 224, 224, 186, 227, 227, 227, 62, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 129, 224, 224, 224, 254, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 122, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 68, 224, 224, 224, 254, 224, 224, 224, 254, 224, 224, 224, 123, 224, 224, 224, 32, 224, 224, 224, 33, 225, 225, 225, 125, 224, 224, 224, 254, 224, 224, 224, 254, 226, 226, 226, 69, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 184, 224, 224, 224, 255, 224, 224, 224, 123, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 125, 224, 224, 224, 255, 225, 225, 225, 174, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 240, 224, 224, 224, 255, 231, 231, 231, 31, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 226, 226, 226, 35, 224, 224, 224, 255, 224, 224, 224, 233, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 232, 224, 224, 224, 255, 224, 224, 224, 32, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 228, 228, 228, 37, 224, 224, 224, 255, 224, 224, 224, 228, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 186, 224, 224, 224, 255, 224, 224, 224, 123, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 130, 224, 224, 224, 255, 224, 224, 224, 173, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 62, 224, 224, 224, 255, 224, 224, 224, 254, 225, 225, 225, 126, 225, 225, 225, 34, 227, 227, 227, 36, 224, 224, 224, 131, 224, 224, 224, 255, 224, 224, 224, 255, 226, 226, 226, 77, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 122, 224, 224, 224, 254, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 210, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 226, 226, 226, 69, 225, 225, 225, 174, 224, 224, 224, 233, 224, 224, 224, 228, 224, 224, 224, 173, 226, 226, 226, 77, 224, 224, 224, 210, 224, 224, 224, 255, 224, 224, 224, 210, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 210, 224, 224, 224, 255, 224, 224, 224, 210, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 210, 224, 224, 224, 255, 224, 224, 224, 210, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 210, 224, 224, 224, 227, 225, 225, 225, 34, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 225, 225, 225, 34, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_ooqbn"] -image = SubResource("Image_3d3lf") - -[sub_resource type="Image" id="Image_7dqyh"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_dehry"] -image = SubResource("Image_7dqyh") - -[sub_resource type="Image" id="Image_nsl4i"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 225, 225, 225, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 225, 225, 225, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 127, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_cfl22"] -image = SubResource("Image_nsl4i") - -[sub_resource type="Image" id="Image_o82dw"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 182, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 180, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 171, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 170, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 234, 224, 224, 224, 234, 231, 231, 231, 21, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 85, 225, 225, 225, 85, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_qoier"] -image = SubResource("Image_o82dw") - -[sub_resource type="Image" id="Image_ey4cw"] -data = { -"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 227, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 225, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 73, 224, 224, 224, 226, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 225, 226, 226, 226, 70, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0), -"format": "RGBA8", -"height": 16, -"mipmaps": false, -"width": 16 -} - -[sub_resource type="ImageTexture" id="ImageTexture_i8glk"] -image = SubResource("Image_ey4cw") - -[node name="ProtosetEditor" type="Control"] -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -script = ExtResource("3") - -[node name="Gui" type="HSplitContainer" parent="."] -layout_mode = 0 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_left = 5.0 -offset_top = 5.0 -offset_right = -5.0 -offset_bottom = -5.0 -size_flags_horizontal = 3 -size_flags_vertical = 3 - -[node name="VBoxContainer" type="VBoxContainer" parent="Gui"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 - -[node name="Label" type="Label" parent="Gui/VBoxContainer"] -layout_mode = 2 -text = "Prototypes" - -[node name="PrototypeFilter" parent="Gui/VBoxContainer" instance=ExtResource("1")] -unique_name_in_owner = true -layout_mode = 2 -pick_button_visible = false -filter_text = "Prototype Filter:" -filter_icon = SubResource("ImageTexture_ooqbn") - -[node name="HBoxContainer2" type="HBoxContainer" parent="Gui/VBoxContainer"] -layout_mode = 2 - -[node name="TxtPrototypeName" type="LineEdit" parent="Gui/VBoxContainer/HBoxContainer2"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 3 -tooltip_text = "Prototype ID" - -[node name="BtnAddPrototype" type="Button" parent="Gui/VBoxContainer/HBoxContainer2"] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Add a new prototype with the entered ID" -disabled = true -text = "Add" -icon = SubResource("ImageTexture_dehry") - -[node name="BtnDuplicatePrototype" type="Button" parent="Gui/VBoxContainer/HBoxContainer2"] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Duplicate the selected prototype" -disabled = true -text = "Duplicate" -icon = SubResource("ImageTexture_cfl22") - -[node name="BtnRenamePrototype" type="Button" parent="Gui/VBoxContainer/HBoxContainer2"] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Rename the selected prototype" -disabled = true -text = "Rename" -icon = SubResource("ImageTexture_qoier") - -[node name="BtnRemovePrototype" type="Button" parent="Gui/VBoxContainer/HBoxContainer2"] -unique_name_in_owner = true -layout_mode = 2 -tooltip_text = "Remove the selected prototype" -disabled = true -text = "Remove" -icon = SubResource("ImageTexture_i8glk") - -[node name="VBoxContainer2" type="VBoxContainer" parent="Gui"] -layout_mode = 2 -size_flags_horizontal = 3 - -[node name="Label" type="Label" parent="Gui/VBoxContainer2"] -layout_mode = 2 -text = "Properties" - -[node name="PropertyEditor" parent="Gui/VBoxContainer2" instance=ExtResource("2")] -unique_name_in_owner = true -layout_mode = 2 -dictionary = {} diff --git a/addons/gloot/editor/undoables.gd b/addons/gloot/editor/undoables.gd new file mode 100644 index 0000000..4dd7835 --- /dev/null +++ b/addons/gloot/editor/undoables.gd @@ -0,0 +1,54 @@ +extends Object + +const _Undoables = preload("res://addons/gloot/editor/undoables.gd") + + +static func _get_undo_redo_manager() -> EditorUndoRedoManager: + if Engine.is_editor_hint(): + var Gloot = load("res://addons/gloot/gloot.gd") + if Gloot.instance() == null: + return null + var undo_redo_manager = Gloot.instance().get_undo_redo() + if undo_redo_manager == null: + return null + return undo_redo_manager + else: + return null + + +static func _undoable_action_impl(objects: Array, action_name: String, callable: Callable) -> bool: + var undo_redo_manager = _get_undo_redo_manager() + if undo_redo_manager == null: + return callable.call() + + var old_states := _serialize_objects(objects) + var result: bool = callable.call() + if !result: + return false + var new_states := _serialize_objects(objects) + + undo_redo_manager.create_action(action_name) + undo_redo_manager.add_do_method(_Undoables, "_deserialize_objects", objects, new_states) + undo_redo_manager.add_undo_method(_Undoables, "_deserialize_objects", objects, old_states) + undo_redo_manager.commit_action() + + return true + + +static func _deserialize_objects(objects: Array, object_data: Array[Dictionary]) -> void: + assert(objects.size() == object_data.size()) + for i in range(objects.size()): + objects[i].deserialize(object_data[i]) + + +static func _serialize_objects(objects: Array) -> Array[Dictionary]: + var result: Array[Dictionary] + for object in objects: + result.push_back(object.serialize()) + return result + + +static func undoable_action(object: Variant, action_name: String, callable: Callable) -> bool: + if typeof(object) == TYPE_ARRAY: + return _undoable_action_impl(object, action_name, callable) + return _undoable_action_impl([object], action_name, callable) diff --git a/addons/gloot/editor/undoables.gd.uid b/addons/gloot/editor/undoables.gd.uid new file mode 100644 index 0000000..274aef9 --- /dev/null +++ b/addons/gloot/editor/undoables.gd.uid @@ -0,0 +1 @@ +uid://ckefa71x887kb diff --git a/addons/gloot/gloot.gd b/addons/gloot/gloot.gd index dde288b..0ebe74d 100644 --- a/addons/gloot/gloot.gd +++ b/addons/gloot/gloot.gd @@ -24,12 +24,7 @@ func _exit_tree() -> void: remove_inspector_plugin(inspector_plugin) func _add_settings() -> void: - _add_setting("gloot/inspector_control_height", TYPE_INT, 200) - _add_setting("gloot/item_dragging_deadzone_radius", TYPE_FLOAT, 8.0) - _add_setting("gloot/JSON_serialization/indent_using_spaces", TYPE_BOOL, true) - _add_setting("gloot/JSON_serialization/indent_size", TYPE_INT, 4) - _add_setting("gloot/JSON_serialization/sort_keys", TYPE_BOOL, true) - _add_setting("gloot/JSON_serialization/full_precision", TYPE_BOOL, false) + _add_setting("gloot/inspector_control_height", TYPE_INT, 300) func _add_setting(name: String, type: int, value) -> void: diff --git a/addons/gloot/gloot.gd.uid b/addons/gloot/gloot.gd.uid new file mode 100644 index 0000000..962d16c --- /dev/null +++ b/addons/gloot/gloot.gd.uid @@ -0,0 +1 @@ +uid://c3xsv6ylc1vpg diff --git a/addons/gloot/images/icon_item_ref_slot.svg b/addons/gloot/images/icon_ctrl_capacity.svg similarity index 68% rename from addons/gloot/images/icon_item_ref_slot.svg rename to addons/gloot/images/icon_ctrl_capacity.svg index c5da49e..68c0a86 100644 --- a/addons/gloot/images/icon_item_ref_slot.svg +++ b/addons/gloot/images/icon_ctrl_capacity.svg @@ -5,7 +5,7 @@ width="16" version="1.1" id="svg4" - sodipodi:docname="icon_item_ref_slot.svg" + sodipodi:docname="icon_ctrl_capacity.svg" inkscape:version="1.3.2 (091e20e, 2023-11-25)" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" @@ -41,8 +41,8 @@ id="namedview6" showgrid="true" inkscape:zoom="29.5" - inkscape:cx="3.0847458" - inkscape:cy="9.0169492" + inkscape:cx="4.0169492" + inkscape:cy="5.8644068" inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="1" @@ -65,13 +65,7 @@ visible="true" /> - + id="rect2" + style="fill:#00e436;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round" + d="M 1 4 L 1 12 L 15 12 L 15 4 L 1 4 z M 2 5 L 14 5 L 14 11 L 2 11 L 2 5 z M 3 6 L 3 10 L 10 10 L 10 6 L 3 6 z " /> diff --git a/addons/gloot/images/icon_item.svg.import b/addons/gloot/images/icon_ctrl_capacity.svg.import similarity index 69% rename from addons/gloot/images/icon_item.svg.import rename to addons/gloot/images/icon_ctrl_capacity.svg.import index 87f2f07..09265db 100644 --- a/addons/gloot/images/icon_item.svg.import +++ b/addons/gloot/images/icon_ctrl_capacity.svg.import @@ -2,16 +2,16 @@ importer="texture" type="CompressedTexture2D" -uid="uid://qlt0i7muj2tj" -path="res://.godot/imported/icon_item.svg-19f0c54092b35b57bc3510f8accf9092.ctex" +uid="uid://vbaob50r5jx8" +path="res://.godot/imported/icon_ctrl_capacity.svg-164a0ccaaa67843fd69711b8f7cc5a8f.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://addons/gloot/images/icon_item.svg" -dest_files=["res://.godot/imported/icon_item.svg-19f0c54092b35b57bc3510f8accf9092.ctex"] +source_file="res://addons/gloot/images/icon_ctrl_capacity.svg" +dest_files=["res://.godot/imported/icon_ctrl_capacity.svg-164a0ccaaa67843fd69711b8f7cc5a8f.ctex"] [params] diff --git a/addons/gloot/images/icon_ctrl_inventory_item.svg b/addons/gloot/images/icon_ctrl_inventory_item.svg new file mode 100644 index 0000000..4f84a1b --- /dev/null +++ b/addons/gloot/images/icon_ctrl_inventory_item.svg @@ -0,0 +1,83 @@ + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/addons/gloot/images/icon_item_protoset.svg.import b/addons/gloot/images/icon_ctrl_inventory_item.svg.import similarity index 68% rename from addons/gloot/images/icon_item_protoset.svg.import rename to addons/gloot/images/icon_ctrl_inventory_item.svg.import index 816fddd..89a7158 100644 --- a/addons/gloot/images/icon_item_protoset.svg.import +++ b/addons/gloot/images/icon_ctrl_inventory_item.svg.import @@ -2,16 +2,16 @@ importer="texture" type="CompressedTexture2D" -uid="uid://dbepw1v0gp80y" -path="res://.godot/imported/icon_item_protoset.svg-3584e3e1df3de7b231a248b80bd83194.ctex" +uid="uid://gypy8asicowf" +path="res://.godot/imported/icon_ctrl_inventory_item.svg-4ddfc5bdcdf5d97ce81d110d6f8c27ff.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://addons/gloot/images/icon_item_protoset.svg" -dest_files=["res://.godot/imported/icon_item_protoset.svg-3584e3e1df3de7b231a248b80bd83194.ctex"] +source_file="res://addons/gloot/images/icon_ctrl_inventory_item.svg" +dest_files=["res://.godot/imported/icon_ctrl_inventory_item.svg-4ddfc5bdcdf5d97ce81d110d6f8c27ff.ctex"] [params] diff --git a/addons/gloot/images/icon_ctrl_inventory_stacked.svg b/addons/gloot/images/icon_ctrl_inventory_stacked.svg deleted file mode 100644 index 4f28b24..0000000 --- a/addons/gloot/images/icon_ctrl_inventory_stacked.svg +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - diff --git a/addons/gloot/images/icon_inventory_grid.svg b/addons/gloot/images/icon_grid_constraint.svg similarity index 74% rename from addons/gloot/images/icon_inventory_grid.svg rename to addons/gloot/images/icon_grid_constraint.svg index 38e05f7..d485dca 100644 --- a/addons/gloot/images/icon_inventory_grid.svg +++ b/addons/gloot/images/icon_grid_constraint.svg @@ -1,19 +1,19 @@ + sodipodi:docname="icon_grid_constraint.svg" + inkscape:version="1.3.2 (091e20e, 2023-11-25)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> @@ -22,7 +22,6 @@ image/svg+xml - @@ -37,29 +36,36 @@ guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" - inkscape:window-width="2498" - inkscape:window-height="1417" + inkscape:window-width="2560" + inkscape:window-height="1368" id="namedview6" showgrid="true" inkscape:zoom="41.7193" - inkscape:cx="10.1668" - inkscape:cy="7.4508754" - inkscape:window-x="54" - inkscape:window-y="-8" + inkscape:cx="3.6074431" + inkscape:cy="8.3414631" + inkscape:window-x="0" + inkscape:window-y="0" inkscape:window-maximized="1" inkscape:current-layer="svg4" inkscape:snap-grids="true" inkscape:snap-bbox="true" inkscape:snap-center="true" - inkscape:snap-others="true"> + inkscape:snap-others="true" + inkscape:showpageshadow="0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#505050"> + spacingy="1" + originx="0" + originy="0" + units="px" + visible="true" /> diff --git a/addons/gloot/images/icon_inventory_grid.svg.import b/addons/gloot/images/icon_grid_constraint.svg.import similarity index 68% rename from addons/gloot/images/icon_inventory_grid.svg.import rename to addons/gloot/images/icon_grid_constraint.svg.import index 0508e6f..81a1aa8 100644 --- a/addons/gloot/images/icon_inventory_grid.svg.import +++ b/addons/gloot/images/icon_grid_constraint.svg.import @@ -2,16 +2,16 @@ importer="texture" type="CompressedTexture2D" -uid="uid://kd75uhabf1gk" -path="res://.godot/imported/icon_inventory_grid.svg-aa0d41ee8a4783e96656b0c95fc25600.ctex" +uid="uid://cialwsw8quwo1" +path="res://.godot/imported/icon_grid_constraint.svg-31bb15f33a36c5e8b232c725fef3f0ae.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://addons/gloot/images/icon_inventory_grid.svg" -dest_files=["res://.godot/imported/icon_inventory_grid.svg-aa0d41ee8a4783e96656b0c95fc25600.ctex"] +source_file="res://addons/gloot/images/icon_grid_constraint.svg" +dest_files=["res://.godot/imported/icon_grid_constraint.svg-31bb15f33a36c5e8b232c725fef3f0ae.ctex"] [params] diff --git a/addons/gloot/images/icon_inventory_grid_stacked.svg b/addons/gloot/images/icon_inventory_grid_stacked.svg deleted file mode 100644 index 75e6b60..0000000 --- a/addons/gloot/images/icon_inventory_grid_stacked.svg +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/addons/gloot/images/icon_inventory_stacked.svg b/addons/gloot/images/icon_inventory_stacked.svg deleted file mode 100644 index c5f3471..0000000 --- a/addons/gloot/images/icon_inventory_stacked.svg +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - diff --git a/addons/gloot/images/icon_item.svg b/addons/gloot/images/icon_item.svg deleted file mode 100644 index dc265c1..0000000 --- a/addons/gloot/images/icon_item.svg +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - diff --git a/addons/gloot/images/icon_item_count_constraint.svg b/addons/gloot/images/icon_item_count_constraint.svg new file mode 100644 index 0000000..9d4de18 --- /dev/null +++ b/addons/gloot/images/icon_item_count_constraint.svg @@ -0,0 +1,72 @@ + + + + + + + image/svg+xml + + + + + + + + + diff --git a/addons/gloot/images/icon_item_count_constraint.svg.import b/addons/gloot/images/icon_item_count_constraint.svg.import new file mode 100644 index 0000000..f2baa56 --- /dev/null +++ b/addons/gloot/images/icon_item_count_constraint.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cic8j2p02o0cn" +path="res://.godot/imported/icon_item_count_constraint.svg-6ba65dc6693bf362d833b589d299e1ff.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/gloot/images/icon_item_count_constraint.svg" +dest_files=["res://.godot/imported/icon_item_count_constraint.svg-6ba65dc6693bf362d833b589d299e1ff.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/gloot/images/icon_item_protoset.svg b/addons/gloot/images/icon_item_protoset.svg deleted file mode 100644 index 159b4ac..0000000 --- a/addons/gloot/images/icon_item_protoset.svg +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - - - diff --git a/addons/gloot/images/icon_item_ref_slot.svg.import b/addons/gloot/images/icon_item_ref_slot.svg.import deleted file mode 100644 index ceb9a0d..0000000 --- a/addons/gloot/images/icon_item_ref_slot.svg.import +++ /dev/null @@ -1,37 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dagqmcoxvm3m6" -path="res://.godot/imported/icon_item_ref_slot.svg-c8a8d9826d793965417f19dda840f923.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/gloot/images/icon_item_ref_slot.svg" -dest_files=["res://.godot/imported/icon_item_ref_slot.svg-c8a8d9826d793965417f19dda840f923.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/addons/gloot/images/icon_weight_constraint.svg b/addons/gloot/images/icon_weight_constraint.svg new file mode 100644 index 0000000..08c005d --- /dev/null +++ b/addons/gloot/images/icon_weight_constraint.svg @@ -0,0 +1,82 @@ + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/addons/gloot/images/icon_inventory_stacked.svg.import b/addons/gloot/images/icon_weight_constraint.svg.import similarity index 68% rename from addons/gloot/images/icon_inventory_stacked.svg.import rename to addons/gloot/images/icon_weight_constraint.svg.import index 67a4717..2383ef2 100644 --- a/addons/gloot/images/icon_inventory_stacked.svg.import +++ b/addons/gloot/images/icon_weight_constraint.svg.import @@ -2,16 +2,16 @@ importer="texture" type="CompressedTexture2D" -uid="uid://ch1f50xu37dvo" -path="res://.godot/imported/icon_inventory_stacked.svg-e621060af73c305939da691316b0c966.ctex" +uid="uid://wkf6siqakc38" +path="res://.godot/imported/icon_weight_constraint.svg-4c78f8924ceb8ed32de7cdd9d5bc492c.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://addons/gloot/images/icon_inventory_stacked.svg" -dest_files=["res://.godot/imported/icon_inventory_stacked.svg-e621060af73c305939da691316b0c966.ctex"] +source_file="res://addons/gloot/images/icon_weight_constraint.svg" +dest_files=["res://.godot/imported/icon_weight_constraint.svg-4c78f8924ceb8ed32de7cdd9d5bc492c.ctex"] [params] diff --git a/addons/gloot/plugin.cfg b/addons/gloot/plugin.cfg index 0ba1162..73c639e 100644 --- a/addons/gloot/plugin.cfg +++ b/addons/gloot/plugin.cfg @@ -3,5 +3,5 @@ name="GLoot" description="A universal inventory system for the Godot game engine" author="Peter Kish" -version="2.4.8" +version="3.0.0" script="gloot.gd" diff --git a/addons/gloot/ui/README.md b/addons/gloot/ui/README.md new file mode 100644 index 0000000..b6cd226 --- /dev/null +++ b/addons/gloot/ui/README.md @@ -0,0 +1,20 @@ +# UI Directory Contents + +## Files + +| Directory | Description | +| --------------------------------------------- | ----------- | +| `ctrl_draggable_inventory_item.gd` | Implements draggable inventory items. | +| `ctrl_draggable.gd` | Implements draggable UI controls. | +| `ctrl_drop_zone.gd` | Implements UI controls that can receive dragged controls | +| `ctrl_inventory_capacity.gd` | `CtrlItemCapacity` implementation. | +| `ctrl_inventory_grid_basic.gd` | Helper script for displaying inventory items on a grid. | +| `ctrl_inventory_grid.gd` | `CtrlInventoryGrid` implementation. | +| `ctrl_inventory_item_base.gd` | `CtrlInventoryItemBase` implementation. | +| `ctrl_inventory_item.gd` | `CtrlInventoryItem` implementation. | +| `ctrl_inventory_universal.gd` | Implements a UI control that can display any inventory. | +| `ctrl_inventory.gd` | `CtrlInventory` implementation. | +| `ctrl_item_slot.gd` | `CtrlItemSlot` implementation. | +| `ctrl_inventory_grid_field_style_normal.tres` | The default grid field background style for `CtrlInventoryGrid`. | +| `ctrl_inventory_grid_style_background.tres` | The default style used for the inventory background in `CtrlInventoryGrid`. | +| `ctrl_inventory_grid_style_selection.tres` | The default style used for displaying item selections in `CtrlInventoryGrid`. | diff --git a/addons/gloot/ui/ctrl_dragable.gd b/addons/gloot/ui/ctrl_dragable.gd deleted file mode 100644 index a6acee1..0000000 --- a/addons/gloot/ui/ctrl_dragable.gd +++ /dev/null @@ -1,81 +0,0 @@ -@tool -extends Control - -const CtrlDragable = preload("res://addons/gloot/ui/ctrl_dragable.gd") -const CtrlDropZone = preload("res://addons/gloot/ui/ctrl_drop_zone.gd") - -# Somewhat hacky way to do static signals: -# https://stackoverflow.com/questions/77026156/how-to-write-a-static-event-emitter-in-gdscript/77026952#77026952 - -static var dragable_grabbed: Signal = (func(): - if (CtrlDragable as Object).has_user_signal("dragable_grabbed"): - return (CtrlDragable as Object).dragable_grabbed - (CtrlDragable as Object).add_user_signal("dragable_grabbed") - return Signal(CtrlDragable, "dragable_grabbed") -).call() - -static var dragable_dropped: Signal = (func(): - if (CtrlDragable as Object).has_user_signal("dragable_dropped"): - return (CtrlDragable as Object).dragable_dropped - (CtrlDragable as Object).add_user_signal("dragable_dropped") - return Signal(CtrlDragable, "dragable_dropped") -).call() - -signal grabbed(position) -signal dropped(zone, position) - -static var _grabbed_dragable: CtrlDragable = null -static var _grab_offset: Vector2 - -var _enabled: bool = true - - -static func get_grabbed_dragable() -> CtrlDragable: - if !is_instance_valid(_grabbed_dragable): - return null - return _grabbed_dragable - - -static func get_grab_offset() -> Vector2: - return _grab_offset - - -static func get_grab_offset_local_to(control: Control) -> Vector2: - return CtrlDragable.get_grab_offset() / control.get_global_transform().get_scale() - - -func _get_drag_data(at_position: Vector2): - if !_enabled: - return null - - _grabbed_dragable = self - _grab_offset = at_position * get_global_transform().get_scale() - dragable_grabbed.emit(_grabbed_dragable, _grab_offset) - grabbed.emit(_grab_offset) - - var preview = Control.new() - var sub_preview = create_preview() - sub_preview.position = -get_grab_offset() - preview.add_child(sub_preview) - set_drag_preview(preview) - return self - - -func create_preview() -> Control: - return null - - -func activate() -> void: - _enabled = true - - -func deactivate() -> void: - _enabled = false - - -func is_active() -> bool: - return _enabled - - -func is_dragged() -> bool: - return _grabbed_dragable == self diff --git a/addons/gloot/ui/ctrl_draggable_inventory_item.gd b/addons/gloot/ui/ctrl_draggable_inventory_item.gd new file mode 100644 index 0000000..0c7b50d --- /dev/null +++ b/addons/gloot/ui/ctrl_draggable_inventory_item.gd @@ -0,0 +1,86 @@ +@tool +extends Control + +signal activated +signal clicked(at_position: Vector2, mouse_button_index: int) + +var item: InventoryItem: + set(new_item): + if item == new_item: + return + + item = new_item + if is_instance_valid(_ctrl_inventory_item): + _ctrl_inventory_item.item = item +var icon_stretch_mode: TextureRect.StretchMode = TextureRect.StretchMode.STRETCH_SCALE: + set(new_stretch_mode): + if icon_stretch_mode == new_stretch_mode: + return + icon_stretch_mode = new_stretch_mode + if is_instance_valid(_ctrl_inventory_item): + _ctrl_inventory_item.icon_stretch_mode = icon_stretch_mode +var ctrl_inventory_item_scene: PackedScene = null +var _ctrl_inventory_item: CtrlInventoryItemBase +static var _grab_offset: Vector2 + + +func _ready() -> void: + if ctrl_inventory_item_scene == null: + _ctrl_inventory_item = CtrlInventoryItem.new() + else: + _ctrl_inventory_item = ctrl_inventory_item_scene.instantiate() + _ctrl_inventory_item.name = "CtrlInventoryItemBase" + _ctrl_inventory_item.size = size + _ctrl_inventory_item.item = item + _ctrl_inventory_item.icon_stretch_mode = icon_stretch_mode + _ctrl_inventory_item.mouse_filter = Control.MOUSE_FILTER_IGNORE + + add_child(_ctrl_inventory_item) + + resized.connect(func(): + _ctrl_inventory_item.size = size + ) + + +func _get_drag_data(at_position: Vector2) -> Variant: + _grab_offset = at_position * get_global_transform().get_scale() + + var sub_preview: Control = null + sub_preview = _create_preview() + if sub_preview == null: + return null + var preview = Control.new() + sub_preview.position = -_grab_offset + preview.add_child(sub_preview) + set_drag_preview(preview) + + return item + + +static func get_grab_offset_local_to(control: Control) -> Vector2: + return _grab_offset / control.get_global_transform().get_scale() + + +func _create_preview() -> Control: + var preview: CtrlInventoryItemBase + if ctrl_inventory_item_scene == null: + preview = CtrlInventoryItem.new() + else: + preview = ctrl_inventory_item_scene.instantiate() + preview.item = item + preview.size = size + preview.icon_stretch_mode = icon_stretch_mode + return preview + + +func _gui_input(event: InputEvent) -> void: + if !(event is InputEventMouseButton): + return + + var mb_event: InputEventMouseButton = event + if !mb_event.pressed: + return + if mb_event.button_index == MOUSE_BUTTON_LEFT: + if mb_event.double_click: + activated.emit() + clicked.emit(mb_event.position, mb_event.button_index) diff --git a/addons/gloot/ui/ctrl_draggable_inventory_item.gd.uid b/addons/gloot/ui/ctrl_draggable_inventory_item.gd.uid new file mode 100644 index 0000000..c5333c9 --- /dev/null +++ b/addons/gloot/ui/ctrl_draggable_inventory_item.gd.uid @@ -0,0 +1 @@ +uid://bn6806v4hesei diff --git a/addons/gloot/ui/ctrl_drop_zone.gd b/addons/gloot/ui/ctrl_drop_zone.gd deleted file mode 100644 index ec8579a..0000000 --- a/addons/gloot/ui/ctrl_drop_zone.gd +++ /dev/null @@ -1,30 +0,0 @@ -@tool -extends Control - -signal dragable_dropped(dragable, position) - -const CtrlDragable = preload("res://addons/gloot/ui/ctrl_dragable.gd") - - -func activate() -> void: - mouse_filter = Control.MOUSE_FILTER_PASS - - -func deactivate() -> void: - mouse_filter = Control.MOUSE_FILTER_IGNORE - - -func is_active() -> bool: - return (mouse_filter != Control.MOUSE_FILTER_IGNORE) - - -func _can_drop_data(at_position: Vector2, data) -> bool: - return data is CtrlDragable - - -func _drop_data(at_position: Vector2, data) -> void: - var local_offset := CtrlDragable.get_grab_offset_local_to(self) - dragable_dropped.emit(data, at_position - local_offset) - CtrlDragable.dragable_dropped.emit(data, self, at_position - local_offset) - - diff --git a/addons/gloot/ui/ctrl_inventory.gd b/addons/gloot/ui/ctrl_inventory.gd index c306bfa..a7d6bc9 100644 --- a/addons/gloot/ui/ctrl_inventory.gd +++ b/addons/gloot/ui/ctrl_inventory.gd @@ -1,196 +1,158 @@ @tool @icon("res://addons/gloot/images/icon_ctrl_inventory.svg") class_name CtrlInventory -extends Control - -signal inventory_item_activated(item) -signal inventory_item_context_activated(item) - -enum SelectMode {SELECT_SINGLE = ItemList.SELECT_SINGLE, SELECT_MULTI = ItemList.SELECT_MULTI} - -@export var inventory_path: NodePath : - set(new_inv_path): - inventory_path = new_inv_path - var node: Node = get_node_or_null(inventory_path) - - if node == null: - return - - if is_inside_tree(): - assert(node is Inventory) - - inventory = node - update_configuration_warnings() - - -@export var default_item_icon: Texture2D -@export_enum("Single", "Multi") var select_mode: int = SelectMode.SELECT_SINGLE : - set(new_select_mode): - if select_mode == new_select_mode: - return - select_mode = new_select_mode - if is_instance_valid(_item_list): - _item_list.deselect_all(); - _item_list.select_mode = select_mode -var inventory: Inventory = null : - set(new_inventory): - if new_inventory == inventory: - return - - _disconnect_inventory_signals() - inventory = new_inventory - _connect_inventory_signals() - - _queue_refresh() -var _vbox_container: VBoxContainer -var _item_list: ItemList -var _refresh_queued: bool = false +extends ItemList +## Control node for displaying inventories. +## +## Displays inventories as an `ItemList`. +signal inventory_item_activated(item: InventoryItem) ## Emitted when an inventory item has been double-clicked. +signal inventory_item_clicked(item: InventoryItem, at_position: Vector2, mouse_button_index: int) ## Emitted when an inventory item has been clicked. +signal inventory_item_selected(item: InventoryItem) ## Emitted when an inventory item has been selected. -func _get_configuration_warnings() -> PackedStringArray: - if inventory_path.is_empty(): - return PackedStringArray([ - "This node is not linked to an inventory, so it can't display any content.\n" + \ - "Set the inventory_path property to point to an Inventory node."]) - return PackedStringArray() - +const _Utils = preload("res://addons/gloot/core/utils.gd") -func _ready(): - if Engine.is_editor_hint(): - # Clean up, in case it is duplicated in the editor - if is_instance_valid(_vbox_container): - _vbox_container.queue_free() +## Reference to the inventory that is being displayed. +@export var inventory: Inventory = null: + set(new_inventory): + if inventory == new_inventory: + return - _vbox_container = VBoxContainer.new() - _vbox_container.size_flags_horizontal = SIZE_EXPAND_FILL - _vbox_container.size_flags_vertical = SIZE_EXPAND_FILL - _vbox_container.anchor_right = 1.0 - _vbox_container.anchor_bottom = 1.0 - add_child(_vbox_container) + if new_inventory == null: + _disconnect_inventory_signals() + inventory = null + _clear() + update_configuration_warnings() + return - _item_list = ItemList.new() - _item_list.size_flags_horizontal = SIZE_EXPAND_FILL - _item_list.size_flags_vertical = SIZE_EXPAND_FILL - _item_list.item_activated.connect(_on_list_item_activated) - _item_list.item_clicked.connect(_on_list_item_clicked) - _item_list.select_mode = select_mode - _vbox_container.add_child(_item_list) + inventory = new_inventory + if inventory.is_node_ready(): + _refresh() + _connect_inventory_signals() + update_configuration_warnings() - if has_node(inventory_path): - inventory = get_node(inventory_path) - _queue_refresh() +func _get_configuration_warnings() -> PackedStringArray: + if !is_instance_valid(inventory): + return PackedStringArray([ + "This CtrlInventory node has no inventory set. Set the 'inventory' field to be able to " \ + + "display its contents."]) + return PackedStringArray() func _connect_inventory_signals() -> void: - if !is_instance_valid(inventory): - return - - if !inventory.contents_changed.is_connected(_queue_refresh): - inventory.contents_changed.connect(_queue_refresh) - if !inventory.item_property_changed.is_connected(_on_item_property_changed): - inventory.item_property_changed.connect(_on_item_property_changed) + if !inventory.is_node_ready(): + _Utils.safe_connect(inventory.ready, _refresh) + inventory.protoset_changed.connect(_refresh) + inventory.item_property_changed.connect(_on_item_property_changed) + inventory.item_added.connect(_on_item_manipulated) + inventory.item_removed.connect(_on_item_manipulated) + inventory.item_moved.connect(_on_item_manipulated) func _disconnect_inventory_signals() -> void: - if !is_instance_valid(inventory): - return + _Utils.safe_disconnect(inventory.ready, _refresh) + inventory.protoset_changed.disconnect(_refresh) + inventory.item_property_changed.disconnect(_on_item_property_changed) + inventory.item_added.disconnect(_on_item_manipulated) + inventory.item_removed.disconnect(_on_item_manipulated) + inventory.item_moved.disconnect(_on_item_manipulated) - if inventory.contents_changed.is_connected(_queue_refresh): - inventory.contents_changed.disconnect(_queue_refresh) - if inventory.item_property_changed.is_connected(_on_item_property_changed): - inventory.item_property_changed.disconnect(_on_item_property_changed) +func _on_item_property_changed(item: InventoryItem, property: String) -> void: + if property == InventoryItem._KEY_NAME || property == Inventory._KEY_STACK_SIZE: + set_item_text(inventory.get_item_index(item), _get_item_title(item)) + if property == InventoryItem._KEY_IMAGE: + set_item_icon(inventory.get_item_index(item), item.get_texture()) -func _on_list_item_activated(index: int) -> void: - inventory_item_activated.emit(_get_inventory_item(index)) +func _on_item_manipulated(item: InventoryItem) -> void: + _refresh() -func _on_list_item_clicked(index: int, at_position: Vector2, mouse_button_index: int) -> void: - if mouse_button_index == MOUSE_BUTTON_RIGHT: - inventory_item_context_activated.emit(_get_inventory_item(index)) +func _ready() -> void: + item_activated.connect(_on_list_item_activated) + item_clicked.connect(_on_list_item_clicked) + item_selected.connect(_on_list_item_selected) + _refresh() -func _on_item_property_changed(_item: InventoryItem, property_name: String) -> void: - if property_name in [InventoryItem.KEY_NAME, InventoryItem.KEY_IMAGE]: - _queue_refresh() +func _on_list_item_activated(index: int) -> void: + inventory_item_activated.emit(_get_inventory_item(index)) -func _process(_delta) -> void: - if _refresh_queued: - _refresh() - _refresh_queued = false +func _on_list_item_clicked(index: int, at_position: Vector2, mouse_button_index: int) -> void: + inventory_item_clicked.emit(_get_inventory_item(index), at_position, mouse_button_index) -func _queue_refresh() -> void: - _refresh_queued = true +func _on_list_item_selected(index: int) -> void: + inventory_item_selected.emit(_get_inventory_item(index)) -func _refresh() -> void: - if is_inside_tree(): - _clear_list() - _populate_list() +## Returns the selected inventory item. If multiple items are selected, it returns the first one. +func get_selected_inventory_item() -> InventoryItem: + if get_selected_items().is_empty(): + return null -func _clear_list() -> void: - if is_instance_valid(_item_list): - _item_list.clear() + return _get_inventory_item(get_selected_items()[0]) -func _populate_list() -> void: - if !is_instance_valid(inventory): - return +## Returns an array of selected inventory items. +func get_selected_inventory_items() -> Array[InventoryItem]: + var result: Array[InventoryItem] + var indexes = get_selected_items() + for i in indexes: + result.append(_get_inventory_item(i)) + return result - for item in inventory.get_items(): - var texture := item.get_texture() - if !texture: - texture = default_item_icon - _item_list.add_item(_get_item_title(item), texture) - _item_list.set_item_metadata(_item_list.get_item_count() - 1, item) +func _get_inventory_item(index: int) -> InventoryItem: + assert(index >= 0) + assert(index < get_item_count()) + return get_item_metadata(index) -func _get_item_title(item: InventoryItem) -> String: - if item == null: - return "" - var title = item.get_title() - var stack_size: int = InventoryStacked.get_item_stack_size(item) - if stack_size > 1: - title = "%s (x%d)" % [title, stack_size] +func _refresh() -> void: + _clear() + _populate() - return title +func _clear() -> void: + clear() -func get_selected_inventory_item() -> InventoryItem: - if _item_list.get_selected_items().is_empty(): - return null - return _get_inventory_item(_item_list.get_selected_items()[0]) +func _populate() -> void: + if inventory == null: + return + for item in inventory.get_items(): + var texture := item.get_texture() + add_item(_get_item_title(item), texture) + set_item_metadata(get_item_count() - 1, item) -func get_selected_inventory_items() -> Array[InventoryItem]: - var result: Array[InventoryItem] - var indexes = _item_list.get_selected_items() - for i in indexes: - result.append(_get_inventory_item(i)) - return result +func _get_item_title(item: InventoryItem) -> String: + if item == null: + return "" -func _get_inventory_item(index: int) -> InventoryItem: - assert(index >= 0) - assert(index < _item_list.get_item_count()) + var title = item.get_title() + var stack_size := item.get_stack_size() + if stack_size > 1: + title = "%s (x%d)" % [title, stack_size] - return _item_list.get_item_metadata(index) + return title -func deselect_inventory_item() -> void: - _item_list.deselect_all() +## Deselects all selected inventory items. +func deselect_inventory_items() -> void: + deselect_all() +## Selects the given inventory item. func select_inventory_item(item: InventoryItem) -> void: - _item_list.deselect_all() - for index in _item_list.item_count: - if _item_list.get_item_metadata(index) != item: - continue - _item_list.select(index) - return + deselect_all() + for index in item_count: + if get_item_metadata(index) != item: + continue + select(index) + return diff --git a/addons/gloot/ui/ctrl_inventory.gd.uid b/addons/gloot/ui/ctrl_inventory.gd.uid new file mode 100644 index 0000000..f7863f4 --- /dev/null +++ b/addons/gloot/ui/ctrl_inventory.gd.uid @@ -0,0 +1 @@ +uid://dkbsp26xx24nl diff --git a/addons/gloot/ui/ctrl_inventory_capacity.gd b/addons/gloot/ui/ctrl_inventory_capacity.gd new file mode 100644 index 0000000..0bbc7dc --- /dev/null +++ b/addons/gloot/ui/ctrl_inventory_capacity.gd @@ -0,0 +1,135 @@ +@tool +@icon("res://addons/gloot/images/icon_ctrl_capacity.svg") +class_name CtrlInventoryCapacity +extends Control +## Control node for displaying inventory capacity. +## +## Displays the inventory capacity as a progress bar. + +const _Utils = preload("res://addons/gloot/core/utils.gd") + +## Includes a label displaying inventory capacity if enabled. +@export var show_label = true: + set(new_show_label): + if new_show_label == show_label: + return + show_label = new_show_label + if _label != null: + _label.visible = show_label + +## Reference to an inventory with a WeightConstraint or an ItemCountConstraint. +@export var inventory: Inventory = null: + set(new_inventory): + if inventory == new_inventory: + return + + if inventory != null: + _disconnect_inventory_signals() + inventory = new_inventory + if inventory != null: + _connect_inventory_signals() + _refresh() + update_configuration_warnings() + +var _progress_bar: ProgressBar +var _label: Label + + +func _get_configuration_warnings() -> PackedStringArray: + if !is_instance_valid(inventory): + return PackedStringArray([ + "This CtrlInventoryCapacity node has no inventory set. Set the 'inventory' field to be able to " \ + + "display its capacity."]) + if inventory.get_constraint(WeightConstraint) == null && inventory.get_constraint(ItemCountConstraint) == null: + return PackedStringArray([ + "The inventory has no WeightConstraint or ItemCountConstraint child node. Add a WeightConstraint or" \ + + "an ItemCountConstraint to the inventory to be able to display its capacity."]) + return PackedStringArray() + + +func _connect_inventory_signals() -> void: + if !inventory.is_node_ready(): + _Utils.safe_connect(inventory.ready, _refresh) + inventory.protoset_changed.connect(_refresh) + inventory.constraint_changed.connect(_on_constraint_changed) + inventory.constraint_added.connect(_on_constraint_changed) + inventory.constraint_removed.connect(_on_constraint_changed) + inventory.item_added.connect(_on_item_manipulated) + inventory.item_removed.connect(_on_item_manipulated) + inventory.item_property_changed.connect(_on_item_property_changed) + + +func _disconnect_inventory_signals() -> void: + _Utils.safe_disconnect(inventory.ready, _refresh) + inventory.protoset_changed.disconnect(_refresh) + inventory.constraint_changed.disconnect(_on_constraint_changed) + inventory.constraint_added.disconnect(_on_constraint_changed) + inventory.constraint_removed.disconnect(_on_constraint_changed) + inventory.item_added.disconnect(_on_item_manipulated) + inventory.item_removed.disconnect(_on_item_manipulated) + inventory.item_property_changed.disconnect(_on_item_property_changed) + + +func _on_constraint_changed(constraint: InventoryConstraint) -> void: + if (constraint is WeightConstraint) or (constraint is ItemCountConstraint): + _refresh() + + +func _on_item_manipulated(item: InventoryItem) -> void: + _refresh() + + +func _on_item_property_changed(item: InventoryItem, property: String) -> void: + if property in [Inventory._KEY_STACK_SIZE, WeightConstraint._KEY_WEIGHT]: + _refresh() + + +func _refresh() -> void: + if !is_instance_valid(_label) || !is_instance_valid(_progress_bar): + return + + _label.text = "" + _progress_bar.min_value = 0 + _progress_bar.max_value = 1 + if inventory == null || !inventory.is_node_ready(): + return + + var weight_constraint := inventory.get_constraint(WeightConstraint) + if weight_constraint != null: + _progress_bar.max_value = weight_constraint.capacity + _label.text = "%s/%s" % [str(weight_constraint.get_occupied_space()), str(weight_constraint.capacity)] + _progress_bar.value = weight_constraint.get_occupied_space() + return + + var item_count_constraint := inventory.get_constraint(ItemCountConstraint) + if item_count_constraint != null: + _progress_bar.max_value = item_count_constraint.capacity + _label.text = "%s/%s" % [str(inventory.get_item_count()), str(item_count_constraint.capacity)] + _progress_bar.value = inventory.get_item_count() + return + + +func _ready() -> void: + _progress_bar = ProgressBar.new() + _progress_bar.show_percentage = false + add_child(_progress_bar) + + _label = Label.new() + _label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + _label.visible = show_label + add_child(_label) + + custom_minimum_size.y = _label.size.y + size.y = _label.size.y + _label.size.x = size.x + _progress_bar.size = size + _label.resized.connect(func(): + custom_minimum_size.y = _label.size.y + size.y = _label.size.y + ) + resized.connect(func(): + _progress_bar.size = size + _label.size.x = size.x + ) + + _refresh() diff --git a/addons/gloot/ui/ctrl_inventory_capacity.gd.uid b/addons/gloot/ui/ctrl_inventory_capacity.gd.uid new file mode 100644 index 0000000..6c7cbce --- /dev/null +++ b/addons/gloot/ui/ctrl_inventory_capacity.gd.uid @@ -0,0 +1 @@ +uid://7mojm1gbttyw diff --git a/addons/gloot/ui/ctrl_inventory_grid.gd b/addons/gloot/ui/ctrl_inventory_grid.gd index 09e6372..eade4c3 100644 --- a/addons/gloot/ui/ctrl_inventory_grid.gd +++ b/addons/gloot/ui/ctrl_inventory_grid.gd @@ -2,292 +2,517 @@ @icon("res://addons/gloot/images/icon_ctrl_inventory_grid.svg") class_name CtrlInventoryGrid extends Control - -signal item_dropped(item, offset) -signal selection_changed -signal inventory_item_activated(item) -signal inventory_item_context_activated(item) -signal item_mouse_entered(item) -signal item_mouse_exited(item) - -const CtrlInventoryGridBasic = preload("res://addons/gloot/ui/ctrl_inventory_grid_basic.gd") - -class GridControl extends Control: - var color: Color = Color.BLACK : - set(new_color): - if new_color == color: - return - color = new_color - queue_redraw() - var dimensions: Vector2i = Vector2i.ZERO : - set(new_dimensions): - if new_dimensions == dimensions: - return - dimensions = new_dimensions - queue_redraw() - - func _init(color_: Color, dimensions_: Vector2i) -> void: - color = color_ - dimensions = dimensions_ - - func _draw() -> void: - var rect = Rect2(Vector2.ZERO, size) - draw_rect(rect, color, false) - - if dimensions.x < 1 || dimensions.y < 1: - return - - for i in range(1, dimensions.x): - var from: Vector2 = Vector2(i * size.x / dimensions.x, 0) - var to: Vector2 = Vector2(i * size.x / dimensions.x, size.y) - draw_line(from, to, color) - for j in range(1, dimensions.y): - var from: Vector2 = Vector2(0, j * size.y / dimensions.y) - var to: Vector2 = Vector2(size.x, j * size.y / dimensions.y) - draw_line(from, to, color) - - -@export var inventory_path: NodePath : - set(new_inv_path): - if new_inv_path == inventory_path: - return - inventory_path = new_inv_path - var node: Node = get_node_or_null(inventory_path) - - if node == null: - return - - if is_inside_tree(): - assert(node is InventoryGrid) - - inventory = node - update_configuration_warnings() -@export var default_item_texture: Texture2D : - set(new_default_item_texture): - if is_instance_valid(_ctrl_inventory_grid_basic): - _ctrl_inventory_grid_basic.default_item_texture = new_default_item_texture - default_item_texture = new_default_item_texture -@export var stretch_item_sprites: bool = true : - set(new_stretch_item_sprites): - if is_instance_valid(_ctrl_inventory_grid_basic): - _ctrl_inventory_grid_basic.stretch_item_sprites = new_stretch_item_sprites - stretch_item_sprites = new_stretch_item_sprites -@export var field_dimensions: Vector2 = Vector2(32, 32) : - set(new_field_dimensions): - if is_instance_valid(_ctrl_inventory_grid_basic): - _ctrl_inventory_grid_basic.field_dimensions = new_field_dimensions - field_dimensions = new_field_dimensions -@export var item_spacing: int = 0 : - set(new_item_spacing): - if is_instance_valid(_ctrl_inventory_grid_basic): - _ctrl_inventory_grid_basic.item_spacing = new_item_spacing - item_spacing = new_item_spacing -@export var draw_grid: bool = true : - set(new_draw_grid): - if new_draw_grid == draw_grid: - return - draw_grid = new_draw_grid - _queue_refresh() -@export var grid_color: Color = Color.BLACK : - set(new_grid_color): - if(new_grid_color == grid_color): - return - grid_color = new_grid_color - _queue_refresh() -@export var draw_selections: bool = false : - set(new_draw_selections): - if new_draw_selections == draw_selections: - return - draw_selections = new_draw_selections - _queue_refresh() -@export var selection_color: Color = Color.GRAY : - set(new_selection_color): - if(new_selection_color == selection_color): - return - selection_color = new_selection_color - _queue_refresh() -@export_enum("Single", "Multi") var select_mode: int = CtrlInventoryGridBasic.SelectMode.SELECT_SINGLE : - set(new_select_mode): - if select_mode == new_select_mode: - return - select_mode = new_select_mode - if is_instance_valid(_ctrl_inventory_grid_basic): - _ctrl_inventory_grid_basic.select_mode = select_mode - -var inventory: InventoryGrid = null : - set(new_inventory): - if inventory == new_inventory: - return - - _disconnect_inventory_signals() - inventory = new_inventory - _connect_inventory_signals() - - if is_instance_valid(_ctrl_inventory_grid_basic): - _ctrl_inventory_grid_basic.inventory = inventory - _queue_refresh() - -var _ctrl_grid: GridControl = null -var _ctrl_selection: Control = null -var _ctrl_inventory_grid_basic: CtrlInventoryGridBasic = null +## Control node for displaying inventories with a GridConstraint. +## +## Displays the inventory contents on a 2D grid. The grid style, size and item icons are customizable. + +signal item_dropped(item: InventoryItem, offset: Vector2) ## Emitted when an item has been dropped onto the 2D grid. +signal selection_changed ## Emitted when the item selection has changed. +signal inventory_item_activated(item: InventoryItem) ## Emitted when an inventory item has been double-clicked. +signal inventory_item_clicked(item: InventoryItem) ## Emitted when an inventory item has been right-clicked. +signal inventory_item_selected(item: InventoryItem) ## Emitted when an inventory item has been selected. +signal item_mouse_entered(item: InventoryItem) ## Emitted when the mouse cursor has entered the visible area of an item. +signal item_mouse_exited(item: InventoryItem) ## Emitted when the mouse cursor has exited the visible area of an item. + +const _Verify = preload("res://addons/gloot/core/verify.gd") +const _CtrlInventoryGridBasic = preload("res://addons/gloot/ui/ctrl_inventory_grid_basic.gd") +const _CtrlDraggableInventoryItem = preload("res://addons/gloot/ui/ctrl_draggable_inventory_item.gd") +const _Utils = preload("res://addons/gloot/core/utils.gd") + + +class PriorityPanel extends Panel: + enum StylePriority {HIGH = 0, MEDIUM = 1, LOW = 2} + + var regular_style: StyleBox + var hover_style: StyleBox + var _styles: Array[StyleBox] = [null, null, null] + + + func _init(regular_style_: StyleBox = null, hover_style_: StyleBox = null) -> void: + regular_style = regular_style_ + hover_style = hover_style_ + + + func _ready() -> void: + set_style(regular_style) + mouse_entered.connect(func(): + set_style(hover_style) + ) + mouse_exited.connect(func(): + set_style(regular_style) + ) + + + func set_style(style: StyleBox, priority: int = StylePriority.LOW) -> void: + if priority > 2 || priority < 0: + return + if _styles[priority] == style: + return + + _styles[priority] = style + + for i in range(0, 3): + if _styles[i] != null: + _set_panel_style(_styles[i]) + return + + + func _set_panel_style(style: StyleBox) -> void: + remove_theme_stylebox_override("panel") + if style != null: + add_theme_stylebox_override("panel", style) + + +class CustomizablePanel extends Panel: + func set_style(style: StyleBox) -> void: + remove_theme_stylebox_override("panel") + if style != null: + add_theme_stylebox_override("panel", style) + +## Reference to an inventory with a GridConstraint that is being displayed. +@export var inventory: Inventory = null: + set(new_inventory): + if inventory == new_inventory: + return + + _disconnect_inventory_signals() + inventory = new_inventory + _connect_inventory_signals() + + if is_instance_valid(_ctrl_inventory_grid_basic): + _ctrl_inventory_grid_basic.inventory = inventory + _queue_refresh() + update_configuration_warnings() +## If enabled, stretches the icons based on `field_dimensions`. +@export var stretch_item_icons: bool = true: + set(new_stretch_item_icons): + if is_instance_valid(_ctrl_inventory_grid_basic): + _ctrl_inventory_grid_basic.stretch_item_icons = new_stretch_item_icons + stretch_item_icons = new_stretch_item_icons +## Size of individual fields in the grid. +@export var field_dimensions: Vector2 = Vector2(32, 32): + set(new_field_dimensions): + if is_instance_valid(_ctrl_inventory_grid_basic): + _ctrl_inventory_grid_basic.field_dimensions = new_field_dimensions + field_dimensions = new_field_dimensions + _queue_refresh() +## Spacing between grid fields. +@export var item_spacing: int = 0: + set(new_item_spacing): + if is_instance_valid(_ctrl_inventory_grid_basic): + _ctrl_inventory_grid_basic.item_spacing = new_item_spacing + item_spacing = new_item_spacing + _queue_refresh() +## Item selection mode. Set to SelectMode.SELECT_MULTI to enable selecting multiple items by holding down CTRL. See the +## `ItemList.SelectMode` constants for details. +@export_enum("Single", "Multi") var select_mode: int = ItemList.SelectMode.SELECT_SINGLE: + set(new_select_mode): + if select_mode == new_select_mode: + return + select_mode = new_select_mode + if is_instance_valid(_ctrl_inventory_grid_basic): + _ctrl_inventory_grid_basic.select_mode = select_mode +## Custom control scene representing an `InventoryItem` (must inherit `CtrlInventoryItemBase`). If set to `null`, +## `CtrlInventoryItem` will be used to represent the item. +@export var custom_item_control_scene: PackedScene = null: + set(new_custom_item_control_scene): + if new_custom_item_control_scene == custom_item_control_scene: + return + if !_valid_custom_item_control_scene(new_custom_item_control_scene): + push_error("Invalid scene! Make sure the custom item control scene inherits from CtrlInventoryItemBase!") + return + custom_item_control_scene = new_custom_item_control_scene + if is_instance_valid(_ctrl_inventory_grid_basic): + _ctrl_inventory_grid_basic.custom_item_control_scene = custom_item_control_scene + +@export_group("Custom Styles") +## The default grid field background style. Unlike `background_style`, this style is used when displaying each +## individual field in the 2D grid. +@export var field_style: StyleBox = null: + set(new_field_style): + field_style = new_field_style + _queue_refresh() +## The grid field style used when hovering over it with the mouse. +@export var field_highlighted_style: StyleBox: + set(new_field_highlighted_style): + field_highlighted_style = new_field_highlighted_style + _queue_refresh() +## The grid field style used for selected items. Unlike `selection_style`, this style is used as field background behind +## selected items. +@export var field_selected_style: StyleBox: + set(new_field_selected_style): + field_selected_style = new_field_selected_style + _queue_refresh() +## The style used for displaying item selections. Unlike `field_selected_style`, this style is used when displaying +## rectangles over the selected items. +@export var selection_style: StyleBox = null: + set(new_selection_style): + selection_style = new_selection_style + _queue_refresh() +## The style used for the inventory background. Unlike `field_style`, this style is used when displaying a rectangle +## behind the 2D grid. +@export var background_style: StyleBox = null: + set(new_background_style): + background_style = new_background_style + _queue_refresh() + +var _ctrl_inventory_grid_basic: _CtrlInventoryGridBasic = null +var _field_background_grid: Control = null +var _field_backgrounds: Array = [] +var _selection_panels: Control = null var _refresh_queued: bool = false +var _background: CustomizablePanel = null + + +func _valid_custom_item_control_scene(scene: PackedScene) -> bool: + if scene == null: + return true + if !scene.can_instantiate(): + return false + var temp_instance := scene.instantiate() + if !temp_instance is CtrlInventoryItemBase: + temp_instance.free() + return false + temp_instance.free() + return true + + +func _get_field_style() -> StyleBox: + if field_style: + return field_style + return preload("res://addons/gloot/ui/ctrl_inventory_grid_field_style_normal.tres") + + +func _get_selection_style() -> StyleBox: + if selection_style: + return selection_style + return preload("res://addons/gloot/ui/ctrl_inventory_grid_style_selection.tres") + + +func _get_background_style() -> StyleBox: + if background_style: + return background_style + return preload("res://addons/gloot/ui/ctrl_inventory_grid_style_background.tres") + + +func _get_field_highlighted_style() -> StyleBox: + return field_highlighted_style + + +func _get_field_selected_style() -> StyleBox: + return field_selected_style + + +func _get_configuration_warnings() -> PackedStringArray: + if !is_instance_valid(inventory): + return PackedStringArray([ + "This CtrlInventoryGrid node has no inventory set. Set the 'inventory' field to be able to " \ + + "display its contents."]) + if inventory.get_constraint(GridConstraint) == null: + return PackedStringArray([ + "The inventory has no GridConstraint child node. Add a GridConstraint to the inventory to be able" \ + + " to display its contents on a grid."]) + return PackedStringArray() func _connect_inventory_signals() -> void: - if !is_instance_valid(inventory): - return - if !inventory.contents_changed.is_connected(_queue_refresh): - inventory.contents_changed.connect(_queue_refresh) - if !inventory.size_changed.is_connected(_on_inventory_resized): - inventory.size_changed.connect(_on_inventory_resized) + if !is_instance_valid(inventory): + return + inventory.constraint_changed.connect(_on_constraint_changed) + inventory.constraint_added.connect(_on_constraint_changed) + inventory.constraint_removed.connect(_on_constraint_changed) + inventory.item_property_changed.connect(_on_item_property_changed) + inventory.item_added.connect(_on_item_manipulated) + inventory.item_removed.connect(_on_item_manipulated) func _disconnect_inventory_signals() -> void: - if !is_instance_valid(inventory): - return - if inventory.contents_changed.is_connected(_queue_refresh): - inventory.contents_changed.disconnect(_queue_refresh) - if inventory.size_changed.is_connected(_on_inventory_resized): - inventory.size_changed.disconnect(_on_inventory_resized) + if !is_instance_valid(inventory): + return + inventory.constraint_changed.disconnect(_on_constraint_changed) + inventory.constraint_added.disconnect(_on_constraint_changed) + inventory.constraint_removed.disconnect(_on_constraint_changed) + inventory.item_property_changed.disconnect(_on_item_property_changed) + inventory.item_added.disconnect(_on_item_manipulated) + inventory.item_removed.disconnect(_on_item_manipulated) -func _on_inventory_resized() -> void: - _queue_refresh() +func _on_constraint_changed(constraint: InventoryConstraint) -> void: + if constraint is GridConstraint: + _queue_refresh() -func _get_configuration_warnings() -> PackedStringArray: - if inventory_path.is_empty(): - return PackedStringArray([ - "This node is not linked to an inventory and can't display any content.\n" + \ - "Set the inventory_path property to point to an InventoryGrid node."]) - return PackedStringArray() +func _on_item_property_changed(item: InventoryItem, property: String) -> void: + var relevant_properties := [ + GridConstraint._KEY_SIZE, + GridConstraint._KEY_ROTATED, + ] + if property in relevant_properties: + _queue_refresh() -func _ready() -> void: - if Engine.is_editor_hint(): - # Clean up, in case it is duplicated in the editor - if is_instance_valid(_ctrl_inventory_grid_basic): - _ctrl_inventory_grid_basic.queue_free() - _ctrl_grid.queue_free() - _ctrl_selection.queue_free() - - if has_node(inventory_path): - inventory = get_node_or_null(inventory_path) - - _ctrl_inventory_grid_basic = CtrlInventoryGridBasic.new() - _ctrl_inventory_grid_basic.inventory = inventory - _ctrl_inventory_grid_basic.field_dimensions = field_dimensions - _ctrl_inventory_grid_basic.item_spacing = item_spacing - _ctrl_inventory_grid_basic.default_item_texture = default_item_texture - _ctrl_inventory_grid_basic.stretch_item_sprites = stretch_item_sprites - _ctrl_inventory_grid_basic.name = "CtrlInventoryGridBasic" - _ctrl_inventory_grid_basic.resized.connect(_update_size) - _ctrl_inventory_grid_basic.select_mode = select_mode - - _ctrl_inventory_grid_basic.item_dropped.connect(func(item: InventoryItem, drop_position: Vector2): - item_dropped.emit(item, drop_position) - ) - _ctrl_inventory_grid_basic.selection_changed.connect(func(): - _queue_refresh() - selection_changed.emit() - ) - _ctrl_inventory_grid_basic.inventory_item_activated.connect(func(item: InventoryItem): - inventory_item_activated.emit(item) - ) - _ctrl_inventory_grid_basic.inventory_item_context_activated.connect(func(item: InventoryItem): - inventory_item_context_activated.emit(item) - ) - _ctrl_inventory_grid_basic.item_mouse_entered.connect(func(item: InventoryItem): item_mouse_entered.emit(item)) - _ctrl_inventory_grid_basic.item_mouse_exited.connect(func(item: InventoryItem): item_mouse_exited.emit(item)) - - _ctrl_grid = GridControl.new(grid_color, _get_inventory_dimensions()) - _ctrl_grid.color = grid_color - _ctrl_grid.dimensions = _get_inventory_dimensions() - _ctrl_grid.name = "CtrlGrid" - - _ctrl_selection = Control.new() - _ctrl_selection.visible = draw_selections - - add_child(_ctrl_grid) - add_child(_ctrl_selection) - add_child(_ctrl_inventory_grid_basic) - - _update_size() - _queue_refresh() +func _on_item_manipulated(item: InventoryItem) -> void: + _queue_refresh() func _process(_delta) -> void: - if _refresh_queued: - _refresh() - _refresh_queued = false + if _refresh_queued: + _refresh() + _refresh_queued = false func _refresh() -> void: - if is_instance_valid(_ctrl_grid): - _ctrl_grid.dimensions = _get_inventory_dimensions() - _ctrl_grid.color = grid_color - _ctrl_grid.visible = draw_grid - else: - _ctrl_grid.hide() - - if is_instance_valid(_ctrl_selection) && is_instance_valid(_ctrl_inventory_grid_basic): - for child in _ctrl_selection.get_children(): - child.queue_free() - for selected_inventory_item in _ctrl_inventory_grid_basic.get_selected_inventory_items(): - var rect := _ctrl_inventory_grid_basic.get_item_rect(selected_inventory_item) - var selection_rect := ColorRect.new() - selection_rect.color = selection_color - selection_rect.position = rect.position - selection_rect.size = rect.size - _ctrl_selection.add_child(selection_rect) - _ctrl_selection.visible = draw_selections + _refresh_field_background_grid() + _refresh_selection_panel() func _queue_refresh() -> void: - _refresh_queued = true + _refresh_queued = true + + +func _refresh_selection_panel() -> void: + if !is_instance_valid(_ctrl_inventory_grid_basic): + return + if !is_instance_valid(_selection_panels): + return + + for child in _selection_panels.get_children(): + child.queue_free() + + var selected_items := _ctrl_inventory_grid_basic.get_selected_inventory_items() + _selection_panels.visible = (!selected_items.is_empty()) && (_get_selection_style() != null) + if selected_items.is_empty(): + return + + for selected_item in selected_items: + var selection_panel := CustomizablePanel.new() + var rect := _ctrl_inventory_grid_basic.get_item_rect(selected_item) + selection_panel.position = rect.position + selection_panel.size = rect.size + selection_panel.set_style(_get_selection_style()) + selection_panel.mouse_filter = Control.MOUSE_FILTER_IGNORE + _selection_panels.add_child(selection_panel) + + +func _refresh_field_background_grid() -> void: + if !is_instance_valid(_ctrl_inventory_grid_basic): + return + if is_instance_valid(_field_background_grid): + while _field_background_grid.get_child_count() > 0: + _field_background_grid.get_children()[0].queue_free() + _field_background_grid.remove_child(_field_background_grid.get_children()[0]) + _field_backgrounds = [] + + if !is_instance_valid(inventory): + return + var grid_constraint: GridConstraint = inventory.get_constraint(GridConstraint) + if grid_constraint == null: + return + + var inv_size := grid_constraint.size + for i in range(inv_size.x): + _field_backgrounds.append([]) + for j in range(inv_size.y): + var field_panel: PriorityPanel = PriorityPanel.new(_get_field_style(), _get_field_highlighted_style()) + field_panel.size = field_dimensions + field_panel.position = _ctrl_inventory_grid_basic._get_field_position(Vector2i(i, j)) + _field_background_grid.add_child(field_panel) + _field_backgrounds[i].append(field_panel) -func _get_inventory_dimensions() -> Vector2i: - var inventory_grid = _get_inventory() - if !is_instance_valid(inventory_grid): - return Vector2i.ZERO - return _ctrl_inventory_grid_basic.inventory.size +func _ready() -> void: + _background = CustomizablePanel.new() + _background.name = "Background" + _background.set_style(_get_background_style()) + add_child(_background) + + _field_background_grid = Control.new() + _field_background_grid.name = "FieldBackgrounds" + add_child(_field_background_grid) + + _ctrl_inventory_grid_basic = _CtrlInventoryGridBasic.new() + _ctrl_inventory_grid_basic.custom_item_control_scene = custom_item_control_scene + _ctrl_inventory_grid_basic.inventory = inventory + _ctrl_inventory_grid_basic.field_dimensions = field_dimensions + _ctrl_inventory_grid_basic.item_spacing = item_spacing + _ctrl_inventory_grid_basic.stretch_item_icons = stretch_item_icons + _ctrl_inventory_grid_basic.name = "_CtrlInventoryGridBasic" + _ctrl_inventory_grid_basic.resized.connect(_update_size) + _ctrl_inventory_grid_basic.item_dropped.connect(func(item: InventoryItem, drop_position: Vector2): + item_dropped.emit(item, drop_position) + ) + _ctrl_inventory_grid_basic.inventory_item_activated.connect(func(item: InventoryItem): + inventory_item_activated.emit(item) + ) + _ctrl_inventory_grid_basic.inventory_item_clicked.connect(func(item: InventoryItem, at_position: Vector2, mouse_button_index: int): + inventory_item_clicked.emit(item, at_position, mouse_button_index) + ) + _ctrl_inventory_grid_basic.inventory_item_selected.connect(func(item: InventoryItem): + inventory_item_selected.emit(item) + ) + _ctrl_inventory_grid_basic.item_mouse_entered.connect(_on_item_mouse_entered) + _ctrl_inventory_grid_basic.item_mouse_exited.connect(_on_item_mouse_exited) + _ctrl_inventory_grid_basic.selection_changed.connect(_on_selection_changed) + _ctrl_inventory_grid_basic.select_mode = select_mode + _ctrl_inventory_grid_basic.mouse_filter = Control.MOUSE_FILTER_IGNORE + add_child(_ctrl_inventory_grid_basic) + + _selection_panels = Control.new() + _selection_panels.mouse_filter = Control.MOUSE_FILTER_IGNORE + _selection_panels.name = "SelectionPanels" + add_child(_selection_panels) + + _update_size() + _queue_refresh() + + +func _notification(what: int) -> void: + if what == NOTIFICATION_DRAG_BEGIN: + _ctrl_inventory_grid_basic.mouse_filter = Control.MOUSE_FILTER_PASS + if what == NOTIFICATION_DRAG_END: + _ctrl_inventory_grid_basic.mouse_filter = Control.MOUSE_FILTER_IGNORE + _fill_background(_get_field_style(), PriorityPanel.StylePriority.LOW) func _update_size() -> void: - custom_minimum_size = _ctrl_inventory_grid_basic.size - size = _ctrl_inventory_grid_basic.size - _ctrl_grid.custom_minimum_size = _ctrl_inventory_grid_basic.size - _ctrl_grid.size = _ctrl_inventory_grid_basic.size + custom_minimum_size = _ctrl_inventory_grid_basic.size + size = _ctrl_inventory_grid_basic.size + _background.size = _ctrl_inventory_grid_basic.size + + +func _on_item_mouse_entered(item: InventoryItem) -> void: + _set_item_background(item, _get_field_highlighted_style(), PriorityPanel.StylePriority.MEDIUM) + item_mouse_entered.emit(item) + + +func _on_item_mouse_exited(item: InventoryItem) -> void: + _set_item_background(item, null, PriorityPanel.StylePriority.MEDIUM) + item_mouse_exited.emit(item) + + +func _on_selection_changed() -> void: + _handle_selection_change() + selection_changed.emit() + + +func _handle_selection_change() -> void: + if !is_instance_valid(inventory): + return + _refresh_selection_panel() + + if !_get_field_selected_style(): + return + for item in inventory.get_items(): + if item in _ctrl_inventory_grid_basic.get_selected_inventory_items(): + _set_item_background(item, _get_field_selected_style(), PriorityPanel.StylePriority.HIGH) + else: + _set_item_background(item, null, PriorityPanel.StylePriority.HIGH) + + +func _on_inventory_resized() -> void: + _refresh_field_background_grid() + + +func _input(event) -> void: + if !(event is InputEventMouseMotion): + return + if !is_instance_valid(inventory): + return + + if !_get_field_highlighted_style(): + return + _highlight_grabbed_item(_get_field_highlighted_style()) + + +func _highlight_grabbed_item(style: StyleBox): + var grid_constraint: GridConstraint = inventory.get_constraint(GridConstraint) + if grid_constraint == null: + return + var grabbed_item: InventoryItem = _get_global_grabbed_item() + if !grabbed_item: + return + + var global_grabbed_item_pos: Vector2 = _get_global_grabbed_item_local_pos() + if !_is_hovering(global_grabbed_item_pos): + _fill_background(_get_field_style(), PriorityPanel.StylePriority.LOW) + return + + _fill_background(_get_field_style(), PriorityPanel.StylePriority.LOW) + + var grabbed_item_coords := _ctrl_inventory_grid_basic.get_field_coords(global_grabbed_item_pos + (field_dimensions / 2)) + var item_size := grid_constraint.get_item_size(grabbed_item) + var rect := Rect2i(grabbed_item_coords, item_size) + if !Rect2i(Vector2i.ZERO, grid_constraint.size).encloses(rect): + return + _set_rect_background(rect, style, PriorityPanel.StylePriority.LOW) + + +func _is_hovering(local_pos: Vector2) -> bool: + return get_rect().has_point(local_pos) + + +func _set_item_background(item: InventoryItem, style: StyleBox, priority: int) -> bool: + var grid_constraint: GridConstraint = inventory.get_constraint(GridConstraint) + if !item || grid_constraint == null: + return false + + _set_rect_background(grid_constraint.get_item_rect(item), style, priority) + return true + + +func _set_rect_background(rect: Rect2i, style: StyleBox, priority: int) -> void: + var grid_constraint: GridConstraint = inventory.get_constraint(GridConstraint) + var inv_size = grid_constraint.size + var h_range = min(rect.size.x + rect.position.x, inv_size.x) + for i in range(rect.position.x, h_range): + var v_range = min(rect.size.y + rect.position.y, inv_size.y) + for j in range(rect.position.y, v_range): + _field_backgrounds[i][j].set_style(style, priority) + + +func _fill_background(style: StyleBox, priority: int) -> void: + for panel in _field_background_grid.get_children(): + panel.set_style(style, priority) + + +func _get_global_grabbed_item() -> InventoryItem: + var drag_data := get_viewport().gui_get_drag_data() + if !is_instance_valid(drag_data): + return null + if !(drag_data is InventoryItem): + return null + return drag_data as InventoryItem -func _get_inventory() -> InventoryGrid: - if !is_instance_valid(_ctrl_inventory_grid_basic): - return null - if !is_instance_valid(_ctrl_inventory_grid_basic.inventory): - return null - return _ctrl_inventory_grid_basic.inventory +func _get_global_grabbed_item_local_pos() -> Vector2: + if _get_global_grabbed_item() != null: + return get_local_mouse_position() - _CtrlDraggableInventoryItem.get_grab_offset_local_to(self) + return Vector2(-1, -1) -func deselect_inventory_item() -> void: - if !is_instance_valid(_ctrl_inventory_grid_basic): - return - _ctrl_inventory_grid_basic.deselect_inventory_item() +## Deselects all selected inventory items. +func deselect_inventory_items() -> void: + if !is_instance_valid(_ctrl_inventory_grid_basic): + return + _ctrl_inventory_grid_basic.deselect_inventory_items() +## Selects the given inventory item. func select_inventory_item(item: InventoryItem) -> void: - if !is_instance_valid(_ctrl_inventory_grid_basic): - return - _ctrl_inventory_grid_basic.select_inventory_item(item) + if !is_instance_valid(_ctrl_inventory_grid_basic): + return + _ctrl_inventory_grid_basic.select_inventory_item(item) +## Returns the selected inventory item. If multiple items are selected, it returns the first one. func get_selected_inventory_item() -> InventoryItem: - if !is_instance_valid(_ctrl_inventory_grid_basic): - return null - return _ctrl_inventory_grid_basic.get_selected_inventory_item() + if !is_instance_valid(_ctrl_inventory_grid_basic): + return null + return _ctrl_inventory_grid_basic.get_selected_inventory_item() +## Returns an array of selected inventory items. func get_selected_inventory_items() -> Array[InventoryItem]: - if !is_instance_valid(_ctrl_inventory_grid_basic): - return [] - return _ctrl_inventory_grid_basic.get_selected_inventory_items() + if !is_instance_valid(_ctrl_inventory_grid_basic): + return [] + return _ctrl_inventory_grid_basic.get_selected_inventory_items() diff --git a/addons/gloot/ui/ctrl_inventory_grid.gd.uid b/addons/gloot/ui/ctrl_inventory_grid.gd.uid new file mode 100644 index 0000000..d2ad2c8 --- /dev/null +++ b/addons/gloot/ui/ctrl_inventory_grid.gd.uid @@ -0,0 +1 @@ +uid://bd75talwyq73v diff --git a/addons/gloot/ui/ctrl_inventory_grid_basic.gd b/addons/gloot/ui/ctrl_inventory_grid_basic.gd index 3e6af5c..c3fec1a 100644 --- a/addons/gloot/ui/ctrl_inventory_grid_basic.gd +++ b/addons/gloot/ui/ctrl_inventory_grid_basic.gd @@ -1,165 +1,108 @@ @tool extends Control -signal item_dropped(item, offset) +signal item_dropped(item: InventoryItem, offset: Vector2) signal selection_changed -signal inventory_item_activated(item) -signal inventory_item_context_activated(item) -signal item_mouse_entered(item) -signal item_mouse_exited(item) +signal inventory_item_activated(item: InventoryItem) +signal inventory_item_clicked(item: InventoryItem) +signal inventory_item_selected(item: InventoryItem) +signal item_mouse_entered(item: InventoryItem) +signal item_mouse_exited(item: InventoryItem) + +const _Undoables = preload("res://addons/gloot/editor/undoables.gd") +const _CtrlDraggableInventoryItem = preload("res://addons/gloot/ui/ctrl_draggable_inventory_item.gd") +const _Utils = preload("res://addons/gloot/core/utils.gd") +const _StackManager = preload("res://addons/gloot/core/stack_manager.gd") + +@export var inventory: Inventory = null: + set(new_inventory): + if inventory == new_inventory: + return -const GlootUndoRedo = preload("res://addons/gloot/editor/gloot_undo_redo.gd") -const CtrlInventoryItemRect = preload("res://addons/gloot/ui/ctrl_inventory_item_rect.gd") -const CtrlDropZone = preload("res://addons/gloot/ui/ctrl_drop_zone.gd") -const CtrlDragable = preload("res://addons/gloot/ui/ctrl_dragable.gd") -const GridConstraint = preload("res://addons/gloot/core/constraints/grid_constraint.gd") + _clear_selection() -enum SelectMode {SELECT_SINGLE = 0, SELECT_MULTI = 1} + _disconnect_inventory_signals() + inventory = new_inventory + _connect_inventory_signals() -@export var field_dimensions: Vector2 = Vector2(32, 32) : + _queue_refresh() +@export var field_dimensions: Vector2 = Vector2(32, 32): set(new_field_dimensions): if new_field_dimensions == field_dimensions: return field_dimensions = new_field_dimensions _queue_refresh() -@export var item_spacing: int = 0 : +@export var item_spacing: int = 0: set(new_item_spacing): if new_item_spacing == item_spacing: return item_spacing = new_item_spacing _queue_refresh() -@export var inventory_path: NodePath : - set(new_inv_path): - if new_inv_path == inventory_path: - return - inventory_path = new_inv_path - var node: Node = get_node_or_null(inventory_path) - - if node == null: - return - - if is_inside_tree(): - assert(node is InventoryGrid) - - inventory = node - update_configuration_warnings() -@export var default_item_texture: Texture2D : - set(new_default_item_texture): - if new_default_item_texture == default_item_texture: - return - default_item_texture = new_default_item_texture - _queue_refresh() -@export var stretch_item_sprites: bool = true : - set(new_stretch_item_sprites): - stretch_item_sprites = new_stretch_item_sprites +@export var stretch_item_icons: bool = true: + set(new_stretch_item_icons): + stretch_item_icons = new_stretch_item_icons _queue_refresh() -@export_enum("Single", "Multi") var select_mode: int = SelectMode.SELECT_SINGLE : +@export_enum("Single", "Multi") var select_mode: int = ItemList.SelectMode.SELECT_SINGLE: set(new_select_mode): if select_mode == new_select_mode: return select_mode = new_select_mode _clear_selection() -var inventory: InventoryGrid = null : - set(new_inventory): - if inventory == new_inventory: +@export var custom_item_control_scene: PackedScene = null: + set(new_custom_item_control_scene): + if new_custom_item_control_scene == custom_item_control_scene: return - - _clear_selection() - - _disconnect_inventory_signals() - inventory = new_inventory - _connect_inventory_signals() - + custom_item_control_scene = new_custom_item_control_scene _queue_refresh() + var _ctrl_item_container: Control = null -var _ctrl_drop_zone: CtrlDropZone = null var _selected_items: Array[InventoryItem] = [] var _refresh_queued: bool = false -func _get_configuration_warnings() -> PackedStringArray: - if inventory_path.is_empty(): - return PackedStringArray([ - "This node is not linked to an inventory and it can't display any content.\n" + \ - "Set the inventory_path property to point to an InventoryGrid node."]) - return PackedStringArray() - - func _ready() -> void: - if Engine.is_editor_hint(): - # Clean up, in case it is duplicated in the editor - if is_instance_valid(_ctrl_item_container): - _ctrl_item_container.queue_free() - - mouse_filter = Control.MOUSE_FILTER_IGNORE - _ctrl_item_container = Control.new() _ctrl_item_container.size = size _ctrl_item_container.mouse_filter = Control.MOUSE_FILTER_IGNORE resized.connect(func(): _ctrl_item_container.size = size) add_child(_ctrl_item_container) - _ctrl_drop_zone = CtrlDropZone.new() - _ctrl_drop_zone.dragable_dropped.connect(_on_dragable_dropped) - _ctrl_drop_zone.size = size - resized.connect(func(): _ctrl_drop_zone.size = size) - CtrlDragable.dragable_grabbed.connect(func(dragable: CtrlDragable, grab_position: Vector2): - _ctrl_drop_zone.activate() - ) - CtrlDragable.dragable_dropped.connect(func(dragable: CtrlDragable, zone: CtrlDropZone, drop_position: Vector2): - _ctrl_drop_zone.deactivate() - ) - add_child(_ctrl_drop_zone) - - if has_node(inventory_path): - inventory = get_node_or_null(inventory_path) - _queue_refresh() -func _notification(what: int) -> void: - if what == NOTIFICATION_DRAG_END: - _ctrl_drop_zone.deactivate() - - func _connect_inventory_signals() -> void: if !is_instance_valid(inventory): return - if !inventory.contents_changed.is_connected(_queue_refresh): - inventory.contents_changed.connect(_queue_refresh) - if !inventory.item_property_changed.is_connected(_on_item_property_changed): - inventory.item_property_changed.connect(_on_item_property_changed) - if !inventory.size_changed.is_connected(_on_inventory_resized): - inventory.size_changed.connect(_on_inventory_resized) - if !inventory.item_removed.is_connected(_on_item_removed): - inventory.item_removed.connect(_on_item_removed) + _Utils.safe_connect(inventory.item_property_changed, _on_item_property_changed) + _Utils.safe_connect(inventory.constraint_changed, _on_constraint_changed) + _Utils.safe_connect(inventory.item_added, _on_item_added) + _Utils.safe_connect(inventory.item_removed, _on_item_removed) func _disconnect_inventory_signals() -> void: if !is_instance_valid(inventory): return - if inventory.contents_changed.is_connected(_queue_refresh): - inventory.contents_changed.disconnect(_queue_refresh) - if inventory.item_property_changed.is_connected(_on_item_property_changed): - inventory.item_property_changed.disconnect(_on_item_property_changed) - if inventory.size_changed.is_connected(_on_inventory_resized): - inventory.size_changed.disconnect(_on_inventory_resized) - if inventory.item_removed.is_connected(_on_item_removed): - inventory.item_removed.disconnect(_on_item_removed) - - -func _on_item_property_changed(_item: InventoryItem, property_name: String) -> void: - var relevant_properties = [ - GridConstraint.KEY_WIDTH, - GridConstraint.KEY_HEIGHT, - GridConstraint.KEY_SIZE, - GridConstraint.KEY_ROTATED, - GridConstraint.KEY_GRID_POSITION, - InventoryItem.KEY_IMAGE, + _Utils.safe_disconnect(inventory.item_property_changed, _on_item_property_changed) + _Utils.safe_disconnect(inventory.constraint_changed, _on_constraint_changed) + _Utils.safe_disconnect(inventory.item_added, _on_item_added) + _Utils.safe_disconnect(inventory.item_removed, _on_item_removed) + + +func _on_constraint_changed(constraint: InventoryConstraint) -> void: + _queue_refresh() + + +func _on_item_property_changed(_item: InventoryItem, property: String) -> void: + var relevant_properties := [ + GridConstraint._KEY_SIZE, + GridConstraint._KEY_ROTATED, + GridConstraint._KEY_POSITIVE_ROTATION, + Inventory._KEY_STACK_SIZE, + InventoryItem._KEY_IMAGE, ] - if property_name in relevant_properties: + if property in relevant_properties: _queue_refresh() @@ -167,8 +110,13 @@ func _on_inventory_resized() -> void: _queue_refresh() +func _on_item_added(item: InventoryItem) -> void: + _queue_refresh() + + func _on_item_removed(item: InventoryItem) -> void: _deselect(item) + _queue_refresh() func _process(_delta) -> void: @@ -182,23 +130,25 @@ func _queue_refresh() -> void: func _refresh() -> void: - _ctrl_drop_zone.deactivate() + _clear_list() + if !is_instance_valid(inventory): + return + custom_minimum_size = _get_inventory_size_px() size = custom_minimum_size - - _clear_list() _populate_list() func _get_inventory_size_px() -> Vector2: - if !is_instance_valid(inventory): + var grid_constraint: GridConstraint = inventory.get_constraint(GridConstraint) + if !is_instance_valid(inventory) || grid_constraint == null: return Vector2.ZERO - var result := Vector2(inventory.size.x * field_dimensions.x, \ - inventory.size.y * field_dimensions.y) + var inv_size := grid_constraint.size + var result := Vector2(inv_size.x * field_dimensions.x, inv_size.y * field_dimensions.y) # Also take item spacing into consideration - result += Vector2(inventory.size - Vector2i.ONE) * item_spacing + result += Vector2(inv_size - Vector2i.ONE) * item_spacing return result @@ -207,89 +157,75 @@ func _clear_list() -> void: if !is_instance_valid(_ctrl_item_container): return - for ctrl_inventory_item in _ctrl_item_container.get_children(): - _ctrl_item_container.remove_child(ctrl_inventory_item) - ctrl_inventory_item.queue_free() + for ctrl_draggable_inventory_item in _ctrl_item_container.get_children(): + _ctrl_item_container.remove_child(ctrl_draggable_inventory_item) + ctrl_draggable_inventory_item.queue_free() func _populate_list() -> void: - if !is_instance_valid(inventory) || !is_instance_valid(_ctrl_item_container): + var grid_constraint: GridConstraint = inventory.get_constraint(GridConstraint) + if !is_instance_valid(inventory) || (!is_instance_valid(grid_constraint)) || !is_instance_valid(_ctrl_item_container): return for item in inventory.get_items(): - var ctrl_inventory_item = CtrlInventoryItemRect.new() - ctrl_inventory_item.texture = default_item_texture - ctrl_inventory_item.item = item - ctrl_inventory_item.grabbed.connect(_on_item_grab.bind(ctrl_inventory_item)) - ctrl_inventory_item.dropped.connect(_on_item_drop.bind(ctrl_inventory_item)) - ctrl_inventory_item.activated.connect(_on_item_activated.bind(ctrl_inventory_item)) - ctrl_inventory_item.context_activated.connect(_on_item_context_activated.bind(ctrl_inventory_item)) - ctrl_inventory_item.mouse_entered.connect(_on_item_mouse_entered.bind(ctrl_inventory_item)) - ctrl_inventory_item.mouse_exited.connect(_on_item_mouse_exited.bind(ctrl_inventory_item)) - ctrl_inventory_item.clicked.connect(_on_item_clicked.bind(ctrl_inventory_item)) - ctrl_inventory_item.size = _get_item_sprite_size(item) - - ctrl_inventory_item.position = _get_field_position(inventory.get_item_position(item)) - ctrl_inventory_item.stretch_mode = TextureRect.STRETCH_KEEP_CENTERED - if stretch_item_sprites: - ctrl_inventory_item.stretch_mode = TextureRect.STRETCH_SCALE - - _ctrl_item_container.add_child(ctrl_inventory_item) - - -func _on_item_grab(offset: Vector2, ctrl_inventory_item: CtrlInventoryItemRect) -> void: - _clear_selection() + var ctrl_draggable_inventory_item = _CtrlDraggableInventoryItem.new() + ctrl_draggable_inventory_item.item = item + ctrl_draggable_inventory_item.ctrl_inventory_item_scene = custom_item_control_scene + ctrl_draggable_inventory_item.activated.connect(_on_inventory_item_activated.bind(ctrl_draggable_inventory_item)) + ctrl_draggable_inventory_item.clicked.connect(_on_inventory_item_clicked.bind(ctrl_draggable_inventory_item)) + ctrl_draggable_inventory_item.mouse_entered.connect(_on_item_mouse_entered.bind(ctrl_draggable_inventory_item)) + ctrl_draggable_inventory_item.mouse_exited.connect(_on_item_mouse_exited.bind(ctrl_draggable_inventory_item)) + ctrl_draggable_inventory_item.size = _get_item_sprite_size(item) + ctrl_draggable_inventory_item.position = _get_field_position(grid_constraint.get_item_position(item)) + ctrl_draggable_inventory_item.icon_stretch_mode = TextureRect.STRETCH_KEEP_CENTERED + if stretch_item_icons: + ctrl_draggable_inventory_item.icon_stretch_mode = TextureRect.STRETCH_SCALE -func _on_item_drop(zone: CtrlDropZone, drop_position: Vector2, ctrl_inventory_item: CtrlInventoryItemRect) -> void: - var item: InventoryItem = ctrl_inventory_item.item - # The item might have been freed in case the item stack has been moved and merged with another - # stack. - if is_instance_valid(item) and inventory.has_item(item): - if zone == null: - item_dropped.emit(item, drop_position + ctrl_inventory_item.position) + _ctrl_item_container.add_child(ctrl_draggable_inventory_item) -func _get_item_sprite_size(item: InventoryItem) -> Vector2: - var item_size := inventory.get_item_size(item) - var sprite_size := Vector2(item_size) * field_dimensions - - # Also take item spacing into consideration - sprite_size += (Vector2(item_size) - Vector2.ONE) * item_spacing - - return sprite_size +func _notification(what): + if what == NOTIFICATION_DRAG_BEGIN: + _clear_selection() + for c in _ctrl_item_container.get_children(): + c.mouse_filter = Control.MOUSE_FILTER_IGNORE + elif what == NOTIFICATION_DRAG_END: + for c in _ctrl_item_container.get_children(): + c.mouse_filter = Control.MOUSE_FILTER_PASS -func _on_item_activated(ctrl_inventory_item: CtrlInventoryItemRect) -> void: - var item = ctrl_inventory_item.item - if !item: - return +func _can_drop_data(at_position: Vector2, data) -> bool: + return data is InventoryItem - inventory_item_activated.emit(item) - -func _on_item_context_activated(ctrl_inventory_item: CtrlInventoryItemRect) -> void: - var item = ctrl_inventory_item.item - if !item: - return - - inventory_item_context_activated.emit(item) +func _drop_data(at_position: Vector2, data) -> void: + var local_offset := _CtrlDraggableInventoryItem.get_grab_offset_local_to(self) + at_position -= local_offset + var item := (data as InventoryItem) + if is_instance_valid(item): + _on_item_dropped(item, at_position) -func _on_item_mouse_entered(ctrl_inventory_item) -> void: - item_mouse_entered.emit(ctrl_inventory_item.item) +func _get_item_sprite_size(item: InventoryItem) -> Vector2: + var grid_constraint: GridConstraint = inventory.get_constraint(GridConstraint) + var item_size := grid_constraint.get_item_size(item) + var sprite_size := Vector2(item_size) * field_dimensions + # Also take item spacing into consideration + sprite_size += (Vector2(item_size) - Vector2.ONE) * item_spacing -func _on_item_mouse_exited(ctrl_inventory_item) -> void: - item_mouse_exited.emit(ctrl_inventory_item.item) + return sprite_size -func _on_item_clicked(ctrl_inventory_item) -> void: - var item = ctrl_inventory_item.item +func _on_inventory_item_clicked(at_position: Vector2, + button_index: int, + ctrl_draggable_inventory_item: _CtrlDraggableInventoryItem) -> void: + var item = ctrl_draggable_inventory_item.item if !is_instance_valid(item): return - if select_mode == SelectMode.SELECT_MULTI && Input.is_key_pressed(KEY_CTRL): + if select_mode == ItemList.SelectMode.SELECT_MULTI && Input.is_key_pressed(KEY_CTRL): if !_is_item_selected(item): _select(item) else: @@ -298,6 +234,24 @@ func _on_item_clicked(ctrl_inventory_item) -> void: _clear_selection() _select(item) + inventory_item_clicked.emit(item, at_position, button_index) + + +func _on_inventory_item_activated(ctrl_draggable_inventory_item: _CtrlDraggableInventoryItem) -> void: + var item = ctrl_draggable_inventory_item.item + if !item: + return + + inventory_item_activated.emit(item) + + +func _on_item_mouse_entered(ctrl_draggable_inventory_item) -> void: + item_mouse_entered.emit(ctrl_draggable_inventory_item.item) + + +func _on_item_mouse_exited(ctrl_draggable_inventory_item) -> void: + item_mouse_exited.emit(ctrl_draggable_inventory_item.item) + func _select(item: InventoryItem) -> void: if item in _selected_items: @@ -307,6 +261,7 @@ func _select(item: InventoryItem) -> void: return _selected_items.append(item) + inventory_item_selected.emit(item) selection_changed.emit() @@ -331,8 +286,7 @@ func _clear_selection() -> void: selection_changed.emit() -func _on_dragable_dropped(dragable: CtrlDragable, drop_position: Vector2) -> void: - var item: InventoryItem = dragable.item +func _on_item_dropped(item: InventoryItem, drop_position: Vector2) -> void: if item == null: return @@ -355,14 +309,19 @@ func _handle_item_move(item: InventoryItem, drop_position: Vector2) -> void: func _handle_item_transfer(item: InventoryItem, drop_position: Vector2) -> void: - var source_inventory: InventoryGrid = item.get_inventory() + var source_inventory: Inventory = item.get_inventory() + var grid_constraint: GridConstraint = inventory.get_constraint(GridConstraint) var field_coords = get_field_coords(drop_position + (field_dimensions / 2)) if source_inventory != null: - if source_inventory.item_protoset != inventory.item_protoset: + if source_inventory.protoset != inventory.protoset: return - source_inventory.transfer_to(item, inventory, field_coords) - elif !inventory.add_item_at(item, field_coords): + if grid_constraint.add_item_at(item, field_coords): + return + if _merge_item(item, field_coords): + return + _swap_items(item, field_coords) + elif !grid_constraint.add_item_at(item, field_coords): _swap_items(item, field_coords) @@ -391,39 +350,60 @@ func get_selected_inventory_items() -> Array[InventoryItem]: func _move_item(item: InventoryItem, move_position: Vector2i) -> bool: - if !inventory.rect_free(Rect2i(move_position, inventory.get_item_size(item)), item): + var grid_constraint: GridConstraint = inventory.get_constraint(GridConstraint) + if !grid_constraint.rect_free(Rect2i(move_position, grid_constraint.get_item_size(item)), item): return false if Engine.is_editor_hint(): - GlootUndoRedo.move_inventory_item(inventory, item, move_position) + _Undoables.undoable_action(inventory, "Move Inventory Item", func(): + return grid_constraint.move_item_to(item, move_position) + ) return true - inventory.move_item_to(item, move_position) + grid_constraint.move_item_to(item, move_position) return true func _merge_item(item_src: InventoryItem, position: Vector2i) -> bool: - if !(inventory is InventoryGridStacked): - return false - - var item_dst = (inventory as InventoryGridStacked)._get_mergable_item_at(item_src, position) + var item_dst = _get_mergable_item_at(item_src, position) if item_dst == null: return false if Engine.is_editor_hint(): - GlootUndoRedo.join_inventory_items(inventory, item_dst, item_src) + _Undoables.undoable_action(inventory, "Merge Inventory Items", func(): + return inventory.merge_stacks(item_dst, item_src, true) + ) else: - (inventory as InventoryGridStacked).join(item_dst, item_src) + inventory.merge_stacks(item_dst, item_src, true) return true +func _get_mergable_item_at(item: InventoryItem, position: Vector2i) -> InventoryItem: + var grid_constraint: GridConstraint = inventory.get_constraint(GridConstraint) + var target_item := grid_constraint.get_item_at(position) + if target_item != null && item.can_merge_into(target_item, true): + return target_item + return null + + func _swap_items(item: InventoryItem, position: Vector2i) -> bool: - var item2 = inventory.get_item_at(position) + var grid_constraint: GridConstraint = inventory.get_constraint(GridConstraint) + var item2 := grid_constraint.get_item_at(position) if item2 == null: return false if Engine.is_editor_hint(): - GlootUndoRedo.swap_inventory_items(item, item2) + var inventories: Array[Inventory] + if is_instance_valid(item.get_inventory()): + inventories.append(item.get_inventory()) + if is_instance_valid(item2.get_inventory()): + inventories.append(item2.get_inventory()) + _Undoables.undoable_action(inventories, "Swap Inventory Items", func(): + if !_StackManager.stacks_compatible(item, item2): + InventoryItem.swap(item, item2) + return true + ) else: - InventoryItem.swap(item, item2) + if !_StackManager.stacks_compatible(item, item2): + InventoryItem.swap(item, item2) return true @@ -434,7 +414,7 @@ func _get_field_position(field_coords: Vector2i) -> Vector2: return field_position -func deselect_inventory_item() -> void: +func deselect_inventory_items() -> void: _clear_selection() @@ -446,7 +426,6 @@ func get_item_rect(item: InventoryItem) -> Rect2: if !is_instance_valid(item): return Rect2() return Rect2( - _get_field_position(inventory.get_item_position(item)), + _get_field_position(inventory.get_constraint(GridConstraint).get_item_position(item)), _get_item_sprite_size(item) ) - diff --git a/addons/gloot/ui/ctrl_inventory_grid_basic.gd.uid b/addons/gloot/ui/ctrl_inventory_grid_basic.gd.uid new file mode 100644 index 0000000..a598ac5 --- /dev/null +++ b/addons/gloot/ui/ctrl_inventory_grid_basic.gd.uid @@ -0,0 +1 @@ +uid://bwg12d5wf7h5t diff --git a/addons/gloot/ui/ctrl_inventory_grid_ex.gd b/addons/gloot/ui/ctrl_inventory_grid_ex.gd deleted file mode 100644 index 69c544f..0000000 --- a/addons/gloot/ui/ctrl_inventory_grid_ex.gd +++ /dev/null @@ -1,408 +0,0 @@ -@tool -@icon("res://addons/gloot/images/icon_ctrl_inventory_grid.svg") -class_name CtrlInventoryGridEx -extends Control - -signal item_dropped(item, offset) -signal selection_changed -signal inventory_item_activated(item) -signal inventory_item_context_activated(item) -signal item_mouse_entered(item) -signal item_mouse_exited(item) - -const Verify = preload("res://addons/gloot/core/verify.gd") -const CtrlInventoryGridBasic = preload("res://addons/gloot/ui/ctrl_inventory_grid_basic.gd") -const CtrlInventoryItemRect = preload("res://addons/gloot/ui/ctrl_inventory_item_rect.gd") -const CtrlDragable = preload("res://addons/gloot/ui/ctrl_dragable.gd") - - -class PriorityPanel extends Panel: - enum StylePriority {HIGH = 0, MEDIUM = 1, LOW = 2} - - var regular_style: StyleBox - var hover_style: StyleBox - var _styles: Array[StyleBox] = [null, null, null] - - - func _init(regular_style_: StyleBox, hover_style_: StyleBox) -> void: - regular_style = regular_style_ - hover_style = hover_style_ - - - func _ready() -> void: - set_style(regular_style) - mouse_entered.connect(func(): - set_style(hover_style) - ) - mouse_exited.connect(func(): - set_style(regular_style) - ) - - - func set_style(style: StyleBox, priority: int = StylePriority.LOW) -> void: - if priority > 2 || priority < 0: - return - if _styles[priority] == style: - return - - _styles[priority] = style - - for i in range(0, 3): - if _styles[i] != null: - _set_panel_style(_styles[i]) - return - - - func _set_panel_style(style: StyleBox) -> void: - remove_theme_stylebox_override("panel") - if style != null: - add_theme_stylebox_override("panel", style) - - -class SelectionPanel extends Panel: - func set_style(style: StyleBox) -> void: - remove_theme_stylebox_override("panel") - if style != null: - add_theme_stylebox_override("panel", style) - - -@export var inventory_path: NodePath : - set(new_inv_path): - if new_inv_path == inventory_path: - return - inventory_path = new_inv_path - var node: Node = get_node_or_null(inventory_path) - - if node == null: - return - - if is_inside_tree(): - assert(node is InventoryGrid) - - inventory = node - update_configuration_warnings() -@export var default_item_texture: Texture2D : - set(new_default_item_texture): - if is_instance_valid(_ctrl_inventory_grid_basic): - _ctrl_inventory_grid_basic.default_item_texture = new_default_item_texture - default_item_texture = new_default_item_texture -@export var stretch_item_sprites: bool = true : - set(new_stretch_item_sprites): - if is_instance_valid(_ctrl_inventory_grid_basic): - _ctrl_inventory_grid_basic.stretch_item_sprites = new_stretch_item_sprites - stretch_item_sprites = new_stretch_item_sprites -@export var field_dimensions: Vector2 = Vector2(32, 32) : - set(new_field_dimensions): - if is_instance_valid(_ctrl_inventory_grid_basic): - _ctrl_inventory_grid_basic.field_dimensions = new_field_dimensions - field_dimensions = new_field_dimensions -@export var item_spacing: int = 0 : - set(new_item_spacing): - if is_instance_valid(_ctrl_inventory_grid_basic): - _ctrl_inventory_grid_basic.item_spacing = new_item_spacing - item_spacing = new_item_spacing -@export_enum("Single", "Multi") var select_mode: int = CtrlInventoryGridBasic.SelectMode.SELECT_SINGLE : - set(new_select_mode): - if select_mode == new_select_mode: - return - select_mode = new_select_mode - if is_instance_valid(_ctrl_inventory_grid_basic): - _ctrl_inventory_grid_basic.select_mode = select_mode - -@export_group("Custom Styles") -@export var field_style: StyleBox : - set(new_field_style): - field_style = new_field_style - _queue_refresh() -@export var field_highlighted_style: StyleBox : - set(new_field_highlighted_style): - field_highlighted_style = new_field_highlighted_style - _queue_refresh() -@export var field_selected_style: StyleBox : - set(new_field_selected_style): - field_selected_style = new_field_selected_style - _queue_refresh() -@export var selection_style: StyleBox : - set(new_selection_style): - selection_style = new_selection_style - _queue_refresh() - -var inventory: InventoryGrid = null : - set(new_inventory): - if inventory == new_inventory: - return - - _disconnect_inventory_signals() - inventory = new_inventory - _connect_inventory_signals() - - if is_instance_valid(_ctrl_inventory_grid_basic): - _ctrl_inventory_grid_basic.inventory = inventory - _queue_refresh() -var _ctrl_inventory_grid_basic: CtrlInventoryGridBasic = null -var _field_background_grid: Control = null -var _field_backgrounds: Array = [] -var _selection_panels: Control = null -var _refresh_queued: bool = false - - -func _connect_inventory_signals() -> void: - if !is_instance_valid(inventory): - return - if !inventory.contents_changed.is_connected(_queue_refresh): - inventory.contents_changed.connect(_queue_refresh) - if !inventory.size_changed.is_connected(_on_inventory_resized): - inventory.size_changed.connect(_on_inventory_resized) - - -func _disconnect_inventory_signals() -> void: - if !is_instance_valid(inventory): - return - if inventory.contents_changed.is_connected(_queue_refresh): - inventory.contents_changed.disconnect(_queue_refresh) - if inventory.size_changed.is_connected(_on_inventory_resized): - inventory.size_changed.disconnect(_on_inventory_resized) - - -func _process(_delta) -> void: - if _refresh_queued: - _refresh() - _refresh_queued = false - - -func _refresh() -> void: - _refresh_field_background_grid() - _refresh_selection_panel() - - -func _queue_refresh() -> void: - _refresh_queued = true - - -func _refresh_selection_panel() -> void: - if !is_instance_valid(_selection_panels): - return - - for child in _selection_panels.get_children(): - child.queue_free() - - var selected_items := _ctrl_inventory_grid_basic.get_selected_inventory_items() - _selection_panels.visible = (!selected_items.is_empty()) && (selection_style != null) - if selected_items.is_empty(): - return - - for selected_item in selected_items: - var selection_panel := SelectionPanel.new() - var rect := _ctrl_inventory_grid_basic.get_item_rect(selected_item) - selection_panel.position = rect.position - selection_panel.size = rect.size - selection_panel.set_style(selection_style) - selection_panel.mouse_filter = Control.MOUSE_FILTER_IGNORE - _selection_panels.add_child(selection_panel) - - -func _refresh_field_background_grid() -> void: - if is_instance_valid(_field_background_grid): - while _field_background_grid.get_child_count() > 0: - _field_background_grid.get_children()[0].queue_free() - _field_background_grid.remove_child(_field_background_grid.get_children()[0]) - _field_backgrounds = [] - - if !is_instance_valid(inventory): - return - - for i in range(inventory.size.x): - _field_backgrounds.append([]) - for j in range(inventory.size.y): - var field_panel: PriorityPanel = PriorityPanel.new(field_style, field_highlighted_style) - field_panel.visible = (field_style != null) - field_panel.size = field_dimensions - field_panel.position = _ctrl_inventory_grid_basic._get_field_position(Vector2i(i, j)) - _field_background_grid.add_child(field_panel) - _field_backgrounds[i].append(field_panel) - - -func _ready() -> void: - if Engine.is_editor_hint(): - # Clean up, in case it is duplicated in the editor - if is_instance_valid(_ctrl_inventory_grid_basic): - _ctrl_inventory_grid_basic.queue_free() - _field_background_grid.queue_free() - - if has_node(inventory_path): - inventory = get_node_or_null(inventory_path) - - _field_background_grid = Control.new() - _field_background_grid.name = "FieldBackgrounds" - add_child(_field_background_grid) - - _ctrl_inventory_grid_basic = CtrlInventoryGridBasic.new() - _ctrl_inventory_grid_basic.inventory = inventory - _ctrl_inventory_grid_basic.field_dimensions = field_dimensions - _ctrl_inventory_grid_basic.item_spacing = item_spacing - _ctrl_inventory_grid_basic.default_item_texture = default_item_texture - _ctrl_inventory_grid_basic.stretch_item_sprites = stretch_item_sprites - _ctrl_inventory_grid_basic.name = "CtrlInventoryGridBasic" - _ctrl_inventory_grid_basic.resized.connect(_update_size) - _ctrl_inventory_grid_basic.item_dropped.connect(func(item: InventoryItem, drop_position: Vector2): - item_dropped.emit(item, drop_position) - ) - _ctrl_inventory_grid_basic.inventory_item_activated.connect(func(item: InventoryItem): - inventory_item_activated.emit(item) - ) - _ctrl_inventory_grid_basic.inventory_item_context_activated.connect(func(item: InventoryItem): - inventory_item_context_activated.emit(item) - ) - _ctrl_inventory_grid_basic.item_mouse_entered.connect(_on_item_mouse_entered) - _ctrl_inventory_grid_basic.item_mouse_exited.connect(_on_item_mouse_exited) - _ctrl_inventory_grid_basic.selection_changed.connect(_on_selection_changed) - _ctrl_inventory_grid_basic.select_mode = select_mode - add_child(_ctrl_inventory_grid_basic) - - _selection_panels = Control.new() - _selection_panels.mouse_filter = Control.MOUSE_FILTER_IGNORE - _selection_panels.name = "SelectionPanels" - add_child(_selection_panels) - - CtrlDragable.dragable_dropped.connect(func(_grabbed_dragable, _zone, _local_drop_position): - _fill_background(field_style, PriorityPanel.StylePriority.LOW) - ) - - _update_size() - _queue_refresh() - - -func _notification(what: int) -> void: - if what == NOTIFICATION_DRAG_END: - _fill_background(field_style, PriorityPanel.StylePriority.LOW) - - -func _update_size() -> void: - custom_minimum_size = _ctrl_inventory_grid_basic.size - size = _ctrl_inventory_grid_basic.size - - -func _on_item_mouse_entered(item: InventoryItem) -> void: - _set_item_background(item, field_highlighted_style, PriorityPanel.StylePriority.MEDIUM) - item_mouse_entered.emit(item) - - -func _on_item_mouse_exited(item: InventoryItem) -> void: - _set_item_background(item, null, PriorityPanel.StylePriority.MEDIUM) - item_mouse_exited.emit(item) - - -func _on_selection_changed() -> void: - _handle_selection_change() - selection_changed.emit() - - -func _handle_selection_change() -> void: - if !is_instance_valid(inventory): - return - _refresh_selection_panel() - - if !field_selected_style: - return - for item in inventory.get_items(): - if item in _ctrl_inventory_grid_basic.get_selected_inventory_items(): - _set_item_background(item, field_selected_style, PriorityPanel.StylePriority.HIGH) - else: - _set_item_background(item, null, PriorityPanel.StylePriority.HIGH) - - -func _on_inventory_resized() -> void: - _refresh_field_background_grid() - - -func _input(event) -> void: - if !(event is InputEventMouseMotion): - return - if !is_instance_valid(inventory): - return - - if !field_highlighted_style: - return - _highlight_grabbed_item(field_highlighted_style) - - -func _highlight_grabbed_item(style: StyleBox): - var grabbed_item: InventoryItem = _get_global_grabbed_item() - if !grabbed_item: - return - - var global_grabbed_item_pos: Vector2 = _get_global_grabbed_item_local_pos() - if !_is_hovering(global_grabbed_item_pos): - _fill_background(field_style, PriorityPanel.StylePriority.LOW) - return - - _fill_background(field_style, PriorityPanel.StylePriority.LOW) - - var grabbed_item_coords := _ctrl_inventory_grid_basic.get_field_coords(global_grabbed_item_pos + (field_dimensions / 2)) - var item_size := inventory.get_item_size(grabbed_item) - var rect := Rect2i(grabbed_item_coords, item_size) - if !Rect2i(Vector2i.ZERO, inventory.size).encloses(rect): - return - _set_rect_background(rect, style, PriorityPanel.StylePriority.LOW) - - -func _is_hovering(local_pos: Vector2) -> bool: - return get_rect().has_point(local_pos) - - -func _set_item_background(item: InventoryItem, style: StyleBox, priority: int) -> bool: - if !item: - return false - - _set_rect_background(inventory.get_item_rect(item), style, priority) - return true - - -func _set_rect_background(rect: Rect2i, style: StyleBox, priority: int) -> void: - var h_range = min(rect.size.x + rect.position.x, inventory.size.x) - for i in range(rect.position.x, h_range): - var v_range = min(rect.size.y + rect.position.y, inventory.size.y) - for j in range(rect.position.y, v_range): - _field_backgrounds[i][j].set_style(style, priority) - - -func _fill_background(style: StyleBox, priority: int) -> void: - for panel in _field_background_grid.get_children(): - panel.set_style(style, priority) - - -func _get_global_grabbed_item() -> InventoryItem: - if CtrlDragable.get_grabbed_dragable() == null: - return null - return (CtrlDragable.get_grabbed_dragable() as CtrlInventoryItemRect).item - - -func _get_global_grabbed_item_local_pos() -> Vector2: - if CtrlDragable.get_grabbed_dragable(): - return get_local_mouse_position() - CtrlDragable.get_grab_offset_local_to(self) - return Vector2(-1, -1) - - -func deselect_inventory_item() -> void: - if !is_instance_valid(_ctrl_inventory_grid_basic): - return - _ctrl_inventory_grid_basic.deselect_inventory_item() - - -func select_inventory_item(item: InventoryItem) -> void: - if !is_instance_valid(_ctrl_inventory_grid_basic): - return - _ctrl_inventory_grid_basic.select_inventory_item(item) - - -func get_selected_inventory_item() -> InventoryItem: - if !is_instance_valid(_ctrl_inventory_grid_basic): - return null - return _ctrl_inventory_grid_basic.get_selected_inventory_item() - - -func get_selected_inventory_items() -> Array[InventoryItem]: - if !is_instance_valid(_ctrl_inventory_grid_basic): - return [] - return _ctrl_inventory_grid_basic.get_selected_inventory_items() - diff --git a/addons/gloot/ui/ctrl_inventory_grid_field_style_normal.tres b/addons/gloot/ui/ctrl_inventory_grid_field_style_normal.tres new file mode 100644 index 0000000..108e501 --- /dev/null +++ b/addons/gloot/ui/ctrl_inventory_grid_field_style_normal.tres @@ -0,0 +1,6 @@ +[gd_resource type="StyleBoxFlat" format=3 uid="uid://bab5l46oddme5"] + +[resource] +bg_color = Color(0.6, 0.6, 0.6, 0) +border_width_right = 1 +border_width_bottom = 1 diff --git a/addons/gloot/ui/ctrl_inventory_grid_style_background.tres b/addons/gloot/ui/ctrl_inventory_grid_style_background.tres new file mode 100644 index 0000000..74d4cd2 --- /dev/null +++ b/addons/gloot/ui/ctrl_inventory_grid_style_background.tres @@ -0,0 +1,6 @@ +[gd_resource type="StyleBoxFlat" format=3 uid="uid://dnk4u11b38rr6"] + +[resource] +bg_color = Color(0.6, 0.6, 0.6, 0) +border_width_left = 1 +border_width_top = 1 diff --git a/addons/gloot/ui/ctrl_inventory_grid_style_selection.tres b/addons/gloot/ui/ctrl_inventory_grid_style_selection.tres new file mode 100644 index 0000000..e725815 --- /dev/null +++ b/addons/gloot/ui/ctrl_inventory_grid_style_selection.tres @@ -0,0 +1,9 @@ +[gd_resource type="StyleBoxFlat" format=3 uid="uid://c2h2ygy48r1cr"] + +[resource] +bg_color = Color(0.6, 0.6, 0.6, 0) +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_color = Color(1, 1, 1, 1) diff --git a/addons/gloot/ui/ctrl_inventory_item.gd b/addons/gloot/ui/ctrl_inventory_item.gd new file mode 100644 index 0000000..d7ddd9e --- /dev/null +++ b/addons/gloot/ui/ctrl_inventory_item.gd @@ -0,0 +1,117 @@ +@tool +@icon("res://addons/gloot/images/icon_ctrl_inventory_item.svg") +class_name CtrlInventoryItem +extends CtrlInventoryItemBase +## Control node for displaying inventory items. +## +## Displays an `InventoryItem` icon and its stack size. Consists of a `TextureRect` (the icon) a `Label` (the stack +## size). + +const _Utils = preload("res://addons/gloot/core/utils.gd") + +var _texture_rect: TextureRect +var _stack_size_label: Label +var _old_item: InventoryItem = null + + +func _connect_item_signals(new_item: InventoryItem) -> void: + if !is_instance_valid(new_item): + return + _Utils.safe_connect(new_item.property_changed, _on_item_property_changed) + + +func _disconnect_item_signals(old_item: InventoryItem) -> void: + if !is_instance_valid(old_item): + return + _Utils.safe_disconnect(old_item.property_changed, _on_item_property_changed) + + +func _on_item_property_changed(_property: String) -> void: + _refresh() + + +func _get_item_position() -> Vector2: + if is_instance_valid(item) && item.get_inventory(): + return item.get_inventory().get_item_position(item) + return Vector2(0, 0) + + +func _ready() -> void: + item_changed.connect(_on_item_changed) + icon_stretch_mode_changed.connect(_on_icon_stretch_mode_changed) + + _texture_rect = TextureRect.new() + _texture_rect.mouse_filter = Control.MOUSE_FILTER_IGNORE + _texture_rect.expand_mode = TextureRect.EXPAND_IGNORE_SIZE + _texture_rect.stretch_mode = icon_stretch_mode + + _stack_size_label = Label.new() + _stack_size_label.mouse_filter = Control.MOUSE_FILTER_IGNORE + _stack_size_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT + _stack_size_label.vertical_alignment = VERTICAL_ALIGNMENT_BOTTOM + + add_child(_texture_rect) + add_child(_stack_size_label) + + resized.connect(func(): + _texture_rect.size = size + _stack_size_label.size = size + ) + + _refresh() + + +func _on_item_changed() -> void: + _disconnect_item_signals(_old_item) + _old_item = item + _connect_item_signals(item) + _refresh() + + +func _on_icon_stretch_mode_changed() -> void: + if is_instance_valid(_texture_rect): + _texture_rect.stretch_mode = icon_stretch_mode + + +func _update_texture() -> void: + if !is_instance_valid(_texture_rect): + return + + if is_instance_valid(item): + _texture_rect.texture = item.get_texture() + else: + _texture_rect.texture = null + return + + if is_instance_valid(item) && GridConstraint.is_item_rotated(item): + _texture_rect.size = Vector2(size.y, size.x) + if GridConstraint.is_item_rotation_positive(item): + _texture_rect.position = Vector2(_texture_rect.size.y, 0) + _texture_rect.rotation = PI / 2 + else: + _texture_rect.position = Vector2(0, _texture_rect.size.x) + _texture_rect.rotation = -PI / 2 + + else: + _texture_rect.size = size + _texture_rect.position = Vector2.ZERO + _texture_rect.rotation = 0 + + +func _update_stack_size() -> void: + if !is_instance_valid(_stack_size_label): + return + if !is_instance_valid(item): + _stack_size_label.text = "" + return + var stack_size: int = item.get_stack_size() + if stack_size <= 1: + _stack_size_label.text = "" + else: + _stack_size_label.text = "%d" % stack_size + _stack_size_label.size = size + + +func _refresh() -> void: + _update_texture() + _update_stack_size() diff --git a/addons/gloot/ui/ctrl_inventory_item.gd.uid b/addons/gloot/ui/ctrl_inventory_item.gd.uid new file mode 100644 index 0000000..1500a3b --- /dev/null +++ b/addons/gloot/ui/ctrl_inventory_item.gd.uid @@ -0,0 +1 @@ +uid://dyd1r31bdgjgu diff --git a/addons/gloot/ui/ctrl_inventory_item_base.gd b/addons/gloot/ui/ctrl_inventory_item_base.gd new file mode 100644 index 0000000..92e2be5 --- /dev/null +++ b/addons/gloot/ui/ctrl_inventory_item_base.gd @@ -0,0 +1,32 @@ +@tool +@icon("res://addons/gloot/images/icon_ctrl_inventory_item.svg") +class_name CtrlInventoryItemBase +extends Control +## Base class for `CtrlInventoryItem`. +## +## `CtrlInventoryItemBase` defines some signals and members used for displaying an `InventoryItem`. Must be inherited +## when defining a custom class for representing inventory items. + +## Emitted when the `item` property has been changed. +signal item_changed + +## Emitted when the `icon_stretch_mode` property has been changed. +signal icon_stretch_mode_changed + +## Reference to the `InventoryItem` that is being displayed. +var item: InventoryItem = null: + set(new_item): + if item == new_item: + return + item = new_item + item_changed.emit() + +@export_group("Icon Behavior", "icon_") +## Controls the item icon behavior when resizing the node's bounding rectangle. See the `TextureRect.StretchMode` +## constants for details. +@export var icon_stretch_mode: TextureRect.StretchMode = TextureRect.StretchMode.STRETCH_SCALE: + set(new_icon_stretch_mode): + if new_icon_stretch_mode == icon_stretch_mode: + return + icon_stretch_mode = new_icon_stretch_mode + icon_stretch_mode_changed.emit() diff --git a/addons/gloot/ui/ctrl_inventory_item_base.gd.uid b/addons/gloot/ui/ctrl_inventory_item_base.gd.uid new file mode 100644 index 0000000..37243de --- /dev/null +++ b/addons/gloot/ui/ctrl_inventory_item_base.gd.uid @@ -0,0 +1 @@ +uid://dydpqmpsplkbg diff --git a/addons/gloot/ui/ctrl_inventory_item_rect.gd b/addons/gloot/ui/ctrl_inventory_item_rect.gd deleted file mode 100644 index 0a77b89..0000000 --- a/addons/gloot/ui/ctrl_inventory_item_rect.gd +++ /dev/null @@ -1,167 +0,0 @@ -extends "res://addons/gloot/ui/ctrl_dragable.gd" - -const CtrlInventoryItemRect = preload("res://addons/gloot/ui/ctrl_inventory_item_rect.gd") -const StacksConstraint = preload("res://addons/gloot/core/constraints/stacks_constraint.gd") -const GridConstraint = preload("res://addons/gloot/core/constraints/grid_constraint.gd") - -signal activated -signal clicked -signal context_activated - -var item: InventoryItem : - set(new_item): - if item == new_item: - return - - _disconnect_item_signals() - _connect_item_signals(new_item) - - item = new_item - if item: - texture = item.get_texture() - activate() - else: - texture = null - deactivate() - _update_stack_size() -var texture: Texture2D : - set(new_texture): - if new_texture == texture: - return - texture = new_texture - _update_texture() -var stretch_mode: TextureRect.StretchMode = TextureRect.StretchMode.STRETCH_SCALE : - set(new_stretch_mode): - if stretch_mode == new_stretch_mode: - return - stretch_mode = new_stretch_mode - if is_instance_valid(_texture_rect): - _texture_rect.stretch_mode = stretch_mode -var item_slot: ItemSlot -var _texture_rect: TextureRect -var _stack_size_label: Label -static var _stored_preview_size: Vector2 -static var _stored_preview_offset: Vector2 - - -func _connect_item_signals(new_item: InventoryItem) -> void: - if new_item == null: - return - - if !new_item.protoset_changed.is_connected(_refresh): - new_item.protoset_changed.connect(_refresh) - if !new_item.prototype_id_changed.is_connected(_refresh): - new_item.prototype_id_changed.connect(_refresh) - if !new_item.property_changed.is_connected(_on_item_property_changed): - new_item.property_changed.connect(_on_item_property_changed) - - -func _disconnect_item_signals() -> void: - if !is_instance_valid(item): - return - - if item.protoset_changed.is_connected(_refresh): - item.protoset_changed.disconnect(_refresh) - if item.prototype_id_changed.is_connected(_refresh): - item.prototype_id_changed.disconnect(_refresh) - if item.property_changed.is_connected(_on_item_property_changed): - item.property_changed.disconnect(_on_item_property_changed) - - -func _on_item_property_changed(property_name: String) -> void: - var relevant_properties = [ - StacksConstraint.KEY_STACK_SIZE, - GridConstraint.KEY_WIDTH, - GridConstraint.KEY_HEIGHT, - GridConstraint.KEY_SIZE, - GridConstraint.KEY_ROTATED, - GridConstraint.KEY_GRID_POSITION, - InventoryItem.KEY_IMAGE, - ] - if property_name in relevant_properties: - _refresh() - - -func _ready() -> void: - _texture_rect = TextureRect.new() - _texture_rect.mouse_filter = Control.MOUSE_FILTER_IGNORE - _texture_rect.expand_mode = TextureRect.EXPAND_IGNORE_SIZE - _texture_rect.stretch_mode = stretch_mode - _stack_size_label = Label.new() - _stack_size_label.mouse_filter = Control.MOUSE_FILTER_IGNORE - _stack_size_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT - _stack_size_label.vertical_alignment = VERTICAL_ALIGNMENT_BOTTOM - add_child(_texture_rect) - add_child(_stack_size_label) - - resized.connect(func(): - _texture_rect.size = size - _stack_size_label.size = size - ) - - if item == null: - deactivate() - - _refresh() - - -func _update_texture() -> void: - if !is_instance_valid(_texture_rect): - return - _texture_rect.texture = texture - if is_instance_valid(item) && GridConstraint.is_item_rotated(item): - _texture_rect.size = Vector2(size.y, size.x) - if GridConstraint.is_item_rotation_positive(item): - _texture_rect.position = Vector2(_texture_rect.size.y, 0) - _texture_rect.rotation = PI/2 - else: - _texture_rect.position = Vector2(0, _texture_rect.size.x) - _texture_rect.rotation = -PI/2 - - else: - _texture_rect.size = size - _texture_rect.position = Vector2.ZERO - _texture_rect.rotation = 0 - - -func _update_stack_size() -> void: - if !is_instance_valid(_stack_size_label): - return - if !is_instance_valid(item): - _stack_size_label.text = "" - return - var stack_size: int = StacksConstraint.get_item_stack_size(item) - if stack_size <= 1: - _stack_size_label.text = "" - else: - _stack_size_label.text = "%d" % stack_size - _stack_size_label.size = size - - -func _refresh() -> void: - _update_texture() - _update_stack_size() - - -func create_preview() -> Control: - var preview = CtrlInventoryItemRect.new() - preview.item = item - preview.texture = texture - preview.size = size - preview.stretch_mode = stretch_mode - return preview - - -func _gui_input(event: InputEvent) -> void: - if !(event is InputEventMouseButton): - return - - var mb_event: InputEventMouseButton = event - if mb_event.button_index == MOUSE_BUTTON_LEFT: - if mb_event.double_click: - activated.emit() - else: - clicked.emit() - elif mb_event.button_index == MOUSE_BUTTON_MASK_RIGHT: - context_activated.emit() - diff --git a/addons/gloot/ui/ctrl_inventory_stacked.gd b/addons/gloot/ui/ctrl_inventory_stacked.gd deleted file mode 100644 index 56f5b58..0000000 --- a/addons/gloot/ui/ctrl_inventory_stacked.gd +++ /dev/null @@ -1,74 +0,0 @@ -@tool -@icon("res://addons/gloot/images/icon_ctrl_inventory_stacked.svg") -class_name CtrlInventoryStacked -extends CtrlInventory - -@export var progress_bar_visible: bool = true : - set(new_progress_bar_visible): - progress_bar_visible = new_progress_bar_visible - if _progress_bar: - _progress_bar.visible = progress_bar_visible -@export var label_visible: bool = true : - set(new_label_visible): - label_visible = new_label_visible - if _label: - _label.visible = label_visible -var _progress_bar: ProgressBar -var _label: Label - - -func _ready(): - super._ready() - - _progress_bar = ProgressBar.new() - _progress_bar.size_flags_horizontal = SIZE_EXPAND_FILL - _progress_bar.show_percentage = false - _progress_bar.visible = progress_bar_visible - _progress_bar.custom_minimum_size.y = 20 - _vbox_container.add_child(_progress_bar) - - _label = Label.new() - _label.anchor_right = 1.0 - _label.anchor_bottom = 1.0 - _label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER - _label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER - _progress_bar.add_child(_label) - - _queue_refresh() - - -func _connect_inventory_signals() -> void: - if !inventory: - return - - super._connect_inventory_signals() - - if !inventory.capacity_changed.is_connected(_queue_refresh): - inventory.capacity_changed.connect(_queue_refresh) - if !inventory.occupied_space_changed.is_connected(_queue_refresh): - inventory.occupied_space_changed.connect(_queue_refresh) - - -func _disconnect_inventory_signals() -> void: - if !inventory: - return - - super._disconnect_inventory_signals() - - if !inventory.capacity_changed.is_connected(_queue_refresh): - inventory.capacity_changed.disconnect(_queue_refresh) - if !inventory.occupied_space_changed.is_connected(_queue_refresh): - inventory.occupied_space_changed.disconnect(_queue_refresh) - - -func _refresh(): - super._refresh() - if is_instance_valid(_label): - _label.visible = label_visible - _label.text = "%d/%d" % [inventory.occupied_space, inventory.capacity] - if is_instance_valid(_progress_bar): - _progress_bar.visible = progress_bar_visible - _progress_bar.min_value = 0 - _progress_bar.max_value = inventory.capacity - _progress_bar.value = inventory.occupied_space - diff --git a/addons/gloot/ui/ctrl_inventory_universal.gd b/addons/gloot/ui/ctrl_inventory_universal.gd new file mode 100644 index 0000000..8644615 --- /dev/null +++ b/addons/gloot/ui/ctrl_inventory_universal.gd @@ -0,0 +1,111 @@ +@tool +@icon("res://addons/gloot/images/icon_ctrl_inventory.svg") +extends VBoxContainer + +signal inventory_item_activated(item: InventoryItem) +signal inventory_item_clicked(item: InventoryItem) +signal inventory_item_selected(item: InventoryItem) + +@export var inventory: Inventory = null: + set(new_inventory): + if inventory == new_inventory: + return + disconnect_inventory_signals() + inventory = new_inventory + connect_inventory_signals() + _refresh() + update_configuration_warnings() + +var _inventory_control: Control = null +var _capacity_control: CtrlInventoryCapacity = null + + +func _get_configuration_warnings() -> PackedStringArray: + if !is_instance_valid(inventory): + return PackedStringArray([ + "This CtrlInventoryUniversal node has no inventory set. Set the 'inventory' field to be able to " \ + + "display its contents."]) + return PackedStringArray() + + +func connect_inventory_signals(): + if !inventory: + return + + inventory.protoset_changed.connect(_refresh) + inventory.constraint_changed.connect(_on_constraint_changed) + inventory.constraint_added.connect(_on_constraint_changed) + inventory.constraint_removed.connect(_on_constraint_changed) + + if !inventory.protoset: + return + inventory.protoset.changed.connect(_refresh) + + +func disconnect_inventory_signals(): + if !inventory: + return + + inventory.protoset_changed.disconnect(_refresh) + inventory.constraint_changed.disconnect(_on_constraint_changed) + inventory.constraint_added.disconnect(_on_constraint_changed) + inventory.constraint_removed.disconnect(_on_constraint_changed) + + if !inventory.protoset: + return + inventory.protoset.changed.disconnect(_refresh) + + +func _on_constraint_changed(constraint: InventoryConstraint) -> void: + _refresh() + + +func _ready() -> void: + _refresh() + + +func _refresh() -> void: + if is_instance_valid(_inventory_control): + _inventory_control.queue_free() + _inventory_control = null + if is_instance_valid(_capacity_control): + _capacity_control.queue_free() + _capacity_control = null + + if !is_instance_valid(inventory): + return + + if inventory.get_constraint(GridConstraint) != null: + _inventory_control = CtrlInventoryGrid.new() + else: + _inventory_control = CtrlInventory.new() + _inventory_control.size_flags_horizontal = SIZE_EXPAND_FILL + _inventory_control.size_flags_vertical = SIZE_EXPAND_FILL + _inventory_control.inventory = inventory + _inventory_control.inventory_item_activated.connect(func(item: InventoryItem): + inventory_item_activated.emit(item) + ) + _inventory_control.inventory_item_clicked.connect(func(item: InventoryItem, at_position: Vector2, mouse_button_index: int): + inventory_item_clicked.emit(item, at_position, mouse_button_index) + ) + _inventory_control.inventory_item_selected.connect(func(item: InventoryItem): + inventory_item_selected.emit(item) + ) + if inventory.get_constraint(WeightConstraint) != null: + _capacity_control = CtrlInventoryCapacity.new() + _capacity_control.inventory = inventory + + if is_instance_valid(_inventory_control): + add_child(_inventory_control) + if is_instance_valid(_capacity_control): + add_child(_capacity_control) + + +func get_selected_inventory_item() -> InventoryItem: + assert(is_instance_valid(_inventory_control)) + return _inventory_control.get_selected_inventory_item() + + +func get_selected_inventory_items() -> Array[InventoryItem]: + assert(is_instance_valid(_inventory_control)) + return _inventory_control.get_selected_inventory_items() diff --git a/addons/gloot/ui/ctrl_inventory_universal.gd.uid b/addons/gloot/ui/ctrl_inventory_universal.gd.uid new file mode 100644 index 0000000..a6a8155 --- /dev/null +++ b/addons/gloot/ui/ctrl_inventory_universal.gd.uid @@ -0,0 +1 @@ +uid://bgmdl33rmga3l diff --git a/addons/gloot/ui/ctrl_item_slot.gd b/addons/gloot/ui/ctrl_item_slot.gd index 95a9888..dcb19e8 100644 --- a/addons/gloot/ui/ctrl_item_slot.gd +++ b/addons/gloot/ui/ctrl_item_slot.gd @@ -2,190 +2,111 @@ @icon("res://addons/gloot/images/icon_ctrl_item_slot.svg") class_name CtrlItemSlot extends Control +## A control node representing an inventory slot (`ItemSlot`). +## +## A control node representing an inventory slot (`ItemSlot`). -const CtrlInventoryItemRect = preload("res://addons/gloot/ui/ctrl_inventory_item_rect.gd") -const CtrlDropZone = preload("res://addons/gloot/ui/ctrl_drop_zone.gd") -const CtrlDragable = preload("res://addons/gloot/ui/ctrl_dragable.gd") -const StacksConstraint = preload("res://addons/gloot/core/constraints/stacks_constraint.gd") -signal item_mouse_entered -signal item_mouse_exited +const _CtrlDraggableInventoryItem = preload("res://addons/gloot/ui/ctrl_draggable_inventory_item.gd") +const _Utils = preload("res://addons/gloot/core/utils.gd") -@export var item_slot_path: NodePath : - set(new_item_slot_path): - if item_slot_path == new_item_slot_path: - return - item_slot_path = new_item_slot_path - var node: Node = get_node_or_null(item_slot_path) - - if node == null: - _clear() +## Reference to the item slot that is being displayed. +@export var item_slot: ItemSlot: + set(new_item_slot): + if new_item_slot == item_slot: return - if is_inside_tree(): - assert(node is ItemSlotBase) - - item_slot = node - _refresh() - update_configuration_warnings() -@export var default_item_icon: Texture2D : - set(new_default_item_icon): - if default_item_icon == new_default_item_icon: - return - default_item_icon = new_default_item_icon + _disconnect_item_slot_signals() + item_slot = new_item_slot + _connect_item_slot_signals() + _refresh() -@export var item_texture_visible: bool = true : - set(new_item_texture_visible): - if item_texture_visible == new_item_texture_visible: - return - item_texture_visible = new_item_texture_visible - if is_instance_valid(_ctrl_inventory_item_rect): - _ctrl_inventory_item_rect.visible = item_texture_visible -@export var label_visible: bool = true : - set(new_label_visible): - if label_visible == new_label_visible: - return - label_visible = new_label_visible - if is_instance_valid(_label): - _label.visible = label_visible + @export_group("Icon Behavior", "icon_") -@export var icon_stretch_mode: TextureRect.StretchMode = TextureRect.StretchMode.STRETCH_KEEP_CENTERED : +## Controls the item icon behavior when resizing the node's bounding rectangle. See the `TextureRect.StretchMode` +## constants for details. +@export var icon_stretch_mode: TextureRect.StretchMode = TextureRect.StretchMode.STRETCH_KEEP_CENTERED: set(new_icon_stretch_mode): if icon_stretch_mode == new_icon_stretch_mode: return icon_stretch_mode = new_icon_stretch_mode - if is_instance_valid(_ctrl_inventory_item_rect): - _ctrl_inventory_item_rect.stretch_mode = icon_stretch_mode -@export_group("Text Behavior", "label_") -@export var label_horizontal_alignment: HorizontalAlignment = HORIZONTAL_ALIGNMENT_CENTER : - set(new_label_horizontal_alignment): - if label_horizontal_alignment == new_label_horizontal_alignment: - return - label_horizontal_alignment = new_label_horizontal_alignment - if is_instance_valid(_label): - _label.horizontal_alignment = label_horizontal_alignment -@export var label_vertical_alignment: VerticalAlignment = VERTICAL_ALIGNMENT_CENTER : - set(new_label_vertical_alignment): - if label_vertical_alignment == new_label_vertical_alignment: - return - label_vertical_alignment = new_label_vertical_alignment - if is_instance_valid(_label): - _label.vertical_alignment = label_vertical_alignment -@export var label_text_overrun_behavior: TextServer.OverrunBehavior : - set(new_label_text_overrun_behavior): - if label_text_overrun_behavior == new_label_text_overrun_behavior: + if is_instance_valid(_ctrl_draggable_inventory_item): + _ctrl_draggable_inventory_item.icon_stretch_mode = icon_stretch_mode + +@export_group("Custom Styles") +## The slot background style. +@export var slot_style: StyleBox: + set(new_slot_style): + if slot_style == new_slot_style: return - label_text_overrun_behavior = new_label_text_overrun_behavior - if is_instance_valid(_label): - _label.text_overrun_behavior = label_text_overrun_behavior -@export var label_clip_text: bool : - set(new_label_clip_text): - if label_clip_text == new_label_clip_text: - return - label_clip_text = new_label_clip_text - if is_instance_valid(_label): - _label.clip_text = label_clip_text -var item_slot: ItemSlotBase : - set(new_item_slot): - if new_item_slot == item_slot: + slot_style = new_slot_style + _refresh() +## The slot background style when the mouse cursor hovers over the slot. +@export var slot_highlighted_style: StyleBox: + set(new_slot_highlighted_style): + if slot_highlighted_style == new_slot_highlighted_style: return - - _disconnect_item_slot_signals() - item_slot = new_item_slot - _connect_item_slot_signals() - + slot_highlighted_style = new_slot_highlighted_style _refresh() -var _hbox_container: HBoxContainer -var _ctrl_inventory_item_rect: CtrlInventoryItemRect -var _label: Label -var _ctrl_drop_zone: CtrlDropZone - -func _get_configuration_warnings() -> PackedStringArray: - if item_slot_path.is_empty(): - return PackedStringArray([ - "This node is not linked to an item slot, so it can't display any content.\n" + \ - "Set the item_slot_path property to point to an ItemSlotBase node."]) - return PackedStringArray() +var _background_panel: Panel +var _ctrl_draggable_inventory_item: _CtrlDraggableInventoryItem func _connect_item_slot_signals() -> void: if !is_instance_valid(item_slot): return - - if !item_slot.item_equipped.is_connected(_refresh): - item_slot.item_equipped.connect(_refresh) - if !item_slot.cleared.is_connected(_refresh): - item_slot.cleared.connect(_refresh) + _Utils.safe_connect(item_slot.item_equipped, _refresh) + _Utils.safe_connect(item_slot.cleared, _refresh) func _disconnect_item_slot_signals() -> void: if !is_instance_valid(item_slot): return - - if item_slot.item_equipped.is_connected(_refresh): - item_slot.item_equipped.disconnect(_refresh) - if item_slot.cleared.is_connected(_refresh): - item_slot.cleared.disconnect(_refresh) + _Utils.safe_disconnect(item_slot.item_equipped, _refresh) + _Utils.safe_disconnect(item_slot.cleared, _refresh) func _ready(): - if Engine.is_editor_hint(): - # Clean up, in case it is duplicated in the editor - if is_instance_valid(_hbox_container): - _hbox_container.queue_free() - - var node: Node = get_node_or_null(item_slot_path) - if is_inside_tree() && node: - assert(node is ItemSlotBase) - item_slot = node - - _hbox_container = HBoxContainer.new() - _hbox_container.size_flags_horizontal = SIZE_EXPAND_FILL - _hbox_container.size_flags_vertical = SIZE_EXPAND_FILL - add_child(_hbox_container) - _hbox_container.resized.connect(func(): size = _hbox_container.size) - - _ctrl_inventory_item_rect = CtrlInventoryItemRect.new() - _ctrl_inventory_item_rect.visible = item_texture_visible - _ctrl_inventory_item_rect.size_flags_horizontal = SIZE_EXPAND_FILL - _ctrl_inventory_item_rect.size_flags_vertical = SIZE_EXPAND_FILL - _ctrl_inventory_item_rect.item_slot = item_slot - _ctrl_inventory_item_rect.stretch_mode = icon_stretch_mode - _ctrl_inventory_item_rect.mouse_entered.connect(_on_mouse_entered) - _ctrl_inventory_item_rect.mouse_exited.connect(_on_mouse_exited) - _hbox_container.add_child(_ctrl_inventory_item_rect) - - _ctrl_drop_zone = CtrlDropZone.new() - _ctrl_drop_zone.dragable_dropped.connect(_on_dragable_dropped) - _ctrl_drop_zone.size = size - resized.connect(func(): _ctrl_drop_zone.size = size) - CtrlDragable.dragable_grabbed.connect(_on_any_dragable_grabbed) - CtrlDragable.dragable_dropped.connect(_on_any_dragable_dropped) - add_child(_ctrl_drop_zone) - _ctrl_drop_zone.deactivate() - - _label = Label.new() - _label.visible = label_visible - _label.size_flags_horizontal = SIZE_EXPAND_FILL - _label.size_flags_vertical = SIZE_EXPAND_FILL - _label.horizontal_alignment = label_horizontal_alignment - _label.vertical_alignment = label_vertical_alignment - _label.text_overrun_behavior = label_text_overrun_behavior - _label.clip_text = label_clip_text - _hbox_container.add_child(_label) - - _hbox_container.size = size + _background_panel = Panel.new() + _background_panel.size = size + _background_panel.mouse_filter = Control.MOUSE_FILTER_IGNORE + _set_panel_style(_background_panel, slot_style) + add_child(_background_panel) + + _ctrl_draggable_inventory_item = _CtrlDraggableInventoryItem.new() + _ctrl_draggable_inventory_item.icon_stretch_mode = icon_stretch_mode + _ctrl_draggable_inventory_item.size = size + add_child(_ctrl_draggable_inventory_item) + resized.connect(func(): - _hbox_container.size = size + if is_instance_valid(_background_panel): + _background_panel.size = size + if is_instance_valid(_ctrl_draggable_inventory_item): + _ctrl_draggable_inventory_item.size = size ) _refresh() -func _on_dragable_dropped(dragable: CtrlDragable, drop_position: Vector2) -> void: - var item = (dragable as CtrlInventoryItemRect).item +func _can_drop_data(at_position: Vector2, data) -> bool: + return data is InventoryItem + +func _drop_data(at_position: Vector2, data) -> void: + var item := (data as InventoryItem) + if is_instance_valid(item): + _on_item_dropped(item, at_position) + + +func _notification(what): + if what == NOTIFICATION_DRAG_BEGIN: + _ctrl_draggable_inventory_item.mouse_filter = Control.MOUSE_FILTER_IGNORE + elif what == NOTIFICATION_DRAG_END: + _ctrl_draggable_inventory_item.mouse_filter = Control.MOUSE_FILTER_PASS + + +func _on_item_dropped(item: InventoryItem, drop_position: Vector2) -> void: if !item: return if !is_instance_valid(item_slot): @@ -203,7 +124,8 @@ func _on_dragable_dropped(dragable: CtrlDragable, drop_position: Vector2) -> voi if _swap_items(item_slot.get_item(), item): return - item_slot.equip(item) + if item_slot.get_item() == null: + item_slot.equip(item) func _join_stacks(item_dst: InventoryItem, item_src: InventoryItem) -> bool: @@ -211,66 +133,51 @@ func _join_stacks(item_dst: InventoryItem, item_src: InventoryItem) -> bool: return false if !is_instance_valid(item_dst.get_inventory()): return false - if item_dst.get_inventory()._constraint_manager.get_stacks_constraint() == null: - return false - return StacksConstraint.join_stacks(item_dst, item_src) + return item_src.merge_into(item_dst) func _swap_items(item1: InventoryItem, item2: InventoryItem) -> bool: if item_slot.get_item() == null: return false - if item_slot is ItemRefSlot: - # No support for swapping (planning to deprecate ItemRefSlot) - return false return InventoryItem.swap(item1, item2) -func _on_any_dragable_grabbed(dragable: CtrlDragable, grab_position: Vector2): - _ctrl_drop_zone.activate() - - -func _on_any_dragable_dropped(dragable: CtrlDragable, zone: CtrlDropZone, drop_position: Vector2): - _ctrl_drop_zone.deactivate() - - -func _on_mouse_entered(): - var item = item_slot.get_item() - emit_signal("item_mouse_entered", item) - - -func _on_mouse_exited(): - var item = item_slot.get_item() - emit_signal("item_mouse_exited", item) - - -func _notification(what: int) -> void: - if what == NOTIFICATION_DRAG_END: - _ctrl_drop_zone.deactivate() - - func _refresh() -> void: _clear() if !is_instance_valid(item_slot): return - - if item_slot.get_item() == null: - return var item = item_slot.get_item() - if is_instance_valid(_label): - _label.text = item.get_property(InventoryItem.KEY_NAME, item.prototype_id) - if is_instance_valid(_ctrl_inventory_item_rect): - _ctrl_inventory_item_rect.item = item - if item.get_texture(): - _ctrl_inventory_item_rect.texture = item.get_texture() + if !is_instance_valid(item): + return + + if is_instance_valid(_ctrl_draggable_inventory_item): + _ctrl_draggable_inventory_item.item = item func _clear() -> void: - if is_instance_valid(_label): - _label.text = "" - if is_instance_valid(_ctrl_inventory_item_rect): - _ctrl_inventory_item_rect.item = null - _ctrl_inventory_item_rect.texture = default_item_icon + if is_instance_valid(_ctrl_draggable_inventory_item): + _ctrl_draggable_inventory_item.item = null + +func _set_panel_style(panel: Panel, style: StyleBox) -> void: + panel.remove_theme_stylebox_override("panel") + if style != null: + panel.add_theme_stylebox_override("panel", style) + + +func _input(event) -> void: + if event is InputEventMouseMotion: + if !is_instance_valid(_background_panel): + return + + if get_global_rect().has_point(get_global_mouse_position()) && slot_highlighted_style: + _set_panel_style(_background_panel, slot_highlighted_style) + return + + if slot_style: + _set_panel_style(_background_panel, slot_style) + else: + _background_panel.hide() diff --git a/addons/gloot/ui/ctrl_item_slot.gd.uid b/addons/gloot/ui/ctrl_item_slot.gd.uid new file mode 100644 index 0000000..5a9809a --- /dev/null +++ b/addons/gloot/ui/ctrl_item_slot.gd.uid @@ -0,0 +1 @@ +uid://lbyveer3y70s diff --git a/addons/gloot/ui/ctrl_item_slot_ex.gd b/addons/gloot/ui/ctrl_item_slot_ex.gd deleted file mode 100644 index 69b508d..0000000 --- a/addons/gloot/ui/ctrl_item_slot_ex.gd +++ /dev/null @@ -1,61 +0,0 @@ -@tool -@icon("res://addons/gloot/images/icon_ctrl_item_slot.svg") -class_name CtrlItemSlotEx -extends CtrlItemSlot - -@export var slot_style: StyleBox : - set(new_slot_style): - slot_style = new_slot_style - _refresh() -@export var slot_highlighted_style: StyleBox : - set(new_slot_highlighted_style): - slot_highlighted_style = new_slot_highlighted_style - _refresh() -var _background_panel: Panel - - -func _ready(): - super._ready() - resized.connect(func(): - if is_instance_valid(_background_panel): - _background_panel.size = size - ) - - -func _refresh() -> void: - super._refresh() - _update_background() - - -func _update_background() -> void: - if !is_instance_valid(_background_panel): - _background_panel = Panel.new() - add_child(_background_panel) - move_child(_background_panel, 0) - - _background_panel.size = size - _background_panel.show() - if slot_style: - _set_panel_style(_background_panel, slot_style) - else: - _background_panel.hide() - - -func _set_panel_style(panel: Panel, style: StyleBox) -> void: - panel.remove_theme_stylebox_override("panel") - if style != null: - panel.add_theme_stylebox_override("panel", style) - - -func _on_mouse_entered(): - if slot_highlighted_style: - _set_panel_style(_background_panel, slot_highlighted_style) - super._on_mouse_entered() - - -func _on_mouse_exited(): - if slot_style: - _set_panel_style(_background_panel, slot_style) - else: - _background_panel.hide() - super._on_mouse_exited() diff --git a/addons/label_font_auto_sizer/label_auto_sizer.gd.uid b/addons/label_font_auto_sizer/label_auto_sizer.gd.uid new file mode 100644 index 0000000..7ca07af --- /dev/null +++ b/addons/label_font_auto_sizer/label_auto_sizer.gd.uid @@ -0,0 +1 @@ +uid://bxml0kyjdhbw5 diff --git a/addons/label_font_auto_sizer/label_font_auto_size_manager.gd.uid b/addons/label_font_auto_sizer/label_font_auto_size_manager.gd.uid new file mode 100644 index 0000000..97d12ad --- /dev/null +++ b/addons/label_font_auto_sizer/label_font_auto_size_manager.gd.uid @@ -0,0 +1 @@ +uid://b0ixau067ehwl diff --git a/addons/label_font_auto_sizer/plugin.gd.uid b/addons/label_font_auto_sizer/plugin.gd.uid new file mode 100644 index 0000000..226df51 --- /dev/null +++ b/addons/label_font_auto_sizer/plugin.gd.uid @@ -0,0 +1 @@ +uid://hqbq2lltkx1n diff --git a/addons/label_font_auto_sizer/rich_label_auto_sizer.gd.uid b/addons/label_font_auto_sizer/rich_label_auto_sizer.gd.uid new file mode 100644 index 0000000..9370f4d --- /dev/null +++ b/addons/label_font_auto_sizer/rich_label_auto_sizer.gd.uid @@ -0,0 +1 @@ +uid://fv3m33cjuae8 diff --git a/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_example_scene.tscn index 5234e31..e1119a8 100644 --- a/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_example_scene.tscn @@ -1,572 +1,173 @@ -[gd_scene load_steps=12 format=3 uid="uid://ohwjxojqcj63"] +[gd_scene load_steps=12 format=4 uid="uid://ohwjxojqcj63"] [ext_resource type="Texture2D" uid="uid://c77npili4pel4" path="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png" id="1_foq54"] [ext_resource type="PackedScene" uid="uid://dg7rhrymsrrrm" path="res://addons/phantom_camera/examples/ui/ui_inventory.tscn" id="2_kmt5y"] [ext_resource type="PackedScene" uid="uid://iq5xd1ob1res" path="res://addons/phantom_camera/examples/ui/ui_sign.tscn" id="3_1cmgi"] [ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="4_4dx73"] -[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="5_w68mw"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="5_gcww2"] [ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd" id="6_i3g4f"] [ext_resource type="Resource" uid="uid://euybd2w0bax" path="res://addons/phantom_camera/examples/resources/tween/player_phantom_camera_2d_tween.tres" id="7_j2i8l"] [ext_resource type="PackedScene" uid="uid://7kh0xydx0b1o" path="res://addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn" id="8_ytjsp"] [ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd" id="9_o4c4h"] -[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"] +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_yx3lp"] texture = ExtResource("1_foq54") 0:0/0 = 0 -0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_0/angular_velocity = 0.0 -0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_1/angular_velocity = 0.0 1:0/0 = 0 -1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_0/angular_velocity = 0.0 -1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_1/angular_velocity = 0.0 2:0/0 = 0 -2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_0/angular_velocity = 0.0 -2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_1/angular_velocity = 0.0 3:0/0 = 0 -3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_0/angular_velocity = 0.0 -3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_1/angular_velocity = 0.0 4:0/0 = 0 -4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_0/angular_velocity = 0.0 -4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_1/angular_velocity = 0.0 5:0/0 = 0 -5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_0/angular_velocity = 0.0 -5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_1/angular_velocity = 0.0 6:0/0 = 0 -6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_0/angular_velocity = 0.0 -6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_1/angular_velocity = 0.0 7:0/0 = 0 -7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_0/angular_velocity = 0.0 7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_1/angular_velocity = 0.0 0:1/0 = 0 -0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_0/angular_velocity = 0.0 -0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_1/angular_velocity = 0.0 1:1/0 = 0 -1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_0/angular_velocity = 0.0 -1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_1/angular_velocity = 0.0 2:1/0 = 0 -2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_0/angular_velocity = 0.0 -2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_1/angular_velocity = 0.0 3:1/0 = 0 -3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_0/angular_velocity = 0.0 -3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_1/angular_velocity = 0.0 4:1/0 = 0 -4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_0/angular_velocity = 0.0 -4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_1/angular_velocity = 0.0 5:1/0 = 0 -5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_0/angular_velocity = 0.0 -5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_1/angular_velocity = 0.0 7:1/0 = 0 -7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_0/angular_velocity = 0.0 7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_1/angular_velocity = 0.0 2:2/0 = 0 -2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_0/angular_velocity = 0.0 -2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_1/angular_velocity = 0.0 3:2/0 = 0 -3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_0/angular_velocity = 0.0 -3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_1/angular_velocity = 0.0 4:2/0 = 0 -4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_0/angular_velocity = 0.0 -4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_1/angular_velocity = 0.0 7:2/0 = 0 -7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_0/angular_velocity = 0.0 7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_1/angular_velocity = 0.0 3:3/0 = 0 -3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_0/angular_velocity = 0.0 -3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_1/angular_velocity = 0.0 4:3/0 = 0 -4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_0/angular_velocity = 0.0 -4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_1/angular_velocity = 0.0 5:3/0 = 0 -5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_0/angular_velocity = 0.0 -5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_1/angular_velocity = 0.0 7:3/0 = 0 -7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_0/angular_velocity = 0.0 7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_1/angular_velocity = 0.0 3:4/0 = 0 -3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_0/angular_velocity = 0.0 -3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_1/angular_velocity = 0.0 4:4/0 = 0 -4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_0/angular_velocity = 0.0 -4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_1/angular_velocity = 0.0 5:4/0 = 0 -5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_0/angular_velocity = 0.0 -5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_1/angular_velocity = 0.0 7:4/0 = 0 -7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_0/angular_velocity = 0.0 -7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_1/angular_velocity = 0.0 3:5/0 = 0 -3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_0/angular_velocity = 0.0 -3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_1/angular_velocity = 0.0 4:5/0 = 0 -4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_0/angular_velocity = 0.0 -4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_1/angular_velocity = 0.0 7:5/0 = 0 -7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_0/angular_velocity = 0.0 -7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_1/angular_velocity = 0.0 3:6/0 = 0 -3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_0/angular_velocity = 0.0 -3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_1/angular_velocity = 0.0 4:6/0 = 0 -4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_0/angular_velocity = 0.0 -4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_1/angular_velocity = 0.0 7:6/0 = 0 -7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_0/angular_velocity = 0.0 -7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_1/angular_velocity = 0.0 2:7/0 = 0 -2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_0/angular_velocity = 0.0 -2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_1/angular_velocity = 0.0 3:7/0 = 0 -3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_0/angular_velocity = 0.0 -3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_1/angular_velocity = 0.0 4:7/0 = 0 -4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_0/angular_velocity = 0.0 -4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_1/angular_velocity = 0.0 5:7/0 = 0 -5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_0/angular_velocity = 0.0 -5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_1/angular_velocity = 0.0 8:0/0 = 0 -8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_0/angular_velocity = 0.0 8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_1/angular_velocity = 0.0 9:0/0 = 0 -9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_0/angular_velocity = 0.0 9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_1/angular_velocity = 0.0 10:0/0 = 0 -10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_0/angular_velocity = 0.0 10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_1/angular_velocity = 0.0 11:0/0 = 0 -11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_0/angular_velocity = 0.0 11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_1/angular_velocity = 0.0 12:0/0 = 0 -12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_0/angular_velocity = 0.0 12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_1/angular_velocity = 0.0 13:0/0 = 0 -13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_0/angular_velocity = 0.0 13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0 = 0 -14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_0/angular_velocity = 0.0 -14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) 14:0/0/custom_data_0 = &"Sign" 15:0/0 = 0 -15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_0/angular_velocity = 0.0 -15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_1/angular_velocity = 0.0 16:0/0 = 0 -16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_0/angular_velocity = 0.0 -16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_1/angular_velocity = 0.0 8:1/0 = 0 -8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_0/angular_velocity = 0.0 8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_1/angular_velocity = 0.0 9:1/0 = 0 -9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_0/angular_velocity = 0.0 9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_1/angular_velocity = 0.0 10:1/0 = 0 -10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_0/angular_velocity = 0.0 10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_1/angular_velocity = 0.0 11:1/0 = 0 -11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_0/angular_velocity = 0.0 11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_1/angular_velocity = 0.0 12:1/0 = 0 -12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_0/angular_velocity = 0.0 12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_1/angular_velocity = 0.0 13:1/0 = 0 -13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_0/angular_velocity = 0.0 13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_1/angular_velocity = 0.0 14:1/0 = 0 -14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_0/angular_velocity = 0.0 -14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_1/angular_velocity = 0.0 15:1/0 = 0 -15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_0/angular_velocity = 0.0 -15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_1/angular_velocity = 0.0 16:1/0 = 0 -16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_0/angular_velocity = 0.0 -16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_1/angular_velocity = 0.0 8:2/0 = 0 -8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_0/angular_velocity = 0.0 8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_1/angular_velocity = 0.0 9:2/0 = 0 -9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_0/angular_velocity = 0.0 9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_1/angular_velocity = 0.0 10:2/0 = 0 -10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_0/angular_velocity = 0.0 10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_1/angular_velocity = 0.0 11:2/0 = 0 -11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_0/angular_velocity = 0.0 11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_1/angular_velocity = 0.0 12:2/0 = 0 -12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_0/angular_velocity = 0.0 12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_1/angular_velocity = 0.0 13:2/0 = 0 -13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_0/angular_velocity = 0.0 13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_1/angular_velocity = 0.0 14:2/0 = 0 -14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_0/angular_velocity = 0.0 -14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_1/angular_velocity = 0.0 15:2/0 = 0 -15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_0/angular_velocity = 0.0 -15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_1/angular_velocity = 0.0 16:2/0 = 0 -16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_0/angular_velocity = 0.0 -16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_1/angular_velocity = 0.0 8:3/0 = 0 -8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_0/angular_velocity = 0.0 8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_1/angular_velocity = 0.0 9:3/0 = 0 -9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_0/angular_velocity = 0.0 9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_1/angular_velocity = 0.0 10:3/0 = 0 -10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_0/angular_velocity = 0.0 10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_1/angular_velocity = 0.0 11:3/0 = 0 -11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_0/angular_velocity = 0.0 -11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_1/angular_velocity = 0.0 12:3/0 = 0 -12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_0/angular_velocity = 0.0 12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_1/angular_velocity = 0.0 13:3/0 = 0 -13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_0/angular_velocity = 0.0 13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_1/angular_velocity = 0.0 14:3/0 = 0 -14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_0/angular_velocity = 0.0 -14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_1/angular_velocity = 0.0 15:3/0 = 0 -15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_0/angular_velocity = 0.0 -15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_1/angular_velocity = 0.0 16:3/0 = 0 -16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_0/angular_velocity = 0.0 -16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_1/angular_velocity = 0.0 8:4/0 = 0 -8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_0/angular_velocity = 0.0 -8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_1/angular_velocity = 0.0 9:4/0 = 0 -9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_0/angular_velocity = 0.0 -9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_1/angular_velocity = 0.0 10:4/0 = 0 -10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_0/angular_velocity = 0.0 -10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_1/angular_velocity = 0.0 11:4/0 = 0 -11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_0/angular_velocity = 0.0 11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8) -11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_1/angular_velocity = 0.0 12:4/0 = 0 -12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_0/angular_velocity = 0.0 12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_1/angular_velocity = 0.0 13:4/0 = 0 -13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_0/angular_velocity = 0.0 13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8) -13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0 = 0 -14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_0/angular_velocity = 0.0 -14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 14:4/0/custom_data_0 = &"Inventory" 15:4/0 = 0 -15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_0/angular_velocity = 0.0 -15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_1/angular_velocity = 0.0 16:4/0 = 0 -16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_0/angular_velocity = 0.0 -16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_1/angular_velocity = 0.0 8:5/0 = 0 -8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_0/angular_velocity = 0.0 -8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_1/angular_velocity = 0.0 9:5/0 = 0 -9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_0/angular_velocity = 0.0 -9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_1/angular_velocity = 0.0 10:5/0 = 0 -10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_0/angular_velocity = 0.0 -10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_1/angular_velocity = 0.0 11:5/0 = 0 -11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_0/angular_velocity = 0.0 11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_1/angular_velocity = 0.0 12:5/0 = 0 -12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_0/angular_velocity = 0.0 12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_1/angular_velocity = 0.0 13:5/0 = 0 -13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_0/angular_velocity = 0.0 13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_1/angular_velocity = 0.0 14:5/0 = 0 -14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_0/angular_velocity = 0.0 -14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_1/angular_velocity = 0.0 15:5/0 = 0 -15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_0/angular_velocity = 0.0 -15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_1/angular_velocity = 0.0 16:5/0 = 0 -16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_0/angular_velocity = 0.0 -16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_1/angular_velocity = 0.0 8:6/0 = 0 -8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_0/angular_velocity = 0.0 -8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_1/angular_velocity = 0.0 9:6/0 = 0 -9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_0/angular_velocity = 0.0 -9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_1/angular_velocity = 0.0 10:6/0 = 0 -10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_0/angular_velocity = 0.0 -10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_1/angular_velocity = 0.0 11:6/0 = 0 -11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_0/angular_velocity = 0.0 11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5) -11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_1/angular_velocity = 0.0 12:6/0 = 0 -12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_0/angular_velocity = 0.0 12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_1/angular_velocity = 0.0 13:6/0 = 0 -13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_0/angular_velocity = 0.0 13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8) -13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_1/angular_velocity = 0.0 14:6/0 = 0 -14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_0/angular_velocity = 0.0 -14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_1/angular_velocity = 0.0 15:6/0 = 0 -15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_0/angular_velocity = 0.0 -15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_1/angular_velocity = 0.0 16:6/0 = 0 -16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_0/angular_velocity = 0.0 -16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_1/angular_velocity = 0.0 -[sub_resource type="TileSet" id="TileSet_kf7eg"] +[sub_resource type="TileSet" id="TileSet_nawqc"] physics_layer_0/collision_layer = 1 physics_layer_1/collision_layer = 2 physics_layer_1/collision_mask = 2 custom_data_layer_0/name = "Type" custom_data_layer_0/type = 21 -sources/0 = SubResource("TileSetAtlasSource_easgx") +sources/0 = SubResource("TileSetAtlasSource_yx3lp") -[node name="ExampleScene2D2" type="Node2D"] +[node name="Root" type="Node2D"] [node name="Background" type="CanvasLayer" parent="."] layer = -3 [node name="ColorRect" type="ColorRect" parent="Background"] +auto_translate_mode = 2 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 @@ -576,20 +177,22 @@ offset_right = 981.0 offset_bottom = 548.0 grow_horizontal = 2 grow_vertical = 2 -auto_translate = false localize_numeral_system = false color = Color(0.137255, 0.14902, 0.196078, 1) -[node name="TileMap" type="TileMap" parent="."] -z_index = -1 +[node name="Pillar" type="TileMapLayer" parent="."] +use_parent_material = true scale = Vector2(3, 3) -tile_set = SubResource("TileSet_kf7eg") -format = 2 -layer_0/name = "Background" -layer_0/tile_data = PackedInt32Array(-393216, 655360, 2, -327680, 655360, 3, -262144, 655360, 3, -196608, 655360, 3, -131072, 655360, 3, -65536, 655360, 3, -393215, 720896, 2, -327679, 720896, 1, -262143, 720896, 1, -196607, 720896, 1, -131071, 720896, 1, -65535, 720896, 1, -393214, 786432, 2, -327678, 786432, 3, -262142, 786432, 3, -196606, 786432, 3, -131070, 786432, 3, -65534, 786432, 3) -layer_1/name = "Terrain" -layer_1/z_index = 1 -layer_1/tile_data = PackedInt32Array(1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1, 393225, 786432, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 458752, 1, 327681, 720896, 1, 393217, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 393218, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 393219, 720896, 1, 65540, 458752, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 393220, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 458752, 1, 327685, 720896, 1, 393221, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 393222, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 393223, 458752, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 458752, 1, 262152, 720896, 1, 327688, 720896, 1, 393224, 720896, 1, 65546, 524288, 5, 65547, 524288, 5, 65548, 524288, 5, 65549, 524288, 5, 131082, 524288, 6, 131083, 524288, 6, 131084, 524288, 6, 131085, 524288, 6, 196618, 720896, 1, 262154, 720896, 1, 196619, 720896, 1, 262155, 720896, 1, 196620, 720896, 1, 262156, 720896, 1, 196621, 720896, 1, 262157, 720896, 1, 65550, 524288, 5, 65551, 524288, 5, 65552, 524288, 5, 131086, 524288, 6, 131087, 524288, 6, 131088, 524288, 6, 196622, 720896, 1, 196623, 720896, 1, 262159, 720896, 1, 262160, 720896, 1, 196624, 720896, 1, 262158, 720896, 1, 17, 720896, 4, 65553, 720896, 5, 131089, 720896, 5, 196625, 720896, 5, 262161, 720896, 5, 18, 786432, 4, 19, 786432, 4, 20, 786432, 4, 21, 786432, 4, 22, 786432, 4, 23, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 65555, 786432, 5, 131091, 589824, 6, 196627, 786432, 5, 262163, 786432, 5, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 655360, 6, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327697, 720896, 5, 393233, 720896, 5, 327698, 589824, 6, 393234, 786432, 5, 327699, 786432, 5, 393235, 786432, 5, 327700, 786432, 5, 393236, 786432, 5, 327701, 786432, 5, 393237, 786432, 5, 327702, 786432, 5, 393238, 786432, 5, 327703, 786432, 5, 393239, 786432, 5, -131062, 720896, 4, -131061, 786432, 4, -131060, 786432, 4, -65526, 720896, 6, -65525, 786432, 6, -65524, 786432, 6, -131056, 851968, 4, -65520, 851968, 6, -131059, 786432, 4, -131058, 786432, 4, -131057, 786432, 4, -65523, 786432, 6, -65522, 786432, 6, -65521, 786432, 6, -196596, 917504, 0, -65536, 917504, 2, -65535, 983040, 2, -65534, 1048576, 2, -65533, 917504, 2, -65532, 983040, 2, -65531, 1048576, 2, -65530, 917504, 2, -65529, 983040, 2, -65528, 1048576, 2, 65535, 655360, 0, 131071, 655360, 1, 196607, 655360, 1, 262143, 655360, 1, 327679, 655360, 1, 393215, 655360, 1, 458751, 655360, 1, 524287, 655360, 1, 589823, 655360, 1, 0, 720896, 0, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 393216, 720896, 1, 458752, 720896, 1, 524288, 720896, 1, 524289, 720896, 1, 524290, 720896, 1, 524291, 720896, 1, 524292, 720896, 1, 524293, 720896, 1, 524294, 720896, 1, 524295, 720896, 1, 524296, 720896, 1, 524297, 786432, 1, 458761, 786432, 1, 458760, 720896, 1, 458759, 720896, 1, 458758, 458752, 1, 458757, 720896, 1, 458756, 720896, 1, 458755, 720896, 1, 458754, 720896, 1, 458753, 720896, 1, -262145, 851968, 4, -196609, 851968, 5, -131073, 851968, 5, -65537, 851968, 5, -1, 851968, 6, -262146, 786432, 4, -262147, 786432, 4, -196610, 589824, 6, -196611, 786432, 5, -6, 786432, 5, -5, 786432, 5, -4, 786432, 5, -3, 786432, 5, -2, 786432, 5, -65538, 786432, 5, -131074, 786432, 5, -131075, 786432, 5, -65539, 655360, 6, 65534, 851968, 5, 131070, 851968, 5, 196606, 851968, 5, 262142, 851968, 5, 327678, 851968, 5, 393214, 851968, 5, 458750, 851968, 5, 65533, 786432, 5, 65532, 786432, 5, 65531, 786432, 5, 65530, 786432, 5, 65529, 720896, 5, 131066, 786432, 5, 196602, 786432, 5, 262138, 786432, 5, 262139, 786432, 5, 327675, 786432, 5, 131068, 786432, 5, 131069, 786432, 5, 196605, 786432, 5, 262141, 786432, 5, 327677, 786432, 5, 393213, 786432, 5, 458749, 786432, 5, 393212, 786432, 5, 393211, 786432, 5, 458748, 786432, 5, 327676, 655360, 6, 262140, 786432, 5, 196604, 786432, 5, 131067, 786432, 5, 196603, 589824, 6, 458747, 786432, 5, 458746, 786432, 5, 393210, 786432, 5, 327674, 786432, 5, -7, 720896, 5, 131065, 720896, 5, 196601, 720896, 5, 262137, 720896, 5, 327673, 720896, 5, 393209, 720896, 5, 458745, 720896, 5, -327684, 720896, 3, -196594, 720896, 3, -196597, 720896, 3, -65518, 720896, 3, -65516, 720896, 3, -327686, 1048576, 5, -327685, 720896, 3, -196595, 917504, 6, -65514, 983040, 6, -327683, 983040, 5, -65513, 1048576, 5, -262151, 720896, 4, -196615, 720896, 5, -131079, 720896, 5, -65543, 720896, 5, -262150, 786432, 4, -196614, 655360, 6, -131078, 786432, 5, -65542, 786432, 5, -262149, 786432, 4, -196613, 786432, 5, -131077, 786432, 5, -65541, 786432, 5, -262148, 786432, 4, -196612, 786432, 5, -131076, 786432, 5, -65540, 786432, 5, 458769, 720896, 5, 524305, 720896, 6, 458775, 786432, 5, 458774, 786432, 5, 458773, 786432, 5, 458772, 786432, 5, 458771, 786432, 5, 458770, 786432, 5, 524306, 786432, 6, 524307, 786432, 6, 524308, 786432, 6, 524309, 786432, 6, 524310, 786432, 6, 524311, 786432, 6, 327690, 720896, 1, 393226, 720896, 1, 458762, 720896, 1, 524298, 720896, 1, 327691, 720896, 1, 393227, 720896, 1, 458763, 720896, 1, 524299, 720896, 1, 327692, 720896, 1, 393228, 720896, 1, 458764, 720896, 1, 524300, 720896, 1, 327693, 720896, 1, 393229, 720896, 1, 458765, 720896, 1, 524301, 720896, 1, 327694, 720896, 1, 393230, 720896, 1, 458766, 720896, 1, 524302, 720896, 1, 327695, 720896, 1, 393231, 720896, 1, 458767, 720896, 1, 524303, 720896, 1, 327696, 720896, 1, 393232, 720896, 1, 458768, 720896, 1, 524304, 720896, 1, 29, 851968, 4, 65565, 851968, 5, 131101, 851968, 5, 196637, 851968, 5, 262173, 851968, 5, 327709, 851968, 5, 393245, 851968, 5, 458781, 851968, 5, 524317, 851968, 6, -65511, 917504, 4, 24, 786432, 4, 25, 786432, 4, 26, 786432, 4, 27, 786432, 4, 28, 786432, 4, 65560, 786432, 5, 65561, 786432, 5, 65562, 786432, 5, 65563, 786432, 5, 65564, 786432, 5, 131100, 786432, 5, 196636, 589824, 6, 131099, 786432, 5, 131098, 786432, 5, 131097, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 393240, 786432, 5, 458776, 786432, 5, 524312, 786432, 6, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 393241, 786432, 5, 458777, 786432, 5, 524313, 786432, 6, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 393242, 655360, 6, 458778, 786432, 5, 524314, 786432, 6, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, 393243, 786432, 5, 458779, 786432, 5, 524315, 786432, 6, 262172, 786432, 5, 327708, 786432, 5, 393244, 786432, 5, 458780, 786432, 5, 524316, 786432, 6, -196593, 1048576, 6, -393182, 1048576, 6, -393185, 917504, 6, -393180, 983040, 6, -393184, 983040, 5, -65509, 720896, 3, -65510, 720896, 3, -393181, 720896, 3, -393183, 720896, 3, -65517, 720896, 3, -65515, 720896, 3, -327650, 720896, 4, -262114, 720896, 5, -196578, 720896, 5, -131042, 720896, 5, -65506, 720896, 5, -65498, 851968, 5, -131034, 851968, 5, -196570, 851968, 5, -327642, 851968, 4, -327649, 786432, 4, -327648, 786432, 4, -327647, 786432, 4, -327646, 786432, 4, -327645, 786432, 4, -327644, 786432, 4, -327643, 786432, 4, -262106, 851968, 5, -65499, 786432, 5, -131035, 786432, 5, -196571, 786432, 5, -262107, 786432, 5, -262108, 786432, 5, -262109, 786432, 5, -262110, 786432, 5, -262111, 786432, 5, -262112, 786432, 5, -262113, 786432, 5, -196577, 655360, 6, -131041, 786432, 5, -65505, 786432, 5, -65500, 655360, 6, -131036, 589824, 6, -196572, 786432, 5, -196573, 786432, 5, -196574, 786432, 5, -196575, 786432, 5, -196576, 786432, 5, -131040, 589824, 6, -65504, 786432, 5, -65501, 786432, 5, -131037, 786432, 5, -131038, 786432, 5, -131039, 786432, 5, -65503, 786432, 5, -65502, 786432, 5, 524318, 720896, 6, 458782, 720896, 5, 393246, 720896, 5, 327710, 720896, 5, 262174, 720896, 5, 196638, 720896, 5, 131102, 720896, 5, 65566, 720896, 5, 30, 720896, 5, 524319, 786432, 6, 524320, 786432, 6, 524321, 786432, 6, 524322, 786432, 6, 524323, 786432, 6, 524324, 786432, 6, 524325, 786432, 6, 524326, 851968, 6, 38, 851968, 5, 65574, 851968, 5, 131110, 851968, 5, 196646, 851968, 5, 262182, 851968, 5, 327718, 851968, 5, 393254, 851968, 5, 458790, 851968, 5, 31, 786432, 5, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 393247, 655360, 6, 458783, 786432, 5, 32, 786432, 5, 65568, 786432, 5, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 393248, 786432, 5, 458784, 786432, 5, 33, 786432, 5, 65569, 786432, 5, 131105, 655360, 6, 196641, 786432, 5, 262177, 786432, 5, 327713, 786432, 5, 393249, 786432, 5, 458785, 786432, 5, 34, 786432, 5, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 655360, 6, 327714, 655360, 6, 393250, 786432, 5, 458786, 786432, 5, 35, 786432, 5, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 393251, 786432, 5, 458787, 786432, 5, 36, 655360, 6, 65572, 786432, 5, 131108, 786432, 5, 196644, 786432, 5, 262180, 786432, 5, 327716, 786432, 5, 393252, 786432, 5, 458788, 655360, 6, 37, 786432, 5, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 786432, 5, 327717, 786432, 5, 393253, 786432, 5, 458789, 786432, 5, 524282, 786432, 5, 524283, 786432, 5, 524284, 786432, 5, 524285, 786432, 5, 524281, 720896, 5, 524286, 851968, 5, 589817, 720896, 6, 589818, 786432, 6, 589819, 786432, 6, 589820, 786432, 6, 589821, 786432, 6, 589822, 851968, 6) +tile_map_data = PackedByteArray("AAAAAPr/AAAKAAIAAAAAAPv/AAAKAAMAAAAAAPz/AAAKAAMAAAAAAP3/AAAKAAMAAAAAAP7/AAAKAAMAAAAAAP//AAAKAAMAAAABAPr/AAALAAIAAAABAPv/AAALAAEAAAABAPz/AAALAAEAAAABAP3/AAALAAEAAAABAP7/AAALAAEAAAABAP//AAALAAEAAAACAPr/AAAMAAIAAAACAPv/AAAMAAMAAAACAPz/AAAMAAMAAAACAP3/AAAMAAMAAAACAP7/AAAMAAMAAAACAP//AAAMAAMAAAA=") +tile_set = SubResource("TileSet_nawqc") +collision_enabled = false +navigation_enabled = false + +[node name="Terrain" type="TileMapLayer" parent="."] +use_parent_material = true +scale = Vector2(3, 3) +tile_map_data = PackedByteArray("AAABAAAAAAALAAAAAAACAAAAAAALAAAAAAADAAAAAAALAAAAAAAEAAAAAAALAAAAAAAFAAAAAAALAAAAAAAGAAAAAAALAAAAAAAHAAAAAAALAAAAAAAIAAAAAAALAAAAAAAJAAAAAAAMAAAAAAAJAAEAAAAMAAEAAAAJAAIAAAAMAAEAAAAJAAMAAAAMAAEAAAAJAAQAAAAMAAEAAAAJAAUAAAAMAAEAAAAJAAYAAAAMAAEAAAABAAEAAAALAAEAAAABAAIAAAALAAEAAAABAAMAAAALAAEAAAABAAQAAAAHAAEAAAABAAUAAAALAAEAAAABAAYAAAALAAEAAAACAAEAAAALAAEAAAACAAIAAAALAAEAAAACAAMAAAALAAEAAAACAAQAAAALAAEAAAACAAUAAAALAAEAAAACAAYAAAALAAEAAAADAAEAAAALAAEAAAADAAIAAAALAAEAAAADAAMAAAALAAEAAAADAAQAAAALAAEAAAADAAUAAAALAAEAAAADAAYAAAALAAEAAAAEAAEAAAAHAAEAAAAEAAIAAAALAAEAAAAEAAMAAAALAAEAAAAEAAQAAAALAAEAAAAEAAUAAAALAAEAAAAEAAYAAAALAAEAAAAFAAEAAAALAAEAAAAFAAIAAAALAAEAAAAFAAMAAAALAAEAAAAFAAQAAAAHAAEAAAAFAAUAAAALAAEAAAAFAAYAAAALAAEAAAAGAAEAAAALAAEAAAAGAAIAAAALAAEAAAAGAAMAAAALAAEAAAAGAAQAAAALAAEAAAAGAAUAAAALAAEAAAAGAAYAAAALAAEAAAAHAAEAAAALAAEAAAAHAAIAAAALAAEAAAAHAAMAAAALAAEAAAAHAAQAAAALAAEAAAAHAAUAAAALAAEAAAAHAAYAAAAHAAEAAAAIAAEAAAALAAEAAAAIAAIAAAALAAEAAAAIAAMAAAAHAAEAAAAIAAQAAAALAAEAAAAIAAUAAAALAAEAAAAIAAYAAAALAAEAAAAKAAEAAAAIAAUAAAALAAEAAAAIAAUAAAAMAAEAAAAIAAUAAAANAAEAAAAIAAUAAAAKAAIAAAAIAAYAAAALAAIAAAAIAAYAAAAMAAIAAAAIAAYAAAANAAIAAAAIAAYAAAAKAAMAAAALAAEAAAAKAAQAAAALAAEAAAALAAMAAAALAAEAAAALAAQAAAALAAEAAAAMAAMAAAALAAEAAAAMAAQAAAALAAEAAAANAAMAAAALAAEAAAANAAQAAAALAAEAAAAOAAEAAAAIAAUAAAAPAAEAAAAIAAUAAAAQAAEAAAAIAAUAAAAOAAIAAAAIAAYAAAAPAAIAAAAIAAYAAAAQAAIAAAAIAAYAAAAOAAMAAAALAAEAAAAPAAMAAAALAAEAAAAPAAQAAAALAAEAAAAQAAQAAAALAAEAAAAQAAMAAAALAAEAAAAOAAQAAAALAAEAAAARAAAAAAALAAQAAAARAAEAAAALAAUAAAARAAIAAAALAAUAAAARAAMAAAALAAUAAAARAAQAAAALAAUAAAASAAAAAAAMAAQAAAATAAAAAAAMAAQAAAAUAAAAAAAMAAQAAAAVAAAAAAAMAAQAAAAWAAAAAAAMAAQAAAAXAAAAAAAMAAQAAAASAAEAAAAMAAUAAAASAAIAAAAMAAUAAAASAAMAAAAMAAUAAAASAAQAAAAMAAUAAAATAAEAAAAMAAUAAAATAAIAAAAJAAYAAAATAAMAAAAMAAUAAAATAAQAAAAMAAUAAAAUAAEAAAAMAAUAAAAUAAIAAAAMAAUAAAAUAAMAAAAMAAUAAAAUAAQAAAAMAAUAAAAVAAEAAAAMAAUAAAAVAAIAAAAMAAUAAAAVAAMAAAAMAAUAAAAVAAQAAAAMAAUAAAAWAAEAAAAMAAUAAAAWAAIAAAAMAAUAAAAWAAMAAAAMAAUAAAAWAAQAAAAKAAYAAAAXAAEAAAAMAAUAAAAXAAIAAAAMAAUAAAAXAAMAAAAMAAUAAAAXAAQAAAAMAAUAAAARAAUAAAALAAUAAAARAAYAAAALAAUAAAASAAUAAAAJAAYAAAASAAYAAAAMAAUAAAATAAUAAAAMAAUAAAATAAYAAAAMAAUAAAAUAAUAAAAMAAUAAAAUAAYAAAAMAAUAAAAVAAUAAAAMAAUAAAAVAAYAAAAMAAUAAAAWAAUAAAAMAAUAAAAWAAYAAAAMAAUAAAAXAAUAAAAMAAUAAAAXAAYAAAAMAAUAAAAKAP7/AAALAAQAAAALAP7/AAAMAAQAAAAMAP7/AAAMAAQAAAAKAP//AAALAAYAAAALAP//AAAMAAYAAAAMAP//AAAMAAYAAAAQAP7/AAANAAQAAAAQAP//AAANAAYAAAANAP7/AAAMAAQAAAAOAP7/AAAMAAQAAAAPAP7/AAAMAAQAAAANAP//AAAMAAYAAAAOAP//AAAMAAYAAAAPAP//AAAMAAYAAAAMAP3/AAAOAAAAAAADAP//AAAOAAIAAAAEAP//AAAPAAIAAAAFAP//AAAQAAIAAAAGAP//AAAOAAIAAAAHAP//AAAPAAIAAAAIAP//AAAQAAIAAAD//wAAAAAKAAAAAAD//wEAAAAKAAEAAAD//wIAAAAKAAEAAAD//wMAAAAKAAEAAAD//wQAAAAKAAEAAAD//wUAAAAKAAEAAAD//wYAAAAKAAEAAAD//wcAAAAKAAEAAAD//wgAAAAKAAEAAAAAAAAAAAALAAAAAAAAAAEAAAALAAEAAAAAAAIAAAALAAEAAAAAAAMAAAALAAEAAAAAAAQAAAALAAEAAAAAAAUAAAALAAEAAAAAAAYAAAALAAEAAAAAAAcAAAALAAEAAAAAAAgAAAALAAEAAAABAAgAAAALAAEAAAACAAgAAAALAAEAAAADAAgAAAALAAEAAAAEAAgAAAALAAEAAAAFAAgAAAALAAEAAAAGAAgAAAALAAEAAAAHAAgAAAALAAEAAAAIAAgAAAALAAEAAAAJAAgAAAAMAAEAAAAJAAcAAAAMAAEAAAAIAAcAAAALAAEAAAAHAAcAAAALAAEAAAAGAAcAAAAHAAEAAAAFAAcAAAALAAEAAAAEAAcAAAALAAEAAAADAAcAAAALAAEAAAACAAcAAAALAAEAAAABAAcAAAALAAEAAAD///v/AAANAAQAAAD///z/AAANAAUAAAD///3/AAANAAUAAAD///7/AAANAAUAAAD/////AAANAAYAAAD+//v/AAAMAAQAAAD9//v/AAAMAAQAAAD+//z/AAAJAAYAAAD9//z/AAAMAAUAAAD6////AAAMAAUAAAD7////AAAMAAUAAAD8////AAAMAAUAAAD9////AAAMAAUAAAD+////AAAMAAUAAAD+//7/AAAMAAUAAAD+//3/AAAMAAUAAAD9//3/AAAMAAUAAAD9//7/AAAKAAYAAAD+/wAAAAANAAUAAAD+/wEAAAANAAUAAAD+/wIAAAANAAUAAAD+/wMAAAANAAUAAAD+/wQAAAANAAUAAAD+/wUAAAANAAUAAAD+/wYAAAANAAUAAAD9/wAAAAAMAAUAAAD8/wAAAAAMAAUAAAD7/wAAAAAMAAUAAAD6/wAAAAAMAAUAAAD5/wAAAAALAAUAAAD6/wEAAAAMAAUAAAD6/wIAAAAMAAUAAAD6/wMAAAAMAAUAAAD7/wMAAAAMAAUAAAD7/wQAAAAMAAUAAAD8/wEAAAAMAAUAAAD9/wEAAAAMAAUAAAD9/wIAAAAMAAUAAAD9/wMAAAAMAAUAAAD9/wQAAAAMAAUAAAD9/wUAAAAMAAUAAAD9/wYAAAAMAAUAAAD8/wUAAAAMAAUAAAD7/wUAAAAMAAUAAAD8/wYAAAAMAAUAAAD8/wQAAAAKAAYAAAD8/wMAAAAMAAUAAAD8/wIAAAAMAAUAAAD7/wEAAAAMAAUAAAD7/wIAAAAJAAYAAAD7/wYAAAAMAAUAAAD6/wYAAAAMAAUAAAD6/wUAAAAMAAUAAAD6/wQAAAAMAAUAAAD5////AAALAAUAAAD5/wEAAAALAAUAAAD5/wIAAAALAAUAAAD5/wMAAAALAAUAAAD5/wQAAAALAAUAAAD5/wUAAAALAAUAAAD5/wYAAAALAAUAAAD8//r/AAALAAMAAAAOAP3/AAALAAMAAAALAP3/AAALAAMAAAASAP//AAALAAMAAAAUAP//AAALAAMAAAD6//r/AAAQAAUAAAD7//r/AAALAAMAAAANAP3/AAAOAAYAAAAWAP//AAAPAAYAAAD9//r/AAAPAAUAAAAXAP//AAAQAAUAAAD5//v/AAALAAQAAAD5//z/AAALAAUAAAD5//3/AAALAAUAAAD5//7/AAALAAUAAAD6//v/AAAMAAQAAAD6//z/AAAKAAYAAAD6//3/AAAMAAUAAAD6//7/AAAMAAUAAAD7//v/AAAMAAQAAAD7//z/AAAMAAUAAAD7//3/AAAMAAUAAAD7//7/AAAMAAUAAAD8//v/AAAMAAQAAAD8//z/AAAMAAUAAAD8//3/AAAMAAUAAAD8//7/AAAMAAUAAAARAAcAAAALAAUAAAARAAgAAAALAAYAAAAXAAcAAAAMAAUAAAAWAAcAAAAMAAUAAAAVAAcAAAAMAAUAAAAUAAcAAAAMAAUAAAATAAcAAAAMAAUAAAASAAcAAAAMAAUAAAASAAgAAAAMAAYAAAATAAgAAAAMAAYAAAAUAAgAAAAMAAYAAAAVAAgAAAAMAAYAAAAWAAgAAAAMAAYAAAAXAAgAAAAMAAYAAAAKAAUAAAALAAEAAAAKAAYAAAALAAEAAAAKAAcAAAALAAEAAAAKAAgAAAALAAEAAAALAAUAAAALAAEAAAALAAYAAAALAAEAAAALAAcAAAALAAEAAAALAAgAAAALAAEAAAAMAAUAAAALAAEAAAAMAAYAAAALAAEAAAAMAAcAAAALAAEAAAAMAAgAAAALAAEAAAANAAUAAAALAAEAAAANAAYAAAALAAEAAAANAAcAAAALAAEAAAANAAgAAAALAAEAAAAOAAUAAAALAAEAAAAOAAYAAAALAAEAAAAOAAcAAAALAAEAAAAOAAgAAAALAAEAAAAPAAUAAAALAAEAAAAPAAYAAAALAAEAAAAPAAcAAAALAAEAAAAPAAgAAAALAAEAAAAQAAUAAAALAAEAAAAQAAYAAAALAAEAAAAQAAcAAAALAAEAAAAQAAgAAAALAAEAAAAdAAAAAAANAAQAAAAdAAEAAAANAAUAAAAdAAIAAAANAAUAAAAdAAMAAAANAAUAAAAdAAQAAAANAAUAAAAdAAUAAAANAAUAAAAdAAYAAAANAAUAAAAdAAcAAAANAAUAAAAdAAgAAAANAAYAAAAZAP//AAAOAAQAAAAYAAAAAAAMAAQAAAAZAAAAAAAMAAQAAAAaAAAAAAAMAAQAAAAbAAAAAAAMAAQAAAAcAAAAAAAMAAQAAAAYAAEAAAAMAAUAAAAZAAEAAAAMAAUAAAAaAAEAAAAMAAUAAAAbAAEAAAAMAAUAAAAcAAEAAAAMAAUAAAAcAAIAAAAMAAUAAAAcAAMAAAAJAAYAAAAbAAIAAAAMAAUAAAAaAAIAAAAMAAUAAAAZAAIAAAAMAAUAAAAYAAIAAAAMAAUAAAAYAAMAAAAMAAUAAAAYAAQAAAAMAAUAAAAYAAUAAAAMAAUAAAAYAAYAAAAMAAUAAAAYAAcAAAAMAAUAAAAYAAgAAAAMAAYAAAAZAAMAAAAMAAUAAAAZAAQAAAAMAAUAAAAZAAUAAAAMAAUAAAAZAAYAAAAMAAUAAAAZAAcAAAAMAAUAAAAZAAgAAAAMAAYAAAAaAAMAAAAMAAUAAAAaAAQAAAAMAAUAAAAaAAUAAAAMAAUAAAAaAAYAAAAKAAYAAAAaAAcAAAAMAAUAAAAaAAgAAAAMAAYAAAAbAAMAAAAMAAUAAAAbAAQAAAAMAAUAAAAbAAUAAAAMAAUAAAAbAAYAAAAMAAUAAAAbAAcAAAAMAAUAAAAbAAgAAAAMAAYAAAAcAAQAAAAMAAUAAAAcAAUAAAAMAAUAAAAcAAYAAAAMAAUAAAAcAAcAAAAMAAUAAAAcAAgAAAAMAAYAAAAPAP3/AAAQAAYAAAAiAPr/AAAQAAYAAAAfAPr/AAAOAAYAAAAkAPr/AAAPAAYAAAAgAPr/AAAPAAUAAAAbAP//AAALAAMAAAAaAP//AAALAAMAAAAjAPr/AAALAAMAAAAhAPr/AAALAAMAAAATAP//AAALAAMAAAAVAP//AAALAAMAAAAeAPv/AAALAAQAAAAeAPz/AAALAAUAAAAeAP3/AAALAAUAAAAeAP7/AAALAAUAAAAeAP//AAALAAUAAAAmAP//AAANAAUAAAAmAP7/AAANAAUAAAAmAP3/AAANAAUAAAAmAPv/AAANAAQAAAAfAPv/AAAMAAQAAAAgAPv/AAAMAAQAAAAhAPv/AAAMAAQAAAAiAPv/AAAMAAQAAAAjAPv/AAAMAAQAAAAkAPv/AAAMAAQAAAAlAPv/AAAMAAQAAAAmAPz/AAANAAUAAAAlAP//AAAMAAUAAAAlAP7/AAAMAAUAAAAlAP3/AAAMAAUAAAAlAPz/AAAMAAUAAAAkAPz/AAAMAAUAAAAjAPz/AAAMAAUAAAAiAPz/AAAMAAUAAAAhAPz/AAAMAAUAAAAgAPz/AAAMAAUAAAAfAPz/AAAMAAUAAAAfAP3/AAAKAAYAAAAfAP7/AAAMAAUAAAAfAP//AAAMAAUAAAAkAP//AAAKAAYAAAAkAP7/AAAJAAYAAAAkAP3/AAAMAAUAAAAjAP3/AAAMAAUAAAAiAP3/AAAMAAUAAAAhAP3/AAAMAAUAAAAgAP3/AAAMAAUAAAAgAP7/AAAJAAYAAAAgAP//AAAMAAUAAAAjAP//AAAMAAUAAAAjAP7/AAAMAAUAAAAiAP7/AAAMAAUAAAAhAP7/AAAMAAUAAAAhAP//AAAMAAUAAAAiAP//AAAMAAUAAAAeAAgAAAALAAYAAAAeAAcAAAALAAUAAAAeAAYAAAALAAUAAAAeAAUAAAALAAUAAAAeAAQAAAALAAUAAAAeAAMAAAALAAUAAAAeAAIAAAALAAUAAAAeAAEAAAALAAUAAAAeAAAAAAALAAUAAAAfAAgAAAAMAAYAAAAgAAgAAAAMAAYAAAAhAAgAAAAMAAYAAAAiAAgAAAAMAAYAAAAjAAgAAAAMAAYAAAAkAAgAAAAMAAYAAAAlAAgAAAAMAAYAAAAmAAgAAAANAAYAAAAmAAAAAAANAAUAAAAmAAEAAAANAAUAAAAmAAIAAAANAAUAAAAmAAMAAAANAAUAAAAmAAQAAAANAAUAAAAmAAUAAAANAAUAAAAmAAYAAAANAAUAAAAmAAcAAAANAAUAAAAfAAAAAAAMAAUAAAAfAAEAAAAMAAUAAAAfAAIAAAAMAAUAAAAfAAMAAAAMAAUAAAAfAAQAAAAMAAUAAAAfAAUAAAAMAAUAAAAfAAYAAAAKAAYAAAAfAAcAAAAMAAUAAAAgAAAAAAAMAAUAAAAgAAEAAAAMAAUAAAAgAAIAAAAMAAUAAAAgAAMAAAAMAAUAAAAgAAQAAAAMAAUAAAAgAAUAAAAMAAUAAAAgAAYAAAAMAAUAAAAgAAcAAAAMAAUAAAAhAAAAAAAMAAUAAAAhAAEAAAAMAAUAAAAhAAIAAAAKAAYAAAAhAAMAAAAMAAUAAAAhAAQAAAAMAAUAAAAhAAUAAAAMAAUAAAAhAAYAAAAMAAUAAAAhAAcAAAAMAAUAAAAiAAAAAAAMAAUAAAAiAAEAAAAMAAUAAAAiAAIAAAAMAAUAAAAiAAMAAAAMAAUAAAAiAAQAAAAKAAYAAAAiAAUAAAAKAAYAAAAiAAYAAAAMAAUAAAAiAAcAAAAMAAUAAAAjAAAAAAAMAAUAAAAjAAEAAAAMAAUAAAAjAAIAAAAMAAUAAAAjAAMAAAAMAAUAAAAjAAQAAAAMAAUAAAAjAAUAAAAMAAUAAAAjAAYAAAAMAAUAAAAjAAcAAAAMAAUAAAAkAAAAAAAKAAYAAAAkAAEAAAAMAAUAAAAkAAIAAAAMAAUAAAAkAAMAAAAMAAUAAAAkAAQAAAAMAAUAAAAkAAUAAAAMAAUAAAAkAAYAAAAMAAUAAAAkAAcAAAAKAAYAAAAlAAAAAAAMAAUAAAAlAAEAAAAMAAUAAAAlAAIAAAAMAAUAAAAlAAMAAAAMAAUAAAAlAAQAAAAMAAUAAAAlAAUAAAAMAAUAAAAlAAYAAAAMAAUAAAAlAAcAAAAMAAUAAAD6/wcAAAAMAAUAAAD7/wcAAAAMAAUAAAD8/wcAAAAMAAUAAAD9/wcAAAAMAAUAAAD5/wcAAAALAAUAAAD+/wcAAAANAAUAAAD5/wgAAAALAAYAAAD6/wgAAAAMAAYAAAD7/wgAAAAMAAYAAAD8/wgAAAAMAAYAAAD9/wgAAAAMAAYAAAD+/wgAAAANAAYAAAA=") +tile_set = SubResource("TileSet_nawqc") [node name="UI" type="CanvasLayer" parent="."] @@ -612,18 +215,23 @@ text = "[WASD] to move [Space] to jump" [node name="Camera2D" type="Camera2D" parent="."] +physics_interpolation_mode = 1 position = Vector2(227, -28) zoom = Vector2(1.5, 1.5) +process_callback = 0 editor_draw_limits = true [node name="PhantomCameraHost" type="Node" parent="Camera2D"] -script = ExtResource("5_w68mw") +process_priority = 300 +process_physics_priority = 300 +script = ExtResource("5_gcww2") [node name="Player" type="Node" parent="."] [node name="PlayerPhantomCamera2D" type="Node2D" parent="Player" node_paths=PackedStringArray("follow_target")] unique_name_in_owner = true process_priority = -1 +top_level = true position = Vector2(227, -28) script = ExtResource("6_i3g4f") priority = 10 diff --git a/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_framed_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_framed_example_scene.tscn index df284df..48f31c7 100644 --- a/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_framed_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_framed_example_scene.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=12 format=3 uid="uid://dg1tuoxd3b4tw"] +[gd_scene load_steps=12 format=4 uid="uid://dg1tuoxd3b4tw"] [ext_resource type="Texture2D" uid="uid://c77npili4pel4" path="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png" id="1_nf5bo"] [ext_resource type="PackedScene" uid="uid://dg7rhrymsrrrm" path="res://addons/phantom_camera/examples/ui/ui_inventory.tscn" id="2_5oggv"] @@ -10,563 +10,164 @@ [ext_resource type="PackedScene" uid="uid://7kh0xydx0b1o" path="res://addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn" id="8_i4m1d"] [ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd" id="9_m3lnd"] -[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"] +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_dpuou"] texture = ExtResource("1_nf5bo") 0:0/0 = 0 -0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_0/angular_velocity = 0.0 -0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_1/angular_velocity = 0.0 1:0/0 = 0 -1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_0/angular_velocity = 0.0 -1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_1/angular_velocity = 0.0 2:0/0 = 0 -2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_0/angular_velocity = 0.0 -2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_1/angular_velocity = 0.0 3:0/0 = 0 -3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_0/angular_velocity = 0.0 -3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_1/angular_velocity = 0.0 4:0/0 = 0 -4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_0/angular_velocity = 0.0 -4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_1/angular_velocity = 0.0 5:0/0 = 0 -5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_0/angular_velocity = 0.0 -5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_1/angular_velocity = 0.0 6:0/0 = 0 -6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_0/angular_velocity = 0.0 -6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_1/angular_velocity = 0.0 7:0/0 = 0 -7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_0/angular_velocity = 0.0 7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_1/angular_velocity = 0.0 0:1/0 = 0 -0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_0/angular_velocity = 0.0 -0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_1/angular_velocity = 0.0 1:1/0 = 0 -1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_0/angular_velocity = 0.0 -1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_1/angular_velocity = 0.0 2:1/0 = 0 -2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_0/angular_velocity = 0.0 -2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_1/angular_velocity = 0.0 3:1/0 = 0 -3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_0/angular_velocity = 0.0 -3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_1/angular_velocity = 0.0 4:1/0 = 0 -4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_0/angular_velocity = 0.0 -4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_1/angular_velocity = 0.0 5:1/0 = 0 -5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_0/angular_velocity = 0.0 -5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_1/angular_velocity = 0.0 7:1/0 = 0 -7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_0/angular_velocity = 0.0 7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_1/angular_velocity = 0.0 2:2/0 = 0 -2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_0/angular_velocity = 0.0 -2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_1/angular_velocity = 0.0 3:2/0 = 0 -3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_0/angular_velocity = 0.0 -3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_1/angular_velocity = 0.0 4:2/0 = 0 -4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_0/angular_velocity = 0.0 -4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_1/angular_velocity = 0.0 7:2/0 = 0 -7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_0/angular_velocity = 0.0 7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_1/angular_velocity = 0.0 3:3/0 = 0 -3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_0/angular_velocity = 0.0 -3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_1/angular_velocity = 0.0 4:3/0 = 0 -4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_0/angular_velocity = 0.0 -4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_1/angular_velocity = 0.0 5:3/0 = 0 -5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_0/angular_velocity = 0.0 -5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_1/angular_velocity = 0.0 7:3/0 = 0 -7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_0/angular_velocity = 0.0 7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_1/angular_velocity = 0.0 3:4/0 = 0 -3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_0/angular_velocity = 0.0 -3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_1/angular_velocity = 0.0 4:4/0 = 0 -4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_0/angular_velocity = 0.0 -4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_1/angular_velocity = 0.0 5:4/0 = 0 -5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_0/angular_velocity = 0.0 -5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_1/angular_velocity = 0.0 7:4/0 = 0 -7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_0/angular_velocity = 0.0 -7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_1/angular_velocity = 0.0 3:5/0 = 0 -3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_0/angular_velocity = 0.0 -3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_1/angular_velocity = 0.0 4:5/0 = 0 -4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_0/angular_velocity = 0.0 -4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_1/angular_velocity = 0.0 7:5/0 = 0 -7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_0/angular_velocity = 0.0 -7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_1/angular_velocity = 0.0 3:6/0 = 0 -3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_0/angular_velocity = 0.0 -3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_1/angular_velocity = 0.0 4:6/0 = 0 -4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_0/angular_velocity = 0.0 -4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_1/angular_velocity = 0.0 7:6/0 = 0 -7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_0/angular_velocity = 0.0 -7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_1/angular_velocity = 0.0 2:7/0 = 0 -2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_0/angular_velocity = 0.0 -2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_1/angular_velocity = 0.0 3:7/0 = 0 -3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_0/angular_velocity = 0.0 -3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_1/angular_velocity = 0.0 4:7/0 = 0 -4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_0/angular_velocity = 0.0 -4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_1/angular_velocity = 0.0 5:7/0 = 0 -5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_0/angular_velocity = 0.0 -5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_1/angular_velocity = 0.0 8:0/0 = 0 -8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_0/angular_velocity = 0.0 8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_1/angular_velocity = 0.0 9:0/0 = 0 -9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_0/angular_velocity = 0.0 9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_1/angular_velocity = 0.0 10:0/0 = 0 -10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_0/angular_velocity = 0.0 10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_1/angular_velocity = 0.0 11:0/0 = 0 -11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_0/angular_velocity = 0.0 11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_1/angular_velocity = 0.0 12:0/0 = 0 -12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_0/angular_velocity = 0.0 12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_1/angular_velocity = 0.0 13:0/0 = 0 -13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_0/angular_velocity = 0.0 13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0 = 0 -14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_0/angular_velocity = 0.0 -14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) 14:0/0/custom_data_0 = &"Sign" 15:0/0 = 0 -15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_0/angular_velocity = 0.0 -15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_1/angular_velocity = 0.0 16:0/0 = 0 -16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_0/angular_velocity = 0.0 -16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_1/angular_velocity = 0.0 8:1/0 = 0 -8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_0/angular_velocity = 0.0 8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_1/angular_velocity = 0.0 9:1/0 = 0 -9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_0/angular_velocity = 0.0 9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_1/angular_velocity = 0.0 10:1/0 = 0 -10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_0/angular_velocity = 0.0 10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_1/angular_velocity = 0.0 11:1/0 = 0 -11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_0/angular_velocity = 0.0 11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_1/angular_velocity = 0.0 12:1/0 = 0 -12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_0/angular_velocity = 0.0 12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_1/angular_velocity = 0.0 13:1/0 = 0 -13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_0/angular_velocity = 0.0 13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_1/angular_velocity = 0.0 14:1/0 = 0 -14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_0/angular_velocity = 0.0 -14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_1/angular_velocity = 0.0 15:1/0 = 0 -15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_0/angular_velocity = 0.0 -15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_1/angular_velocity = 0.0 16:1/0 = 0 -16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_0/angular_velocity = 0.0 -16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_1/angular_velocity = 0.0 8:2/0 = 0 -8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_0/angular_velocity = 0.0 8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_1/angular_velocity = 0.0 9:2/0 = 0 -9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_0/angular_velocity = 0.0 9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_1/angular_velocity = 0.0 10:2/0 = 0 -10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_0/angular_velocity = 0.0 10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_1/angular_velocity = 0.0 11:2/0 = 0 -11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_0/angular_velocity = 0.0 11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_1/angular_velocity = 0.0 12:2/0 = 0 -12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_0/angular_velocity = 0.0 12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_1/angular_velocity = 0.0 13:2/0 = 0 -13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_0/angular_velocity = 0.0 13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_1/angular_velocity = 0.0 14:2/0 = 0 -14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_0/angular_velocity = 0.0 -14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_1/angular_velocity = 0.0 15:2/0 = 0 -15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_0/angular_velocity = 0.0 -15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_1/angular_velocity = 0.0 16:2/0 = 0 -16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_0/angular_velocity = 0.0 -16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_1/angular_velocity = 0.0 8:3/0 = 0 -8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_0/angular_velocity = 0.0 8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_1/angular_velocity = 0.0 9:3/0 = 0 -9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_0/angular_velocity = 0.0 9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_1/angular_velocity = 0.0 10:3/0 = 0 -10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_0/angular_velocity = 0.0 10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_1/angular_velocity = 0.0 11:3/0 = 0 -11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_0/angular_velocity = 0.0 -11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_1/angular_velocity = 0.0 12:3/0 = 0 -12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_0/angular_velocity = 0.0 12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_1/angular_velocity = 0.0 13:3/0 = 0 -13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_0/angular_velocity = 0.0 13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_1/angular_velocity = 0.0 14:3/0 = 0 -14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_0/angular_velocity = 0.0 -14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_1/angular_velocity = 0.0 15:3/0 = 0 -15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_0/angular_velocity = 0.0 -15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_1/angular_velocity = 0.0 16:3/0 = 0 -16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_0/angular_velocity = 0.0 -16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_1/angular_velocity = 0.0 8:4/0 = 0 -8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_0/angular_velocity = 0.0 -8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_1/angular_velocity = 0.0 9:4/0 = 0 -9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_0/angular_velocity = 0.0 -9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_1/angular_velocity = 0.0 10:4/0 = 0 -10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_0/angular_velocity = 0.0 -10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_1/angular_velocity = 0.0 11:4/0 = 0 -11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_0/angular_velocity = 0.0 11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8) -11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_1/angular_velocity = 0.0 12:4/0 = 0 -12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_0/angular_velocity = 0.0 12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_1/angular_velocity = 0.0 13:4/0 = 0 -13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_0/angular_velocity = 0.0 13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8) -13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0 = 0 -14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_0/angular_velocity = 0.0 -14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 14:4/0/custom_data_0 = &"Inventory" 15:4/0 = 0 -15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_0/angular_velocity = 0.0 -15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_1/angular_velocity = 0.0 16:4/0 = 0 -16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_0/angular_velocity = 0.0 -16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_1/angular_velocity = 0.0 8:5/0 = 0 -8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_0/angular_velocity = 0.0 -8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_1/angular_velocity = 0.0 9:5/0 = 0 -9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_0/angular_velocity = 0.0 -9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_1/angular_velocity = 0.0 10:5/0 = 0 -10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_0/angular_velocity = 0.0 -10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_1/angular_velocity = 0.0 11:5/0 = 0 -11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_0/angular_velocity = 0.0 11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_1/angular_velocity = 0.0 12:5/0 = 0 -12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_0/angular_velocity = 0.0 12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_1/angular_velocity = 0.0 13:5/0 = 0 -13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_0/angular_velocity = 0.0 13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_1/angular_velocity = 0.0 14:5/0 = 0 -14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_0/angular_velocity = 0.0 -14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_1/angular_velocity = 0.0 15:5/0 = 0 -15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_0/angular_velocity = 0.0 -15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_1/angular_velocity = 0.0 16:5/0 = 0 -16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_0/angular_velocity = 0.0 -16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_1/angular_velocity = 0.0 8:6/0 = 0 -8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_0/angular_velocity = 0.0 -8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_1/angular_velocity = 0.0 9:6/0 = 0 -9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_0/angular_velocity = 0.0 -9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_1/angular_velocity = 0.0 10:6/0 = 0 -10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_0/angular_velocity = 0.0 -10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_1/angular_velocity = 0.0 11:6/0 = 0 -11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_0/angular_velocity = 0.0 11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5) -11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_1/angular_velocity = 0.0 12:6/0 = 0 -12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_0/angular_velocity = 0.0 12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_1/angular_velocity = 0.0 13:6/0 = 0 -13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_0/angular_velocity = 0.0 13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8) -13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_1/angular_velocity = 0.0 14:6/0 = 0 -14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_0/angular_velocity = 0.0 -14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_1/angular_velocity = 0.0 15:6/0 = 0 -15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_0/angular_velocity = 0.0 -15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_1/angular_velocity = 0.0 16:6/0 = 0 -16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_0/angular_velocity = 0.0 -16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_1/angular_velocity = 0.0 -[sub_resource type="TileSet" id="TileSet_kf7eg"] +[sub_resource type="TileSet" id="TileSet_kxirl"] physics_layer_0/collision_layer = 1 physics_layer_1/collision_layer = 2 physics_layer_1/collision_mask = 2 custom_data_layer_0/name = "Type" custom_data_layer_0/type = 21 -sources/0 = SubResource("TileSetAtlasSource_easgx") +sources/0 = SubResource("TileSetAtlasSource_dpuou") -[node name="ExampleScene2D" type="Node2D"] +[node name="Root" type="Node2D"] [node name="Background" type="CanvasLayer" parent="."] layer = -3 [node name="ColorRect" type="ColorRect" parent="Background"] +auto_translate_mode = 2 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 @@ -576,20 +177,22 @@ offset_right = 947.0 offset_bottom = 578.0 grow_horizontal = 2 grow_vertical = 2 -auto_translate = false localize_numeral_system = false color = Color(0.137255, 0.14902, 0.196078, 1) -[node name="TileMap" type="TileMap" parent="."] -z_index = -1 +[node name="Pillar" type="TileMapLayer" parent="."] +use_parent_material = true scale = Vector2(3, 3) -tile_set = SubResource("TileSet_kf7eg") -format = 2 -layer_0/name = "Background" -layer_0/tile_data = PackedInt32Array(-393216, 655360, 2, -327680, 655360, 3, -262144, 655360, 3, -196608, 655360, 3, -131072, 655360, 3, -65536, 655360, 3, -393215, 720896, 2, -327679, 720896, 1, -262143, 720896, 1, -196607, 720896, 1, -131071, 720896, 1, -65535, 720896, 1, -393214, 786432, 2, -327678, 786432, 3, -262142, 786432, 3, -196606, 786432, 3, -131070, 786432, 3, -65534, 786432, 3) -layer_1/name = "Terrain" -layer_1/z_index = 1 -layer_1/tile_data = PackedInt32Array(1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1, 393225, 786432, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 458752, 1, 327681, 720896, 1, 393217, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 393218, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 393219, 720896, 1, 65540, 458752, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 393220, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 458752, 1, 327685, 720896, 1, 393221, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 393222, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 393223, 458752, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 458752, 1, 262152, 720896, 1, 327688, 720896, 1, 393224, 720896, 1, 65546, 524288, 5, 65547, 524288, 5, 65548, 524288, 5, 65549, 524288, 5, 131082, 524288, 6, 131083, 524288, 6, 131084, 524288, 6, 131085, 524288, 6, 196618, 720896, 1, 262154, 720896, 1, 196619, 720896, 1, 262155, 720896, 1, 196620, 720896, 1, 262156, 720896, 1, 196621, 720896, 1, 262157, 720896, 1, 65550, 524288, 5, 65551, 524288, 5, 65552, 524288, 5, 131086, 524288, 6, 131087, 524288, 6, 131088, 524288, 6, 196622, 720896, 1, 196623, 720896, 1, 262159, 720896, 1, 262160, 720896, 1, 196624, 720896, 1, 262158, 720896, 1, 17, 720896, 4, 65553, 720896, 5, 131089, 720896, 5, 196625, 720896, 5, 262161, 720896, 5, 18, 786432, 4, 19, 786432, 4, 20, 786432, 4, 21, 786432, 4, 22, 786432, 4, 23, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 65555, 786432, 5, 131091, 589824, 6, 196627, 786432, 5, 262163, 786432, 5, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 655360, 6, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327697, 720896, 5, 393233, 720896, 5, 327698, 589824, 6, 393234, 786432, 5, 327699, 786432, 5, 393235, 786432, 5, 327700, 786432, 5, 393236, 786432, 5, 327701, 786432, 5, 393237, 786432, 5, 327702, 786432, 5, 393238, 786432, 5, 327703, 786432, 5, 393239, 786432, 5, -131062, 720896, 4, -131061, 786432, 4, -131060, 786432, 4, -65526, 720896, 6, -65525, 786432, 6, -65524, 786432, 6, -131056, 851968, 4, -65520, 851968, 6, -131059, 786432, 4, -131058, 786432, 4, -131057, 786432, 4, -65523, 786432, 6, -65522, 786432, 6, -65521, 786432, 6, -196596, 917504, 0, -65536, 917504, 2, -65535, 983040, 2, -65534, 1048576, 2, -65533, 917504, 2, -65532, 983040, 2, -65531, 1048576, 2, -65530, 917504, 2, -65529, 983040, 2, -65528, 1048576, 2, 65535, 655360, 0, 131071, 655360, 1, 196607, 655360, 1, 262143, 655360, 1, 327679, 655360, 1, 393215, 655360, 1, 458751, 655360, 1, 524287, 655360, 1, 589823, 655360, 1, 0, 720896, 0, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 393216, 720896, 1, 458752, 720896, 1, 524288, 720896, 1, 524289, 720896, 1, 524290, 720896, 1, 524291, 720896, 1, 524292, 720896, 1, 524293, 720896, 1, 524294, 720896, 1, 524295, 720896, 1, 524296, 720896, 1, 524297, 786432, 1, 458761, 786432, 1, 458760, 720896, 1, 458759, 720896, 1, 458758, 458752, 1, 458757, 720896, 1, 458756, 720896, 1, 458755, 720896, 1, 458754, 720896, 1, 458753, 720896, 1, -262145, 851968, 4, -196609, 851968, 5, -131073, 851968, 5, -65537, 851968, 5, -1, 851968, 6, -262146, 786432, 4, -262147, 786432, 4, -196610, 589824, 6, -196611, 786432, 5, -6, 786432, 5, -5, 786432, 5, -4, 786432, 5, -3, 786432, 5, -2, 786432, 5, -65538, 786432, 5, -131074, 786432, 5, -131075, 786432, 5, -65539, 655360, 6, 65534, 851968, 5, 131070, 851968, 5, 196606, 851968, 5, 262142, 851968, 5, 327678, 851968, 5, 393214, 851968, 5, 458750, 851968, 5, 65533, 786432, 5, 65532, 786432, 5, 65531, 786432, 5, 65530, 786432, 5, 65529, 720896, 5, 131066, 786432, 5, 196602, 786432, 5, 262138, 786432, 5, 262139, 786432, 5, 327675, 786432, 5, 131068, 786432, 5, 131069, 786432, 5, 196605, 786432, 5, 262141, 786432, 5, 327677, 786432, 5, 393213, 786432, 5, 458749, 786432, 5, 393212, 786432, 5, 393211, 786432, 5, 458748, 786432, 5, 327676, 655360, 6, 262140, 786432, 5, 196604, 786432, 5, 131067, 786432, 5, 196603, 589824, 6, 458747, 786432, 5, 458746, 786432, 5, 393210, 786432, 5, 327674, 786432, 5, -7, 720896, 5, 131065, 720896, 5, 196601, 720896, 5, 262137, 720896, 5, 327673, 720896, 5, 393209, 720896, 5, 458745, 720896, 5, -327684, 720896, 3, -196594, 720896, 3, -196597, 720896, 3, -65518, 720896, 3, -65516, 720896, 3, -327686, 1048576, 5, -327685, 720896, 3, -196595, 917504, 6, -65514, 983040, 6, -327683, 983040, 5, -65513, 1048576, 5, -262151, 720896, 4, -196615, 720896, 5, -131079, 720896, 5, -65543, 720896, 5, -262150, 786432, 4, -196614, 655360, 6, -131078, 786432, 5, -65542, 786432, 5, -262149, 786432, 4, -196613, 786432, 5, -131077, 786432, 5, -65541, 786432, 5, -262148, 786432, 4, -196612, 786432, 5, -131076, 786432, 5, -65540, 786432, 5, 458769, 720896, 5, 524305, 720896, 6, 458775, 786432, 5, 458774, 786432, 5, 458773, 786432, 5, 458772, 786432, 5, 458771, 786432, 5, 458770, 786432, 5, 524306, 786432, 6, 524307, 786432, 6, 524308, 786432, 6, 524309, 786432, 6, 524310, 786432, 6, 524311, 786432, 6, 327690, 720896, 1, 393226, 720896, 1, 458762, 720896, 1, 524298, 720896, 1, 327691, 720896, 1, 393227, 720896, 1, 458763, 720896, 1, 524299, 720896, 1, 327692, 720896, 1, 393228, 720896, 1, 458764, 720896, 1, 524300, 720896, 1, 327693, 720896, 1, 393229, 720896, 1, 458765, 720896, 1, 524301, 720896, 1, 327694, 720896, 1, 393230, 720896, 1, 458766, 720896, 1, 524302, 720896, 1, 327695, 720896, 1, 393231, 720896, 1, 458767, 720896, 1, 524303, 720896, 1, 327696, 720896, 1, 393232, 720896, 1, 458768, 720896, 1, 524304, 720896, 1, 29, 851968, 4, 65565, 851968, 5, 131101, 851968, 5, 196637, 851968, 5, 262173, 851968, 5, 327709, 851968, 5, 393245, 851968, 5, 458781, 851968, 5, 524317, 851968, 6, -65511, 917504, 4, 24, 786432, 4, 25, 786432, 4, 26, 786432, 4, 27, 786432, 4, 28, 786432, 4, 65560, 786432, 5, 65561, 786432, 5, 65562, 786432, 5, 65563, 786432, 5, 65564, 786432, 5, 131100, 786432, 5, 196636, 589824, 6, 131099, 786432, 5, 131098, 786432, 5, 131097, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 393240, 786432, 5, 458776, 786432, 5, 524312, 786432, 6, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 393241, 786432, 5, 458777, 786432, 5, 524313, 786432, 6, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 393242, 655360, 6, 458778, 786432, 5, 524314, 786432, 6, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, 393243, 786432, 5, 458779, 786432, 5, 524315, 786432, 6, 262172, 786432, 5, 327708, 786432, 5, 393244, 786432, 5, 458780, 786432, 5, 524316, 786432, 6, -196593, 1048576, 6, -393182, 1048576, 6, -393185, 917504, 6, -393180, 983040, 6, -393184, 983040, 5, -65509, 720896, 3, -65510, 720896, 3, -393181, 720896, 3, -393183, 720896, 3, -65517, 720896, 3, -65515, 720896, 3, -327650, 720896, 4, -262114, 720896, 5, -196578, 720896, 5, -131042, 720896, 5, -65506, 720896, 5, -65498, 851968, 5, -131034, 851968, 5, -196570, 851968, 5, -327642, 851968, 4, -327649, 786432, 4, -327648, 786432, 4, -327647, 786432, 4, -327646, 786432, 4, -327645, 786432, 4, -327644, 786432, 4, -327643, 786432, 4, -262106, 851968, 5, -65499, 786432, 5, -131035, 786432, 5, -196571, 786432, 5, -262107, 786432, 5, -262108, 786432, 5, -262109, 786432, 5, -262110, 786432, 5, -262111, 786432, 5, -262112, 786432, 5, -262113, 786432, 5, -196577, 655360, 6, -131041, 786432, 5, -65505, 786432, 5, -65500, 655360, 6, -131036, 589824, 6, -196572, 786432, 5, -196573, 786432, 5, -196574, 786432, 5, -196575, 786432, 5, -196576, 786432, 5, -131040, 589824, 6, -65504, 786432, 5, -65501, 786432, 5, -131037, 786432, 5, -131038, 786432, 5, -131039, 786432, 5, -65503, 786432, 5, -65502, 786432, 5, 524318, 720896, 6, 458782, 720896, 5, 393246, 720896, 5, 327710, 720896, 5, 262174, 720896, 5, 196638, 720896, 5, 131102, 720896, 5, 65566, 720896, 5, 30, 720896, 5, 524319, 786432, 6, 524320, 786432, 6, 524321, 786432, 6, 524322, 786432, 6, 524323, 786432, 6, 524324, 786432, 6, 524325, 786432, 6, 524326, 851968, 6, 38, 851968, 5, 65574, 851968, 5, 131110, 851968, 5, 196646, 851968, 5, 262182, 851968, 5, 327718, 851968, 5, 393254, 851968, 5, 458790, 851968, 5, 31, 786432, 5, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 393247, 655360, 6, 458783, 786432, 5, 32, 786432, 5, 65568, 786432, 5, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 393248, 786432, 5, 458784, 786432, 5, 33, 786432, 5, 65569, 786432, 5, 131105, 655360, 6, 196641, 786432, 5, 262177, 786432, 5, 327713, 786432, 5, 393249, 786432, 5, 458785, 786432, 5, 34, 786432, 5, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 655360, 6, 327714, 655360, 6, 393250, 786432, 5, 458786, 786432, 5, 35, 786432, 5, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 393251, 786432, 5, 458787, 786432, 5, 36, 655360, 6, 65572, 786432, 5, 131108, 786432, 5, 196644, 786432, 5, 262180, 786432, 5, 327716, 786432, 5, 393252, 786432, 5, 458788, 655360, 6, 37, 786432, 5, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 786432, 5, 327717, 786432, 5, 393253, 786432, 5, 458789, 786432, 5, 524282, 786432, 5, 524283, 786432, 5, 524284, 786432, 5, 524285, 786432, 5, 524281, 720896, 5, 524286, 851968, 5, 589817, 720896, 6, 589818, 786432, 6, 589819, 786432, 6, 589820, 786432, 6, 589821, 786432, 6, 589822, 851968, 6) +tile_map_data = PackedByteArray("AAAAAPr/AAAKAAIAAAAAAPv/AAAKAAMAAAAAAPz/AAAKAAMAAAAAAP3/AAAKAAMAAAAAAP7/AAAKAAMAAAAAAP//AAAKAAMAAAABAPr/AAALAAIAAAABAPv/AAALAAEAAAABAPz/AAALAAEAAAABAP3/AAALAAEAAAABAP7/AAALAAEAAAABAP//AAALAAEAAAACAPr/AAAMAAIAAAACAPv/AAAMAAMAAAACAPz/AAAMAAMAAAACAP3/AAAMAAMAAAACAP7/AAAMAAMAAAACAP//AAAMAAMAAAA=") +tile_set = SubResource("TileSet_kxirl") +collision_enabled = false +navigation_enabled = false + +[node name="Terrain" type="TileMapLayer" parent="."] +use_parent_material = true +scale = Vector2(3, 3) +tile_map_data = PackedByteArray("AAABAAAAAAALAAAAAAACAAAAAAALAAAAAAADAAAAAAALAAAAAAAEAAAAAAALAAAAAAAFAAAAAAALAAAAAAAGAAAAAAALAAAAAAAHAAAAAAALAAAAAAAIAAAAAAALAAAAAAAJAAAAAAAMAAAAAAAJAAEAAAAMAAEAAAAJAAIAAAAMAAEAAAAJAAMAAAAMAAEAAAAJAAQAAAAMAAEAAAAJAAUAAAAMAAEAAAAJAAYAAAAMAAEAAAABAAEAAAALAAEAAAABAAIAAAALAAEAAAABAAMAAAALAAEAAAABAAQAAAAHAAEAAAABAAUAAAALAAEAAAABAAYAAAALAAEAAAACAAEAAAALAAEAAAACAAIAAAALAAEAAAACAAMAAAALAAEAAAACAAQAAAALAAEAAAACAAUAAAALAAEAAAACAAYAAAALAAEAAAADAAEAAAALAAEAAAADAAIAAAALAAEAAAADAAMAAAALAAEAAAADAAQAAAALAAEAAAADAAUAAAALAAEAAAADAAYAAAALAAEAAAAEAAEAAAAHAAEAAAAEAAIAAAALAAEAAAAEAAMAAAALAAEAAAAEAAQAAAALAAEAAAAEAAUAAAALAAEAAAAEAAYAAAALAAEAAAAFAAEAAAALAAEAAAAFAAIAAAALAAEAAAAFAAMAAAALAAEAAAAFAAQAAAAHAAEAAAAFAAUAAAALAAEAAAAFAAYAAAALAAEAAAAGAAEAAAALAAEAAAAGAAIAAAALAAEAAAAGAAMAAAALAAEAAAAGAAQAAAALAAEAAAAGAAUAAAALAAEAAAAGAAYAAAALAAEAAAAHAAEAAAALAAEAAAAHAAIAAAALAAEAAAAHAAMAAAALAAEAAAAHAAQAAAALAAEAAAAHAAUAAAALAAEAAAAHAAYAAAAHAAEAAAAIAAEAAAALAAEAAAAIAAIAAAALAAEAAAAIAAMAAAAHAAEAAAAIAAQAAAALAAEAAAAIAAUAAAALAAEAAAAIAAYAAAALAAEAAAAKAAEAAAAIAAUAAAALAAEAAAAIAAUAAAAMAAEAAAAIAAUAAAANAAEAAAAIAAUAAAAKAAIAAAAIAAYAAAALAAIAAAAIAAYAAAAMAAIAAAAIAAYAAAANAAIAAAAIAAYAAAAKAAMAAAALAAEAAAAKAAQAAAALAAEAAAALAAMAAAALAAEAAAALAAQAAAALAAEAAAAMAAMAAAALAAEAAAAMAAQAAAALAAEAAAANAAMAAAALAAEAAAANAAQAAAALAAEAAAAOAAEAAAAIAAUAAAAPAAEAAAAIAAUAAAAQAAEAAAAIAAUAAAAOAAIAAAAIAAYAAAAPAAIAAAAIAAYAAAAQAAIAAAAIAAYAAAAOAAMAAAALAAEAAAAPAAMAAAALAAEAAAAPAAQAAAALAAEAAAAQAAQAAAALAAEAAAAQAAMAAAALAAEAAAAOAAQAAAALAAEAAAARAAAAAAALAAQAAAARAAEAAAALAAUAAAARAAIAAAALAAUAAAARAAMAAAALAAUAAAARAAQAAAALAAUAAAASAAAAAAAMAAQAAAATAAAAAAAMAAQAAAAUAAAAAAAMAAQAAAAVAAAAAAAMAAQAAAAWAAAAAAAMAAQAAAAXAAAAAAAMAAQAAAASAAEAAAAMAAUAAAASAAIAAAAMAAUAAAASAAMAAAAMAAUAAAASAAQAAAAMAAUAAAATAAEAAAAMAAUAAAATAAIAAAAJAAYAAAATAAMAAAAMAAUAAAATAAQAAAAMAAUAAAAUAAEAAAAMAAUAAAAUAAIAAAAMAAUAAAAUAAMAAAAMAAUAAAAUAAQAAAAMAAUAAAAVAAEAAAAMAAUAAAAVAAIAAAAMAAUAAAAVAAMAAAAMAAUAAAAVAAQAAAAMAAUAAAAWAAEAAAAMAAUAAAAWAAIAAAAMAAUAAAAWAAMAAAAMAAUAAAAWAAQAAAAKAAYAAAAXAAEAAAAMAAUAAAAXAAIAAAAMAAUAAAAXAAMAAAAMAAUAAAAXAAQAAAAMAAUAAAARAAUAAAALAAUAAAARAAYAAAALAAUAAAASAAUAAAAJAAYAAAASAAYAAAAMAAUAAAATAAUAAAAMAAUAAAATAAYAAAAMAAUAAAAUAAUAAAAMAAUAAAAUAAYAAAAMAAUAAAAVAAUAAAAMAAUAAAAVAAYAAAAMAAUAAAAWAAUAAAAMAAUAAAAWAAYAAAAMAAUAAAAXAAUAAAAMAAUAAAAXAAYAAAAMAAUAAAAKAP7/AAALAAQAAAALAP7/AAAMAAQAAAAMAP7/AAAMAAQAAAAKAP//AAALAAYAAAALAP//AAAMAAYAAAAMAP//AAAMAAYAAAAQAP7/AAANAAQAAAAQAP//AAANAAYAAAANAP7/AAAMAAQAAAAOAP7/AAAMAAQAAAAPAP7/AAAMAAQAAAANAP//AAAMAAYAAAAOAP//AAAMAAYAAAAPAP//AAAMAAYAAAAMAP3/AAAOAAAAAAADAP//AAAOAAIAAAAEAP//AAAPAAIAAAAFAP//AAAQAAIAAAAGAP//AAAOAAIAAAAHAP//AAAPAAIAAAAIAP//AAAQAAIAAAD//wAAAAAKAAAAAAD//wEAAAAKAAEAAAD//wIAAAAKAAEAAAD//wMAAAAKAAEAAAD//wQAAAAKAAEAAAD//wUAAAAKAAEAAAD//wYAAAAKAAEAAAD//wcAAAAKAAEAAAD//wgAAAAKAAEAAAAAAAAAAAALAAAAAAAAAAEAAAALAAEAAAAAAAIAAAALAAEAAAAAAAMAAAALAAEAAAAAAAQAAAALAAEAAAAAAAUAAAALAAEAAAAAAAYAAAALAAEAAAAAAAcAAAALAAEAAAAAAAgAAAALAAEAAAABAAgAAAALAAEAAAACAAgAAAALAAEAAAADAAgAAAALAAEAAAAEAAgAAAALAAEAAAAFAAgAAAALAAEAAAAGAAgAAAALAAEAAAAHAAgAAAALAAEAAAAIAAgAAAALAAEAAAAJAAgAAAAMAAEAAAAJAAcAAAAMAAEAAAAIAAcAAAALAAEAAAAHAAcAAAALAAEAAAAGAAcAAAAHAAEAAAAFAAcAAAALAAEAAAAEAAcAAAALAAEAAAADAAcAAAALAAEAAAACAAcAAAALAAEAAAABAAcAAAALAAEAAAD///v/AAANAAQAAAD///z/AAANAAUAAAD///3/AAANAAUAAAD///7/AAANAAUAAAD/////AAANAAYAAAD+//v/AAAMAAQAAAD9//v/AAAMAAQAAAD+//z/AAAJAAYAAAD9//z/AAAMAAUAAAD6////AAAMAAUAAAD7////AAAMAAUAAAD8////AAAMAAUAAAD9////AAAMAAUAAAD+////AAAMAAUAAAD+//7/AAAMAAUAAAD+//3/AAAMAAUAAAD9//3/AAAMAAUAAAD9//7/AAAKAAYAAAD+/wAAAAANAAUAAAD+/wEAAAANAAUAAAD+/wIAAAANAAUAAAD+/wMAAAANAAUAAAD+/wQAAAANAAUAAAD+/wUAAAANAAUAAAD+/wYAAAANAAUAAAD9/wAAAAAMAAUAAAD8/wAAAAAMAAUAAAD7/wAAAAAMAAUAAAD6/wAAAAAMAAUAAAD5/wAAAAALAAUAAAD6/wEAAAAMAAUAAAD6/wIAAAAMAAUAAAD6/wMAAAAMAAUAAAD7/wMAAAAMAAUAAAD7/wQAAAAMAAUAAAD8/wEAAAAMAAUAAAD9/wEAAAAMAAUAAAD9/wIAAAAMAAUAAAD9/wMAAAAMAAUAAAD9/wQAAAAMAAUAAAD9/wUAAAAMAAUAAAD9/wYAAAAMAAUAAAD8/wUAAAAMAAUAAAD7/wUAAAAMAAUAAAD8/wYAAAAMAAUAAAD8/wQAAAAKAAYAAAD8/wMAAAAMAAUAAAD8/wIAAAAMAAUAAAD7/wEAAAAMAAUAAAD7/wIAAAAJAAYAAAD7/wYAAAAMAAUAAAD6/wYAAAAMAAUAAAD6/wUAAAAMAAUAAAD6/wQAAAAMAAUAAAD5////AAALAAUAAAD5/wEAAAALAAUAAAD5/wIAAAALAAUAAAD5/wMAAAALAAUAAAD5/wQAAAALAAUAAAD5/wUAAAALAAUAAAD5/wYAAAALAAUAAAD8//r/AAALAAMAAAAOAP3/AAALAAMAAAALAP3/AAALAAMAAAASAP//AAALAAMAAAAUAP//AAALAAMAAAD6//r/AAAQAAUAAAD7//r/AAALAAMAAAANAP3/AAAOAAYAAAAWAP//AAAPAAYAAAD9//r/AAAPAAUAAAAXAP//AAAQAAUAAAD5//v/AAALAAQAAAD5//z/AAALAAUAAAD5//3/AAALAAUAAAD5//7/AAALAAUAAAD6//v/AAAMAAQAAAD6//z/AAAKAAYAAAD6//3/AAAMAAUAAAD6//7/AAAMAAUAAAD7//v/AAAMAAQAAAD7//z/AAAMAAUAAAD7//3/AAAMAAUAAAD7//7/AAAMAAUAAAD8//v/AAAMAAQAAAD8//z/AAAMAAUAAAD8//3/AAAMAAUAAAD8//7/AAAMAAUAAAARAAcAAAALAAUAAAARAAgAAAALAAYAAAAXAAcAAAAMAAUAAAAWAAcAAAAMAAUAAAAVAAcAAAAMAAUAAAAUAAcAAAAMAAUAAAATAAcAAAAMAAUAAAASAAcAAAAMAAUAAAASAAgAAAAMAAYAAAATAAgAAAAMAAYAAAAUAAgAAAAMAAYAAAAVAAgAAAAMAAYAAAAWAAgAAAAMAAYAAAAXAAgAAAAMAAYAAAAKAAUAAAALAAEAAAAKAAYAAAALAAEAAAAKAAcAAAALAAEAAAAKAAgAAAALAAEAAAALAAUAAAALAAEAAAALAAYAAAALAAEAAAALAAcAAAALAAEAAAALAAgAAAALAAEAAAAMAAUAAAALAAEAAAAMAAYAAAALAAEAAAAMAAcAAAALAAEAAAAMAAgAAAALAAEAAAANAAUAAAALAAEAAAANAAYAAAALAAEAAAANAAcAAAALAAEAAAANAAgAAAALAAEAAAAOAAUAAAALAAEAAAAOAAYAAAALAAEAAAAOAAcAAAALAAEAAAAOAAgAAAALAAEAAAAPAAUAAAALAAEAAAAPAAYAAAALAAEAAAAPAAcAAAALAAEAAAAPAAgAAAALAAEAAAAQAAUAAAALAAEAAAAQAAYAAAALAAEAAAAQAAcAAAALAAEAAAAQAAgAAAALAAEAAAAdAAAAAAANAAQAAAAdAAEAAAANAAUAAAAdAAIAAAANAAUAAAAdAAMAAAANAAUAAAAdAAQAAAANAAUAAAAdAAUAAAANAAUAAAAdAAYAAAANAAUAAAAdAAcAAAANAAUAAAAdAAgAAAANAAYAAAAZAP//AAAOAAQAAAAYAAAAAAAMAAQAAAAZAAAAAAAMAAQAAAAaAAAAAAAMAAQAAAAbAAAAAAAMAAQAAAAcAAAAAAAMAAQAAAAYAAEAAAAMAAUAAAAZAAEAAAAMAAUAAAAaAAEAAAAMAAUAAAAbAAEAAAAMAAUAAAAcAAEAAAAMAAUAAAAcAAIAAAAMAAUAAAAcAAMAAAAJAAYAAAAbAAIAAAAMAAUAAAAaAAIAAAAMAAUAAAAZAAIAAAAMAAUAAAAYAAIAAAAMAAUAAAAYAAMAAAAMAAUAAAAYAAQAAAAMAAUAAAAYAAUAAAAMAAUAAAAYAAYAAAAMAAUAAAAYAAcAAAAMAAUAAAAYAAgAAAAMAAYAAAAZAAMAAAAMAAUAAAAZAAQAAAAMAAUAAAAZAAUAAAAMAAUAAAAZAAYAAAAMAAUAAAAZAAcAAAAMAAUAAAAZAAgAAAAMAAYAAAAaAAMAAAAMAAUAAAAaAAQAAAAMAAUAAAAaAAUAAAAMAAUAAAAaAAYAAAAKAAYAAAAaAAcAAAAMAAUAAAAaAAgAAAAMAAYAAAAbAAMAAAAMAAUAAAAbAAQAAAAMAAUAAAAbAAUAAAAMAAUAAAAbAAYAAAAMAAUAAAAbAAcAAAAMAAUAAAAbAAgAAAAMAAYAAAAcAAQAAAAMAAUAAAAcAAUAAAAMAAUAAAAcAAYAAAAMAAUAAAAcAAcAAAAMAAUAAAAcAAgAAAAMAAYAAAAPAP3/AAAQAAYAAAAiAPr/AAAQAAYAAAAfAPr/AAAOAAYAAAAkAPr/AAAPAAYAAAAgAPr/AAAPAAUAAAAbAP//AAALAAMAAAAaAP//AAALAAMAAAAjAPr/AAALAAMAAAAhAPr/AAALAAMAAAATAP//AAALAAMAAAAVAP//AAALAAMAAAAeAPv/AAALAAQAAAAeAPz/AAALAAUAAAAeAP3/AAALAAUAAAAeAP7/AAALAAUAAAAeAP//AAALAAUAAAAmAP//AAANAAUAAAAmAP7/AAANAAUAAAAmAP3/AAANAAUAAAAmAPv/AAANAAQAAAAfAPv/AAAMAAQAAAAgAPv/AAAMAAQAAAAhAPv/AAAMAAQAAAAiAPv/AAAMAAQAAAAjAPv/AAAMAAQAAAAkAPv/AAAMAAQAAAAlAPv/AAAMAAQAAAAmAPz/AAANAAUAAAAlAP//AAAMAAUAAAAlAP7/AAAMAAUAAAAlAP3/AAAMAAUAAAAlAPz/AAAMAAUAAAAkAPz/AAAMAAUAAAAjAPz/AAAMAAUAAAAiAPz/AAAMAAUAAAAhAPz/AAAMAAUAAAAgAPz/AAAMAAUAAAAfAPz/AAAMAAUAAAAfAP3/AAAKAAYAAAAfAP7/AAAMAAUAAAAfAP//AAAMAAUAAAAkAP//AAAKAAYAAAAkAP7/AAAJAAYAAAAkAP3/AAAMAAUAAAAjAP3/AAAMAAUAAAAiAP3/AAAMAAUAAAAhAP3/AAAMAAUAAAAgAP3/AAAMAAUAAAAgAP7/AAAJAAYAAAAgAP//AAAMAAUAAAAjAP//AAAMAAUAAAAjAP7/AAAMAAUAAAAiAP7/AAAMAAUAAAAhAP7/AAAMAAUAAAAhAP//AAAMAAUAAAAiAP//AAAMAAUAAAAeAAgAAAALAAYAAAAeAAcAAAALAAUAAAAeAAYAAAALAAUAAAAeAAUAAAALAAUAAAAeAAQAAAALAAUAAAAeAAMAAAALAAUAAAAeAAIAAAALAAUAAAAeAAEAAAALAAUAAAAeAAAAAAALAAUAAAAfAAgAAAAMAAYAAAAgAAgAAAAMAAYAAAAhAAgAAAAMAAYAAAAiAAgAAAAMAAYAAAAjAAgAAAAMAAYAAAAkAAgAAAAMAAYAAAAlAAgAAAAMAAYAAAAmAAgAAAANAAYAAAAmAAAAAAANAAUAAAAmAAEAAAANAAUAAAAmAAIAAAANAAUAAAAmAAMAAAANAAUAAAAmAAQAAAANAAUAAAAmAAUAAAANAAUAAAAmAAYAAAANAAUAAAAmAAcAAAANAAUAAAAfAAAAAAAMAAUAAAAfAAEAAAAMAAUAAAAfAAIAAAAMAAUAAAAfAAMAAAAMAAUAAAAfAAQAAAAMAAUAAAAfAAUAAAAMAAUAAAAfAAYAAAAKAAYAAAAfAAcAAAAMAAUAAAAgAAAAAAAMAAUAAAAgAAEAAAAMAAUAAAAgAAIAAAAMAAUAAAAgAAMAAAAMAAUAAAAgAAQAAAAMAAUAAAAgAAUAAAAMAAUAAAAgAAYAAAAMAAUAAAAgAAcAAAAMAAUAAAAhAAAAAAAMAAUAAAAhAAEAAAAMAAUAAAAhAAIAAAAKAAYAAAAhAAMAAAAMAAUAAAAhAAQAAAAMAAUAAAAhAAUAAAAMAAUAAAAhAAYAAAAMAAUAAAAhAAcAAAAMAAUAAAAiAAAAAAAMAAUAAAAiAAEAAAAMAAUAAAAiAAIAAAAMAAUAAAAiAAMAAAAMAAUAAAAiAAQAAAAKAAYAAAAiAAUAAAAKAAYAAAAiAAYAAAAMAAUAAAAiAAcAAAAMAAUAAAAjAAAAAAAMAAUAAAAjAAEAAAAMAAUAAAAjAAIAAAAMAAUAAAAjAAMAAAAMAAUAAAAjAAQAAAAMAAUAAAAjAAUAAAAMAAUAAAAjAAYAAAAMAAUAAAAjAAcAAAAMAAUAAAAkAAAAAAAKAAYAAAAkAAEAAAAMAAUAAAAkAAIAAAAMAAUAAAAkAAMAAAAMAAUAAAAkAAQAAAAMAAUAAAAkAAUAAAAMAAUAAAAkAAYAAAAMAAUAAAAkAAcAAAAKAAYAAAAlAAAAAAAMAAUAAAAlAAEAAAAMAAUAAAAlAAIAAAAMAAUAAAAlAAMAAAAMAAUAAAAlAAQAAAAMAAUAAAAlAAUAAAAMAAUAAAAlAAYAAAAMAAUAAAAlAAcAAAAMAAUAAAD6/wcAAAAMAAUAAAD7/wcAAAAMAAUAAAD8/wcAAAAMAAUAAAD9/wcAAAAMAAUAAAD5/wcAAAALAAUAAAD+/wcAAAANAAUAAAD5/wgAAAALAAYAAAD6/wgAAAAMAAYAAAD7/wgAAAAMAAYAAAD8/wgAAAAMAAYAAAD9/wgAAAAMAAYAAAD+/wgAAAANAAYAAAA=") +tile_set = SubResource("TileSet_kxirl") [node name="UI" type="CanvasLayer" parent="."] @@ -602,17 +205,22 @@ unique_name_in_owner = true visible = false [node name="Camera2D" type="Camera2D" parent="."] -position = Vector2(282, -29) +physics_interpolation_mode = 1 +position = Vector2(215, -73) zoom = Vector2(2, 2) +process_callback = 0 [node name="PhantomCameraHost" type="Node" parent="Camera2D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("4_j3ux0") [node name="Player" type="Node" parent="."] [node name="PlayerPhantomCamera2D" type="Node2D" parent="Player" node_paths=PackedStringArray("follow_target")] unique_name_in_owner = true -position = Vector2(282, -29) +top_level = true +position = Vector2(215, -73) script = ExtResource("5_uwr6r") priority = 5 follow_mode = 5 @@ -620,9 +228,10 @@ follow_target = NodePath("../CharacterBody2D") zoom = Vector2(2, 2) tween_resource = ExtResource("6_4l0c3") tween_on_load = false +follow_offset = Vector2(0, -45) follow_damping = true -dead_zone_width = 0.416 -dead_zone_height = 0.63 +dead_zone_width = 0.25 +dead_zone_height = 0.8 show_viewfinder_in_play = true draw_limits = true @@ -637,5 +246,5 @@ text = "[WASD] to move [Space] to jump" [node name="CharacterBody2D" parent="Player" instance=ExtResource("8_i4m1d")] -position = Vector2(282, -29) +position = Vector2(215, -28) script = ExtResource("9_m3lnd") diff --git a/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_group_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_group_example_scene.tscn index 143e8d6..6519323 100644 --- a/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_group_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_group_example_scene.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=14 format=3 uid="uid://bio6mao7gtru2"] +[gd_scene load_steps=14 format=4 uid="uid://bio6mao7gtru2"] [ext_resource type="Texture2D" uid="uid://c77npili4pel4" path="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png" id="1_8rflf"] [ext_resource type="PackedScene" uid="uid://dg7rhrymsrrrm" path="res://addons/phantom_camera/examples/ui/ui_inventory.tscn" id="2_tafwr"] @@ -11,556 +11,156 @@ [ext_resource type="PackedScene" uid="uid://7kh0xydx0b1o" path="res://addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn" id="9_witv0"] [ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd" id="10_aivri"] -[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"] +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_3qxnm"] texture = ExtResource("1_8rflf") 0:0/0 = 0 -0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_0/angular_velocity = 0.0 -0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_1/angular_velocity = 0.0 1:0/0 = 0 -1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_0/angular_velocity = 0.0 -1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_1/angular_velocity = 0.0 2:0/0 = 0 -2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_0/angular_velocity = 0.0 -2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_1/angular_velocity = 0.0 3:0/0 = 0 -3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_0/angular_velocity = 0.0 -3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_1/angular_velocity = 0.0 4:0/0 = 0 -4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_0/angular_velocity = 0.0 -4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_1/angular_velocity = 0.0 5:0/0 = 0 -5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_0/angular_velocity = 0.0 -5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_1/angular_velocity = 0.0 6:0/0 = 0 -6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_0/angular_velocity = 0.0 -6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_1/angular_velocity = 0.0 7:0/0 = 0 -7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_0/angular_velocity = 0.0 7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_1/angular_velocity = 0.0 0:1/0 = 0 -0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_0/angular_velocity = 0.0 -0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_1/angular_velocity = 0.0 1:1/0 = 0 -1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_0/angular_velocity = 0.0 -1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_1/angular_velocity = 0.0 2:1/0 = 0 -2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_0/angular_velocity = 0.0 -2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_1/angular_velocity = 0.0 3:1/0 = 0 -3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_0/angular_velocity = 0.0 -3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_1/angular_velocity = 0.0 4:1/0 = 0 -4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_0/angular_velocity = 0.0 -4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_1/angular_velocity = 0.0 5:1/0 = 0 -5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_0/angular_velocity = 0.0 -5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_1/angular_velocity = 0.0 7:1/0 = 0 -7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_0/angular_velocity = 0.0 7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_1/angular_velocity = 0.0 2:2/0 = 0 -2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_0/angular_velocity = 0.0 -2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_1/angular_velocity = 0.0 3:2/0 = 0 -3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_0/angular_velocity = 0.0 -3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_1/angular_velocity = 0.0 4:2/0 = 0 -4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_0/angular_velocity = 0.0 -4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_1/angular_velocity = 0.0 7:2/0 = 0 -7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_0/angular_velocity = 0.0 7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_1/angular_velocity = 0.0 3:3/0 = 0 -3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_0/angular_velocity = 0.0 -3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_1/angular_velocity = 0.0 4:3/0 = 0 -4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_0/angular_velocity = 0.0 -4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_1/angular_velocity = 0.0 5:3/0 = 0 -5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_0/angular_velocity = 0.0 -5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_1/angular_velocity = 0.0 7:3/0 = 0 -7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_0/angular_velocity = 0.0 7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_1/angular_velocity = 0.0 3:4/0 = 0 -3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_0/angular_velocity = 0.0 -3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_1/angular_velocity = 0.0 4:4/0 = 0 -4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_0/angular_velocity = 0.0 -4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_1/angular_velocity = 0.0 5:4/0 = 0 -5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_0/angular_velocity = 0.0 -5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_1/angular_velocity = 0.0 7:4/0 = 0 -7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_0/angular_velocity = 0.0 -7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_1/angular_velocity = 0.0 3:5/0 = 0 -3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_0/angular_velocity = 0.0 -3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_1/angular_velocity = 0.0 4:5/0 = 0 -4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_0/angular_velocity = 0.0 -4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_1/angular_velocity = 0.0 7:5/0 = 0 -7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_0/angular_velocity = 0.0 -7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_1/angular_velocity = 0.0 3:6/0 = 0 -3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_0/angular_velocity = 0.0 -3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_1/angular_velocity = 0.0 4:6/0 = 0 -4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_0/angular_velocity = 0.0 -4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_1/angular_velocity = 0.0 7:6/0 = 0 -7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_0/angular_velocity = 0.0 -7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_1/angular_velocity = 0.0 2:7/0 = 0 -2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_0/angular_velocity = 0.0 -2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_1/angular_velocity = 0.0 3:7/0 = 0 -3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_0/angular_velocity = 0.0 -3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_1/angular_velocity = 0.0 4:7/0 = 0 -4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_0/angular_velocity = 0.0 -4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_1/angular_velocity = 0.0 5:7/0 = 0 -5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_0/angular_velocity = 0.0 -5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_1/angular_velocity = 0.0 8:0/0 = 0 -8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_0/angular_velocity = 0.0 8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_1/angular_velocity = 0.0 9:0/0 = 0 -9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_0/angular_velocity = 0.0 9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_1/angular_velocity = 0.0 10:0/0 = 0 -10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_0/angular_velocity = 0.0 10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_1/angular_velocity = 0.0 11:0/0 = 0 -11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_0/angular_velocity = 0.0 11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_1/angular_velocity = 0.0 12:0/0 = 0 -12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_0/angular_velocity = 0.0 12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_1/angular_velocity = 0.0 13:0/0 = 0 -13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_0/angular_velocity = 0.0 13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0 = 0 -14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_0/angular_velocity = 0.0 -14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) 14:0/0/custom_data_0 = &"Sign" 15:0/0 = 0 -15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_0/angular_velocity = 0.0 -15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_1/angular_velocity = 0.0 16:0/0 = 0 -16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_0/angular_velocity = 0.0 -16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_1/angular_velocity = 0.0 8:1/0 = 0 -8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_0/angular_velocity = 0.0 8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_1/angular_velocity = 0.0 9:1/0 = 0 -9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_0/angular_velocity = 0.0 9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_1/angular_velocity = 0.0 10:1/0 = 0 -10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_0/angular_velocity = 0.0 10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_1/angular_velocity = 0.0 11:1/0 = 0 -11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_0/angular_velocity = 0.0 11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_1/angular_velocity = 0.0 12:1/0 = 0 -12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_0/angular_velocity = 0.0 12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_1/angular_velocity = 0.0 13:1/0 = 0 -13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_0/angular_velocity = 0.0 13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_1/angular_velocity = 0.0 14:1/0 = 0 -14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_0/angular_velocity = 0.0 -14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_1/angular_velocity = 0.0 15:1/0 = 0 -15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_0/angular_velocity = 0.0 -15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_1/angular_velocity = 0.0 16:1/0 = 0 -16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_0/angular_velocity = 0.0 -16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_1/angular_velocity = 0.0 8:2/0 = 0 -8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_0/angular_velocity = 0.0 8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_1/angular_velocity = 0.0 9:2/0 = 0 -9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_0/angular_velocity = 0.0 9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_1/angular_velocity = 0.0 10:2/0 = 0 -10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_0/angular_velocity = 0.0 10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_1/angular_velocity = 0.0 11:2/0 = 0 -11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_0/angular_velocity = 0.0 11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_1/angular_velocity = 0.0 12:2/0 = 0 -12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_0/angular_velocity = 0.0 12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_1/angular_velocity = 0.0 13:2/0 = 0 -13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_0/angular_velocity = 0.0 13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_1/angular_velocity = 0.0 14:2/0 = 0 -14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_0/angular_velocity = 0.0 -14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_1/angular_velocity = 0.0 15:2/0 = 0 -15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_0/angular_velocity = 0.0 -15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_1/angular_velocity = 0.0 16:2/0 = 0 -16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_0/angular_velocity = 0.0 -16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_1/angular_velocity = 0.0 8:3/0 = 0 -8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_0/angular_velocity = 0.0 8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_1/angular_velocity = 0.0 9:3/0 = 0 -9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_0/angular_velocity = 0.0 9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_1/angular_velocity = 0.0 10:3/0 = 0 -10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_0/angular_velocity = 0.0 10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_1/angular_velocity = 0.0 11:3/0 = 0 -11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_0/angular_velocity = 0.0 -11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_1/angular_velocity = 0.0 12:3/0 = 0 -12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_0/angular_velocity = 0.0 12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_1/angular_velocity = 0.0 13:3/0 = 0 -13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_0/angular_velocity = 0.0 13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_1/angular_velocity = 0.0 14:3/0 = 0 -14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_0/angular_velocity = 0.0 -14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_1/angular_velocity = 0.0 15:3/0 = 0 -15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_0/angular_velocity = 0.0 -15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_1/angular_velocity = 0.0 16:3/0 = 0 -16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_0/angular_velocity = 0.0 -16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_1/angular_velocity = 0.0 8:4/0 = 0 -8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_0/angular_velocity = 0.0 -8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_1/angular_velocity = 0.0 9:4/0 = 0 -9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_0/angular_velocity = 0.0 -9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_1/angular_velocity = 0.0 10:4/0 = 0 -10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_0/angular_velocity = 0.0 -10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_1/angular_velocity = 0.0 11:4/0 = 0 -11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_0/angular_velocity = 0.0 11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8) -11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_1/angular_velocity = 0.0 12:4/0 = 0 -12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_0/angular_velocity = 0.0 12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_1/angular_velocity = 0.0 13:4/0 = 0 -13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_0/angular_velocity = 0.0 13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8) -13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0 = 0 -14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_0/angular_velocity = 0.0 -14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 14:4/0/custom_data_0 = &"Inventory" 15:4/0 = 0 -15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_0/angular_velocity = 0.0 -15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_1/angular_velocity = 0.0 16:4/0 = 0 -16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_0/angular_velocity = 0.0 -16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_1/angular_velocity = 0.0 8:5/0 = 0 -8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_0/angular_velocity = 0.0 -8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_1/angular_velocity = 0.0 9:5/0 = 0 -9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_0/angular_velocity = 0.0 -9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_1/angular_velocity = 0.0 10:5/0 = 0 -10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_0/angular_velocity = 0.0 -10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_1/angular_velocity = 0.0 11:5/0 = 0 -11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_0/angular_velocity = 0.0 11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_1/angular_velocity = 0.0 12:5/0 = 0 -12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_0/angular_velocity = 0.0 12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_1/angular_velocity = 0.0 13:5/0 = 0 -13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_0/angular_velocity = 0.0 13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_1/angular_velocity = 0.0 14:5/0 = 0 -14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_0/angular_velocity = 0.0 -14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_1/angular_velocity = 0.0 15:5/0 = 0 -15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_0/angular_velocity = 0.0 -15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_1/angular_velocity = 0.0 16:5/0 = 0 -16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_0/angular_velocity = 0.0 -16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_1/angular_velocity = 0.0 8:6/0 = 0 -8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_0/angular_velocity = 0.0 -8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_1/angular_velocity = 0.0 9:6/0 = 0 -9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_0/angular_velocity = 0.0 -9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_1/angular_velocity = 0.0 10:6/0 = 0 -10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_0/angular_velocity = 0.0 -10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_1/angular_velocity = 0.0 11:6/0 = 0 -11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_0/angular_velocity = 0.0 11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5) -11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_1/angular_velocity = 0.0 12:6/0 = 0 -12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_0/angular_velocity = 0.0 12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_1/angular_velocity = 0.0 13:6/0 = 0 -13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_0/angular_velocity = 0.0 13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8) -13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_1/angular_velocity = 0.0 14:6/0 = 0 -14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_0/angular_velocity = 0.0 -14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_1/angular_velocity = 0.0 15:6/0 = 0 -15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_0/angular_velocity = 0.0 -15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_1/angular_velocity = 0.0 16:6/0 = 0 -16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_0/angular_velocity = 0.0 -16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_1/angular_velocity = 0.0 -[sub_resource type="TileSet" id="TileSet_kf7eg"] +[sub_resource type="TileSet" id="TileSet_14yng"] physics_layer_0/collision_layer = 1 physics_layer_1/collision_layer = 2 physics_layer_1/collision_mask = 2 custom_data_layer_0/name = "Type" custom_data_layer_0/type = 21 -sources/0 = SubResource("TileSetAtlasSource_easgx") +sources/0 = SubResource("TileSetAtlasSource_3qxnm") [sub_resource type="Resource" id="Resource_spy00"] script = ExtResource("7_awenl") @@ -568,12 +168,13 @@ duration = 0.3 transition = 4 ease = 2 -[node name="ExampleScene2D" type="Node2D"] +[node name="Root" type="Node2D"] [node name="Background" type="CanvasLayer" parent="."] layer = -3 [node name="ColorRect" type="ColorRect" parent="Background"] +auto_translate_mode = 2 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 @@ -583,20 +184,22 @@ offset_right = 981.0 offset_bottom = 548.0 grow_horizontal = 2 grow_vertical = 2 -auto_translate = false localize_numeral_system = false color = Color(0.137255, 0.14902, 0.196078, 1) -[node name="TileMap" type="TileMap" parent="."] -z_index = -1 +[node name="Pillar" type="TileMapLayer" parent="."] +use_parent_material = true scale = Vector2(3, 3) -tile_set = SubResource("TileSet_kf7eg") -format = 2 -layer_0/name = "Background" -layer_0/tile_data = PackedInt32Array(-393216, 655360, 2, -327680, 655360, 3, -262144, 655360, 3, -196608, 655360, 3, -131072, 655360, 3, -65536, 655360, 3, -393215, 720896, 2, -327679, 720896, 1, -262143, 720896, 1, -196607, 720896, 1, -131071, 720896, 1, -65535, 720896, 1, -393214, 786432, 2, -327678, 786432, 3, -262142, 786432, 3, -196606, 786432, 3, -131070, 786432, 3, -65534, 786432, 3) -layer_1/name = "Terrain" -layer_1/z_index = 1 -layer_1/tile_data = PackedInt32Array(1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1, 393225, 786432, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 458752, 1, 327681, 720896, 1, 393217, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 393218, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 393219, 720896, 1, 65540, 458752, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 393220, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 458752, 1, 327685, 720896, 1, 393221, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 393222, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 393223, 458752, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 458752, 1, 262152, 720896, 1, 327688, 720896, 1, 393224, 720896, 1, 65546, 524288, 5, 65547, 524288, 5, 65548, 524288, 5, 65549, 524288, 5, 131082, 524288, 6, 131083, 524288, 6, 131084, 524288, 6, 131085, 524288, 6, 196618, 720896, 1, 262154, 720896, 1, 196619, 720896, 1, 262155, 720896, 1, 196620, 720896, 1, 262156, 720896, 1, 196621, 720896, 1, 262157, 720896, 1, 65550, 524288, 5, 65551, 524288, 5, 65552, 524288, 5, 131086, 524288, 6, 131087, 524288, 6, 131088, 524288, 6, 196622, 720896, 1, 196623, 720896, 1, 262159, 720896, 1, 262160, 720896, 1, 196624, 720896, 1, 262158, 720896, 1, 17, 720896, 4, 65553, 720896, 5, 131089, 720896, 5, 196625, 720896, 5, 262161, 720896, 5, 18, 786432, 4, 19, 786432, 4, 20, 786432, 4, 21, 786432, 4, 22, 786432, 4, 23, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 65555, 786432, 5, 131091, 589824, 6, 196627, 786432, 5, 262163, 786432, 5, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 655360, 6, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327697, 720896, 5, 393233, 720896, 5, 327698, 589824, 6, 393234, 786432, 5, 327699, 786432, 5, 393235, 786432, 5, 327700, 786432, 5, 393236, 786432, 5, 327701, 786432, 5, 393237, 786432, 5, 327702, 786432, 5, 393238, 786432, 5, 327703, 786432, 5, 393239, 786432, 5, -131062, 720896, 4, -131061, 786432, 4, -131060, 786432, 4, -65526, 720896, 6, -65525, 786432, 6, -65524, 786432, 6, -131056, 851968, 4, -65520, 851968, 6, -131059, 786432, 4, -131058, 786432, 4, -131057, 786432, 4, -65523, 786432, 6, -65522, 786432, 6, -65521, 786432, 6, -196596, 917504, 0, -65536, 917504, 2, -65535, 983040, 2, -65534, 1048576, 2, -65533, 917504, 2, -65532, 983040, 2, -65531, 1048576, 2, -65530, 917504, 2, -65529, 983040, 2, -65528, 1048576, 2, 65535, 655360, 0, 131071, 655360, 1, 196607, 655360, 1, 262143, 655360, 1, 327679, 655360, 1, 393215, 655360, 1, 458751, 655360, 1, 524287, 655360, 1, 589823, 655360, 1, 0, 720896, 0, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 393216, 720896, 1, 458752, 720896, 1, 524288, 720896, 1, 524289, 720896, 1, 524290, 720896, 1, 524291, 720896, 1, 524292, 720896, 1, 524293, 720896, 1, 524294, 720896, 1, 524295, 720896, 1, 524296, 720896, 1, 524297, 786432, 1, 458761, 786432, 1, 458760, 720896, 1, 458759, 720896, 1, 458758, 458752, 1, 458757, 720896, 1, 458756, 720896, 1, 458755, 720896, 1, 458754, 720896, 1, 458753, 720896, 1, -262145, 851968, 4, -196609, 851968, 5, -131073, 851968, 5, -65537, 851968, 5, -1, 851968, 6, -262146, 786432, 4, -262147, 786432, 4, -196610, 589824, 6, -196611, 786432, 5, -6, 786432, 5, -5, 786432, 5, -4, 786432, 5, -3, 786432, 5, -2, 786432, 5, -65538, 786432, 5, -131074, 786432, 5, -131075, 786432, 5, -65539, 655360, 6, 65534, 851968, 5, 131070, 851968, 5, 196606, 851968, 5, 262142, 851968, 5, 327678, 851968, 5, 393214, 851968, 5, 458750, 851968, 5, 65533, 786432, 5, 65532, 786432, 5, 65531, 786432, 5, 65530, 786432, 5, 65529, 720896, 5, 131066, 786432, 5, 196602, 786432, 5, 262138, 786432, 5, 262139, 786432, 5, 327675, 786432, 5, 131068, 786432, 5, 131069, 786432, 5, 196605, 786432, 5, 262141, 786432, 5, 327677, 786432, 5, 393213, 786432, 5, 458749, 786432, 5, 393212, 786432, 5, 393211, 786432, 5, 458748, 786432, 5, 327676, 655360, 6, 262140, 786432, 5, 196604, 786432, 5, 131067, 786432, 5, 196603, 589824, 6, 458747, 786432, 5, 458746, 786432, 5, 393210, 786432, 5, 327674, 786432, 5, -7, 720896, 5, 131065, 720896, 5, 196601, 720896, 5, 262137, 720896, 5, 327673, 720896, 5, 393209, 720896, 5, 458745, 720896, 5, -327684, 720896, 3, -196594, 720896, 3, -196597, 720896, 3, -65518, 720896, 3, -65516, 720896, 3, -327686, 1048576, 5, -327685, 720896, 3, -196595, 917504, 6, -65514, 983040, 6, -327683, 983040, 5, -65513, 1048576, 5, -262151, 720896, 4, -196615, 720896, 5, -131079, 720896, 5, -65543, 720896, 5, -262150, 786432, 4, -196614, 655360, 6, -131078, 786432, 5, -65542, 786432, 5, -262149, 786432, 4, -196613, 786432, 5, -131077, 786432, 5, -65541, 786432, 5, -262148, 786432, 4, -196612, 786432, 5, -131076, 786432, 5, -65540, 786432, 5, 458769, 720896, 5, 524305, 720896, 6, 458775, 786432, 5, 458774, 786432, 5, 458773, 786432, 5, 458772, 786432, 5, 458771, 786432, 5, 458770, 786432, 5, 524306, 786432, 6, 524307, 786432, 6, 524308, 786432, 6, 524309, 786432, 6, 524310, 786432, 6, 524311, 786432, 6, 327690, 720896, 1, 393226, 720896, 1, 458762, 720896, 1, 524298, 720896, 1, 327691, 720896, 1, 393227, 720896, 1, 458763, 720896, 1, 524299, 720896, 1, 327692, 720896, 1, 393228, 720896, 1, 458764, 720896, 1, 524300, 720896, 1, 327693, 720896, 1, 393229, 720896, 1, 458765, 720896, 1, 524301, 720896, 1, 327694, 720896, 1, 393230, 720896, 1, 458766, 720896, 1, 524302, 720896, 1, 327695, 720896, 1, 393231, 720896, 1, 458767, 720896, 1, 524303, 720896, 1, 327696, 720896, 1, 393232, 720896, 1, 458768, 720896, 1, 524304, 720896, 1, 29, 851968, 4, 65565, 851968, 5, 131101, 851968, 5, 196637, 851968, 5, 262173, 851968, 5, 327709, 851968, 5, 393245, 851968, 5, 458781, 851968, 5, 524317, 851968, 6, -65511, 917504, 4, 24, 786432, 4, 25, 786432, 4, 26, 786432, 4, 27, 786432, 4, 28, 786432, 4, 65560, 786432, 5, 65561, 786432, 5, 65562, 786432, 5, 65563, 786432, 5, 65564, 786432, 5, 131100, 786432, 5, 196636, 589824, 6, 131099, 786432, 5, 131098, 786432, 5, 131097, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 393240, 786432, 5, 458776, 786432, 5, 524312, 786432, 6, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 393241, 786432, 5, 458777, 786432, 5, 524313, 786432, 6, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 393242, 655360, 6, 458778, 786432, 5, 524314, 786432, 6, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, 393243, 786432, 5, 458779, 786432, 5, 524315, 786432, 6, 262172, 786432, 5, 327708, 786432, 5, 393244, 786432, 5, 458780, 786432, 5, 524316, 786432, 6, -196593, 1048576, 6, -393182, 1048576, 6, -393185, 917504, 6, -393180, 983040, 6, -393184, 983040, 5, -65509, 720896, 3, -65510, 720896, 3, -393181, 720896, 3, -393183, 720896, 3, -65517, 720896, 3, -65515, 720896, 3, -327650, 720896, 4, -262114, 720896, 5, -196578, 720896, 5, -131042, 720896, 5, -65506, 720896, 5, -65498, 851968, 5, -131034, 851968, 5, -196570, 851968, 5, -327642, 851968, 4, -327649, 786432, 4, -327648, 786432, 4, -327647, 786432, 4, -327646, 786432, 4, -327645, 786432, 4, -327644, 786432, 4, -327643, 786432, 4, -262106, 851968, 5, -65499, 786432, 5, -131035, 786432, 5, -196571, 786432, 5, -262107, 786432, 5, -262108, 786432, 5, -262109, 786432, 5, -262110, 786432, 5, -262111, 786432, 5, -262112, 786432, 5, -262113, 786432, 5, -196577, 655360, 6, -131041, 786432, 5, -65505, 786432, 5, -65500, 655360, 6, -131036, 589824, 6, -196572, 786432, 5, -196573, 786432, 5, -196574, 786432, 5, -196575, 786432, 5, -196576, 786432, 5, -131040, 589824, 6, -65504, 786432, 5, -65501, 786432, 5, -131037, 786432, 5, -131038, 786432, 5, -131039, 786432, 5, -65503, 786432, 5, -65502, 786432, 5, 524318, 720896, 6, 458782, 720896, 5, 393246, 720896, 5, 327710, 720896, 5, 262174, 720896, 5, 196638, 720896, 5, 131102, 720896, 5, 65566, 720896, 5, 30, 720896, 5, 524319, 786432, 6, 524320, 786432, 6, 524321, 786432, 6, 524322, 786432, 6, 524323, 786432, 6, 524324, 786432, 6, 524325, 786432, 6, 524326, 851968, 6, 38, 851968, 5, 65574, 851968, 5, 131110, 851968, 5, 196646, 851968, 5, 262182, 851968, 5, 327718, 851968, 5, 393254, 851968, 5, 458790, 851968, 5, 31, 786432, 5, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 393247, 655360, 6, 458783, 786432, 5, 32, 786432, 5, 65568, 786432, 5, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 393248, 786432, 5, 458784, 786432, 5, 33, 786432, 5, 65569, 786432, 5, 131105, 655360, 6, 196641, 786432, 5, 262177, 786432, 5, 327713, 786432, 5, 393249, 786432, 5, 458785, 786432, 5, 34, 786432, 5, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 655360, 6, 327714, 655360, 6, 393250, 786432, 5, 458786, 786432, 5, 35, 786432, 5, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 393251, 786432, 5, 458787, 786432, 5, 36, 655360, 6, 65572, 786432, 5, 131108, 786432, 5, 196644, 786432, 5, 262180, 786432, 5, 327716, 786432, 5, 393252, 786432, 5, 458788, 655360, 6, 37, 786432, 5, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 786432, 5, 327717, 786432, 5, 393253, 786432, 5, 458789, 786432, 5) +tile_map_data = PackedByteArray("AAAAAPr/AAAKAAIAAAAAAPv/AAAKAAMAAAAAAPz/AAAKAAMAAAAAAP3/AAAKAAMAAAAAAP7/AAAKAAMAAAAAAP//AAAKAAMAAAABAPr/AAALAAIAAAABAPv/AAALAAEAAAABAPz/AAALAAEAAAABAP3/AAALAAEAAAABAP7/AAALAAEAAAABAP//AAALAAEAAAACAPr/AAAMAAIAAAACAPv/AAAMAAMAAAACAPz/AAAMAAMAAAACAP3/AAAMAAMAAAACAP7/AAAMAAMAAAACAP//AAAMAAMAAAA=") +tile_set = SubResource("TileSet_14yng") +collision_enabled = false +navigation_enabled = false + +[node name="Terrain" type="TileMapLayer" parent="."] +use_parent_material = true +scale = Vector2(3, 3) +tile_map_data = PackedByteArray("AAABAAAAAAALAAAAAAACAAAAAAALAAAAAAADAAAAAAALAAAAAAAEAAAAAAALAAAAAAAFAAAAAAALAAAAAAAGAAAAAAALAAAAAAAHAAAAAAALAAAAAAAIAAAAAAALAAAAAAAJAAAAAAAMAAAAAAAJAAEAAAAMAAEAAAAJAAIAAAAMAAEAAAAJAAMAAAAMAAEAAAAJAAQAAAAMAAEAAAAJAAUAAAAMAAEAAAAJAAYAAAAMAAEAAAABAAEAAAALAAEAAAABAAIAAAALAAEAAAABAAMAAAALAAEAAAABAAQAAAAHAAEAAAABAAUAAAALAAEAAAABAAYAAAALAAEAAAACAAEAAAALAAEAAAACAAIAAAALAAEAAAACAAMAAAALAAEAAAACAAQAAAALAAEAAAACAAUAAAALAAEAAAACAAYAAAALAAEAAAADAAEAAAALAAEAAAADAAIAAAALAAEAAAADAAMAAAALAAEAAAADAAQAAAALAAEAAAADAAUAAAALAAEAAAADAAYAAAALAAEAAAAEAAEAAAAHAAEAAAAEAAIAAAALAAEAAAAEAAMAAAALAAEAAAAEAAQAAAALAAEAAAAEAAUAAAALAAEAAAAEAAYAAAALAAEAAAAFAAEAAAALAAEAAAAFAAIAAAALAAEAAAAFAAMAAAALAAEAAAAFAAQAAAAHAAEAAAAFAAUAAAALAAEAAAAFAAYAAAALAAEAAAAGAAEAAAALAAEAAAAGAAIAAAALAAEAAAAGAAMAAAALAAEAAAAGAAQAAAALAAEAAAAGAAUAAAALAAEAAAAGAAYAAAALAAEAAAAHAAEAAAALAAEAAAAHAAIAAAALAAEAAAAHAAMAAAALAAEAAAAHAAQAAAALAAEAAAAHAAUAAAALAAEAAAAHAAYAAAAHAAEAAAAIAAEAAAALAAEAAAAIAAIAAAALAAEAAAAIAAMAAAAHAAEAAAAIAAQAAAALAAEAAAAIAAUAAAALAAEAAAAIAAYAAAALAAEAAAAKAAEAAAAIAAUAAAALAAEAAAAIAAUAAAAMAAEAAAAIAAUAAAANAAEAAAAIAAUAAAAKAAIAAAAIAAYAAAALAAIAAAAIAAYAAAAMAAIAAAAIAAYAAAANAAIAAAAIAAYAAAAKAAMAAAALAAEAAAAKAAQAAAALAAEAAAALAAMAAAALAAEAAAALAAQAAAALAAEAAAAMAAMAAAALAAEAAAAMAAQAAAALAAEAAAANAAMAAAALAAEAAAANAAQAAAALAAEAAAAOAAEAAAAIAAUAAAAPAAEAAAAIAAUAAAAQAAEAAAAIAAUAAAAOAAIAAAAIAAYAAAAPAAIAAAAIAAYAAAAQAAIAAAAIAAYAAAAOAAMAAAALAAEAAAAPAAMAAAALAAEAAAAPAAQAAAALAAEAAAAQAAQAAAALAAEAAAAQAAMAAAALAAEAAAAOAAQAAAALAAEAAAARAAAAAAALAAQAAAARAAEAAAALAAUAAAARAAIAAAALAAUAAAARAAMAAAALAAUAAAARAAQAAAALAAUAAAASAAAAAAAMAAQAAAATAAAAAAAMAAQAAAAUAAAAAAAMAAQAAAAVAAAAAAAMAAQAAAAWAAAAAAAMAAQAAAAXAAAAAAAMAAQAAAASAAEAAAAMAAUAAAASAAIAAAAMAAUAAAASAAMAAAAMAAUAAAASAAQAAAAMAAUAAAATAAEAAAAMAAUAAAATAAIAAAAJAAYAAAATAAMAAAAMAAUAAAATAAQAAAAMAAUAAAAUAAEAAAAMAAUAAAAUAAIAAAAMAAUAAAAUAAMAAAAMAAUAAAAUAAQAAAAMAAUAAAAVAAEAAAAMAAUAAAAVAAIAAAAMAAUAAAAVAAMAAAAMAAUAAAAVAAQAAAAMAAUAAAAWAAEAAAAMAAUAAAAWAAIAAAAMAAUAAAAWAAMAAAAMAAUAAAAWAAQAAAAKAAYAAAAXAAEAAAAMAAUAAAAXAAIAAAAMAAUAAAAXAAMAAAAMAAUAAAAXAAQAAAAMAAUAAAARAAUAAAALAAUAAAARAAYAAAALAAUAAAASAAUAAAAJAAYAAAASAAYAAAAMAAUAAAATAAUAAAAMAAUAAAATAAYAAAAMAAUAAAAUAAUAAAAMAAUAAAAUAAYAAAAMAAUAAAAVAAUAAAAMAAUAAAAVAAYAAAAMAAUAAAAWAAUAAAAMAAUAAAAWAAYAAAAMAAUAAAAXAAUAAAAMAAUAAAAXAAYAAAAMAAUAAAAKAP7/AAALAAQAAAALAP7/AAAMAAQAAAAMAP7/AAAMAAQAAAAKAP//AAALAAYAAAALAP//AAAMAAYAAAAMAP//AAAMAAYAAAAQAP7/AAANAAQAAAAQAP//AAANAAYAAAANAP7/AAAMAAQAAAAOAP7/AAAMAAQAAAAPAP7/AAAMAAQAAAANAP//AAAMAAYAAAAOAP//AAAMAAYAAAAPAP//AAAMAAYAAAAMAP3/AAAOAAAAAAADAP//AAAOAAIAAAAEAP//AAAPAAIAAAAFAP//AAAQAAIAAAAGAP//AAAOAAIAAAAHAP//AAAPAAIAAAAIAP//AAAQAAIAAAD//wAAAAAKAAAAAAD//wEAAAAKAAEAAAD//wIAAAAKAAEAAAD//wMAAAAKAAEAAAD//wQAAAAKAAEAAAD//wUAAAAKAAEAAAD//wYAAAAKAAEAAAD//wcAAAAKAAEAAAD//wgAAAAKAAEAAAAAAAAAAAALAAAAAAAAAAEAAAALAAEAAAAAAAIAAAALAAEAAAAAAAMAAAALAAEAAAAAAAQAAAALAAEAAAAAAAUAAAALAAEAAAAAAAYAAAALAAEAAAAAAAcAAAALAAEAAAAAAAgAAAALAAEAAAABAAgAAAALAAEAAAACAAgAAAALAAEAAAADAAgAAAALAAEAAAAEAAgAAAALAAEAAAAFAAgAAAALAAEAAAAGAAgAAAALAAEAAAAHAAgAAAALAAEAAAAIAAgAAAALAAEAAAAJAAgAAAAMAAEAAAAJAAcAAAAMAAEAAAAIAAcAAAALAAEAAAAHAAcAAAALAAEAAAAGAAcAAAAHAAEAAAAFAAcAAAALAAEAAAAEAAcAAAALAAEAAAADAAcAAAALAAEAAAACAAcAAAALAAEAAAABAAcAAAALAAEAAAD///v/AAANAAQAAAD///z/AAANAAUAAAD///3/AAANAAUAAAD///7/AAANAAUAAAD/////AAANAAYAAAD+//v/AAAMAAQAAAD9//v/AAAMAAQAAAD+//z/AAAJAAYAAAD9//z/AAAMAAUAAAD6////AAAMAAUAAAD7////AAAMAAUAAAD8////AAAMAAUAAAD9////AAAMAAUAAAD+////AAAMAAUAAAD+//7/AAAMAAUAAAD+//3/AAAMAAUAAAD9//3/AAAMAAUAAAD9//7/AAAKAAYAAAD+/wAAAAANAAUAAAD+/wEAAAANAAUAAAD+/wIAAAANAAUAAAD+/wMAAAANAAUAAAD+/wQAAAANAAUAAAD+/wUAAAANAAUAAAD+/wYAAAANAAUAAAD9/wAAAAAMAAUAAAD8/wAAAAAMAAUAAAD7/wAAAAAMAAUAAAD6/wAAAAAMAAUAAAD5/wAAAAALAAUAAAD6/wEAAAAMAAUAAAD6/wIAAAAMAAUAAAD6/wMAAAAMAAUAAAD7/wMAAAAMAAUAAAD7/wQAAAAMAAUAAAD8/wEAAAAMAAUAAAD9/wEAAAAMAAUAAAD9/wIAAAAMAAUAAAD9/wMAAAAMAAUAAAD9/wQAAAAMAAUAAAD9/wUAAAAMAAUAAAD9/wYAAAAMAAUAAAD8/wUAAAAMAAUAAAD7/wUAAAAMAAUAAAD8/wYAAAAMAAUAAAD8/wQAAAAKAAYAAAD8/wMAAAAMAAUAAAD8/wIAAAAMAAUAAAD7/wEAAAAMAAUAAAD7/wIAAAAJAAYAAAD7/wYAAAAMAAUAAAD6/wYAAAAMAAUAAAD6/wUAAAAMAAUAAAD6/wQAAAAMAAUAAAD5////AAALAAUAAAD5/wEAAAALAAUAAAD5/wIAAAALAAUAAAD5/wMAAAALAAUAAAD5/wQAAAALAAUAAAD5/wUAAAALAAUAAAD5/wYAAAALAAUAAAD8//r/AAALAAMAAAAOAP3/AAALAAMAAAALAP3/AAALAAMAAAASAP//AAALAAMAAAAUAP//AAALAAMAAAD6//r/AAAQAAUAAAD7//r/AAALAAMAAAANAP3/AAAOAAYAAAAWAP//AAAPAAYAAAD9//r/AAAPAAUAAAAXAP//AAAQAAUAAAD5//v/AAALAAQAAAD5//z/AAALAAUAAAD5//3/AAALAAUAAAD5//7/AAALAAUAAAD6//v/AAAMAAQAAAD6//z/AAAKAAYAAAD6//3/AAAMAAUAAAD6//7/AAAMAAUAAAD7//v/AAAMAAQAAAD7//z/AAAMAAUAAAD7//3/AAAMAAUAAAD7//7/AAAMAAUAAAD8//v/AAAMAAQAAAD8//z/AAAMAAUAAAD8//3/AAAMAAUAAAD8//7/AAAMAAUAAAARAAcAAAALAAUAAAARAAgAAAALAAYAAAAXAAcAAAAMAAUAAAAWAAcAAAAMAAUAAAAVAAcAAAAMAAUAAAAUAAcAAAAMAAUAAAATAAcAAAAMAAUAAAASAAcAAAAMAAUAAAASAAgAAAAMAAYAAAATAAgAAAAMAAYAAAAUAAgAAAAMAAYAAAAVAAgAAAAMAAYAAAAWAAgAAAAMAAYAAAAXAAgAAAAMAAYAAAAKAAUAAAALAAEAAAAKAAYAAAALAAEAAAAKAAcAAAALAAEAAAAKAAgAAAALAAEAAAALAAUAAAALAAEAAAALAAYAAAALAAEAAAALAAcAAAALAAEAAAALAAgAAAALAAEAAAAMAAUAAAALAAEAAAAMAAYAAAALAAEAAAAMAAcAAAALAAEAAAAMAAgAAAALAAEAAAANAAUAAAALAAEAAAANAAYAAAALAAEAAAANAAcAAAALAAEAAAANAAgAAAALAAEAAAAOAAUAAAALAAEAAAAOAAYAAAALAAEAAAAOAAcAAAALAAEAAAAOAAgAAAALAAEAAAAPAAUAAAALAAEAAAAPAAYAAAALAAEAAAAPAAcAAAALAAEAAAAPAAgAAAALAAEAAAAQAAUAAAALAAEAAAAQAAYAAAALAAEAAAAQAAcAAAALAAEAAAAQAAgAAAALAAEAAAAdAAAAAAANAAQAAAAdAAEAAAANAAUAAAAdAAIAAAANAAUAAAAdAAMAAAANAAUAAAAdAAQAAAANAAUAAAAdAAUAAAANAAUAAAAdAAYAAAANAAUAAAAdAAcAAAANAAUAAAAdAAgAAAANAAYAAAAZAP//AAAOAAQAAAAYAAAAAAAMAAQAAAAZAAAAAAAMAAQAAAAaAAAAAAAMAAQAAAAbAAAAAAAMAAQAAAAcAAAAAAAMAAQAAAAYAAEAAAAMAAUAAAAZAAEAAAAMAAUAAAAaAAEAAAAMAAUAAAAbAAEAAAAMAAUAAAAcAAEAAAAMAAUAAAAcAAIAAAAMAAUAAAAcAAMAAAAJAAYAAAAbAAIAAAAMAAUAAAAaAAIAAAAMAAUAAAAZAAIAAAAMAAUAAAAYAAIAAAAMAAUAAAAYAAMAAAAMAAUAAAAYAAQAAAAMAAUAAAAYAAUAAAAMAAUAAAAYAAYAAAAMAAUAAAAYAAcAAAAMAAUAAAAYAAgAAAAMAAYAAAAZAAMAAAAMAAUAAAAZAAQAAAAMAAUAAAAZAAUAAAAMAAUAAAAZAAYAAAAMAAUAAAAZAAcAAAAMAAUAAAAZAAgAAAAMAAYAAAAaAAMAAAAMAAUAAAAaAAQAAAAMAAUAAAAaAAUAAAAMAAUAAAAaAAYAAAAKAAYAAAAaAAcAAAAMAAUAAAAaAAgAAAAMAAYAAAAbAAMAAAAMAAUAAAAbAAQAAAAMAAUAAAAbAAUAAAAMAAUAAAAbAAYAAAAMAAUAAAAbAAcAAAAMAAUAAAAbAAgAAAAMAAYAAAAcAAQAAAAMAAUAAAAcAAUAAAAMAAUAAAAcAAYAAAAMAAUAAAAcAAcAAAAMAAUAAAAcAAgAAAAMAAYAAAAPAP3/AAAQAAYAAAAiAPr/AAAQAAYAAAAfAPr/AAAOAAYAAAAkAPr/AAAPAAYAAAAgAPr/AAAPAAUAAAAbAP//AAALAAMAAAAaAP//AAALAAMAAAAjAPr/AAALAAMAAAAhAPr/AAALAAMAAAATAP//AAALAAMAAAAVAP//AAALAAMAAAAeAPv/AAALAAQAAAAeAPz/AAALAAUAAAAeAP3/AAALAAUAAAAeAP7/AAALAAUAAAAeAP//AAALAAUAAAAmAP//AAANAAUAAAAmAP7/AAANAAUAAAAmAP3/AAANAAUAAAAmAPv/AAANAAQAAAAfAPv/AAAMAAQAAAAgAPv/AAAMAAQAAAAhAPv/AAAMAAQAAAAiAPv/AAAMAAQAAAAjAPv/AAAMAAQAAAAkAPv/AAAMAAQAAAAlAPv/AAAMAAQAAAAmAPz/AAANAAUAAAAlAP//AAAMAAUAAAAlAP7/AAAMAAUAAAAlAP3/AAAMAAUAAAAlAPz/AAAMAAUAAAAkAPz/AAAMAAUAAAAjAPz/AAAMAAUAAAAiAPz/AAAMAAUAAAAhAPz/AAAMAAUAAAAgAPz/AAAMAAUAAAAfAPz/AAAMAAUAAAAfAP3/AAAKAAYAAAAfAP7/AAAMAAUAAAAfAP//AAAMAAUAAAAkAP//AAAKAAYAAAAkAP7/AAAJAAYAAAAkAP3/AAAMAAUAAAAjAP3/AAAMAAUAAAAiAP3/AAAMAAUAAAAhAP3/AAAMAAUAAAAgAP3/AAAMAAUAAAAgAP7/AAAJAAYAAAAgAP//AAAMAAUAAAAjAP//AAAMAAUAAAAjAP7/AAAMAAUAAAAiAP7/AAAMAAUAAAAhAP7/AAAMAAUAAAAhAP//AAAMAAUAAAAiAP//AAAMAAUAAAAeAAgAAAALAAYAAAAeAAcAAAALAAUAAAAeAAYAAAALAAUAAAAeAAUAAAALAAUAAAAeAAQAAAALAAUAAAAeAAMAAAALAAUAAAAeAAIAAAALAAUAAAAeAAEAAAALAAUAAAAeAAAAAAALAAUAAAAfAAgAAAAMAAYAAAAgAAgAAAAMAAYAAAAhAAgAAAAMAAYAAAAiAAgAAAAMAAYAAAAjAAgAAAAMAAYAAAAkAAgAAAAMAAYAAAAlAAgAAAAMAAYAAAAmAAgAAAANAAYAAAAmAAAAAAANAAUAAAAmAAEAAAANAAUAAAAmAAIAAAANAAUAAAAmAAMAAAANAAUAAAAmAAQAAAANAAUAAAAmAAUAAAANAAUAAAAmAAYAAAANAAUAAAAmAAcAAAANAAUAAAAfAAAAAAAMAAUAAAAfAAEAAAAMAAUAAAAfAAIAAAAMAAUAAAAfAAMAAAAMAAUAAAAfAAQAAAAMAAUAAAAfAAUAAAAMAAUAAAAfAAYAAAAKAAYAAAAfAAcAAAAMAAUAAAAgAAAAAAAMAAUAAAAgAAEAAAAMAAUAAAAgAAIAAAAMAAUAAAAgAAMAAAAMAAUAAAAgAAQAAAAMAAUAAAAgAAUAAAAMAAUAAAAgAAYAAAAMAAUAAAAgAAcAAAAMAAUAAAAhAAAAAAAMAAUAAAAhAAEAAAAMAAUAAAAhAAIAAAAKAAYAAAAhAAMAAAAMAAUAAAAhAAQAAAAMAAUAAAAhAAUAAAAMAAUAAAAhAAYAAAAMAAUAAAAhAAcAAAAMAAUAAAAiAAAAAAAMAAUAAAAiAAEAAAAMAAUAAAAiAAIAAAAMAAUAAAAiAAMAAAAMAAUAAAAiAAQAAAAKAAYAAAAiAAUAAAAKAAYAAAAiAAYAAAAMAAUAAAAiAAcAAAAMAAUAAAAjAAAAAAAMAAUAAAAjAAEAAAAMAAUAAAAjAAIAAAAMAAUAAAAjAAMAAAAMAAUAAAAjAAQAAAAMAAUAAAAjAAUAAAAMAAUAAAAjAAYAAAAMAAUAAAAjAAcAAAAMAAUAAAAkAAAAAAAKAAYAAAAkAAEAAAAMAAUAAAAkAAIAAAAMAAUAAAAkAAMAAAAMAAUAAAAkAAQAAAAMAAUAAAAkAAUAAAAMAAUAAAAkAAYAAAAMAAUAAAAkAAcAAAAKAAYAAAAlAAAAAAAMAAUAAAAlAAEAAAAMAAUAAAAlAAIAAAAMAAUAAAAlAAMAAAAMAAUAAAAlAAQAAAAMAAUAAAAlAAUAAAAMAAUAAAAlAAYAAAAMAAUAAAAlAAcAAAAMAAUAAAD6/wcAAAAMAAUAAAD7/wcAAAAMAAUAAAD8/wcAAAAMAAUAAAD9/wcAAAAMAAUAAAD5/wcAAAALAAUAAAD+/wcAAAANAAUAAAD5/wgAAAALAAYAAAD6/wgAAAAMAAYAAAD7/wgAAAAMAAYAAAD8/wgAAAAMAAYAAAD9/wgAAAAMAAYAAAD+/wgAAAANAAYAAAA=") +tile_set = SubResource("TileSet_14yng") [node name="UI" type="CanvasLayer" parent="."] @@ -609,10 +212,15 @@ unique_name_in_owner = true visible = false [node name="Camera2D" type="Camera2D" parent="."] -position = Vector2(107, -172.5) +physics_interpolation_mode = 1 +position = Vector2(186, -172.5) +zoom = Vector2(1.5, 1.5) +process_callback = 0 position_smoothing_speed = 8.0 [node name="PhantomCameraHost" type="Node" parent="Camera2D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("4_dxiro") [node name="Label" type="Label" parent="."] @@ -626,15 +234,19 @@ text = "[WASD] to move [Space] to jump" [node name="PhantomCamera2D" type="Node2D" parent="." node_paths=PackedStringArray("follow_targets")] -position = Vector2(107, -172.5) +top_level = true +position = Vector2(186, -172.5) script = ExtResource("6_ojk83") priority = 10 follow_mode = 3 -follow_targets = [NodePath("../GroupNPCSprite"), NodePath("../CharacterBody2D")] +follow_targets = [NodePath("../CharacterBody2D"), NodePath("../GroupNPCSprite")] +zoom = Vector2(1.5, 1.5) tween_resource = SubResource("Resource_spy00") tween_on_load = false follow_damping = true auto_zoom = true +auto_zoom_min = 0.5 +auto_zoom_max = 1.5 auto_zoom_margin = Vector4(200, 0, 200, 0) draw_limits = true diff --git a/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_path_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_path_example_scene.tscn index 260aa31..b5d2775 100644 --- a/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_path_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_follow_path_example_scene.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=13 format=3 uid="uid://b75giavcvh1mv"] +[gd_scene load_steps=13 format=4 uid="uid://b75giavcvh1mv"] [ext_resource type="Texture2D" uid="uid://c77npili4pel4" path="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png" id="1_t003o"] [ext_resource type="PackedScene" uid="uid://dg7rhrymsrrrm" path="res://addons/phantom_camera/examples/ui/ui_inventory.tscn" id="2_4ncqd"] @@ -10,569 +10,170 @@ [ext_resource type="PackedScene" uid="uid://7kh0xydx0b1o" path="res://addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn" id="8_fy81j"] [ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd" id="9_u6ygl"] -[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"] +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_nivvc"] texture = ExtResource("1_t003o") 0:0/0 = 0 -0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_0/angular_velocity = 0.0 -0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_1/angular_velocity = 0.0 1:0/0 = 0 -1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_0/angular_velocity = 0.0 -1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_1/angular_velocity = 0.0 2:0/0 = 0 -2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_0/angular_velocity = 0.0 -2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_1/angular_velocity = 0.0 3:0/0 = 0 -3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_0/angular_velocity = 0.0 -3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_1/angular_velocity = 0.0 4:0/0 = 0 -4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_0/angular_velocity = 0.0 -4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_1/angular_velocity = 0.0 5:0/0 = 0 -5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_0/angular_velocity = 0.0 -5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_1/angular_velocity = 0.0 6:0/0 = 0 -6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_0/angular_velocity = 0.0 -6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_1/angular_velocity = 0.0 7:0/0 = 0 -7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_0/angular_velocity = 0.0 7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_1/angular_velocity = 0.0 0:1/0 = 0 -0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_0/angular_velocity = 0.0 -0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_1/angular_velocity = 0.0 1:1/0 = 0 -1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_0/angular_velocity = 0.0 -1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_1/angular_velocity = 0.0 2:1/0 = 0 -2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_0/angular_velocity = 0.0 -2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_1/angular_velocity = 0.0 3:1/0 = 0 -3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_0/angular_velocity = 0.0 -3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_1/angular_velocity = 0.0 4:1/0 = 0 -4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_0/angular_velocity = 0.0 -4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_1/angular_velocity = 0.0 5:1/0 = 0 -5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_0/angular_velocity = 0.0 -5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_1/angular_velocity = 0.0 7:1/0 = 0 -7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_0/angular_velocity = 0.0 7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_1/angular_velocity = 0.0 2:2/0 = 0 -2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_0/angular_velocity = 0.0 -2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_1/angular_velocity = 0.0 3:2/0 = 0 -3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_0/angular_velocity = 0.0 -3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_1/angular_velocity = 0.0 4:2/0 = 0 -4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_0/angular_velocity = 0.0 -4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_1/angular_velocity = 0.0 7:2/0 = 0 -7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_0/angular_velocity = 0.0 7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_1/angular_velocity = 0.0 3:3/0 = 0 -3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_0/angular_velocity = 0.0 -3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_1/angular_velocity = 0.0 4:3/0 = 0 -4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_0/angular_velocity = 0.0 -4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_1/angular_velocity = 0.0 5:3/0 = 0 -5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_0/angular_velocity = 0.0 -5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_1/angular_velocity = 0.0 7:3/0 = 0 -7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_0/angular_velocity = 0.0 7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_1/angular_velocity = 0.0 3:4/0 = 0 -3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_0/angular_velocity = 0.0 -3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_1/angular_velocity = 0.0 4:4/0 = 0 -4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_0/angular_velocity = 0.0 -4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_1/angular_velocity = 0.0 5:4/0 = 0 -5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_0/angular_velocity = 0.0 -5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_1/angular_velocity = 0.0 7:4/0 = 0 -7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_0/angular_velocity = 0.0 -7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_1/angular_velocity = 0.0 3:5/0 = 0 -3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_0/angular_velocity = 0.0 -3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_1/angular_velocity = 0.0 4:5/0 = 0 -4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_0/angular_velocity = 0.0 -4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_1/angular_velocity = 0.0 7:5/0 = 0 -7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_0/angular_velocity = 0.0 -7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_1/angular_velocity = 0.0 3:6/0 = 0 -3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_0/angular_velocity = 0.0 -3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_1/angular_velocity = 0.0 4:6/0 = 0 -4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_0/angular_velocity = 0.0 -4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_1/angular_velocity = 0.0 7:6/0 = 0 -7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_0/angular_velocity = 0.0 -7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_1/angular_velocity = 0.0 2:7/0 = 0 -2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_0/angular_velocity = 0.0 -2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_1/angular_velocity = 0.0 3:7/0 = 0 -3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_0/angular_velocity = 0.0 -3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_1/angular_velocity = 0.0 4:7/0 = 0 -4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_0/angular_velocity = 0.0 -4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_1/angular_velocity = 0.0 5:7/0 = 0 -5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_0/angular_velocity = 0.0 -5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_1/angular_velocity = 0.0 8:0/0 = 0 -8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_0/angular_velocity = 0.0 8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_1/angular_velocity = 0.0 9:0/0 = 0 -9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_0/angular_velocity = 0.0 9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_1/angular_velocity = 0.0 10:0/0 = 0 -10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_0/angular_velocity = 0.0 10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_1/angular_velocity = 0.0 11:0/0 = 0 -11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_0/angular_velocity = 0.0 11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_1/angular_velocity = 0.0 12:0/0 = 0 -12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_0/angular_velocity = 0.0 12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_1/angular_velocity = 0.0 13:0/0 = 0 -13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_0/angular_velocity = 0.0 13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0 = 0 -14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_0/angular_velocity = 0.0 -14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) 14:0/0/custom_data_0 = &"Sign" 15:0/0 = 0 -15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_0/angular_velocity = 0.0 -15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_1/angular_velocity = 0.0 16:0/0 = 0 -16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_0/angular_velocity = 0.0 -16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_1/angular_velocity = 0.0 8:1/0 = 0 -8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_0/angular_velocity = 0.0 8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_1/angular_velocity = 0.0 9:1/0 = 0 -9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_0/angular_velocity = 0.0 9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_1/angular_velocity = 0.0 10:1/0 = 0 -10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_0/angular_velocity = 0.0 10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_1/angular_velocity = 0.0 11:1/0 = 0 -11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_0/angular_velocity = 0.0 11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_1/angular_velocity = 0.0 12:1/0 = 0 -12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_0/angular_velocity = 0.0 12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_1/angular_velocity = 0.0 13:1/0 = 0 -13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_0/angular_velocity = 0.0 13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_1/angular_velocity = 0.0 14:1/0 = 0 -14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_0/angular_velocity = 0.0 -14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_1/angular_velocity = 0.0 15:1/0 = 0 -15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_0/angular_velocity = 0.0 -15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_1/angular_velocity = 0.0 16:1/0 = 0 -16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_0/angular_velocity = 0.0 -16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_1/angular_velocity = 0.0 8:2/0 = 0 -8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_0/angular_velocity = 0.0 8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_1/angular_velocity = 0.0 9:2/0 = 0 -9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_0/angular_velocity = 0.0 9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_1/angular_velocity = 0.0 10:2/0 = 0 -10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_0/angular_velocity = 0.0 10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_1/angular_velocity = 0.0 11:2/0 = 0 -11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_0/angular_velocity = 0.0 11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_1/angular_velocity = 0.0 12:2/0 = 0 -12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_0/angular_velocity = 0.0 12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_1/angular_velocity = 0.0 13:2/0 = 0 -13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_0/angular_velocity = 0.0 13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_1/angular_velocity = 0.0 14:2/0 = 0 -14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_0/angular_velocity = 0.0 -14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_1/angular_velocity = 0.0 15:2/0 = 0 -15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_0/angular_velocity = 0.0 -15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_1/angular_velocity = 0.0 16:2/0 = 0 -16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_0/angular_velocity = 0.0 -16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_1/angular_velocity = 0.0 8:3/0 = 0 -8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_0/angular_velocity = 0.0 8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_1/angular_velocity = 0.0 9:3/0 = 0 -9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_0/angular_velocity = 0.0 9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_1/angular_velocity = 0.0 10:3/0 = 0 -10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_0/angular_velocity = 0.0 10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_1/angular_velocity = 0.0 11:3/0 = 0 -11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_0/angular_velocity = 0.0 -11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_1/angular_velocity = 0.0 12:3/0 = 0 -12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_0/angular_velocity = 0.0 12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_1/angular_velocity = 0.0 13:3/0 = 0 -13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_0/angular_velocity = 0.0 13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_1/angular_velocity = 0.0 14:3/0 = 0 -14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_0/angular_velocity = 0.0 -14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_1/angular_velocity = 0.0 15:3/0 = 0 -15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_0/angular_velocity = 0.0 -15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_1/angular_velocity = 0.0 16:3/0 = 0 -16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_0/angular_velocity = 0.0 -16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_1/angular_velocity = 0.0 8:4/0 = 0 -8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_0/angular_velocity = 0.0 -8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_1/angular_velocity = 0.0 9:4/0 = 0 -9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_0/angular_velocity = 0.0 -9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_1/angular_velocity = 0.0 10:4/0 = 0 -10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_0/angular_velocity = 0.0 -10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_1/angular_velocity = 0.0 11:4/0 = 0 -11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_0/angular_velocity = 0.0 11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8) -11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_1/angular_velocity = 0.0 12:4/0 = 0 -12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_0/angular_velocity = 0.0 12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_1/angular_velocity = 0.0 13:4/0 = 0 -13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_0/angular_velocity = 0.0 13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8) -13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0 = 0 -14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_0/angular_velocity = 0.0 -14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 14:4/0/custom_data_0 = &"Inventory" 15:4/0 = 0 -15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_0/angular_velocity = 0.0 -15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_1/angular_velocity = 0.0 16:4/0 = 0 -16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_0/angular_velocity = 0.0 -16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_1/angular_velocity = 0.0 8:5/0 = 0 -8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_0/angular_velocity = 0.0 -8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_1/angular_velocity = 0.0 9:5/0 = 0 -9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_0/angular_velocity = 0.0 -9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_1/angular_velocity = 0.0 10:5/0 = 0 -10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_0/angular_velocity = 0.0 -10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_1/angular_velocity = 0.0 11:5/0 = 0 -11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_0/angular_velocity = 0.0 11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_1/angular_velocity = 0.0 12:5/0 = 0 -12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_0/angular_velocity = 0.0 12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_1/angular_velocity = 0.0 13:5/0 = 0 -13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_0/angular_velocity = 0.0 13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_1/angular_velocity = 0.0 14:5/0 = 0 -14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_0/angular_velocity = 0.0 -14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_1/angular_velocity = 0.0 15:5/0 = 0 -15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_0/angular_velocity = 0.0 -15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_1/angular_velocity = 0.0 16:5/0 = 0 -16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_0/angular_velocity = 0.0 -16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_1/angular_velocity = 0.0 8:6/0 = 0 -8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_0/angular_velocity = 0.0 -8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_1/angular_velocity = 0.0 9:6/0 = 0 -9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_0/angular_velocity = 0.0 -9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_1/angular_velocity = 0.0 10:6/0 = 0 -10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_0/angular_velocity = 0.0 -10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_1/angular_velocity = 0.0 11:6/0 = 0 -11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_0/angular_velocity = 0.0 11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5) -11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_1/angular_velocity = 0.0 12:6/0 = 0 -12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_0/angular_velocity = 0.0 12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_1/angular_velocity = 0.0 13:6/0 = 0 -13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_0/angular_velocity = 0.0 13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8) -13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_1/angular_velocity = 0.0 14:6/0 = 0 -14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_0/angular_velocity = 0.0 -14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_1/angular_velocity = 0.0 15:6/0 = 0 -15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_0/angular_velocity = 0.0 -15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_1/angular_velocity = 0.0 16:6/0 = 0 -16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_0/angular_velocity = 0.0 -16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_1/angular_velocity = 0.0 -[sub_resource type="TileSet" id="TileSet_kf7eg"] +[sub_resource type="TileSet" id="TileSet_eyojy"] physics_layer_0/collision_layer = 1 physics_layer_1/collision_layer = 2 physics_layer_1/collision_mask = 2 custom_data_layer_0/name = "Type" custom_data_layer_0/type = 21 -sources/0 = SubResource("TileSetAtlasSource_easgx") +sources/0 = SubResource("TileSetAtlasSource_nivvc") [sub_resource type="Curve2D" id="Curve2D_usrhf"] _data = { -"points": PackedVector2Array(-96.4111, 42.3785, 0, 0, 222, 0, 0, 0, 0, 0, 1550, 0) +"points": PackedVector2Array(-96.4111, 42.3785, 0, 0, 222, 0, 0, 0, 0, 0, 1580.53, 0) } point_count = 2 -[node name="ExampleScene2D" type="Node2D"] +[node name="Root" type="Node2D"] [node name="Background" type="CanvasLayer" parent="."] layer = -3 [node name="ColorRect" type="ColorRect" parent="Background"] +auto_translate_mode = 2 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 @@ -582,20 +183,22 @@ offset_right = 981.0 offset_bottom = 548.0 grow_horizontal = 2 grow_vertical = 2 -auto_translate = false localize_numeral_system = false color = Color(0.137255, 0.14902, 0.196078, 1) -[node name="TileMap" type="TileMap" parent="."] -z_index = -1 +[node name="Pillar" type="TileMapLayer" parent="."] +use_parent_material = true scale = Vector2(3, 3) -tile_set = SubResource("TileSet_kf7eg") -format = 2 -layer_0/name = "Background" -layer_0/tile_data = PackedInt32Array(-393216, 655360, 2, -327680, 655360, 3, -262144, 655360, 3, -196608, 655360, 3, -131072, 655360, 3, -65536, 655360, 3, -393215, 720896, 2, -327679, 720896, 1, -262143, 720896, 1, -196607, 720896, 1, -131071, 720896, 1, -65535, 720896, 1, -393214, 786432, 2, -327678, 786432, 3, -262142, 786432, 3, -196606, 786432, 3, -131070, 786432, 3, -65534, 786432, 3) -layer_1/name = "Terrain" -layer_1/z_index = 1 -layer_1/tile_data = PackedInt32Array(1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1, 393225, 786432, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 458752, 1, 327681, 720896, 1, 393217, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 393218, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 393219, 720896, 1, 65540, 458752, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 393220, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 458752, 1, 327685, 720896, 1, 393221, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 393222, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 393223, 458752, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 458752, 1, 262152, 720896, 1, 327688, 720896, 1, 393224, 720896, 1, 65546, 524288, 5, 65547, 524288, 5, 65548, 524288, 5, 65549, 524288, 5, 131082, 524288, 6, 131083, 524288, 6, 131084, 524288, 6, 131085, 524288, 6, 196618, 720896, 1, 262154, 720896, 1, 196619, 720896, 1, 262155, 720896, 1, 196620, 720896, 1, 262156, 720896, 1, 196621, 720896, 1, 262157, 720896, 1, 65550, 524288, 5, 65551, 524288, 5, 65552, 524288, 5, 131086, 524288, 6, 131087, 524288, 6, 131088, 524288, 6, 196622, 720896, 1, 196623, 720896, 1, 262159, 720896, 1, 262160, 720896, 1, 196624, 720896, 1, 262158, 720896, 1, 17, 720896, 4, 65553, 720896, 5, 131089, 720896, 5, 196625, 720896, 5, 262161, 720896, 5, 18, 786432, 4, 19, 786432, 4, 20, 786432, 4, 21, 786432, 4, 22, 786432, 4, 23, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 65555, 786432, 5, 131091, 589824, 6, 196627, 786432, 5, 262163, 786432, 5, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 655360, 6, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327697, 720896, 5, 393233, 720896, 5, 327698, 589824, 6, 393234, 786432, 5, 327699, 786432, 5, 393235, 786432, 5, 327700, 786432, 5, 393236, 786432, 5, 327701, 786432, 5, 393237, 786432, 5, 327702, 786432, 5, 393238, 786432, 5, 327703, 786432, 5, 393239, 786432, 5, -131062, 720896, 4, -131061, 786432, 4, -131060, 786432, 4, -65526, 720896, 6, -65525, 786432, 6, -65524, 786432, 6, -131056, 851968, 4, -65520, 851968, 6, -131059, 786432, 4, -131058, 786432, 4, -131057, 786432, 4, -65523, 786432, 6, -65522, 786432, 6, -65521, 786432, 6, -65536, 917504, 2, -65535, 983040, 2, -65534, 1048576, 2, -65533, 917504, 2, -65532, 983040, 2, -65531, 1048576, 2, -65530, 917504, 2, -65529, 983040, 2, -65528, 1048576, 2, 65535, 655360, 0, 131071, 655360, 1, 196607, 655360, 1, 262143, 655360, 1, 327679, 655360, 1, 393215, 655360, 1, 458751, 655360, 1, 524287, 655360, 1, 589823, 655360, 1, 0, 720896, 0, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 393216, 720896, 1, 458752, 720896, 1, 524288, 720896, 1, 524289, 720896, 1, 524290, 720896, 1, 524291, 720896, 1, 524292, 720896, 1, 524293, 720896, 1, 524294, 720896, 1, 524295, 720896, 1, 524296, 720896, 1, 524297, 786432, 1, 458761, 786432, 1, 458760, 720896, 1, 458759, 720896, 1, 458758, 458752, 1, 458757, 720896, 1, 458756, 720896, 1, 458755, 720896, 1, 458754, 720896, 1, 458753, 720896, 1, -262145, 851968, 4, -196609, 851968, 5, -131073, 851968, 5, -65537, 851968, 5, -1, 851968, 6, -262146, 786432, 4, -262147, 786432, 4, -196610, 589824, 6, -196611, 786432, 5, -6, 786432, 5, -5, 786432, 5, -4, 786432, 5, -3, 786432, 5, -2, 786432, 5, -65538, 786432, 5, -131074, 786432, 5, -131075, 786432, 5, -65539, 655360, 6, 65534, 851968, 5, 131070, 851968, 5, 196606, 851968, 5, 262142, 851968, 5, 327678, 851968, 5, 393214, 851968, 5, 458750, 851968, 5, 65533, 786432, 5, 65532, 786432, 5, 65531, 786432, 5, 65530, 786432, 5, 65529, 720896, 5, 131066, 786432, 5, 196602, 786432, 5, 262138, 786432, 5, 262139, 786432, 5, 327675, 786432, 5, 131068, 786432, 5, 131069, 786432, 5, 196605, 786432, 5, 262141, 786432, 5, 327677, 786432, 5, 393213, 786432, 5, 458749, 786432, 5, 393212, 786432, 5, 393211, 786432, 5, 458748, 786432, 5, 327676, 655360, 6, 262140, 786432, 5, 196604, 786432, 5, 131067, 786432, 5, 196603, 589824, 6, 458747, 786432, 5, 458746, 786432, 5, 393210, 786432, 5, 327674, 786432, 5, -7, 720896, 5, 131065, 720896, 5, 196601, 720896, 5, 262137, 720896, 5, 327673, 720896, 5, 393209, 720896, 5, 458745, 720896, 5, -327684, 720896, 3, -196594, 720896, 3, -196597, 720896, 3, -65518, 720896, 3, -65516, 720896, 3, -327686, 1048576, 5, -327685, 720896, 3, -196595, 917504, 6, -65514, 983040, 6, -327683, 983040, 5, -65513, 1048576, 5, -262151, 720896, 4, -196615, 720896, 5, -131079, 720896, 5, -65543, 720896, 5, -262150, 786432, 4, -196614, 655360, 6, -131078, 786432, 5, -65542, 786432, 5, -262149, 786432, 4, -196613, 786432, 5, -131077, 786432, 5, -65541, 786432, 5, -262148, 786432, 4, -196612, 786432, 5, -131076, 786432, 5, -65540, 786432, 5, 458769, 720896, 5, 524305, 720896, 6, 458775, 786432, 5, 458774, 786432, 5, 458773, 786432, 5, 458772, 786432, 5, 458771, 786432, 5, 458770, 786432, 5, 524306, 786432, 6, 524307, 786432, 6, 524308, 786432, 6, 524309, 786432, 6, 524310, 786432, 6, 524311, 786432, 6, 327690, 720896, 1, 393226, 720896, 1, 458762, 720896, 1, 524298, 720896, 1, 327691, 720896, 1, 393227, 720896, 1, 458763, 720896, 1, 524299, 720896, 1, 327692, 720896, 1, 393228, 720896, 1, 458764, 720896, 1, 524300, 720896, 1, 327693, 720896, 1, 393229, 720896, 1, 458765, 720896, 1, 524301, 720896, 1, 327694, 720896, 1, 393230, 720896, 1, 458766, 720896, 1, 524302, 720896, 1, 327695, 720896, 1, 393231, 720896, 1, 458767, 720896, 1, 524303, 720896, 1, 327696, 720896, 1, 393232, 720896, 1, 458768, 720896, 1, 524304, 720896, 1, 29, 851968, 4, 65565, 851968, 5, 131101, 851968, 5, 196637, 851968, 5, 262173, 851968, 5, 327709, 851968, 5, 393245, 851968, 5, 458781, 851968, 5, 524317, 851968, 6, 24, 786432, 4, 25, 786432, 4, 26, 786432, 4, 27, 786432, 4, 28, 786432, 4, 65560, 786432, 5, 65561, 786432, 5, 65562, 786432, 5, 65563, 786432, 5, 65564, 786432, 5, 131100, 786432, 5, 196636, 589824, 6, 131099, 786432, 5, 131098, 786432, 5, 131097, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 393240, 786432, 5, 458776, 786432, 5, 524312, 786432, 6, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 393241, 786432, 5, 458777, 786432, 5, 524313, 786432, 6, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 393242, 655360, 6, 458778, 786432, 5, 524314, 786432, 6, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, 393243, 786432, 5, 458779, 786432, 5, 524315, 786432, 6, 262172, 786432, 5, 327708, 786432, 5, 393244, 786432, 5, 458780, 786432, 5, 524316, 786432, 6, -196593, 1048576, 6, -65509, 720896, 3, -65510, 720896, 3, -65517, 720896, 3, -65515, 720896, 3, 524282, 786432, 5, 524283, 786432, 5, 524284, 786432, 5, 524285, 786432, 5, 524281, 720896, 5, 524286, 851968, 5, 589817, 720896, 6, 589818, 786432, 6, 589819, 786432, 6, 589820, 786432, 6, 589821, 786432, 6, 589822, 851968, 6, -196569, 720896, 4, -131033, 720896, 5, -65497, 720896, 5, 39, 720896, 5, 65575, 720896, 5, 131111, 720896, 5, 196647, 720896, 5, 262183, 720896, 5, 327719, 720896, 5, 393255, 720896, 5, 458791, 720896, 5, 524327, 720896, 5, 589863, 720896, 5, 655399, 720896, 6, -262104, 917504, 6, -196568, 786432, 4, -131032, 786432, 5, -65496, 655360, 6, 40, 786432, 5, 65576, 786432, 5, 131112, 786432, 5, 196648, 786432, 5, 262184, 786432, 5, 327720, 786432, 5, 393256, 786432, 5, 458792, 786432, 5, 524328, 655360, 6, 589864, 786432, 5, 655400, 786432, 6, -262103, 983040, 5, -196567, 786432, 4, -131031, 786432, 5, -65495, 786432, 5, 41, 589824, 6, 65577, 786432, 5, 131113, 786432, 5, 196649, 786432, 5, 262185, 786432, 5, 327721, 786432, 5, 393257, 786432, 5, 458793, 786432, 5, 524329, 786432, 5, 589865, 786432, 5, 655401, 786432, 6, -262102, 720896, 3, -196566, 786432, 4, -131030, 786432, 5, -65494, 786432, 5, 42, 786432, 5, 65578, 786432, 5, 131114, 786432, 5, 196650, 786432, 5, 262186, 655360, 6, 327722, 786432, 5, 393258, 786432, 5, 458794, 786432, 5, 524330, 786432, 5, 589866, 786432, 5, 655402, 786432, 6, -262101, 1048576, 6, -196565, 786432, 4, -131029, 786432, 5, -65493, 786432, 5, 43, 786432, 5, 65579, 786432, 5, 131115, 786432, 5, 196651, 786432, 5, 262187, 786432, 5, 327723, 786432, 5, 393259, 655360, 6, 458795, 655360, 6, 524331, 786432, 5, 589867, 786432, 5, 655403, 786432, 6, -262100, 720896, 3, -196564, 786432, 4, -131028, 786432, 5, -65492, 786432, 5, 44, 786432, 5, 65580, 786432, 5, 131116, 786432, 5, 196652, 786432, 5, 262188, 786432, 5, 327724, 786432, 5, 393260, 786432, 5, 458796, 786432, 5, 524332, 786432, 5, 589868, 786432, 5, 655404, 786432, 6, -262099, 983040, 6, -196563, 786432, 4, -131027, 786432, 5, -65491, 786432, 5, 45, 589824, 6, 65581, 655360, 6, 131117, 655360, 6, 196653, 786432, 5, 262189, 786432, 5, 327725, 786432, 5, 393261, 786432, 5, 458797, 786432, 5, 524333, 786432, 5, 589869, 655360, 6, 655405, 786432, 6, -196562, 786432, 4, -131026, 786432, 5, -65490, 786432, 5, 46, 786432, 5, 65582, 786432, 5, 131118, 786432, 5, 196654, 786432, 5, 262190, 786432, 5, 327726, 786432, 5, 393262, 786432, 5, 458798, 786432, 5, 524334, 786432, 5, 589870, 786432, 5, 655406, 786432, 6, -196561, 851968, 4, -131025, 851968, 5, -65489, 851968, 5, 47, 851968, 5, 65583, 851968, 5, 131119, 851968, 5, 196655, 851968, 5, 262191, 851968, 5, 327727, 851968, 5, 393263, 851968, 5, 458799, 851968, 5, 524335, 851968, 5, 589871, 851968, 5, 655407, 851968, 6, -131042, 720896, 4, -65506, 720896, 5, 30, 720896, 5, 65566, 720896, 5, 131102, 720896, 5, 196638, 720896, 5, 262174, 720896, 5, 327710, 720896, 5, 393246, 720896, 5, 458782, 720896, 5, 524318, 720896, 5, -196577, 917504, 6, -131041, 786432, 4, -65505, 786432, 5, 31, 655360, 6, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 393247, 786432, 5, 458783, 786432, 5, 524319, 786432, 5, -196576, 983040, 5, -131040, 786432, 4, -65504, 786432, 5, 32, 786432, 5, 65568, 589824, 6, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 393248, 786432, 5, 458784, 786432, 5, 524320, 786432, 5, -196575, 720896, 3, -131039, 786432, 4, -65503, 786432, 5, 33, 786432, 5, 65569, 786432, 5, 131105, 786432, 5, 196641, 786432, 5, 262177, 786432, 5, 327713, 655360, 6, 393249, 786432, 5, 458785, 786432, 5, 524321, 786432, 5, -196574, 1048576, 6, -131038, 786432, 4, -65502, 786432, 5, 34, 786432, 5, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 786432, 5, 327714, 786432, 5, 393250, 786432, 5, 458786, 655360, 6, 524322, 655360, 6, -196573, 720896, 3, -131037, 786432, 4, -65501, 786432, 5, 35, 786432, 5, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 393251, 786432, 5, 458787, 786432, 5, 524323, 786432, 5, -196572, 983040, 6, -131036, 786432, 4, -65500, 786432, 5, 36, 786432, 5, 65572, 589824, 6, 131108, 655360, 6, 196644, 655360, 6, 262180, 786432, 5, 327716, 786432, 5, 393252, 786432, 5, 458788, 786432, 5, 524324, 786432, 5, -131035, 786432, 4, -65499, 786432, 5, 37, 786432, 5, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 786432, 5, 327717, 786432, 5, 393253, 786432, 5, 458789, 786432, 5, 524325, 786432, 5, -131034, 851968, 4, -65498, 851968, 5, 38, 851968, 5, 65574, 851968, 5, 131110, 851968, 5, 196646, 851968, 5, 262182, 851968, 5, 327718, 851968, 5, 393254, 851968, 5, 458790, 851968, 5, 524326, 851968, 5, 589854, 720896, 5, 655390, 720896, 5, 720926, 720896, 6, 589855, 655360, 6, 655391, 786432, 5, 720927, 786432, 6, 589856, 786432, 5, 655392, 786432, 5, 720928, 786432, 6, 589857, 786432, 5, 655393, 786432, 5, 720929, 786432, 6, 589858, 786432, 5, 655394, 786432, 5, 720930, 786432, 6, 589859, 786432, 5, 655395, 786432, 5, 720931, 786432, 6, 589860, 786432, 5, 655396, 655360, 6, 720932, 786432, 6, 589861, 786432, 5, 655397, 786432, 5, 720933, 786432, 6, 589862, 851968, 5, 655398, 851968, 5, 720934, 851968, 6, -458704, 720896, 4, -393168, 720896, 5, -327632, 720896, 5, -262096, 720896, 5, -196560, 720896, 5, -131024, 720896, 5, -65488, 720896, 5, 48, 720896, 5, 65584, 720896, 5, 131120, 720896, 5, 196656, 720896, 5, 262192, 720896, 5, 327728, 720896, 5, 393264, 720896, 6, -524239, 917504, 6, -458703, 786432, 4, -393167, 786432, 5, -327631, 655360, 6, -262095, 786432, 5, -196559, 786432, 5, -131023, 786432, 5, -65487, 786432, 5, 49, 786432, 5, 65585, 786432, 5, 131121, 786432, 5, 196657, 786432, 5, 262193, 655360, 6, 327729, 786432, 5, 393265, 786432, 6, -524238, 983040, 5, -458702, 786432, 4, -393166, 786432, 5, -327630, 786432, 5, -262094, 589824, 6, -196558, 786432, 5, -131022, 786432, 5, -65486, 786432, 5, 50, 786432, 5, 65586, 786432, 5, 131122, 786432, 5, 196658, 786432, 5, 262194, 786432, 5, 327730, 786432, 5, 393266, 786432, 6, -524237, 720896, 3, -458701, 786432, 4, -393165, 786432, 5, -327629, 786432, 5, -262093, 786432, 5, -196557, 786432, 5, -131021, 786432, 5, -65485, 786432, 5, 51, 655360, 6, 65587, 786432, 5, 131123, 786432, 5, 196659, 786432, 5, 262195, 786432, 5, 327731, 786432, 5, 393267, 786432, 6, -524236, 1048576, 6, -458700, 786432, 4, -393164, 786432, 5, -327628, 786432, 5, -262092, 786432, 5, -196556, 786432, 5, -131020, 786432, 5, -65484, 786432, 5, 52, 786432, 5, 65588, 786432, 5, 131124, 655360, 6, 196660, 655360, 6, 262196, 786432, 5, 327732, 786432, 5, 393268, 786432, 6, -524235, 720896, 3, -458699, 786432, 4, -393163, 786432, 5, -327627, 786432, 5, -262091, 786432, 5, -196555, 786432, 5, -131019, 786432, 5, -65483, 786432, 5, 53, 786432, 5, 65589, 786432, 5, 131125, 786432, 5, 196661, 786432, 5, 262197, 786432, 5, 327733, 786432, 5, 393269, 786432, 6, -524234, 983040, 6, -458698, 786432, 4, -393162, 786432, 5, -327626, 786432, 5, -262090, 589824, 6, -196554, 655360, 6, -131018, 655360, 6, -65482, 786432, 5, 54, 786432, 5, 65590, 786432, 5, 131126, 786432, 5, 196662, 786432, 5, 262198, 786432, 5, 327734, 655360, 6, 393270, 786432, 6, -458697, 786432, 4, -393161, 786432, 5, -327625, 786432, 5, -262089, 786432, 5, -196553, 786432, 5, -131017, 786432, 5, -65481, 786432, 5, 55, 786432, 5, 65591, 786432, 5, 131127, 786432, 5, 196663, 786432, 5, 262199, 786432, 5, 327735, 786432, 5, 393271, 786432, 6, -458696, 851968, 4, -393160, 851968, 5, -327624, 851968, 5, -262088, 851968, 5, -196552, 851968, 5, -131016, 851968, 5, -65480, 851968, 5, 56, 851968, 5, 65592, 851968, 5, 131128, 851968, 5, 196664, 851968, 5, 262200, 851968, 5, 327736, 851968, 5, 393272, 851968, 6) +tile_map_data = PackedByteArray("AAAAAPr/AAAKAAIAAAAAAPv/AAAKAAMAAAAAAPz/AAAKAAMAAAAAAP3/AAAKAAMAAAAAAP7/AAAKAAMAAAAAAP//AAAKAAMAAAABAPr/AAALAAIAAAABAPv/AAALAAEAAAABAPz/AAALAAEAAAABAP3/AAALAAEAAAABAP7/AAALAAEAAAABAP//AAALAAEAAAACAPr/AAAMAAIAAAACAPv/AAAMAAMAAAACAPz/AAAMAAMAAAACAP3/AAAMAAMAAAACAP7/AAAMAAMAAAACAP//AAAMAAMAAAA=") +tile_set = SubResource("TileSet_eyojy") +collision_enabled = false +navigation_enabled = false + +[node name="Terrain" type="TileMapLayer" parent="."] +use_parent_material = true +scale = Vector2(3, 3) +tile_map_data = PackedByteArray("AAABAAAAAAALAAAAAAACAAAAAAALAAAAAAADAAAAAAALAAAAAAAEAAAAAAALAAAAAAAFAAAAAAALAAAAAAAGAAAAAAALAAAAAAAHAAAAAAALAAAAAAAIAAAAAAALAAAAAAAJAAAAAAAMAAAAAAAJAAEAAAAMAAEAAAAJAAIAAAAMAAEAAAAJAAMAAAAMAAEAAAAJAAQAAAAMAAEAAAAJAAUAAAAMAAEAAAAJAAYAAAAMAAEAAAABAAEAAAALAAEAAAABAAIAAAALAAEAAAABAAMAAAALAAEAAAABAAQAAAAHAAEAAAABAAUAAAALAAEAAAABAAYAAAALAAEAAAACAAEAAAALAAEAAAACAAIAAAALAAEAAAACAAMAAAALAAEAAAACAAQAAAALAAEAAAACAAUAAAALAAEAAAACAAYAAAALAAEAAAADAAEAAAALAAEAAAADAAIAAAALAAEAAAADAAMAAAALAAEAAAADAAQAAAALAAEAAAADAAUAAAALAAEAAAADAAYAAAALAAEAAAAEAAEAAAAHAAEAAAAEAAIAAAALAAEAAAAEAAMAAAALAAEAAAAEAAQAAAALAAEAAAAEAAUAAAALAAEAAAAEAAYAAAALAAEAAAAFAAEAAAALAAEAAAAFAAIAAAALAAEAAAAFAAMAAAALAAEAAAAFAAQAAAAHAAEAAAAFAAUAAAALAAEAAAAFAAYAAAALAAEAAAAGAAEAAAALAAEAAAAGAAIAAAALAAEAAAAGAAMAAAALAAEAAAAGAAQAAAALAAEAAAAGAAUAAAALAAEAAAAGAAYAAAALAAEAAAAHAAEAAAALAAEAAAAHAAIAAAALAAEAAAAHAAMAAAALAAEAAAAHAAQAAAALAAEAAAAHAAUAAAALAAEAAAAHAAYAAAAHAAEAAAAIAAEAAAALAAEAAAAIAAIAAAALAAEAAAAIAAMAAAAHAAEAAAAIAAQAAAALAAEAAAAIAAUAAAALAAEAAAAIAAYAAAALAAEAAAAKAAEAAAAIAAUAAAALAAEAAAAIAAUAAAAMAAEAAAAIAAUAAAANAAEAAAAIAAUAAAAKAAIAAAAIAAYAAAALAAIAAAAIAAYAAAAMAAIAAAAIAAYAAAANAAIAAAAIAAYAAAAKAAMAAAALAAEAAAAKAAQAAAALAAEAAAALAAMAAAALAAEAAAALAAQAAAALAAEAAAAMAAMAAAALAAEAAAAMAAQAAAALAAEAAAANAAMAAAALAAEAAAANAAQAAAALAAEAAAAOAAEAAAAIAAUAAAAPAAEAAAAIAAUAAAAQAAEAAAAIAAUAAAAOAAIAAAAIAAYAAAAPAAIAAAAIAAYAAAAQAAIAAAAIAAYAAAAOAAMAAAALAAEAAAAPAAMAAAALAAEAAAAPAAQAAAALAAEAAAAQAAQAAAALAAEAAAAQAAMAAAALAAEAAAAOAAQAAAALAAEAAAARAAAAAAALAAQAAAARAAEAAAALAAUAAAARAAIAAAALAAUAAAARAAMAAAALAAUAAAARAAQAAAALAAUAAAASAAAAAAAMAAQAAAATAAAAAAAMAAQAAAAUAAAAAAAMAAQAAAAVAAAAAAAMAAQAAAAWAAAAAAAMAAQAAAAXAAAAAAAMAAQAAAASAAEAAAAMAAUAAAASAAIAAAAMAAUAAAASAAMAAAAMAAUAAAASAAQAAAAMAAUAAAATAAEAAAAMAAUAAAATAAIAAAAJAAYAAAATAAMAAAAMAAUAAAATAAQAAAAMAAUAAAAUAAEAAAAMAAUAAAAUAAIAAAAMAAUAAAAUAAMAAAAMAAUAAAAUAAQAAAAMAAUAAAAVAAEAAAAMAAUAAAAVAAIAAAAMAAUAAAAVAAMAAAAMAAUAAAAVAAQAAAAMAAUAAAAWAAEAAAAMAAUAAAAWAAIAAAAMAAUAAAAWAAMAAAAMAAUAAAAWAAQAAAAKAAYAAAAXAAEAAAAMAAUAAAAXAAIAAAAMAAUAAAAXAAMAAAAMAAUAAAAXAAQAAAAMAAUAAAARAAUAAAALAAUAAAARAAYAAAALAAUAAAASAAUAAAAJAAYAAAASAAYAAAAMAAUAAAATAAUAAAAMAAUAAAATAAYAAAAMAAUAAAAUAAUAAAAMAAUAAAAUAAYAAAAMAAUAAAAVAAUAAAAMAAUAAAAVAAYAAAAMAAUAAAAWAAUAAAAMAAUAAAAWAAYAAAAMAAUAAAAXAAUAAAAMAAUAAAAXAAYAAAAMAAUAAAAKAP7/AAALAAQAAAALAP7/AAAMAAQAAAAMAP7/AAAMAAQAAAAKAP//AAALAAYAAAALAP//AAAMAAYAAAAMAP//AAAMAAYAAAAQAP7/AAANAAQAAAAQAP//AAANAAYAAAANAP7/AAAMAAQAAAAOAP7/AAAMAAQAAAAPAP7/AAAMAAQAAAANAP//AAAMAAYAAAAOAP//AAAMAAYAAAAPAP//AAAMAAYAAAAMAP3/AAAOAAAAAAADAP//AAAOAAIAAAAEAP//AAAPAAIAAAAFAP//AAAQAAIAAAAGAP//AAAOAAIAAAAHAP//AAAPAAIAAAAIAP//AAAQAAIAAAD//wAAAAAKAAAAAAD//wEAAAAKAAEAAAD//wIAAAAKAAEAAAD//wMAAAAKAAEAAAD//wQAAAAKAAEAAAD//wUAAAAKAAEAAAD//wYAAAAKAAEAAAD//wcAAAAKAAEAAAD//wgAAAAKAAEAAAAAAAAAAAALAAAAAAAAAAEAAAALAAEAAAAAAAIAAAALAAEAAAAAAAMAAAALAAEAAAAAAAQAAAALAAEAAAAAAAUAAAALAAEAAAAAAAYAAAALAAEAAAAAAAcAAAALAAEAAAAAAAgAAAALAAEAAAABAAgAAAALAAEAAAACAAgAAAALAAEAAAADAAgAAAALAAEAAAAEAAgAAAALAAEAAAAFAAgAAAALAAEAAAAGAAgAAAALAAEAAAAHAAgAAAALAAEAAAAIAAgAAAALAAEAAAAJAAgAAAAMAAEAAAAJAAcAAAAMAAEAAAAIAAcAAAALAAEAAAAHAAcAAAALAAEAAAAGAAcAAAAHAAEAAAAFAAcAAAALAAEAAAAEAAcAAAALAAEAAAADAAcAAAALAAEAAAACAAcAAAALAAEAAAABAAcAAAALAAEAAAD///v/AAANAAQAAAD///z/AAANAAUAAAD///3/AAANAAUAAAD///7/AAANAAUAAAD/////AAANAAYAAAD+//v/AAAMAAQAAAD9//v/AAAMAAQAAAD+//z/AAAJAAYAAAD9//z/AAAMAAUAAAD6////AAAMAAUAAAD7////AAAMAAUAAAD8////AAAMAAUAAAD9////AAAMAAUAAAD+////AAAMAAUAAAD+//7/AAAMAAUAAAD+//3/AAAMAAUAAAD9//3/AAAMAAUAAAD9//7/AAAKAAYAAAD+/wAAAAANAAUAAAD+/wEAAAANAAUAAAD+/wIAAAANAAUAAAD+/wMAAAANAAUAAAD+/wQAAAANAAUAAAD+/wUAAAANAAUAAAD+/wYAAAANAAUAAAD9/wAAAAAMAAUAAAD8/wAAAAAMAAUAAAD7/wAAAAAMAAUAAAD6/wAAAAAMAAUAAAD5/wAAAAALAAUAAAD6/wEAAAAMAAUAAAD6/wIAAAAMAAUAAAD6/wMAAAAMAAUAAAD7/wMAAAAMAAUAAAD7/wQAAAAMAAUAAAD8/wEAAAAMAAUAAAD9/wEAAAAMAAUAAAD9/wIAAAAMAAUAAAD9/wMAAAAMAAUAAAD9/wQAAAAMAAUAAAD9/wUAAAAMAAUAAAD9/wYAAAAMAAUAAAD8/wUAAAAMAAUAAAD7/wUAAAAMAAUAAAD8/wYAAAAMAAUAAAD8/wQAAAAKAAYAAAD8/wMAAAAMAAUAAAD8/wIAAAAMAAUAAAD7/wEAAAAMAAUAAAD7/wIAAAAJAAYAAAD7/wYAAAAMAAUAAAD6/wYAAAAMAAUAAAD6/wUAAAAMAAUAAAD6/wQAAAAMAAUAAAD5////AAALAAUAAAD5/wEAAAALAAUAAAD5/wIAAAALAAUAAAD5/wMAAAALAAUAAAD5/wQAAAALAAUAAAD5/wUAAAALAAUAAAD5/wYAAAALAAUAAAD8//r/AAALAAMAAAAOAP3/AAALAAMAAAALAP3/AAALAAMAAAASAP//AAALAAMAAAAUAP//AAALAAMAAAD6//r/AAAQAAUAAAD7//r/AAALAAMAAAANAP3/AAAOAAYAAAAWAP//AAAPAAYAAAD9//r/AAAPAAUAAAAXAP//AAAQAAUAAAD5//v/AAALAAQAAAD5//z/AAALAAUAAAD5//3/AAALAAUAAAD5//7/AAALAAUAAAD6//v/AAAMAAQAAAD6//z/AAAKAAYAAAD6//3/AAAMAAUAAAD6//7/AAAMAAUAAAD7//v/AAAMAAQAAAD7//z/AAAMAAUAAAD7//3/AAAMAAUAAAD7//7/AAAMAAUAAAD8//v/AAAMAAQAAAD8//z/AAAMAAUAAAD8//3/AAAMAAUAAAD8//7/AAAMAAUAAAARAAcAAAALAAUAAAARAAgAAAALAAYAAAAXAAcAAAAMAAUAAAAWAAcAAAAMAAUAAAAVAAcAAAAMAAUAAAAUAAcAAAAMAAUAAAATAAcAAAAMAAUAAAASAAcAAAAMAAUAAAASAAgAAAAMAAYAAAATAAgAAAAMAAYAAAAUAAgAAAAMAAYAAAAVAAgAAAAMAAYAAAAWAAgAAAAMAAYAAAAXAAgAAAAMAAYAAAAKAAUAAAALAAEAAAAKAAYAAAALAAEAAAAKAAcAAAALAAEAAAAKAAgAAAALAAEAAAALAAUAAAALAAEAAAALAAYAAAALAAEAAAALAAcAAAALAAEAAAALAAgAAAALAAEAAAAMAAUAAAALAAEAAAAMAAYAAAALAAEAAAAMAAcAAAALAAEAAAAMAAgAAAALAAEAAAANAAUAAAALAAEAAAANAAYAAAALAAEAAAANAAcAAAALAAEAAAANAAgAAAALAAEAAAAOAAUAAAALAAEAAAAOAAYAAAALAAEAAAAOAAcAAAALAAEAAAAOAAgAAAALAAEAAAAPAAUAAAALAAEAAAAPAAYAAAALAAEAAAAPAAcAAAALAAEAAAAPAAgAAAALAAEAAAAQAAUAAAALAAEAAAAQAAYAAAALAAEAAAAQAAcAAAALAAEAAAAQAAgAAAALAAEAAAAdAAAAAAANAAQAAAAdAAEAAAANAAUAAAAdAAIAAAANAAUAAAAdAAMAAAANAAUAAAAdAAQAAAANAAUAAAAdAAUAAAANAAUAAAAdAAYAAAANAAUAAAAdAAcAAAANAAUAAAAdAAgAAAANAAYAAAAZAP//AAAOAAQAAAAYAAAAAAAMAAQAAAAZAAAAAAAMAAQAAAAaAAAAAAAMAAQAAAAbAAAAAAAMAAQAAAAcAAAAAAAMAAQAAAAYAAEAAAAMAAUAAAAZAAEAAAAMAAUAAAAaAAEAAAAMAAUAAAAbAAEAAAAMAAUAAAAcAAEAAAAMAAUAAAAcAAIAAAAMAAUAAAAcAAMAAAAJAAYAAAAbAAIAAAAMAAUAAAAaAAIAAAAMAAUAAAAZAAIAAAAMAAUAAAAYAAIAAAAMAAUAAAAYAAMAAAAMAAUAAAAYAAQAAAAMAAUAAAAYAAUAAAAMAAUAAAAYAAYAAAAMAAUAAAAYAAcAAAAMAAUAAAAYAAgAAAAMAAYAAAAZAAMAAAAMAAUAAAAZAAQAAAAMAAUAAAAZAAUAAAAMAAUAAAAZAAYAAAAMAAUAAAAZAAcAAAAMAAUAAAAZAAgAAAAMAAYAAAAaAAMAAAAMAAUAAAAaAAQAAAAMAAUAAAAaAAUAAAAMAAUAAAAaAAYAAAAKAAYAAAAaAAcAAAAMAAUAAAAaAAgAAAAMAAYAAAAbAAMAAAAMAAUAAAAbAAQAAAAMAAUAAAAbAAUAAAAMAAUAAAAbAAYAAAAMAAUAAAAbAAcAAAAMAAUAAAAbAAgAAAAMAAYAAAAcAAQAAAAMAAUAAAAcAAUAAAAMAAUAAAAcAAYAAAAMAAUAAAAcAAcAAAAMAAUAAAAcAAgAAAAMAAYAAAAPAP3/AAAQAAYAAAAbAP//AAALAAMAAAAaAP//AAALAAMAAAATAP//AAALAAMAAAAVAP//AAALAAMAAAD6/wcAAAAMAAUAAAD7/wcAAAAMAAUAAAD8/wcAAAAMAAUAAAD9/wcAAAAMAAUAAAD5/wcAAAALAAUAAAD+/wcAAAANAAUAAAD5/wgAAAALAAYAAAD6/wgAAAAMAAYAAAD7/wgAAAAMAAYAAAD8/wgAAAAMAAYAAAD9/wgAAAAMAAYAAAD+/wgAAAANAAYAAAAeAP//AAALAAQAAAAeAAAAAAALAAUAAAAeAAEAAAALAAUAAAAeAAIAAAALAAUAAAAeAAMAAAALAAUAAAAeAAQAAAALAAUAAAAeAAUAAAALAAUAAAAeAAYAAAALAAUAAAAeAAcAAAALAAUAAAAeAAgAAAALAAUAAAAeAAkAAAALAAUAAAAeAAoAAAALAAUAAAAeAAsAAAALAAUAAAAeAAwAAAALAAYAAAAfAP//AAAMAAQAAAAfAAAAAAAMAAUAAAAfAAEAAAAKAAYAAAAfAAIAAAAMAAUAAAAfAAMAAAAMAAUAAAAfAAQAAAAMAAUAAAAfAAUAAAAMAAUAAAAfAAYAAAAMAAUAAAAfAAcAAAAMAAUAAAAfAAgAAAAMAAUAAAAfAAkAAAAMAAUAAAAfAAoAAAAKAAYAAAAfAAsAAAAMAAUAAAAfAAwAAAAMAAYAAAAgAP//AAAMAAQAAAAgAAAAAAAMAAUAAAAgAAEAAAAMAAUAAAAgAAIAAAAJAAYAAAAgAAMAAAAMAAUAAAAgAAQAAAAMAAUAAAAgAAUAAAAMAAUAAAAgAAYAAAAMAAUAAAAgAAcAAAAMAAUAAAAgAAgAAAAMAAUAAAAgAAkAAAAMAAUAAAAgAAoAAAAMAAUAAAAgAAsAAAAMAAUAAAAgAAwAAAAMAAYAAAAhAP//AAAMAAQAAAAhAAAAAAAMAAUAAAAhAAEAAAAMAAUAAAAhAAIAAAAMAAUAAAAhAAMAAAAMAAUAAAAhAAQAAAAMAAUAAAAhAAUAAAAMAAUAAAAhAAYAAAAKAAYAAAAhAAcAAAAMAAUAAAAhAAgAAAAMAAUAAAAhAAkAAAAMAAUAAAAhAAoAAAAMAAUAAAAhAAsAAAAMAAUAAAAhAAwAAAAMAAYAAAAiAP//AAAMAAQAAAAiAAAAAAAMAAUAAAAiAAEAAAAMAAUAAAAiAAIAAAAMAAUAAAAiAAMAAAAMAAUAAAAiAAQAAAAMAAUAAAAiAAUAAAAMAAUAAAAiAAYAAAAMAAUAAAAiAAcAAAAMAAUAAAAiAAgAAAAKAAYAAAAiAAkAAAAKAAYAAAAiAAoAAAAMAAUAAAAiAAsAAAAMAAUAAAAiAAwAAAAMAAYAAAAjAP//AAAMAAQAAAAjAAAAAAAMAAUAAAAjAAEAAAAMAAUAAAAjAAIAAAAMAAUAAAAjAAMAAAAMAAUAAAAjAAQAAAAMAAUAAAAjAAUAAAAMAAUAAAAjAAYAAAAMAAUAAAAjAAcAAAAMAAUAAAAjAAgAAAAMAAUAAAAjAAkAAAAMAAUAAAAjAAoAAAAMAAUAAAAjAAsAAAAMAAUAAAAjAAwAAAAMAAYAAAAkAP//AAAMAAQAAAAkAAAAAAAMAAUAAAAkAAEAAAAMAAUAAAAkAAIAAAAJAAYAAAAkAAMAAAAKAAYAAAAkAAQAAAAKAAYAAAAkAAUAAAAMAAUAAAAkAAYAAAAMAAUAAAAkAAcAAAAMAAUAAAAkAAgAAAAMAAUAAAAkAAkAAAAMAAUAAAAkAAoAAAAMAAUAAAAkAAsAAAAKAAYAAAAkAAwAAAAMAAYAAAAlAP//AAAMAAQAAAAlAAAAAAAMAAUAAAAlAAEAAAAMAAUAAAAlAAIAAAAMAAUAAAAlAAMAAAAMAAUAAAAlAAQAAAAMAAUAAAAlAAUAAAAMAAUAAAAlAAYAAAAMAAUAAAAlAAcAAAAMAAUAAAAlAAgAAAAMAAUAAAAlAAkAAAAMAAUAAAAlAAoAAAAMAAUAAAAlAAsAAAAMAAUAAAAlAAwAAAAMAAYAAAAmAP//AAANAAQAAAAmAAAAAAANAAUAAAAmAAEAAAANAAUAAAAmAAIAAAANAAUAAAAmAAMAAAANAAUAAAAmAAQAAAANAAUAAAAmAAUAAAANAAUAAAAmAAYAAAANAAUAAAAmAAcAAAANAAUAAAAmAAgAAAANAAUAAAAmAAkAAAANAAUAAAAmAAoAAAANAAUAAAAmAAsAAAANAAUAAAAmAAwAAAANAAYAAAAnAP7/AAALAAQAAAAnAP//AAALAAUAAAAnAAAAAAALAAUAAAAnAAEAAAALAAUAAAAnAAIAAAALAAUAAAAnAAMAAAALAAUAAAAnAAQAAAALAAUAAAAnAAUAAAALAAUAAAAnAAYAAAALAAUAAAAnAAcAAAALAAUAAAAnAAgAAAALAAUAAAAnAAkAAAALAAUAAAAnAAoAAAALAAUAAAAnAAsAAAALAAYAAAAoAP7/AAAMAAQAAAAoAP//AAAMAAUAAAAoAAAAAAAKAAYAAAAoAAEAAAAMAAUAAAAoAAIAAAAMAAUAAAAoAAMAAAAMAAUAAAAoAAQAAAAMAAUAAAAoAAUAAAAMAAUAAAAoAAYAAAAMAAUAAAAoAAcAAAAMAAUAAAAoAAgAAAAMAAUAAAAoAAkAAAAKAAYAAAAoAAoAAAAMAAUAAAAoAAsAAAAMAAYAAAApAP7/AAAMAAQAAAApAP//AAAMAAUAAAApAAAAAAAMAAUAAAApAAEAAAAMAAUAAAApAAIAAAAMAAUAAAApAAMAAAAMAAUAAAApAAQAAAAMAAUAAAApAAUAAAAMAAUAAAApAAYAAAAMAAUAAAApAAcAAAAMAAUAAAApAAgAAAAMAAUAAAApAAkAAAAMAAUAAAApAAoAAAAMAAUAAAApAAsAAAAMAAYAAAAqAP7/AAAMAAQAAAAqAP//AAAMAAUAAAAqAAAAAAAMAAUAAAAqAAEAAAAJAAYAAAAqAAIAAAAKAAYAAAAqAAMAAAAKAAYAAAAqAAQAAAAMAAUAAAAqAAUAAAAMAAUAAAAqAAYAAAAMAAUAAAAqAAcAAAAMAAUAAAAqAAgAAAAMAAUAAAAqAAkAAAAMAAUAAAAqAAoAAAAKAAYAAAAqAAsAAAAMAAYAAAArAPb/AAALAAQAAAArAPf/AAALAAUAAAArAPj/AAALAAUAAAArAPn/AAALAAUAAAArAPr/AAALAAUAAAArAPv/AAALAAUAAAArAPz/AAALAAUAAAArAP3/AAALAAYAAAAsAPb/AAAMAAQAAAAsAPf/AAAMAAUAAAAsAPj/AAAKAAYAAAAsAPn/AAAMAAUAAAAsAPr/AAAMAAUAAAAsAPv/AAAMAAUAAAAsAPz/AAAMAAUAAAAsAP3/AAAMAAYAAAAtAPb/AAAMAAQAAAAtAPf/AAAMAAUAAAAtAPj/AAAMAAUAAAAtAPn/AAAJAAYAAAAtAPr/AAAMAAUAAAAtAPv/AAAMAAUAAAAtAPz/AAAMAAUAAAAtAP3/AAAMAAYAAAAuAPb/AAAMAAQAAAAuAPf/AAAMAAUAAAAuAPj/AAAMAAUAAAAuAPn/AAAMAAUAAAAuAPr/AAAMAAUAAAAuAPv/AAAMAAUAAAAuAPz/AAAMAAUAAAAuAP3/AAAMAAYAAAAvAPb/AAAMAAQAAAAvAPf/AAAMAAUAAAAvAPj/AAAMAAUAAAAvAPn/AAAMAAUAAAAvAPr/AAAMAAUAAAAvAPv/AAAMAAUAAAAvAPz/AAAMAAUAAAAvAP3/AAAMAAYAAAAwAPb/AAAMAAQAAAAwAPf/AAAMAAUAAAAwAPj/AAAMAAUAAAAwAPn/AAAMAAUAAAAwAPr/AAAMAAUAAAAwAPv/AAAMAAUAAAAwAPz/AAAMAAUAAAAwAP3/AAAMAAYAAAAxAPb/AAAMAAQAAAAxAPf/AAAMAAUAAAAxAPj/AAAMAAUAAAAxAPn/AAAMAAUAAAAxAPr/AAAMAAUAAAAxAPv/AAAMAAUAAAAxAPz/AAAMAAUAAAAxAP3/AAAMAAYAAAAyAPb/AAAMAAQAAAAyAPf/AAAMAAUAAAAyAPj/AAAMAAUAAAAyAPn/AAAMAAUAAAAyAPr/AAAMAAUAAAAyAPv/AAAMAAUAAAAyAPz/AAAMAAUAAAAyAP3/AAAMAAUAAAArAP7/AAANAAQAAAArAP//AAANAAUAAAArAAAAAAANAAUAAAArAAEAAAANAAUAAAArAAIAAAANAAUAAAArAAMAAAANAAUAAAArAAQAAAANAAUAAAArAAUAAAANAAUAAAArAAYAAAANAAUAAAArAAcAAAANAAUAAAArAAgAAAANAAUAAAArAAkAAAANAAUAAAArAAoAAAANAAUAAAArAAsAAAANAAYAAAA=") +tile_set = SubResource("TileSet_eyojy") [node name="UI" type="CanvasLayer" parent="."] @@ -608,10 +211,14 @@ unique_name_in_owner = true visible = false [node name="Camera2D" type="Camera2D" parent="."] -position = Vector2(374, -216) +physics_interpolation_mode = 1 +position = Vector2(374, -190) zoom = Vector2(1.5, 1.5) +process_callback = 0 [node name="PhantomCameraHost" type="Node" parent="Camera2D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("4_w0rat") [node name="Label" type="Label" parent="."] @@ -639,7 +246,8 @@ text = "[WASD] to move [node name="PlayerPhantomCamera2D" type="Node2D" parent="." node_paths=PackedStringArray("follow_target", "follow_path")] unique_name_in_owner = true -position = Vector2(374, -216) +top_level = true +position = Vector2(374, -190) script = ExtResource("6_y6hoa") priority = 10 follow_mode = 4 @@ -648,10 +256,11 @@ follow_path = NodePath("../Path2D") zoom = Vector2(1.5, 1.5) tween_resource = ExtResource("7_wd55r") tween_on_load = false +follow_damping = true draw_limits = true [node name="Path2D" type="Path2D" parent="."] -position = Vector2(152, -216) +position = Vector2(152, -190) curve = SubResource("Curve2D_usrhf") [node name="CharacterBody2D" parent="." instance=ExtResource("8_fy81j")] diff --git a/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_limit_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_limit_example_scene.tscn index d34057f..9eb1d61 100644 --- a/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_limit_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_limit_example_scene.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=17 format=3 uid="uid://0ox7hgdpwpqp"] +[gd_scene load_steps=17 format=4 uid="uid://0ox7hgdpwpqp"] [ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/2d_room_limit_tween_4.3.gd" id="1_bwr3f"] [ext_resource type="Texture2D" uid="uid://c77npili4pel4" path="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png" id="2_f03of"] @@ -13,545 +13,145 @@ [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"] texture = ExtResource("2_f03of") 0:0/0 = 0 -0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_0/angular_velocity = 0.0 -0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_1/angular_velocity = 0.0 1:0/0 = 0 -1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_0/angular_velocity = 0.0 -1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_1/angular_velocity = 0.0 2:0/0 = 0 -2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_0/angular_velocity = 0.0 -2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_1/angular_velocity = 0.0 3:0/0 = 0 -3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_0/angular_velocity = 0.0 -3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_1/angular_velocity = 0.0 4:0/0 = 0 -4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_0/angular_velocity = 0.0 -4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_1/angular_velocity = 0.0 5:0/0 = 0 -5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_0/angular_velocity = 0.0 -5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_1/angular_velocity = 0.0 6:0/0 = 0 -6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_0/angular_velocity = 0.0 -6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_1/angular_velocity = 0.0 7:0/0 = 0 -7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_0/angular_velocity = 0.0 7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_1/angular_velocity = 0.0 0:1/0 = 0 -0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_0/angular_velocity = 0.0 -0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_1/angular_velocity = 0.0 1:1/0 = 0 -1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_0/angular_velocity = 0.0 -1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_1/angular_velocity = 0.0 2:1/0 = 0 -2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_0/angular_velocity = 0.0 -2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_1/angular_velocity = 0.0 3:1/0 = 0 -3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_0/angular_velocity = 0.0 -3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_1/angular_velocity = 0.0 4:1/0 = 0 -4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_0/angular_velocity = 0.0 -4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_1/angular_velocity = 0.0 5:1/0 = 0 -5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_0/angular_velocity = 0.0 -5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_1/angular_velocity = 0.0 7:1/0 = 0 -7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_0/angular_velocity = 0.0 7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_1/angular_velocity = 0.0 2:2/0 = 0 -2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_0/angular_velocity = 0.0 -2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_1/angular_velocity = 0.0 3:2/0 = 0 -3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_0/angular_velocity = 0.0 -3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_1/angular_velocity = 0.0 4:2/0 = 0 -4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_0/angular_velocity = 0.0 -4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_1/angular_velocity = 0.0 7:2/0 = 0 -7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_0/angular_velocity = 0.0 7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_1/angular_velocity = 0.0 3:3/0 = 0 -3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_0/angular_velocity = 0.0 -3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_1/angular_velocity = 0.0 4:3/0 = 0 -4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_0/angular_velocity = 0.0 -4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_1/angular_velocity = 0.0 5:3/0 = 0 -5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_0/angular_velocity = 0.0 -5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_1/angular_velocity = 0.0 7:3/0 = 0 -7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_0/angular_velocity = 0.0 7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_1/angular_velocity = 0.0 3:4/0 = 0 -3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_0/angular_velocity = 0.0 -3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_1/angular_velocity = 0.0 4:4/0 = 0 -4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_0/angular_velocity = 0.0 -4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_1/angular_velocity = 0.0 5:4/0 = 0 -5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_0/angular_velocity = 0.0 -5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_1/angular_velocity = 0.0 7:4/0 = 0 -7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_0/angular_velocity = 0.0 -7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_1/angular_velocity = 0.0 3:5/0 = 0 -3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_0/angular_velocity = 0.0 -3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_1/angular_velocity = 0.0 4:5/0 = 0 -4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_0/angular_velocity = 0.0 -4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_1/angular_velocity = 0.0 7:5/0 = 0 -7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_0/angular_velocity = 0.0 -7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_1/angular_velocity = 0.0 3:6/0 = 0 -3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_0/angular_velocity = 0.0 -3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_1/angular_velocity = 0.0 4:6/0 = 0 -4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_0/angular_velocity = 0.0 -4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_1/angular_velocity = 0.0 7:6/0 = 0 -7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_0/angular_velocity = 0.0 -7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_1/angular_velocity = 0.0 2:7/0 = 0 -2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_0/angular_velocity = 0.0 -2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_1/angular_velocity = 0.0 3:7/0 = 0 -3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_0/angular_velocity = 0.0 -3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_1/angular_velocity = 0.0 4:7/0 = 0 -4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_0/angular_velocity = 0.0 -4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_1/angular_velocity = 0.0 5:7/0 = 0 -5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_0/angular_velocity = 0.0 -5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_1/angular_velocity = 0.0 8:0/0 = 0 -8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_0/angular_velocity = 0.0 8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_1/angular_velocity = 0.0 9:0/0 = 0 -9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_0/angular_velocity = 0.0 9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_1/angular_velocity = 0.0 10:0/0 = 0 -10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_0/angular_velocity = 0.0 10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_1/angular_velocity = 0.0 11:0/0 = 0 -11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_0/angular_velocity = 0.0 11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_1/angular_velocity = 0.0 12:0/0 = 0 -12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_0/angular_velocity = 0.0 12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_1/angular_velocity = 0.0 13:0/0 = 0 -13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_0/angular_velocity = 0.0 13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0 = 0 -14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_0/angular_velocity = 0.0 -14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) 14:0/0/custom_data_0 = &"Sign" 15:0/0 = 0 -15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_0/angular_velocity = 0.0 -15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_1/angular_velocity = 0.0 16:0/0 = 0 -16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_0/angular_velocity = 0.0 -16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_1/angular_velocity = 0.0 8:1/0 = 0 -8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_0/angular_velocity = 0.0 8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_1/angular_velocity = 0.0 9:1/0 = 0 -9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_0/angular_velocity = 0.0 9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_1/angular_velocity = 0.0 10:1/0 = 0 -10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_0/angular_velocity = 0.0 10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_1/angular_velocity = 0.0 11:1/0 = 0 -11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_0/angular_velocity = 0.0 11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_1/angular_velocity = 0.0 12:1/0 = 0 -12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_0/angular_velocity = 0.0 12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_1/angular_velocity = 0.0 13:1/0 = 0 -13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_0/angular_velocity = 0.0 13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_1/angular_velocity = 0.0 14:1/0 = 0 -14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_0/angular_velocity = 0.0 -14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_1/angular_velocity = 0.0 15:1/0 = 0 -15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_0/angular_velocity = 0.0 -15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_1/angular_velocity = 0.0 16:1/0 = 0 -16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_0/angular_velocity = 0.0 -16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_1/angular_velocity = 0.0 8:2/0 = 0 -8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_0/angular_velocity = 0.0 8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_1/angular_velocity = 0.0 9:2/0 = 0 -9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_0/angular_velocity = 0.0 9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_1/angular_velocity = 0.0 10:2/0 = 0 -10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_0/angular_velocity = 0.0 10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_1/angular_velocity = 0.0 11:2/0 = 0 -11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_0/angular_velocity = 0.0 11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_1/angular_velocity = 0.0 12:2/0 = 0 -12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_0/angular_velocity = 0.0 12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_1/angular_velocity = 0.0 13:2/0 = 0 -13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_0/angular_velocity = 0.0 13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_1/angular_velocity = 0.0 14:2/0 = 0 -14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_0/angular_velocity = 0.0 -14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_1/angular_velocity = 0.0 15:2/0 = 0 -15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_0/angular_velocity = 0.0 -15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_1/angular_velocity = 0.0 16:2/0 = 0 -16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_0/angular_velocity = 0.0 -16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_1/angular_velocity = 0.0 8:3/0 = 0 -8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_0/angular_velocity = 0.0 8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_1/angular_velocity = 0.0 9:3/0 = 0 -9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_0/angular_velocity = 0.0 9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_1/angular_velocity = 0.0 10:3/0 = 0 -10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_0/angular_velocity = 0.0 10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_1/angular_velocity = 0.0 11:3/0 = 0 -11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_0/angular_velocity = 0.0 -11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_1/angular_velocity = 0.0 12:3/0 = 0 -12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_0/angular_velocity = 0.0 12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_1/angular_velocity = 0.0 13:3/0 = 0 -13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_0/angular_velocity = 0.0 13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_1/angular_velocity = 0.0 14:3/0 = 0 -14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_0/angular_velocity = 0.0 -14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_1/angular_velocity = 0.0 15:3/0 = 0 -15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_0/angular_velocity = 0.0 -15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_1/angular_velocity = 0.0 16:3/0 = 0 -16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_0/angular_velocity = 0.0 -16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_1/angular_velocity = 0.0 8:4/0 = 0 -8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_0/angular_velocity = 0.0 -8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_1/angular_velocity = 0.0 9:4/0 = 0 -9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_0/angular_velocity = 0.0 -9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_1/angular_velocity = 0.0 10:4/0 = 0 -10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_0/angular_velocity = 0.0 -10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_1/angular_velocity = 0.0 11:4/0 = 0 -11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_0/angular_velocity = 0.0 11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8) -11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_1/angular_velocity = 0.0 12:4/0 = 0 -12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_0/angular_velocity = 0.0 12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_1/angular_velocity = 0.0 13:4/0 = 0 -13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_0/angular_velocity = 0.0 13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8) -13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0 = 0 -14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_0/angular_velocity = 0.0 -14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 14:4/0/custom_data_0 = &"Inventory" 15:4/0 = 0 -15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_0/angular_velocity = 0.0 -15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_1/angular_velocity = 0.0 16:4/0 = 0 -16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_0/angular_velocity = 0.0 -16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_1/angular_velocity = 0.0 8:5/0 = 0 -8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_0/angular_velocity = 0.0 -8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_1/angular_velocity = 0.0 9:5/0 = 0 -9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_0/angular_velocity = 0.0 -9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_1/angular_velocity = 0.0 10:5/0 = 0 -10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_0/angular_velocity = 0.0 -10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_1/angular_velocity = 0.0 11:5/0 = 0 -11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_0/angular_velocity = 0.0 11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_1/angular_velocity = 0.0 12:5/0 = 0 -12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_0/angular_velocity = 0.0 12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_1/angular_velocity = 0.0 13:5/0 = 0 -13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_0/angular_velocity = 0.0 13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_1/angular_velocity = 0.0 14:5/0 = 0 -14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_0/angular_velocity = 0.0 -14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_1/angular_velocity = 0.0 15:5/0 = 0 -15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_0/angular_velocity = 0.0 -15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_1/angular_velocity = 0.0 16:5/0 = 0 -16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_0/angular_velocity = 0.0 -16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_1/angular_velocity = 0.0 8:6/0 = 0 -8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_0/angular_velocity = 0.0 -8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_1/angular_velocity = 0.0 9:6/0 = 0 -9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_0/angular_velocity = 0.0 -9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_1/angular_velocity = 0.0 10:6/0 = 0 -10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_0/angular_velocity = 0.0 -10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_1/angular_velocity = 0.0 11:6/0 = 0 -11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_0/angular_velocity = 0.0 11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5) -11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_1/angular_velocity = 0.0 12:6/0 = 0 -12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_0/angular_velocity = 0.0 12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_1/angular_velocity = 0.0 13:6/0 = 0 -13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_0/angular_velocity = 0.0 13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8) -13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_1/angular_velocity = 0.0 14:6/0 = 0 -14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_0/angular_velocity = 0.0 -14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_1/angular_velocity = 0.0 15:6/0 = 0 -15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_0/angular_velocity = 0.0 -15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_1/angular_velocity = 0.0 16:6/0 = 0 -16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_0/angular_velocity = 0.0 -16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_1/angular_velocity = 0.0 [sub_resource type="TileSet" id="TileSet_kf7eg"] physics_layer_0/collision_layer = 1 @@ -589,6 +189,7 @@ script = ExtResource("1_bwr3f") layer = -3 [node name="ColorRect" type="ColorRect" parent="Background"] +auto_translate_mode = 2 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 @@ -598,32 +199,24 @@ offset_right = 981.0 offset_bottom = 548.0 grow_horizontal = 2 grow_vertical = 2 -auto_translate = false localize_numeral_system = false color = Color(0.137255, 0.14902, 0.196078, 1) metadata/_edit_lock_ = true -[node name="TileMap" type="TileMap" parent="."] -z_index = -1 +[node name="StartingTerrain" type="TileMapLayer" parent="."] +z_index = 1 +use_parent_material = true position = Vector2(-97, 0) scale = Vector2(3, 3) +tile_map_data = PackedByteArray("AAD9/wAAAAALAAAAAAD+/wAAAAALAAAAAAD//wAAAAALAAAAAAAAAAAAAAALAAAAAAABAAAAAAALAAAAAAACAAAAAAALAAAAAAADAAAAAAALAAAAAAAEAAAAAAALAAAAAAAFAAAAAAALAAAAAAAGAAAAAAALAAAAAAAHAAAAAAALAAAAAAAIAAAAAAALAAAAAAAJAAAAAAAMAAAAAAD8/wAAAAALAAAAAAD7/wAAAAAKAAAAAAD7/wEAAAAKAAEAAAD7/wIAAAAKAAEAAAD7/wMAAAAKAAEAAAD7/wQAAAAKAAEAAAD7/wUAAAAKAAEAAAD8/wEAAAALAAEAAAD8/wIAAAALAAEAAAD8/wMAAAALAAEAAAD8/wQAAAALAAEAAAD8/wUAAAALAAEAAAD9/wEAAAALAAEAAAD9/wIAAAALAAEAAAD9/wMAAAALAAEAAAD9/wQAAAALAAEAAAD9/wUAAAALAAEAAAD+/wEAAAALAAEAAAD+/wIAAAALAAEAAAD+/wMAAAALAAEAAAD+/wQAAAALAAEAAAD+/wUAAAALAAEAAAD//wEAAAALAAEAAAD//wIAAAALAAEAAAD//wMAAAALAAEAAAD//wQAAAALAAEAAAD//wUAAAALAAEAAAAAAAEAAAALAAEAAAAAAAIAAAALAAEAAAAAAAMAAAALAAEAAAAAAAQAAAALAAEAAAAAAAUAAAALAAEAAAABAAEAAAALAAEAAAABAAIAAAALAAEAAAABAAMAAAALAAEAAAABAAQAAAALAAEAAAABAAUAAAALAAEAAAACAAEAAAALAAEAAAACAAIAAAALAAEAAAACAAMAAAALAAEAAAACAAQAAAALAAEAAAACAAUAAAALAAEAAAADAAEAAAALAAEAAAADAAIAAAALAAEAAAADAAMAAAALAAEAAAADAAQAAAALAAEAAAADAAUAAAALAAEAAAAEAAEAAAALAAEAAAAEAAIAAAALAAEAAAAEAAMAAAALAAEAAAAEAAQAAAALAAEAAAAEAAUAAAALAAEAAAAFAAEAAAALAAEAAAAFAAIAAAALAAEAAAAFAAMAAAALAAEAAAAFAAQAAAALAAEAAAAFAAUAAAALAAEAAAAGAAEAAAALAAEAAAAGAAIAAAALAAEAAAAGAAMAAAALAAEAAAAGAAQAAAALAAEAAAAGAAUAAAALAAEAAAAHAAEAAAALAAEAAAAHAAIAAAALAAEAAAAHAAMAAAALAAEAAAAHAAQAAAALAAEAAAAHAAUAAAALAAEAAAAIAAEAAAALAAEAAAAIAAIAAAALAAEAAAAIAAMAAAALAAEAAAAIAAQAAAALAAEAAAAIAAUAAAALAAEAAAAJAAEAAAAMAAEAAAAJAAIAAAAMAAEAAAAJAAMAAAAMAAEAAAAJAAQAAAAMAAEAAAAJAAUAAAAMAAEAAAD7//n/AAALAAYAAAD7//j/AAALAAUAAAD7//f/AAALAAUAAAD7//b/AAALAAUAAAD7//X/AAALAAQAAAD8//n/AAAMAAYAAAD9//n/AAAMAAYAAAD+//n/AAAMAAYAAAD///n/AAAMAAYAAAAAAPn/AAAMAAYAAAABAPn/AAAMAAYAAAACAPn/AAAMAAYAAAADAPn/AAAMAAYAAAAEAPn/AAAMAAYAAAAFAPn/AAAMAAYAAAAGAPn/AAAMAAYAAAAHAPn/AAAMAAYAAAAIAPn/AAAMAAYAAAD8//X/AAAMAAQAAAD9//X/AAAMAAQAAAD+//X/AAAMAAQAAAD///X/AAAMAAQAAAAAAPX/AAAMAAQAAAABAPX/AAAMAAQAAAACAPX/AAAMAAQAAAADAPX/AAAMAAQAAAAEAPX/AAAMAAQAAAAFAPX/AAAMAAQAAAAGAPX/AAAMAAQAAAAHAPX/AAAMAAQAAAAIAPX/AAAMAAQAAAAJAPX/AAANAAQAAAAJAPb/AAANAAUAAAAJAPf/AAANAAUAAAAJAPj/AAANAAUAAAAJAPn/AAANAAYAAAD8//b/AAAMAAUAAAD8//f/AAAMAAUAAAD8//j/AAAMAAUAAAD9//b/AAAMAAUAAAD9//f/AAAMAAUAAAD9//j/AAAMAAUAAAD+//b/AAAMAAUAAAD+//f/AAAMAAUAAAD+//j/AAAMAAUAAAD///b/AAAMAAUAAAD///f/AAAMAAUAAAD///j/AAAMAAUAAAAAAPb/AAAMAAUAAAAAAPf/AAAMAAUAAAAAAPj/AAAMAAUAAAABAPb/AAAMAAUAAAABAPf/AAAMAAUAAAABAPj/AAAMAAUAAAACAPb/AAAMAAUAAAACAPf/AAAMAAUAAAACAPj/AAAMAAUAAAADAPb/AAAMAAUAAAADAPf/AAAMAAUAAAADAPj/AAAMAAUAAAAEAPb/AAAMAAUAAAAEAPf/AAAMAAUAAAAEAPj/AAAMAAUAAAAFAPb/AAAMAAUAAAAFAPf/AAAMAAUAAAAFAPj/AAAMAAUAAAAGAPb/AAAMAAUAAAAGAPf/AAAMAAUAAAAGAPj/AAAMAAUAAAAHAPb/AAAMAAUAAAAHAPf/AAAMAAUAAAAHAPj/AAAMAAUAAAAIAPb/AAAMAAUAAAAIAPf/AAAMAAUAAAAIAPj/AAAMAAUAAAA=") tile_set = SubResource("TileSet_kf7eg") -format = 2 -layer_0/name = "Background" -layer_0/tile_data = PackedInt32Array(-458743, 851968, 6, -458744, 786432, 6, -458745, 786432, 6, -458746, 786432, 6, -458747, 786432, 6, -458748, 786432, 6, -458749, 786432, 6, -458750, 786432, 6, -458751, 786432, 6, -393218, 786432, 6, -393219, 786432, 6, -393220, 786432, 6, -393221, 720896, 6, -458752, 786432, 6, -393217, 786432, 6, -524279, 851968, 5, -589815, 851968, 5, -655351, 851968, 5, -720887, 851968, 4, -720888, 786432, 4, -720889, 786432, 4, -720890, 786432, 4, -720891, 786432, 4, -720892, 786432, 4, -720893, 786432, 4, -720894, 786432, 4, -720895, 786432, 4, -720896, 786432, 4, -655361, 786432, 4, -655362, 786432, 4, -655363, 786432, 4, -655364, 786432, 4, -655365, 720896, 4, -589829, 720896, 5, -524293, 720896, 5, -458757, 720896, 5, -589828, 786432, 5, -524292, 786432, 5, -458756, 786432, 5, -589827, 786432, 5, -524291, 786432, 5, -458755, 786432, 5, -589826, 786432, 5, -524290, 786432, 5, -458754, 786432, 5, -589825, 786432, 5, -524289, 786432, 5, -458753, 786432, 5, -655360, 786432, 5, -589824, 786432, 5, -524288, 786432, 5, -655359, 786432, 5, -589823, 786432, 5, -524287, 786432, 5, -655358, 786432, 5, -589822, 786432, 5, -524286, 786432, 5, -655357, 786432, 5, -589821, 786432, 5, -524285, 786432, 5, -655356, 786432, 5, -589820, 786432, 5, -524284, 786432, 5, -655355, 786432, 5, -589819, 786432, 5, -524283, 786432, 5, -655354, 786432, 5, -589818, 786432, 5, -524282, 786432, 5, -655353, 786432, 5, -589817, 786432, 5, -524281, 786432, 5, -655352, 786432, 5, -589816, 786432, 5, -524280, 786432, 5) -layer_1/name = "Terrain" -layer_1/z_index = 1 -layer_1/tile_data = PackedInt32Array(65533, 720896, 0, 65534, 720896, 0, 65535, 720896, 0, 0, 720896, 0, 1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65532, 720896, 0, 65531, 655360, 0, 131067, 655360, 1, 196603, 655360, 1, 262139, 655360, 1, 327675, 655360, 1, 393211, 655360, 1, 131068, 720896, 1, 196604, 720896, 1, 262140, 720896, 1, 327676, 720896, 1, 393212, 720896, 1, 131069, 720896, 1, 196605, 720896, 1, 262141, 720896, 1, 327677, 720896, 1, 393213, 720896, 1, 131070, 720896, 1, 196606, 720896, 1, 262142, 720896, 1, 327678, 720896, 1, 393214, 720896, 1, 131071, 720896, 1, 196607, 720896, 1, 262143, 720896, 1, 327679, 720896, 1, 393215, 720896, 1, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 720896, 1, 327681, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 65540, 720896, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 720896, 1, 327685, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 720896, 1, 262152, 720896, 1, 327688, 720896, 1, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1) -[node name="TileMap2" type="TileMap" parent="."] -z_index = -1 +[node name="OtherTerrain" type="TileMapLayer" parent="."] +z_index = 1 +use_parent_material = true scale = Vector2(3, 3) +tile_map_data = PackedByteArray("AAAIAAAAAAAMAAQAAAAJAAAAAAAMAAQAAAAKAAAAAAAMAAQAAAALAAAAAAAMAAQAAAAMAAAAAAAMAAQAAAANAAAAAAAMAAQAAAAOAAAAAAAMAAQAAAD4/wAAAAANAAUAAAD3/wAAAAAMAAUAAAD2/wAAAAAMAAUAAAD1/wAAAAAMAAUAAAD0/wAAAAAMAAUAAADz/wAAAAAMAAUAAAAIAAEAAAAMAAUAAAAIAAIAAAAMAAUAAAAIAAMAAAAMAAUAAAAIAAQAAAAMAAUAAAAJAAEAAAAMAAUAAAAJAAIAAAAMAAUAAAAJAAMAAAAMAAUAAAAJAAQAAAAMAAUAAAAKAAEAAAAMAAUAAAAKAAIAAAAMAAUAAAAKAAMAAAAMAAUAAAAKAAQAAAAMAAUAAAALAAEAAAAMAAUAAAALAAIAAAAMAAUAAAALAAMAAAAMAAUAAAALAAQAAAAMAAUAAAAMAAEAAAAMAAUAAAAMAAIAAAAMAAUAAAAMAAMAAAAMAAUAAAAMAAQAAAAMAAUAAAANAAEAAAAMAAUAAAANAAIAAAAMAAUAAAANAAMAAAAMAAUAAAANAAQAAAAMAAUAAAAOAAEAAAAMAAUAAAAOAAIAAAAMAAUAAAAOAAMAAAAMAAUAAAAOAAQAAAAMAAUAAAAOAAUAAAAMAAUAAAANAAUAAAAMAAUAAAAMAAUAAAAMAAUAAAALAAUAAAAMAAUAAAAKAAUAAAAMAAUAAAAJAAUAAAAMAAUAAAAIAAUAAAAMAAUAAADv//3/AAALAAUAAADv//7/AAALAAUAAADv////AAALAAUAAADv/wAAAAALAAYAAADw//3/AAAMAAUAAADw//7/AAAMAAUAAADw////AAAMAAUAAADw/wAAAAAMAAUAAADx//3/AAAMAAUAAADx//7/AAAMAAUAAADx////AAAMAAUAAADx/wAAAAAMAAUAAADy//3/AAAMAAUAAADy//7/AAAMAAUAAADy////AAAMAAUAAADy/wAAAAAMAAUAAADz//3/AAAMAAUAAADz//7/AAAMAAUAAADz////AAAMAAUAAAD0//3/AAAMAAUAAAD0//7/AAAMAAUAAAD0////AAAMAAUAAAD1//3/AAAMAAUAAAD1//7/AAAMAAUAAAD1////AAAMAAUAAAD2//3/AAAMAAUAAAD2//7/AAAMAAUAAAD2////AAAMAAUAAAD3//3/AAAMAAUAAAD3//7/AAAMAAUAAAD3////AAAMAAUAAAD4//3/AAANAAUAAAD4//7/AAANAAUAAAD4////AAANAAUAAAD4/wEAAAANAAUAAAD4/wIAAAANAAUAAAD4/wMAAAANAAUAAAD4/wQAAAANAAUAAAD4/wUAAAANAAUAAADw/wEAAAAMAAUAAADw/wIAAAAMAAUAAADw/wMAAAAMAAUAAADw/wQAAAAMAAUAAADw/wUAAAAMAAUAAADx/wEAAAAMAAUAAADx/wIAAAAMAAUAAADx/wMAAAAMAAUAAADx/wQAAAAMAAUAAADx/wUAAAAMAAUAAADy/wEAAAAMAAUAAADy/wIAAAAMAAUAAADy/wMAAAAMAAUAAADy/wQAAAAMAAUAAADy/wUAAAAMAAUAAADz/wEAAAAMAAUAAADz/wIAAAAMAAUAAADz/wMAAAAMAAUAAADz/wQAAAAMAAUAAADz/wUAAAAMAAUAAAD0/wEAAAAMAAUAAAD0/wIAAAAMAAUAAAD0/wMAAAAMAAUAAAD0/wQAAAAMAAUAAAD0/wUAAAAMAAUAAAD1/wEAAAAMAAUAAAD1/wIAAAAMAAUAAAD1/wMAAAAMAAUAAAD1/wQAAAAMAAUAAAD1/wUAAAAMAAUAAAD2/wEAAAAMAAUAAAD2/wIAAAAMAAUAAAD2/wMAAAAMAAUAAAD2/wQAAAAMAAUAAAD2/wUAAAAMAAUAAAD3/wEAAAAMAAUAAAD3/wIAAAAMAAUAAAD3/wMAAAAMAAUAAAD3/wQAAAAMAAUAAAD3/wUAAAAMAAUAAAARAAAAAAAMAAQAAAARAAEAAAAMAAUAAAARAAIAAAAMAAUAAAARAAMAAAAMAAUAAAARAAQAAAAMAAUAAAARAAUAAAAMAAUAAAASAAAAAAAMAAQAAAASAAEAAAAMAAUAAAASAAIAAAAMAAUAAAASAAMAAAAMAAUAAAASAAQAAAAMAAUAAAASAAUAAAAMAAUAAAAPAAAAAAAMAAQAAAAPAAEAAAAMAAUAAAAPAAIAAAAMAAUAAAAPAAMAAAAMAAUAAAAPAAQAAAAMAAUAAAAPAAUAAAAMAAUAAAAQAAAAAAAMAAQAAAAQAAEAAAAMAAUAAAAQAAIAAAAMAAUAAAAQAAMAAAAMAAUAAAAQAAQAAAAMAAUAAAAQAAUAAAAMAAUAAAATAAAAAAAMAAQAAAATAAEAAAAMAAUAAAATAAIAAAAMAAUAAAATAAMAAAAMAAUAAAATAAQAAAAMAAUAAAATAAUAAAAMAAUAAADv//j/AAALAAUAAADv//n/AAALAAUAAADw//j/AAAMAAUAAADw//n/AAAMAAUAAADx//j/AAAMAAUAAADx//n/AAAMAAUAAADy//j/AAAMAAUAAADy//n/AAAMAAUAAADz//j/AAAMAAUAAADz//n/AAAMAAUAAAD0//j/AAAMAAUAAAD0//n/AAAMAAUAAAD1//j/AAAMAAUAAAD1//n/AAAMAAUAAAD2//j/AAAMAAUAAAD2//n/AAAMAAUAAAD3//j/AAAMAAUAAAD3//n/AAAMAAUAAAD4//j/AAANAAUAAAD4//n/AAANAAUAAADv//X/AAALAAQAAADv//b/AAALAAUAAADv//f/AAALAAUAAADw//X/AAAMAAQAAADw//b/AAAMAAUAAADw//f/AAAMAAUAAADx//X/AAAMAAQAAADx//b/AAAMAAUAAADx//f/AAAMAAUAAADy//X/AAAMAAQAAADy//b/AAAMAAUAAADy//f/AAAMAAUAAADz//X/AAAMAAQAAADz//b/AAAMAAUAAADz//f/AAAMAAUAAAD0//X/AAAMAAQAAAD0//b/AAAMAAUAAAD0//f/AAAMAAUAAAD1//X/AAAMAAQAAAD1//b/AAAMAAUAAAD1//f/AAAMAAUAAAD2//X/AAAMAAQAAAD2//b/AAAMAAUAAAD2//f/AAAMAAUAAAD3//X/AAAMAAQAAAD3//b/AAAMAAUAAAD3//f/AAAMAAUAAAD4//X/AAANAAQAAAD4//b/AAANAAUAAAD4//f/AAANAAUAAADv//r/AAALAAUAAADw//r/AAAMAAUAAADx//r/AAAMAAUAAADy//r/AAAMAAUAAADz//r/AAAMAAUAAAD0//r/AAAMAAUAAAD1//r/AAAMAAUAAAD2//r/AAAMAAUAAAD3//r/AAAMAAUAAAD4//r/AAANAAUAAADv//v/AAALAAUAAADw//v/AAAMAAUAAADx//v/AAAMAAUAAADy//v/AAAMAAUAAADz//v/AAAMAAUAAAD0//v/AAAMAAUAAAD1//v/AAAMAAUAAAD2//v/AAAMAAUAAAD3//v/AAAMAAUAAAD4//v/AAANAAUAAADv//z/AAALAAUAAADw//z/AAAMAAUAAADx//z/AAAMAAUAAADy//z/AAAMAAUAAADz//z/AAAMAAUAAAD0//z/AAAMAAUAAAD1//z/AAAMAAUAAAD2//z/AAAMAAUAAAD3//z/AAAMAAUAAAD4//z/AAANAAUAAAAUAAAAAAAMAAQAAAAUAAEAAAAMAAUAAAAUAAIAAAAMAAUAAAAUAAMAAAAMAAUAAAAUAAQAAAAMAAUAAAAUAAUAAAAMAAUAAAAVAAAAAAAMAAQAAAAVAAEAAAAMAAUAAAAVAAIAAAAMAAUAAAAVAAMAAAAMAAUAAAAVAAQAAAAMAAUAAAAVAAUAAAAMAAUAAAAWAAAAAAAMAAQAAAAWAAEAAAAMAAUAAAAWAAIAAAAMAAUAAAAWAAMAAAAMAAUAAAAWAAQAAAAMAAUAAAAWAAUAAAAMAAUAAAAXAAAAAAAMAAQAAAAXAAEAAAAMAAUAAAAXAAIAAAAMAAUAAAAXAAMAAAAMAAUAAAAXAAQAAAAMAAUAAAAXAAUAAAAMAAUAAAAYAAAAAAAMAAQAAAAYAAEAAAAMAAUAAAAYAAIAAAAMAAUAAAAYAAMAAAAMAAUAAAAYAAQAAAAMAAUAAAAYAAUAAAAMAAUAAAAZAAAAAAAMAAQAAAAZAAEAAAAMAAUAAAAZAAIAAAAMAAUAAAAZAAMAAAAMAAUAAAAZAAQAAAAMAAUAAAAZAAUAAAAMAAUAAAAaAAAAAAAMAAQAAAAaAAEAAAAMAAUAAAAaAAIAAAAMAAUAAAAaAAMAAAAMAAUAAAAaAAQAAAAMAAUAAAAaAAUAAAAMAAUAAAAbAAAAAAAMAAQAAAAbAAEAAAAMAAUAAAAbAAIAAAAMAAUAAAAbAAMAAAAMAAUAAAAbAAQAAAAMAAUAAAAbAAUAAAAMAAUAAAAmAAAAAAAMAAQAAAAmAAEAAAAMAAUAAAAmAAIAAAAMAAUAAAAmAAMAAAAMAAUAAAAmAAQAAAAMAAUAAAAmAAUAAAAMAAUAAAAnAAAAAAAMAAQAAAAnAAEAAAAMAAUAAAAnAAIAAAAMAAUAAAAnAAMAAAAMAAUAAAAnAAQAAAAMAAUAAAAnAAUAAAAMAAUAAAAoAAAAAAAMAAQAAAAoAAEAAAAMAAUAAAAoAAIAAAAMAAUAAAAoAAMAAAAMAAUAAAAoAAQAAAAMAAUAAAAoAAUAAAAMAAUAAAApAAAAAAAMAAQAAAApAAEAAAAMAAUAAAApAAIAAAAMAAUAAAApAAMAAAAMAAUAAAApAAQAAAAMAAUAAAApAAUAAAAMAAUAAAAqAAAAAAAMAAQAAAAqAAEAAAAMAAUAAAAqAAIAAAAMAAUAAAAqAAMAAAAMAAUAAAAqAAQAAAAMAAUAAAAqAAUAAAAMAAUAAAArAAAAAAAMAAQAAAArAAEAAAAMAAUAAAArAAIAAAAMAAUAAAArAAMAAAAMAAUAAAArAAQAAAAMAAUAAAArAAUAAAAMAAUAAAAsAAAAAAAMAAQAAAAsAAEAAAAMAAUAAAAsAAIAAAAMAAUAAAAsAAMAAAAMAAUAAAAsAAQAAAAMAAUAAAAsAAUAAAAMAAUAAAAtAAAAAAAMAAQAAAAtAAEAAAAMAAUAAAAtAAIAAAAMAAUAAAAtAAMAAAAMAAUAAAAtAAQAAAAMAAUAAAAtAAUAAAAMAAUAAAAuAAAAAAAMAAQAAAAuAAEAAAAMAAUAAAAuAAIAAAAMAAUAAAAuAAMAAAAMAAUAAAAuAAQAAAAMAAUAAAAuAAUAAAAMAAUAAAAvAAAAAAAMAAQAAAAvAAEAAAAMAAUAAAAvAAIAAAAMAAUAAAAvAAMAAAAMAAUAAAAvAAQAAAAMAAUAAAAvAAUAAAAMAAUAAAAwAAAAAAAMAAQAAAAwAAEAAAAMAAUAAAAwAAIAAAAMAAUAAAAwAAMAAAAMAAUAAAAwAAQAAAAMAAUAAAAwAAUAAAAMAAUAAAAxAAAAAAANAAQAAAAxAAEAAAANAAUAAAAxAAIAAAANAAUAAAAxAAMAAAANAAUAAAAxAAQAAAANAAUAAAAxAAUAAAANAAUAAAAyAPf/AAALAAQAAAAyAPj/AAALAAUAAAAyAPn/AAALAAUAAAAyAPr/AAALAAUAAAAyAPv/AAALAAUAAAAyAPz/AAALAAUAAAAyAP3/AAALAAUAAAAyAP7/AAALAAUAAAAyAP//AAALAAUAAAAyAAAAAAALAAUAAAAyAAEAAAALAAUAAAAyAAIAAAALAAUAAAAyAAMAAAALAAUAAAAyAAQAAAALAAUAAAAyAAUAAAALAAUAAAAzAPf/AAAMAAQAAAAzAPj/AAAMAAUAAAAzAPn/AAAMAAUAAAAzAPr/AAAMAAUAAAAzAPv/AAAMAAUAAAAzAPz/AAAMAAUAAAAzAP3/AAAMAAUAAAAzAP7/AAAMAAUAAAAzAP//AAAMAAUAAAAzAAAAAAAMAAUAAAAzAAEAAAAMAAUAAAAzAAIAAAAMAAUAAAAzAAMAAAAMAAUAAAAzAAQAAAAMAAUAAAAzAAUAAAAMAAUAAAA0APf/AAAMAAQAAAA0APj/AAAMAAUAAAA0APn/AAAMAAUAAAA0APr/AAAMAAUAAAA0APv/AAAMAAUAAAA0APz/AAAMAAUAAAA0AP3/AAAMAAUAAAA0AP7/AAAMAAUAAAA0AP//AAAMAAUAAAA0AAAAAAAMAAUAAAA0AAEAAAAMAAUAAAA0AAIAAAAMAAUAAAA0AAMAAAAMAAUAAAA0AAQAAAAMAAUAAAA0AAUAAAAMAAUAAAA1APf/AAAMAAQAAAA1APj/AAAMAAUAAAA1APn/AAAMAAUAAAA1APr/AAAMAAUAAAA1APv/AAAMAAUAAAA1APz/AAAMAAUAAAA1AP3/AAAMAAUAAAA1AP7/AAAMAAUAAAA1AP//AAAMAAUAAAA1AAAAAAAMAAUAAAA1AAEAAAAMAAUAAAA1AAIAAAAMAAUAAAA1AAMAAAAMAAUAAAA1AAQAAAAMAAUAAAA1AAUAAAAMAAUAAAA2APf/AAAMAAQAAAA2APj/AAAMAAUAAAA2APn/AAAMAAUAAAA2APr/AAAMAAUAAAA2APv/AAAMAAUAAAA2APz/AAAMAAUAAAA2AP3/AAAMAAUAAAA2AP7/AAAMAAUAAAA2AP//AAAMAAUAAAA2AAAAAAAMAAUAAAA2AAEAAAAMAAUAAAA2AAIAAAAMAAUAAAA2AAMAAAAMAAUAAAA2AAQAAAAMAAUAAAA2AAUAAAAMAAUAAAA3APf/AAAMAAQAAAA3APj/AAAMAAUAAAA3APn/AAAMAAUAAAA3APr/AAAMAAUAAAA3APv/AAAMAAUAAAA3APz/AAAMAAUAAAA3AP3/AAAMAAUAAAA3AP7/AAAMAAUAAAA3AP//AAAMAAUAAAA3AAAAAAAMAAUAAAA3AAEAAAAMAAUAAAA3AAIAAAAMAAUAAAA3AAMAAAAMAAUAAAA3AAQAAAAMAAUAAAA3AAUAAAAMAAUAAAA4APf/AAAMAAQAAAA4APj/AAAMAAUAAAA4APn/AAAMAAUAAAA4APr/AAAMAAUAAAA4APv/AAAMAAUAAAA4APz/AAAMAAUAAAA4AP3/AAAMAAUAAAA4AP7/AAAMAAUAAAA4AP//AAAMAAUAAAA4AAAAAAAMAAUAAAA4AAEAAAAMAAUAAAA4AAIAAAAMAAUAAAA4AAMAAAAMAAUAAAA4AAQAAAAMAAUAAAA4AAUAAAAMAAUAAAA5APf/AAAMAAQAAAA5APj/AAAMAAUAAAA5APn/AAAMAAUAAAA5APr/AAAMAAUAAAA5APv/AAAMAAUAAAA5APz/AAAMAAUAAAA5AP3/AAAMAAUAAAA5AP7/AAAMAAUAAAA5AP//AAAMAAUAAAA5AAAAAAAMAAUAAAA5AAEAAAAMAAUAAAA5AAIAAAAMAAUAAAA5AAMAAAAMAAUAAAA5AAQAAAAMAAUAAAA5AAUAAAAMAAUAAAA6APf/AAAMAAQAAAA6APj/AAAMAAUAAAA6APn/AAAMAAUAAAA6APr/AAAMAAUAAAA6APv/AAAMAAUAAAA6APz/AAAMAAUAAAA6AP3/AAAMAAUAAAA6AP7/AAAMAAUAAAA6AP//AAAMAAUAAAA6AAAAAAAMAAUAAAA6AAEAAAAMAAUAAAA6AAIAAAAMAAUAAAA6AAMAAAAMAAUAAAA6AAQAAAAMAAUAAAA6AAUAAAAMAAUAAAA7APf/AAANAAQAAAA7APj/AAANAAUAAAA7APn/AAANAAUAAAA7APr/AAANAAUAAAA7APv/AAANAAUAAAA7APz/AAANAAUAAAA7AP3/AAANAAUAAAA7AP7/AAANAAUAAAA7AP//AAANAAUAAAA7AAAAAAANAAUAAAA7AAEAAAANAAUAAAA7AAIAAAANAAUAAAA7AAMAAAANAAUAAAA7AAQAAAANAAUAAAA7AAUAAAANAAUAAAAcAAAAAAAMAAQAAAAcAAEAAAAMAAUAAAAcAAIAAAAMAAUAAAAcAAMAAAAMAAUAAAAcAAQAAAAMAAUAAAAcAAUAAAAMAAUAAAAdAAAAAAAMAAQAAAAdAAEAAAAMAAUAAAAdAAIAAAAMAAUAAAAdAAMAAAAMAAUAAAAdAAQAAAAMAAUAAAAdAAUAAAAMAAUAAAAeAAAAAAAMAAQAAAAeAAEAAAAMAAUAAAAeAAIAAAAMAAUAAAAeAAMAAAAMAAUAAAAeAAQAAAAMAAUAAAAeAAUAAAAMAAUAAAAfAAAAAAAMAAQAAAAfAAEAAAAMAAUAAAAfAAIAAAAMAAUAAAAfAAMAAAAMAAUAAAAfAAQAAAAMAAUAAAAfAAUAAAAMAAUAAAAgAAAAAAAMAAQAAAAgAAEAAAAMAAUAAAAgAAIAAAAMAAUAAAAgAAMAAAAMAAUAAAAgAAQAAAAMAAUAAAAgAAUAAAAMAAUAAAAhAAAAAAAMAAQAAAAhAAEAAAAMAAUAAAAhAAIAAAAMAAUAAAAhAAMAAAAMAAUAAAAhAAQAAAAMAAUAAAAhAAUAAAAMAAUAAAAiAAAAAAAMAAQAAAAiAAEAAAAMAAUAAAAiAAIAAAAMAAUAAAAiAAMAAAAMAAUAAAAiAAQAAAAMAAUAAAAiAAUAAAAMAAUAAAAjAAAAAAAMAAQAAAAjAAEAAAAMAAUAAAAjAAIAAAAMAAUAAAAjAAMAAAAMAAUAAAAjAAQAAAAMAAUAAAAjAAUAAAAMAAUAAAAkAAAAAAAMAAQAAAAkAAEAAAAMAAUAAAAkAAIAAAAMAAUAAAAkAAMAAAAMAAUAAAAkAAQAAAAMAAUAAAAkAAUAAAAMAAUAAAAlAAAAAAAMAAQAAAAlAAEAAAAMAAUAAAAlAAIAAAAMAAUAAAAlAAMAAAAMAAUAAAAlAAQAAAAMAAUAAAAlAAUAAAAMAAUAAAAmAP//AAAOAAMAAAAnAP//AAAPAAMAAAAoAP//AAAPAAMAAAApAP//AAAPAAMAAAAqAP//AAAPAAMAAAArAP//AAAPAAMAAAAsAP//AAAPAAMAAAAtAP//AAAPAAMAAAAuAP//AAAPAAMAAAAvAP//AAAPAAMAAAAwAP//AAAQAAMAAAAxAPf/AAAHAAQAAAAxAPj/AAAHAAUAAAAxAPn/AAAHAAUAAAAxAPr/AAAHAAUAAAAxAPv/AAAHAAUAAAAxAPz/AAAHAAUAAAAxAP3/AAAHAAUAAAAxAP7/AAAHAAUAAAAxAP//AAAHAAYAAAA=") tile_set = SubResource("TileSet_kf7eg") -format = 2 -layer_0/name = "Background" -layer_1/name = "Terrain" -layer_1/z_index = 1 -layer_1/tile_data = PackedInt32Array(8, 786432, 4, 9, 786432, 4, 10, 786432, 4, 11, 786432, 4, 12, 786432, 4, 13, 786432, 4, 14, 786432, 4, 65528, 851968, 5, 65527, 786432, 5, 65526, 786432, 5, 65525, 786432, 5, 65524, 786432, 5, 65523, 786432, 5, 65544, 786432, 5, 131080, 786432, 5, 196616, 786432, 5, 262152, 786432, 5, 65545, 786432, 5, 131081, 786432, 5, 196617, 786432, 5, 262153, 786432, 5, 65546, 786432, 5, 131082, 786432, 5, 196618, 786432, 5, 262154, 786432, 5, 65547, 786432, 5, 131083, 786432, 5, 196619, 786432, 5, 262155, 786432, 5, 65548, 786432, 5, 131084, 786432, 5, 196620, 786432, 5, 262156, 786432, 5, 65549, 786432, 5, 131085, 786432, 5, 196621, 786432, 5, 262157, 786432, 5, 65550, 786432, 5, 131086, 786432, 5, 196622, 786432, 5, 262158, 786432, 5, 327694, 786432, 5, 327693, 786432, 5, 327692, 786432, 5, 327691, 786432, 5, 327690, 786432, 5, 327689, 786432, 5, 327688, 786432, 5, -131089, 720896, 5, -65553, 720896, 5, -17, 720896, 5, 65519, 720896, 6, -131088, 786432, 5, -65552, 786432, 5, -16, 786432, 5, 65520, 786432, 5, -131087, 786432, 5, -65551, 786432, 5, -15, 786432, 5, 65521, 786432, 5, -131086, 786432, 5, -65550, 786432, 5, -14, 786432, 5, 65522, 786432, 5, -131085, 786432, 5, -65549, 786432, 5, -13, 786432, 5, -131084, 786432, 5, -65548, 786432, 5, -12, 786432, 5, -131083, 786432, 5, -65547, 786432, 5, -11, 786432, 5, -131082, 786432, 5, -65546, 786432, 5, -10, 786432, 5, -131081, 786432, 5, -65545, 786432, 5, -9, 786432, 5, -131080, 851968, 5, -65544, 851968, 5, -8, 851968, 5, 131064, 851968, 5, 196600, 851968, 5, 262136, 851968, 5, 327672, 851968, 5, 393208, 851968, 5, 131056, 786432, 5, 196592, 786432, 5, 262128, 786432, 5, 327664, 786432, 5, 393200, 786432, 5, 131057, 786432, 5, 196593, 786432, 5, 262129, 786432, 5, 327665, 786432, 5, 393201, 786432, 5, 131058, 786432, 5, 196594, 786432, 5, 262130, 786432, 5, 327666, 786432, 5, 393202, 786432, 5, 131059, 786432, 5, 196595, 786432, 5, 262131, 786432, 5, 327667, 786432, 5, 393203, 786432, 5, 131060, 786432, 5, 196596, 786432, 5, 262132, 786432, 5, 327668, 786432, 5, 393204, 786432, 5, 131061, 786432, 5, 196597, 786432, 5, 262133, 786432, 5, 327669, 786432, 5, 393205, 786432, 5, 131062, 786432, 5, 196598, 786432, 5, 262134, 786432, 5, 327670, 786432, 5, 393206, 786432, 5, 131063, 786432, 5, 196599, 786432, 5, 262135, 786432, 5, 327671, 786432, 5, 393207, 786432, 5, 17, 786432, 4, 65553, 786432, 5, 131089, 786432, 5, 196625, 786432, 5, 262161, 786432, 5, 327697, 786432, 5, 18, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 327698, 786432, 5, 15, 786432, 4, 65551, 786432, 5, 131087, 786432, 5, 196623, 786432, 5, 262159, 786432, 5, 327695, 786432, 5, 16, 786432, 4, 65552, 786432, 5, 131088, 786432, 5, 196624, 786432, 5, 262160, 786432, 5, 327696, 786432, 5, 19, 786432, 4, 65555, 786432, 5, 131091, 786432, 5, 196627, 786432, 5, 262163, 786432, 5, 327699, 786432, 5, -458769, 720896, 5, -393233, 720896, 5, -458768, 786432, 5, -393232, 786432, 5, -458767, 786432, 5, -393231, 786432, 5, -458766, 786432, 5, -393230, 786432, 5, -458765, 786432, 5, -393229, 786432, 5, -458764, 786432, 5, -393228, 786432, 5, -458763, 786432, 5, -393227, 786432, 5, -458762, 786432, 5, -393226, 786432, 5, -458761, 786432, 5, -393225, 786432, 5, -458760, 851968, 5, -393224, 851968, 5, -655377, 720896, 4, -589841, 720896, 5, -524305, 720896, 5, -655376, 786432, 4, -589840, 786432, 5, -524304, 786432, 5, -655375, 786432, 4, -589839, 786432, 5, -524303, 786432, 5, -655374, 786432, 4, -589838, 786432, 5, -524302, 786432, 5, -655373, 786432, 4, -589837, 786432, 5, -524301, 786432, 5, -655372, 786432, 4, -589836, 786432, 5, -524300, 786432, 5, -655371, 786432, 4, -589835, 786432, 5, -524299, 786432, 5, -655370, 786432, 4, -589834, 786432, 5, -524298, 786432, 5, -655369, 786432, 4, -589833, 786432, 5, -524297, 786432, 5, -655368, 851968, 4, -589832, 851968, 5, -524296, 851968, 5, -327697, 720896, 5, -327696, 786432, 5, -327695, 786432, 5, -327694, 786432, 5, -327693, 786432, 5, -327692, 786432, 5, -327691, 786432, 5, -327690, 786432, 5, -327689, 786432, 5, -327688, 851968, 5, -262161, 720896, 5, -262160, 786432, 5, -262159, 786432, 5, -262158, 786432, 5, -262157, 786432, 5, -262156, 786432, 5, -262155, 786432, 5, -262154, 786432, 5, -262153, 786432, 5, -262152, 851968, 5, -196625, 720896, 5, -196624, 786432, 5, -196623, 786432, 5, -196622, 786432, 5, -196621, 786432, 5, -196620, 786432, 5, -196619, 786432, 5, -196618, 786432, 5, -196617, 786432, 5, -196616, 851968, 5, 20, 786432, 4, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 327700, 786432, 5, 21, 786432, 4, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 327701, 786432, 5, 22, 786432, 4, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 786432, 5, 327702, 786432, 5, 23, 786432, 4, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327703, 786432, 5, 24, 786432, 4, 65560, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 25, 786432, 4, 65561, 786432, 5, 131097, 786432, 5, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 26, 786432, 4, 65562, 786432, 5, 131098, 786432, 5, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 27, 786432, 4, 65563, 786432, 5, 131099, 786432, 5, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, -65498, 917504, 3, 38, 786432, 4, 65574, 786432, 5, 131110, 786432, 5, 196646, 786432, 5, 262182, 786432, 5, 327718, 786432, 5, 39, 786432, 4, 65575, 786432, 5, 131111, 786432, 5, 196647, 786432, 5, 262183, 786432, 5, 327719, 786432, 5, -65496, 983040, 3, 40, 786432, 4, 65576, 786432, 5, 131112, 786432, 5, 196648, 786432, 5, 262184, 786432, 5, 327720, 786432, 5, -65495, 983040, 3, 41, 786432, 4, 65577, 786432, 5, 131113, 786432, 5, 196649, 786432, 5, 262185, 786432, 5, 327721, 786432, 5, -65494, 983040, 3, 42, 786432, 4, 65578, 786432, 5, 131114, 786432, 5, 196650, 786432, 5, 262186, 786432, 5, 327722, 786432, 5, -65493, 983040, 3, 43, 786432, 4, 65579, 786432, 5, 131115, 786432, 5, 196651, 786432, 5, 262187, 786432, 5, 327723, 786432, 5, -65492, 983040, 3, 44, 786432, 4, 65580, 786432, 5, 131116, 786432, 5, 196652, 786432, 5, 262188, 786432, 5, 327724, 786432, 5, -65491, 983040, 3, 45, 786432, 4, 65581, 786432, 5, 131117, 786432, 5, 196653, 786432, 5, 262189, 786432, 5, 327725, 786432, 5, -65490, 983040, 3, 46, 786432, 4, 65582, 786432, 5, 131118, 786432, 5, 196654, 786432, 5, 262190, 786432, 5, 327726, 786432, 5, -65489, 983040, 3, 47, 786432, 4, 65583, 786432, 5, 131119, 786432, 5, 196655, 786432, 5, 262191, 786432, 5, 327727, 786432, 5, -65488, 1048576, 3, 48, 786432, 4, 65584, 786432, 5, 131120, 786432, 5, 196656, 786432, 5, 262192, 786432, 5, 327728, 786432, 5, 49, 851968, 4, 65585, 851968, 5, 131121, 851968, 5, 196657, 851968, 5, 262193, 851968, 5, 327729, 851968, 5, -65497, 983040, 3, -589774, 720896, 4, -524238, 720896, 5, -458702, 720896, 5, -393166, 720896, 5, -327630, 720896, 5, -262094, 720896, 5, -196558, 720896, 5, -131022, 720896, 5, -65486, 720896, 5, 50, 720896, 5, 65586, 720896, 5, 131122, 720896, 5, 196658, 720896, 5, 262194, 720896, 5, 327730, 720896, 5, -589773, 786432, 4, -524237, 786432, 5, -458701, 786432, 5, -393165, 786432, 5, -327629, 786432, 5, -262093, 786432, 5, -196557, 786432, 5, -131021, 786432, 5, -65485, 786432, 5, 51, 786432, 5, 65587, 786432, 5, 131123, 786432, 5, 196659, 786432, 5, 262195, 786432, 5, 327731, 786432, 5, -589772, 786432, 4, -524236, 786432, 5, -458700, 786432, 5, -393164, 786432, 5, -327628, 786432, 5, -262092, 786432, 5, -196556, 786432, 5, -131020, 786432, 5, -65484, 786432, 5, 52, 786432, 5, 65588, 786432, 5, 131124, 786432, 5, 196660, 786432, 5, 262196, 786432, 5, 327732, 786432, 5, -589771, 786432, 4, -524235, 786432, 5, -458699, 786432, 5, -393163, 786432, 5, -327627, 786432, 5, -262091, 786432, 5, -196555, 786432, 5, -131019, 786432, 5, -65483, 786432, 5, 53, 786432, 5, 65589, 786432, 5, 131125, 786432, 5, 196661, 786432, 5, 262197, 786432, 5, 327733, 786432, 5, -589770, 786432, 4, -524234, 786432, 5, -458698, 786432, 5, -393162, 786432, 5, -327626, 786432, 5, -262090, 786432, 5, -196554, 786432, 5, -131018, 786432, 5, -65482, 786432, 5, 54, 786432, 5, 65590, 786432, 5, 131126, 786432, 5, 196662, 786432, 5, 262198, 786432, 5, 327734, 786432, 5, -589769, 786432, 4, -524233, 786432, 5, -458697, 786432, 5, -393161, 786432, 5, -327625, 786432, 5, -262089, 786432, 5, -196553, 786432, 5, -131017, 786432, 5, -65481, 786432, 5, 55, 786432, 5, 65591, 786432, 5, 131127, 786432, 5, 196663, 786432, 5, 262199, 786432, 5, 327735, 786432, 5, -589768, 786432, 4, -524232, 786432, 5, -458696, 786432, 5, -393160, 786432, 5, -327624, 786432, 5, -262088, 786432, 5, -196552, 786432, 5, -131016, 786432, 5, -65480, 786432, 5, 56, 786432, 5, 65592, 786432, 5, 131128, 786432, 5, 196664, 786432, 5, 262200, 786432, 5, 327736, 786432, 5, -589767, 786432, 4, -524231, 786432, 5, -458695, 786432, 5, -393159, 786432, 5, -327623, 786432, 5, -262087, 786432, 5, -196551, 786432, 5, -131015, 786432, 5, -65479, 786432, 5, 57, 786432, 5, 65593, 786432, 5, 131129, 786432, 5, 196665, 786432, 5, 262201, 786432, 5, 327737, 786432, 5, -589766, 786432, 4, -524230, 786432, 5, -458694, 786432, 5, -393158, 786432, 5, -327622, 786432, 5, -262086, 786432, 5, -196550, 786432, 5, -131014, 786432, 5, -65478, 786432, 5, 58, 786432, 5, 65594, 786432, 5, 131130, 786432, 5, 196666, 786432, 5, 262202, 786432, 5, 327738, 786432, 5, -589765, 851968, 4, -524229, 851968, 5, -458693, 851968, 5, -393157, 851968, 5, -327621, 851968, 5, -262085, 851968, 5, -196549, 851968, 5, -131013, 851968, 5, -65477, 851968, 5, 59, 851968, 5, 65595, 851968, 5, 131131, 851968, 5, 196667, 851968, 5, 262203, 851968, 5, 327739, 851968, 5, 28, 786432, 4, 65564, 786432, 5, 131100, 786432, 5, 196636, 786432, 5, 262172, 786432, 5, 327708, 786432, 5, 29, 786432, 4, 65565, 786432, 5, 131101, 786432, 5, 196637, 786432, 5, 262173, 786432, 5, 327709, 786432, 5, 30, 786432, 4, 65566, 786432, 5, 131102, 786432, 5, 196638, 786432, 5, 262174, 786432, 5, 327710, 786432, 5, 31, 786432, 4, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 32, 786432, 4, 65568, 786432, 5, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 33, 786432, 4, 65569, 786432, 5, 131105, 786432, 5, 196641, 786432, 5, 262177, 786432, 5, 327713, 786432, 5, 34, 786432, 4, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 786432, 5, 327714, 786432, 5, 35, 786432, 4, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 36, 786432, 4, 65572, 786432, 5, 131108, 786432, 5, 196644, 786432, 5, 262180, 786432, 5, 327716, 786432, 5, 37, 786432, 4, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 786432, 5, 327717, 786432, 5, -65487, 458752, 6, -131023, 458752, 5, -196559, 458752, 5, -262095, 458752, 5, -327631, 458752, 5, -393167, 458752, 5, -458703, 458752, 5, -524239, 458752, 5, -589775, 458752, 4) [node name="UI" type="CanvasLayer" parent="."] @@ -637,12 +230,14 @@ visible = false [node name="CharacterBody2D" parent="." instance=ExtResource("5_yv8tn")] unique_name_in_owner = true -position = Vector2(66, -50) +z_index = 1 +position = Vector2(66, -28) script = ExtResource("6_68ewj") [node name="RoomLeftPhantomCamera2D" type="Node2D" parent="." node_paths=PackedStringArray("follow_target")] unique_name_in_owner = true -position = Vector2(66, -113.205) +top_level = true +position = Vector2(66, -91.205) script = ExtResource("6_2n5r1") priority = 5 follow_mode = 2 @@ -652,7 +247,7 @@ tween_resource = SubResource("Resource_ct1eh") follow_offset = Vector2(0, -63.205) follow_damping = true draw_limits = true -limit_target = NodePath("../TileMap") +limit_target = NodePath("../StartingTerrain") limit_margin = Vector4i(-50, 0, -50, 0) [node name="RoomLeftArea2D" type="Area2D" parent="."] @@ -666,7 +261,8 @@ debug_color = Color(0, 0.6, 0.701961, 0.0313726) [node name="RoomCentrePhantomCamera2D" type="Node2D" parent="."] unique_name_in_owner = true -position = Vector2(1474, -149) +top_level = true +position = Vector2(1218, -217) script = ExtResource("6_2n5r1") follow_mode = 2 zoom = Vector2(1.5, 1.5) @@ -695,6 +291,7 @@ debug_color = Color(0, 0.6, 0.701961, 0) [node name="RoomRightPhantomCamera2D" type="Node2D" parent="."] unique_name_in_owner = true +top_level = true position = Vector2(2347, -156) scale = Vector2(1.0024, 1) script = ExtResource("6_2n5r1") @@ -705,8 +302,10 @@ follow_damping = true draw_limits = true [node name="Camera2D" type="Camera2D" parent="."] -position = Vector2(66, -113.205) +physics_interpolation_mode = 1 +position = Vector2(66, -91.205) zoom = Vector2(2, 2) +process_callback = 0 limit_left = -387 limit_top = -528 limit_right = 433 @@ -715,4 +314,6 @@ position_smoothing_speed = 10.0 editor_draw_limits = true [node name="PhantomCameraHost" type="Node" parent="Camera2D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("8_hulu3") diff --git a/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_noise_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_noise_example_scene.tscn new file mode 100644 index 0000000..029444b --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_noise_example_scene.tscn @@ -0,0 +1,289 @@ +[gd_scene load_steps=16 format=4 uid="uid://chw6g32u86uve"] + +[ext_resource type="Texture2D" uid="uid://c77npili4pel4" path="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png" id="1_2m0x8"] +[ext_resource type="PackedScene" uid="uid://dg7rhrymsrrrm" path="res://addons/phantom_camera/examples/ui/ui_inventory.tscn" id="2_4bfy0"] +[ext_resource type="PackedScene" uid="uid://iq5xd1ob1res" path="res://addons/phantom_camera/examples/ui/ui_sign.tscn" id="3_vdqsb"] +[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="4_w2gh7"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="5_d6fcf"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd" id="6_bdmii"] +[ext_resource type="Resource" uid="uid://euybd2w0bax" path="res://addons/phantom_camera/examples/resources/tween/player_phantom_camera_2d_tween.tres" id="7_dpnkg"] +[ext_resource type="PackedScene" uid="uid://7kh0xydx0b1o" path="res://addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn" id="8_u5o87"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd" id="9_suxld"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_2d.gd" id="10_p43w0"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/phantom_camera_noise_2d.gd" id="11_d6abr"] + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_lvmak"] +texture = ExtResource("1_2m0x8") +0:0/0 = 0 +1:0/0 = 0 +2:0/0 = 0 +3:0/0 = 0 +4:0/0 = 0 +5:0/0 = 0 +6:0/0 = 0 +7:0/0 = 0 +7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +0:1/0 = 0 +1:1/0 = 0 +2:1/0 = 0 +3:1/0 = 0 +4:1/0 = 0 +5:1/0 = 0 +7:1/0 = 0 +7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +2:2/0 = 0 +3:2/0 = 0 +4:2/0 = 0 +7:2/0 = 0 +7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +3:3/0 = 0 +4:3/0 = 0 +5:3/0 = 0 +7:3/0 = 0 +7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +3:4/0 = 0 +4:4/0 = 0 +5:4/0 = 0 +7:4/0 = 0 +3:5/0 = 0 +4:5/0 = 0 +7:5/0 = 0 +3:6/0 = 0 +4:6/0 = 0 +7:6/0 = 0 +2:7/0 = 0 +3:7/0 = 0 +4:7/0 = 0 +5:7/0 = 0 +8:0/0 = 0 +8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +9:0/0 = 0 +9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +10:0/0 = 0 +10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +11:0/0 = 0 +11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:0/0 = 0 +12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:0/0 = 0 +13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +14:0/0 = 0 +14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) +14:0/0/custom_data_0 = &"Sign" +15:0/0 = 0 +16:0/0 = 0 +8:1/0 = 0 +8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +9:1/0 = 0 +9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +10:1/0 = 0 +10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +11:1/0 = 0 +11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:1/0 = 0 +12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:1/0 = 0 +13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +14:1/0 = 0 +15:1/0 = 0 +16:1/0 = 0 +8:2/0 = 0 +8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +9:2/0 = 0 +9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +10:2/0 = 0 +10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +11:2/0 = 0 +11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:2/0 = 0 +12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:2/0 = 0 +13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +14:2/0 = 0 +15:2/0 = 0 +16:2/0 = 0 +8:3/0 = 0 +8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +9:3/0 = 0 +9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +10:3/0 = 0 +10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +11:3/0 = 0 +12:3/0 = 0 +12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:3/0 = 0 +13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +14:3/0 = 0 +15:3/0 = 0 +16:3/0 = 0 +8:4/0 = 0 +9:4/0 = 0 +10:4/0 = 0 +11:4/0 = 0 +11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8) +12:4/0 = 0 +12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:4/0 = 0 +13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8) +14:4/0 = 0 +14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) +14:4/0/custom_data_0 = &"Inventory" +15:4/0 = 0 +16:4/0 = 0 +8:5/0 = 0 +9:5/0 = 0 +10:5/0 = 0 +11:5/0 = 0 +11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:5/0 = 0 +12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:5/0 = 0 +13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +14:5/0 = 0 +15:5/0 = 0 +16:5/0 = 0 +8:6/0 = 0 +9:6/0 = 0 +10:6/0 = 0 +11:6/0 = 0 +11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5) +12:6/0 = 0 +12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:6/0 = 0 +13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8) +14:6/0 = 0 +15:6/0 = 0 +16:6/0 = 0 + +[sub_resource type="TileSet" id="TileSet_kf7eg"] +physics_layer_0/collision_layer = 1 +physics_layer_1/collision_layer = 2 +physics_layer_1/collision_mask = 2 +custom_data_layer_0/name = "Type" +custom_data_layer_0/type = 21 +sources/0 = SubResource("TileSetAtlasSource_lvmak") + +[sub_resource type="Resource" id="Resource_87ddr"] +script = ExtResource("11_d6abr") +amplitude = 30.0 +frequency = 0.5 +randomize_noise_seed = 1 +noise_seed = 0 +positional_noise = true +rotational_noise = false +positional_multiplier_x = 1.0 +positional_multiplier_y = 1.0 +rotational_multiplier = 1.0 + +[sub_resource type="Resource" id="Resource_rmnw1"] +script = ExtResource("11_d6abr") +amplitude = 20.0 +frequency = 10.0 +randomize_noise_seed = 1 +noise_seed = 96 +positional_noise = true +rotational_noise = false +positional_multiplier_x = 1.0 +positional_multiplier_y = 1.0 +rotational_multiplier = 1.0 + +[node name="Root" type="Node2D"] + +[node name="Background" type="CanvasLayer" parent="."] +layer = -3 + +[node name="ColorRect" type="ColorRect" parent="Background"] +auto_translate_mode = 2 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -311.0 +offset_top = -173.0 +offset_right = 981.0 +offset_bottom = 548.0 +grow_horizontal = 2 +grow_vertical = 2 +localize_numeral_system = false +color = Color(0.137255, 0.14902, 0.196078, 1) + +[node name="Pillar" type="TileMapLayer" parent="."] +use_parent_material = true +scale = Vector2(3, 3) +tile_map_data = PackedByteArray("AAAAAPr/AAAKAAIAAAAAAPv/AAAKAAMAAAAAAPz/AAAKAAMAAAAAAP3/AAAKAAMAAAAAAP7/AAAKAAMAAAAAAP//AAAKAAMAAAABAPr/AAALAAIAAAABAPv/AAALAAEAAAABAPz/AAALAAEAAAABAP3/AAALAAEAAAABAP7/AAALAAEAAAABAP//AAALAAEAAAACAPr/AAAMAAIAAAACAPv/AAAMAAMAAAACAPz/AAAMAAMAAAACAP3/AAAMAAMAAAACAP7/AAAMAAMAAAACAP//AAAMAAMAAAA=") +tile_set = SubResource("TileSet_kf7eg") +collision_enabled = false +navigation_enabled = false + +[node name="Terrain" type="TileMapLayer" parent="."] +z_index = 1 +use_parent_material = true +scale = Vector2(3, 3) +tile_map_data = PackedByteArray("AAABAAAAAAALAAAAAAACAAAAAAALAAAAAAADAAAAAAALAAAAAAAEAAAAAAALAAAAAAAFAAAAAAALAAAAAAAGAAAAAAALAAAAAAAHAAAAAAALAAAAAAAIAAAAAAALAAAAAAAJAAAAAAAMAAAAAAAJAAEAAAAMAAEAAAAJAAIAAAAMAAEAAAAJAAMAAAAMAAEAAAAJAAQAAAAMAAEAAAAJAAUAAAAMAAEAAAAJAAYAAAAMAAEAAAABAAEAAAALAAEAAAABAAIAAAALAAEAAAABAAMAAAALAAEAAAABAAQAAAAHAAEAAAABAAUAAAALAAEAAAABAAYAAAALAAEAAAACAAEAAAALAAEAAAACAAIAAAALAAEAAAACAAMAAAALAAEAAAACAAQAAAALAAEAAAACAAUAAAALAAEAAAACAAYAAAALAAEAAAADAAEAAAALAAEAAAADAAIAAAALAAEAAAADAAMAAAALAAEAAAADAAQAAAALAAEAAAADAAUAAAALAAEAAAADAAYAAAALAAEAAAAEAAEAAAAHAAEAAAAEAAIAAAALAAEAAAAEAAMAAAALAAEAAAAEAAQAAAALAAEAAAAEAAUAAAALAAEAAAAEAAYAAAALAAEAAAAFAAEAAAALAAEAAAAFAAIAAAALAAEAAAAFAAMAAAALAAEAAAAFAAQAAAAHAAEAAAAFAAUAAAALAAEAAAAFAAYAAAALAAEAAAAGAAEAAAALAAEAAAAGAAIAAAALAAEAAAAGAAMAAAALAAEAAAAGAAQAAAALAAEAAAAGAAUAAAALAAEAAAAGAAYAAAALAAEAAAAHAAEAAAALAAEAAAAHAAIAAAALAAEAAAAHAAMAAAALAAEAAAAHAAQAAAALAAEAAAAHAAUAAAALAAEAAAAHAAYAAAAHAAEAAAAIAAEAAAALAAEAAAAIAAIAAAALAAEAAAAIAAMAAAAHAAEAAAAIAAQAAAALAAEAAAAIAAUAAAALAAEAAAAIAAYAAAALAAEAAAAKAAEAAAAIAAUAAAALAAEAAAAIAAUAAAAMAAEAAAAIAAUAAAANAAEAAAAIAAUAAAAKAAIAAAAIAAYAAAALAAIAAAAIAAYAAAAMAAIAAAAIAAYAAAANAAIAAAAIAAYAAAAKAAMAAAALAAEAAAAKAAQAAAALAAEAAAALAAMAAAALAAEAAAALAAQAAAALAAEAAAAMAAMAAAALAAEAAAAMAAQAAAALAAEAAAANAAMAAAALAAEAAAANAAQAAAALAAEAAAAOAAEAAAAIAAUAAAAPAAEAAAAIAAUAAAAQAAEAAAAIAAUAAAAOAAIAAAAIAAYAAAAPAAIAAAAIAAYAAAAQAAIAAAAIAAYAAAAOAAMAAAALAAEAAAAPAAMAAAALAAEAAAAPAAQAAAALAAEAAAAQAAQAAAALAAEAAAAQAAMAAAALAAEAAAAOAAQAAAALAAEAAAARAAAAAAALAAQAAAARAAEAAAALAAUAAAARAAIAAAALAAUAAAARAAMAAAALAAUAAAARAAQAAAALAAUAAAASAAAAAAAMAAQAAAATAAAAAAAMAAQAAAAUAAAAAAAMAAQAAAAVAAAAAAAMAAQAAAAWAAAAAAAMAAQAAAAXAAAAAAAMAAQAAAASAAEAAAAMAAUAAAASAAIAAAAMAAUAAAASAAMAAAAMAAUAAAASAAQAAAAMAAUAAAATAAEAAAAMAAUAAAATAAIAAAAJAAYAAAATAAMAAAAMAAUAAAATAAQAAAAMAAUAAAAUAAEAAAAMAAUAAAAUAAIAAAAMAAUAAAAUAAMAAAAMAAUAAAAUAAQAAAAMAAUAAAAVAAEAAAAMAAUAAAAVAAIAAAAMAAUAAAAVAAMAAAAMAAUAAAAVAAQAAAAMAAUAAAAWAAEAAAAMAAUAAAAWAAIAAAAMAAUAAAAWAAMAAAAMAAUAAAAWAAQAAAAKAAYAAAAXAAEAAAAMAAUAAAAXAAIAAAAMAAUAAAAXAAMAAAAMAAUAAAAXAAQAAAAMAAUAAAARAAUAAAALAAUAAAARAAYAAAALAAUAAAASAAUAAAAJAAYAAAASAAYAAAAMAAUAAAATAAUAAAAMAAUAAAATAAYAAAAMAAUAAAAUAAUAAAAMAAUAAAAUAAYAAAAMAAUAAAAVAAUAAAAMAAUAAAAVAAYAAAAMAAUAAAAWAAUAAAAMAAUAAAAWAAYAAAAMAAUAAAAXAAUAAAAMAAUAAAAXAAYAAAAMAAUAAAAKAP7/AAALAAQAAAALAP7/AAAMAAQAAAAMAP7/AAAMAAQAAAAKAP//AAALAAYAAAALAP//AAAMAAYAAAAMAP//AAAMAAYAAAAQAP7/AAANAAQAAAAQAP//AAANAAYAAAANAP7/AAAMAAQAAAAOAP7/AAAMAAQAAAAPAP7/AAAMAAQAAAANAP//AAAMAAYAAAAOAP//AAAMAAYAAAAPAP//AAAMAAYAAAAMAP3/AAAOAAAAAAADAP//AAAOAAIAAAAEAP//AAAPAAIAAAAFAP//AAAQAAIAAAAGAP//AAAOAAIAAAAHAP//AAAPAAIAAAAIAP//AAAQAAIAAAD//wAAAAAKAAAAAAD//wEAAAAKAAEAAAD//wIAAAAKAAEAAAD//wMAAAAKAAEAAAD//wQAAAAKAAEAAAD//wUAAAAKAAEAAAD//wYAAAAKAAEAAAD//wcAAAAKAAEAAAD//wgAAAAKAAEAAAAAAAAAAAALAAAAAAAAAAEAAAALAAEAAAAAAAIAAAALAAEAAAAAAAMAAAALAAEAAAAAAAQAAAALAAEAAAAAAAUAAAALAAEAAAAAAAYAAAALAAEAAAAAAAcAAAALAAEAAAAAAAgAAAALAAEAAAABAAgAAAALAAEAAAACAAgAAAALAAEAAAADAAgAAAALAAEAAAAEAAgAAAALAAEAAAAFAAgAAAALAAEAAAAGAAgAAAALAAEAAAAHAAgAAAALAAEAAAAIAAgAAAALAAEAAAAJAAgAAAAMAAEAAAAJAAcAAAAMAAEAAAAIAAcAAAALAAEAAAAHAAcAAAALAAEAAAAGAAcAAAAHAAEAAAAFAAcAAAALAAEAAAAEAAcAAAALAAEAAAADAAcAAAALAAEAAAACAAcAAAALAAEAAAABAAcAAAALAAEAAAD///v/AAANAAQAAAD///z/AAANAAUAAAD///3/AAANAAUAAAD///7/AAANAAUAAAD/////AAANAAYAAAD+//v/AAAMAAQAAAD9//v/AAAMAAQAAAD+//z/AAAJAAYAAAD9//z/AAAMAAUAAAD6////AAAMAAUAAAD7////AAAMAAUAAAD8////AAAMAAUAAAD9////AAAMAAUAAAD+////AAAMAAUAAAD+//7/AAAMAAUAAAD+//3/AAAMAAUAAAD9//3/AAAMAAUAAAD9//7/AAAKAAYAAAD+/wAAAAANAAUAAAD+/wEAAAANAAUAAAD+/wIAAAANAAUAAAD+/wMAAAANAAUAAAD+/wQAAAANAAUAAAD+/wUAAAANAAUAAAD+/wYAAAANAAUAAAD9/wAAAAAMAAUAAAD8/wAAAAAMAAUAAAD7/wAAAAAMAAUAAAD6/wAAAAAMAAUAAAD5/wAAAAALAAUAAAD6/wEAAAAMAAUAAAD6/wIAAAAMAAUAAAD6/wMAAAAMAAUAAAD7/wMAAAAMAAUAAAD7/wQAAAAMAAUAAAD8/wEAAAAMAAUAAAD9/wEAAAAMAAUAAAD9/wIAAAAMAAUAAAD9/wMAAAAMAAUAAAD9/wQAAAAMAAUAAAD9/wUAAAAMAAUAAAD9/wYAAAAMAAUAAAD8/wUAAAAMAAUAAAD7/wUAAAAMAAUAAAD8/wYAAAAMAAUAAAD8/wQAAAAKAAYAAAD8/wMAAAAMAAUAAAD8/wIAAAAMAAUAAAD7/wEAAAAMAAUAAAD7/wIAAAAJAAYAAAD7/wYAAAAMAAUAAAD6/wYAAAAMAAUAAAD6/wUAAAAMAAUAAAD6/wQAAAAMAAUAAAD5////AAALAAUAAAD5/wEAAAALAAUAAAD5/wIAAAALAAUAAAD5/wMAAAALAAUAAAD5/wQAAAALAAUAAAD5/wUAAAALAAUAAAD5/wYAAAALAAUAAAD8//r/AAALAAMAAAAOAP3/AAALAAMAAAALAP3/AAALAAMAAAASAP//AAALAAMAAAAUAP//AAALAAMAAAD6//r/AAAQAAUAAAD7//r/AAALAAMAAAANAP3/AAAOAAYAAAAWAP//AAAPAAYAAAD9//r/AAAPAAUAAAAXAP//AAAQAAUAAAD5//v/AAALAAQAAAD5//z/AAALAAUAAAD5//3/AAALAAUAAAD5//7/AAALAAUAAAD6//v/AAAMAAQAAAD6//z/AAAKAAYAAAD6//3/AAAMAAUAAAD6//7/AAAMAAUAAAD7//v/AAAMAAQAAAD7//z/AAAMAAUAAAD7//3/AAAMAAUAAAD7//7/AAAMAAUAAAD8//v/AAAMAAQAAAD8//z/AAAMAAUAAAD8//3/AAAMAAUAAAD8//7/AAAMAAUAAAARAAcAAAALAAUAAAARAAgAAAALAAYAAAAXAAcAAAAMAAUAAAAWAAcAAAAMAAUAAAAVAAcAAAAMAAUAAAAUAAcAAAAMAAUAAAATAAcAAAAMAAUAAAASAAcAAAAMAAUAAAASAAgAAAAMAAYAAAATAAgAAAAMAAYAAAAUAAgAAAAMAAYAAAAVAAgAAAAMAAYAAAAWAAgAAAAMAAYAAAAXAAgAAAAMAAYAAAAKAAUAAAALAAEAAAAKAAYAAAALAAEAAAAKAAcAAAALAAEAAAAKAAgAAAALAAEAAAALAAUAAAALAAEAAAALAAYAAAALAAEAAAALAAcAAAALAAEAAAALAAgAAAALAAEAAAAMAAUAAAALAAEAAAAMAAYAAAALAAEAAAAMAAcAAAALAAEAAAAMAAgAAAALAAEAAAANAAUAAAALAAEAAAANAAYAAAALAAEAAAANAAcAAAALAAEAAAANAAgAAAALAAEAAAAOAAUAAAALAAEAAAAOAAYAAAALAAEAAAAOAAcAAAALAAEAAAAOAAgAAAALAAEAAAAPAAUAAAALAAEAAAAPAAYAAAALAAEAAAAPAAcAAAALAAEAAAAPAAgAAAALAAEAAAAQAAUAAAALAAEAAAAQAAYAAAALAAEAAAAQAAcAAAALAAEAAAAQAAgAAAALAAEAAAAdAAAAAAANAAQAAAAdAAEAAAANAAUAAAAdAAIAAAANAAUAAAAdAAMAAAANAAUAAAAdAAQAAAANAAUAAAAdAAUAAAANAAUAAAAdAAYAAAANAAUAAAAdAAcAAAANAAUAAAAdAAgAAAANAAYAAAAZAP//AAAOAAQAAAAYAAAAAAAMAAQAAAAZAAAAAAAMAAQAAAAaAAAAAAAMAAQAAAAbAAAAAAAMAAQAAAAcAAAAAAAMAAQAAAAYAAEAAAAMAAUAAAAZAAEAAAAMAAUAAAAaAAEAAAAMAAUAAAAbAAEAAAAMAAUAAAAcAAEAAAAMAAUAAAAcAAIAAAAMAAUAAAAcAAMAAAAJAAYAAAAbAAIAAAAMAAUAAAAaAAIAAAAMAAUAAAAZAAIAAAAMAAUAAAAYAAIAAAAMAAUAAAAYAAMAAAAMAAUAAAAYAAQAAAAMAAUAAAAYAAUAAAAMAAUAAAAYAAYAAAAMAAUAAAAYAAcAAAAMAAUAAAAYAAgAAAAMAAYAAAAZAAMAAAAMAAUAAAAZAAQAAAAMAAUAAAAZAAUAAAAMAAUAAAAZAAYAAAAMAAUAAAAZAAcAAAAMAAUAAAAZAAgAAAAMAAYAAAAaAAMAAAAMAAUAAAAaAAQAAAAMAAUAAAAaAAUAAAAMAAUAAAAaAAYAAAAKAAYAAAAaAAcAAAAMAAUAAAAaAAgAAAAMAAYAAAAbAAMAAAAMAAUAAAAbAAQAAAAMAAUAAAAbAAUAAAAMAAUAAAAbAAYAAAAMAAUAAAAbAAcAAAAMAAUAAAAbAAgAAAAMAAYAAAAcAAQAAAAMAAUAAAAcAAUAAAAMAAUAAAAcAAYAAAAMAAUAAAAcAAcAAAAMAAUAAAAcAAgAAAAMAAYAAAAPAP3/AAAQAAYAAAAiAPr/AAAQAAYAAAAfAPr/AAAOAAYAAAAkAPr/AAAPAAYAAAAgAPr/AAAPAAUAAAAbAP//AAALAAMAAAAaAP//AAALAAMAAAAjAPr/AAALAAMAAAAhAPr/AAALAAMAAAATAP//AAALAAMAAAAVAP//AAALAAMAAAAeAPv/AAALAAQAAAAeAPz/AAALAAUAAAAeAP3/AAALAAUAAAAeAP7/AAALAAUAAAAeAP//AAALAAUAAAAmAP//AAANAAUAAAAmAP7/AAANAAUAAAAmAP3/AAANAAUAAAAmAPv/AAANAAQAAAAfAPv/AAAMAAQAAAAgAPv/AAAMAAQAAAAhAPv/AAAMAAQAAAAiAPv/AAAMAAQAAAAjAPv/AAAMAAQAAAAkAPv/AAAMAAQAAAAlAPv/AAAMAAQAAAAmAPz/AAANAAUAAAAlAP//AAAMAAUAAAAlAP7/AAAMAAUAAAAlAP3/AAAMAAUAAAAlAPz/AAAMAAUAAAAkAPz/AAAMAAUAAAAjAPz/AAAMAAUAAAAiAPz/AAAMAAUAAAAhAPz/AAAMAAUAAAAgAPz/AAAMAAUAAAAfAPz/AAAMAAUAAAAfAP3/AAAKAAYAAAAfAP7/AAAMAAUAAAAfAP//AAAMAAUAAAAkAP//AAAKAAYAAAAkAP7/AAAJAAYAAAAkAP3/AAAMAAUAAAAjAP3/AAAMAAUAAAAiAP3/AAAMAAUAAAAhAP3/AAAMAAUAAAAgAP3/AAAMAAUAAAAgAP7/AAAJAAYAAAAgAP//AAAMAAUAAAAjAP//AAAMAAUAAAAjAP7/AAAMAAUAAAAiAP7/AAAMAAUAAAAhAP7/AAAMAAUAAAAhAP//AAAMAAUAAAAiAP//AAAMAAUAAAAeAAgAAAALAAYAAAAeAAcAAAALAAUAAAAeAAYAAAALAAUAAAAeAAUAAAALAAUAAAAeAAQAAAALAAUAAAAeAAMAAAALAAUAAAAeAAIAAAALAAUAAAAeAAEAAAALAAUAAAAeAAAAAAALAAUAAAAfAAgAAAAMAAYAAAAgAAgAAAAMAAYAAAAhAAgAAAAMAAYAAAAiAAgAAAAMAAYAAAAjAAgAAAAMAAYAAAAkAAgAAAAMAAYAAAAlAAgAAAAMAAYAAAAmAAgAAAANAAYAAAAmAAAAAAANAAUAAAAmAAEAAAANAAUAAAAmAAIAAAANAAUAAAAmAAMAAAANAAUAAAAmAAQAAAANAAUAAAAmAAUAAAANAAUAAAAmAAYAAAANAAUAAAAmAAcAAAANAAUAAAAfAAAAAAAMAAUAAAAfAAEAAAAMAAUAAAAfAAIAAAAMAAUAAAAfAAMAAAAMAAUAAAAfAAQAAAAMAAUAAAAfAAUAAAAMAAUAAAAfAAYAAAAKAAYAAAAfAAcAAAAMAAUAAAAgAAAAAAAMAAUAAAAgAAEAAAAMAAUAAAAgAAIAAAAMAAUAAAAgAAMAAAAMAAUAAAAgAAQAAAAMAAUAAAAgAAUAAAAMAAUAAAAgAAYAAAAMAAUAAAAgAAcAAAAMAAUAAAAhAAAAAAAMAAUAAAAhAAEAAAAMAAUAAAAhAAIAAAAKAAYAAAAhAAMAAAAMAAUAAAAhAAQAAAAMAAUAAAAhAAUAAAAMAAUAAAAhAAYAAAAMAAUAAAAhAAcAAAAMAAUAAAAiAAAAAAAMAAUAAAAiAAEAAAAMAAUAAAAiAAIAAAAMAAUAAAAiAAMAAAAMAAUAAAAiAAQAAAAKAAYAAAAiAAUAAAAKAAYAAAAiAAYAAAAMAAUAAAAiAAcAAAAMAAUAAAAjAAAAAAAMAAUAAAAjAAEAAAAMAAUAAAAjAAIAAAAMAAUAAAAjAAMAAAAMAAUAAAAjAAQAAAAMAAUAAAAjAAUAAAAMAAUAAAAjAAYAAAAMAAUAAAAjAAcAAAAMAAUAAAAkAAAAAAAKAAYAAAAkAAEAAAAMAAUAAAAkAAIAAAAMAAUAAAAkAAMAAAAMAAUAAAAkAAQAAAAMAAUAAAAkAAUAAAAMAAUAAAAkAAYAAAAMAAUAAAAkAAcAAAAKAAYAAAAlAAAAAAAMAAUAAAAlAAEAAAAMAAUAAAAlAAIAAAAMAAUAAAAlAAMAAAAMAAUAAAAlAAQAAAAMAAUAAAAlAAUAAAAMAAUAAAAlAAYAAAAMAAUAAAAlAAcAAAAMAAUAAAD6/wcAAAAMAAUAAAD7/wcAAAAMAAUAAAD8/wcAAAAMAAUAAAD9/wcAAAAMAAUAAAD5/wcAAAALAAUAAAD+/wcAAAANAAUAAAD5/wgAAAALAAYAAAD6/wgAAAAMAAYAAAD7/wgAAAAMAAYAAAD8/wgAAAAMAAYAAAD9/wgAAAAMAAYAAAD+/wgAAAANAAYAAAA=") +tile_set = SubResource("TileSet_kf7eg") + +[node name="UI" type="CanvasLayer" parent="."] + +[node name="UIInventory" parent="UI" instance=ExtResource("2_4bfy0")] +unique_name_in_owner = true +visible = false + +[node name="UISign" parent="UI" instance=ExtResource("3_vdqsb")] +unique_name_in_owner = true +visible = false + +[node name="Controls" type="Label" parent="."] +offset_left = 167.0 +offset_top = -145.0 +offset_right = 332.0 +offset_bottom = -81.0 +theme_override_colors/font_color = Color(0.294118, 1, 0.631373, 1) +theme_override_fonts/font = ExtResource("4_w2gh7") +text = "[WASD] to move +[Space] to jump +[Q] to trigger noise" + +[node name="Camera2D" type="Camera2D" parent="."] +physics_interpolation_mode = 1 +position = Vector2(227, -28) +offset = Vector2(-0.0537988, 2.87179) +ignore_rotation = false +zoom = Vector2(1.5, 1.5) +process_callback = 0 +editor_draw_limits = true + +[node name="PhantomCameraHost" type="Node" parent="Camera2D"] +process_priority = 300 +process_physics_priority = 300 +script = ExtResource("5_d6fcf") + +[node name="Player" type="Node" parent="."] + +[node name="PlayerPhantomCamera2D" type="Node2D" parent="Player" node_paths=PackedStringArray("follow_target")] +unique_name_in_owner = true +process_priority = -1 +top_level = true +position = Vector2(227, -28) +script = ExtResource("6_bdmii") +priority = 10 +follow_mode = 2 +follow_target = NodePath("../CharacterBody2D") +zoom = Vector2(1.5, 1.5) +frame_preview = false +tween_resource = ExtResource("7_dpnkg") +tween_on_load = false +follow_damping = true +draw_limits = true +noise = SubResource("Resource_87ddr") +noise_emitter_layer = 1 + +[node name="PlayerPhantomCameraNoiseEmitter2D" type="Node2D" parent="Player"] +unique_name_in_owner = true +script = ExtResource("10_p43w0") +noise = SubResource("Resource_rmnw1") +duration = 0.1 +decay_time = 0.1 + +[node name="CharacterBody2D" parent="Player" instance=ExtResource("8_u5o87")] +z_index = 2 +position = Vector2(227, -28) +script = ExtResource("9_suxld") diff --git a/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_tweening_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_tweening_example_scene.tscn index 4831baf..74db5c1 100644 --- a/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_tweening_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/2D-4.3/2d_tweening_example_scene.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=20 format=3 uid="uid://bvpp5na5054jd"] +[gd_scene load_steps=20 format=4 uid="uid://bvpp5na5054jd"] [ext_resource type="Texture2D" uid="uid://c77npili4pel4" path="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png" id="1_h1rbo"] [ext_resource type="PackedScene" uid="uid://dg7rhrymsrrrm" path="res://addons/phantom_camera/examples/ui/ui_inventory.tscn" id="2_1f2t2"] @@ -12,556 +12,156 @@ [ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd" id="9_5jy5e"] [ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="10_guf2v"] -[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"] +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_cvmao"] texture = ExtResource("1_h1rbo") 0:0/0 = 0 -0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_0/angular_velocity = 0.0 -0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_1/angular_velocity = 0.0 1:0/0 = 0 -1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_0/angular_velocity = 0.0 -1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_1/angular_velocity = 0.0 2:0/0 = 0 -2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_0/angular_velocity = 0.0 -2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_1/angular_velocity = 0.0 3:0/0 = 0 -3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_0/angular_velocity = 0.0 -3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_1/angular_velocity = 0.0 4:0/0 = 0 -4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_0/angular_velocity = 0.0 -4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_1/angular_velocity = 0.0 5:0/0 = 0 -5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_0/angular_velocity = 0.0 -5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_1/angular_velocity = 0.0 6:0/0 = 0 -6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_0/angular_velocity = 0.0 -6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_1/angular_velocity = 0.0 7:0/0 = 0 -7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_0/angular_velocity = 0.0 7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_1/angular_velocity = 0.0 0:1/0 = 0 -0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_0/angular_velocity = 0.0 -0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_1/angular_velocity = 0.0 1:1/0 = 0 -1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_0/angular_velocity = 0.0 -1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_1/angular_velocity = 0.0 2:1/0 = 0 -2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_0/angular_velocity = 0.0 -2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_1/angular_velocity = 0.0 3:1/0 = 0 -3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_0/angular_velocity = 0.0 -3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_1/angular_velocity = 0.0 4:1/0 = 0 -4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_0/angular_velocity = 0.0 -4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_1/angular_velocity = 0.0 5:1/0 = 0 -5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_0/angular_velocity = 0.0 -5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_1/angular_velocity = 0.0 7:1/0 = 0 -7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_0/angular_velocity = 0.0 7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_1/angular_velocity = 0.0 2:2/0 = 0 -2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_0/angular_velocity = 0.0 -2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_1/angular_velocity = 0.0 3:2/0 = 0 -3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_0/angular_velocity = 0.0 -3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_1/angular_velocity = 0.0 4:2/0 = 0 -4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_0/angular_velocity = 0.0 -4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_1/angular_velocity = 0.0 7:2/0 = 0 -7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_0/angular_velocity = 0.0 7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_1/angular_velocity = 0.0 3:3/0 = 0 -3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_0/angular_velocity = 0.0 -3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_1/angular_velocity = 0.0 4:3/0 = 0 -4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_0/angular_velocity = 0.0 -4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_1/angular_velocity = 0.0 +5:3/0 = 0 7:3/0 = 0 -7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_0/angular_velocity = 0.0 7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_1/angular_velocity = 0.0 3:4/0 = 0 -3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_0/angular_velocity = 0.0 -3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_1/angular_velocity = 0.0 4:4/0 = 0 -4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_0/angular_velocity = 0.0 -4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_1/angular_velocity = 0.0 5:4/0 = 0 -5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_0/angular_velocity = 0.0 -5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_1/angular_velocity = 0.0 7:4/0 = 0 -7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_0/angular_velocity = 0.0 -7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_1/angular_velocity = 0.0 3:5/0 = 0 -3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_0/angular_velocity = 0.0 -3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_1/angular_velocity = 0.0 4:5/0 = 0 -4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_0/angular_velocity = 0.0 -4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_1/angular_velocity = 0.0 7:5/0 = 0 -7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_0/angular_velocity = 0.0 -7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_1/angular_velocity = 0.0 3:6/0 = 0 -3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_0/angular_velocity = 0.0 -3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_1/angular_velocity = 0.0 4:6/0 = 0 -4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_0/angular_velocity = 0.0 -4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_1/angular_velocity = 0.0 7:6/0 = 0 -7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_0/angular_velocity = 0.0 -7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_1/angular_velocity = 0.0 2:7/0 = 0 -2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_0/angular_velocity = 0.0 -2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_1/angular_velocity = 0.0 3:7/0 = 0 -3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_0/angular_velocity = 0.0 -3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_1/angular_velocity = 0.0 4:7/0 = 0 -4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_0/angular_velocity = 0.0 -4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_1/angular_velocity = 0.0 5:7/0 = 0 -5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_0/angular_velocity = 0.0 -5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_1/angular_velocity = 0.0 8:0/0 = 0 -8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_0/angular_velocity = 0.0 8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_1/angular_velocity = 0.0 9:0/0 = 0 -9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_0/angular_velocity = 0.0 9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_1/angular_velocity = 0.0 10:0/0 = 0 -10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_0/angular_velocity = 0.0 10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_1/angular_velocity = 0.0 11:0/0 = 0 -11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_0/angular_velocity = 0.0 11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_1/angular_velocity = 0.0 12:0/0 = 0 -12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_0/angular_velocity = 0.0 12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_1/angular_velocity = 0.0 13:0/0 = 0 -13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_0/angular_velocity = 0.0 13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0 = 0 -14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_0/angular_velocity = 0.0 -14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) 14:0/0/custom_data_0 = &"Sign" 15:0/0 = 0 -15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_0/angular_velocity = 0.0 -15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_1/angular_velocity = 0.0 16:0/0 = 0 -16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_0/angular_velocity = 0.0 -16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_1/angular_velocity = 0.0 8:1/0 = 0 -8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_0/angular_velocity = 0.0 8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_1/angular_velocity = 0.0 9:1/0 = 0 -9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_0/angular_velocity = 0.0 9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_1/angular_velocity = 0.0 10:1/0 = 0 -10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_0/angular_velocity = 0.0 10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_1/angular_velocity = 0.0 11:1/0 = 0 -11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_0/angular_velocity = 0.0 11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_1/angular_velocity = 0.0 12:1/0 = 0 -12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_0/angular_velocity = 0.0 12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_1/angular_velocity = 0.0 13:1/0 = 0 -13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_0/angular_velocity = 0.0 13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_1/angular_velocity = 0.0 14:1/0 = 0 -14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_0/angular_velocity = 0.0 -14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_1/angular_velocity = 0.0 15:1/0 = 0 -15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_0/angular_velocity = 0.0 -15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_1/angular_velocity = 0.0 16:1/0 = 0 -16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_0/angular_velocity = 0.0 -16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_1/angular_velocity = 0.0 8:2/0 = 0 -8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_0/angular_velocity = 0.0 8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_1/angular_velocity = 0.0 9:2/0 = 0 -9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_0/angular_velocity = 0.0 9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_1/angular_velocity = 0.0 10:2/0 = 0 -10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_0/angular_velocity = 0.0 10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_1/angular_velocity = 0.0 11:2/0 = 0 -11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_0/angular_velocity = 0.0 11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_1/angular_velocity = 0.0 12:2/0 = 0 -12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_0/angular_velocity = 0.0 12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_1/angular_velocity = 0.0 13:2/0 = 0 -13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_0/angular_velocity = 0.0 13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_1/angular_velocity = 0.0 14:2/0 = 0 -14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_0/angular_velocity = 0.0 -14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_1/angular_velocity = 0.0 15:2/0 = 0 -15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_0/angular_velocity = 0.0 -15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_1/angular_velocity = 0.0 16:2/0 = 0 -16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_0/angular_velocity = 0.0 -16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_1/angular_velocity = 0.0 8:3/0 = 0 -8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_0/angular_velocity = 0.0 8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_1/angular_velocity = 0.0 9:3/0 = 0 -9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_0/angular_velocity = 0.0 9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_1/angular_velocity = 0.0 10:3/0 = 0 -10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_0/angular_velocity = 0.0 10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_1/angular_velocity = 0.0 11:3/0 = 0 -11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_0/angular_velocity = 0.0 -11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_1/angular_velocity = 0.0 12:3/0 = 0 -12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_0/angular_velocity = 0.0 12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_1/angular_velocity = 0.0 13:3/0 = 0 -13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_0/angular_velocity = 0.0 13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_1/angular_velocity = 0.0 14:3/0 = 0 -14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_0/angular_velocity = 0.0 -14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_1/angular_velocity = 0.0 15:3/0 = 0 -15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_0/angular_velocity = 0.0 -15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_1/angular_velocity = 0.0 16:3/0 = 0 -16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_0/angular_velocity = 0.0 -16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_1/angular_velocity = 0.0 8:4/0 = 0 -8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_0/angular_velocity = 0.0 -8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_1/angular_velocity = 0.0 9:4/0 = 0 -9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_0/angular_velocity = 0.0 -9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_1/angular_velocity = 0.0 10:4/0 = 0 -10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_0/angular_velocity = 0.0 -10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_1/angular_velocity = 0.0 11:4/0 = 0 -11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_0/angular_velocity = 0.0 11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8) -11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_1/angular_velocity = 0.0 12:4/0 = 0 -12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_0/angular_velocity = 0.0 12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_1/angular_velocity = 0.0 13:4/0 = 0 -13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_0/angular_velocity = 0.0 13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8) -13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0 = 0 -14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_0/angular_velocity = 0.0 -14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 14:4/0/custom_data_0 = &"Inventory" 15:4/0 = 0 -15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_0/angular_velocity = 0.0 -15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_1/angular_velocity = 0.0 16:4/0 = 0 -16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_0/angular_velocity = 0.0 -16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_1/angular_velocity = 0.0 8:5/0 = 0 -8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_0/angular_velocity = 0.0 -8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_1/angular_velocity = 0.0 9:5/0 = 0 -9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_0/angular_velocity = 0.0 -9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_1/angular_velocity = 0.0 10:5/0 = 0 -10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_0/angular_velocity = 0.0 -10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_1/angular_velocity = 0.0 11:5/0 = 0 -11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_0/angular_velocity = 0.0 11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_1/angular_velocity = 0.0 12:5/0 = 0 -12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_0/angular_velocity = 0.0 12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_1/angular_velocity = 0.0 13:5/0 = 0 -13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_0/angular_velocity = 0.0 13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_1/angular_velocity = 0.0 14:5/0 = 0 -14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_0/angular_velocity = 0.0 -14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_1/angular_velocity = 0.0 15:5/0 = 0 -15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_0/angular_velocity = 0.0 -15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_1/angular_velocity = 0.0 16:5/0 = 0 -16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_0/angular_velocity = 0.0 -16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_1/angular_velocity = 0.0 8:6/0 = 0 -8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_0/angular_velocity = 0.0 -8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_1/angular_velocity = 0.0 9:6/0 = 0 -9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_0/angular_velocity = 0.0 -9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_1/angular_velocity = 0.0 10:6/0 = 0 -10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_0/angular_velocity = 0.0 -10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_1/angular_velocity = 0.0 11:6/0 = 0 -11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_0/angular_velocity = 0.0 11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5) -11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_1/angular_velocity = 0.0 12:6/0 = 0 -12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_0/angular_velocity = 0.0 12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_1/angular_velocity = 0.0 13:6/0 = 0 -13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_0/angular_velocity = 0.0 13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8) -13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_1/angular_velocity = 0.0 14:6/0 = 0 -14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_0/angular_velocity = 0.0 -14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_1/angular_velocity = 0.0 15:6/0 = 0 -15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_0/angular_velocity = 0.0 -15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_1/angular_velocity = 0.0 16:6/0 = 0 -16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_0/angular_velocity = 0.0 -16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_1/angular_velocity = 0.0 -5:3/0 = 0 -5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_0/angular_velocity = 0.0 -5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_1/angular_velocity = 0.0 -[sub_resource type="TileSet" id="TileSet_kf7eg"] +[sub_resource type="TileSet" id="TileSet_na7gm"] physics_layer_0/collision_layer = 1 physics_layer_1/collision_layer = 2 physics_layer_1/collision_mask = 2 custom_data_layer_0/name = "Type" custom_data_layer_0/type = 21 -sources/0 = SubResource("TileSetAtlasSource_easgx") +sources/0 = SubResource("TileSetAtlasSource_cvmao") [sub_resource type="RectangleShape2D" id="RectangleShape2D_tgk1y"] size = Vector2(140, 160) @@ -590,12 +190,13 @@ duration = 1.2 transition = 10 ease = 2 -[node name="ExampleScene2D" type="Node2D"] +[node name="Root" type="Node2D"] [node name="Background" type="CanvasLayer" parent="."] layer = -3 [node name="ColorRect" type="ColorRect" parent="Background"] +auto_translate_mode = 2 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 @@ -605,20 +206,22 @@ offset_right = 981.0 offset_bottom = 548.0 grow_horizontal = 2 grow_vertical = 2 -auto_translate = false localize_numeral_system = false color = Color(0.137255, 0.14902, 0.196078, 1) -[node name="TileMap" type="TileMap" parent="."] -z_index = -1 +[node name="Pillar" type="TileMapLayer" parent="."] +use_parent_material = true +scale = Vector2(3, 3) +tile_map_data = PackedByteArray("AAAAAPr/AAAKAAIAAAAAAPv/AAAKAAMAAAAAAPz/AAAKAAMAAAAAAP3/AAAKAAMAAAAAAP7/AAAKAAMAAAAAAP//AAAKAAMAAAABAPr/AAALAAIAAAABAPv/AAALAAEAAAABAPz/AAALAAEAAAABAP3/AAALAAEAAAABAP7/AAALAAEAAAABAP//AAALAAEAAAACAPr/AAAMAAIAAAACAPv/AAAMAAMAAAACAPz/AAAMAAMAAAACAP3/AAAMAAMAAAACAP7/AAAMAAMAAAACAP//AAAMAAMAAAA=") +tile_set = SubResource("TileSet_na7gm") +collision_enabled = false +navigation_enabled = false + +[node name="Terrain" type="TileMapLayer" parent="."] +use_parent_material = true scale = Vector2(3, 3) -tile_set = SubResource("TileSet_kf7eg") -format = 2 -layer_0/name = "Background" -layer_0/tile_data = PackedInt32Array(-393216, 655360, 2, -327680, 655360, 3, -262144, 655360, 3, -196608, 655360, 3, -131072, 655360, 3, -65536, 655360, 3, -393215, 720896, 2, -327679, 720896, 1, -262143, 720896, 1, -196607, 720896, 1, -131071, 720896, 1, -65535, 720896, 1, -393214, 786432, 2, -327678, 786432, 3, -262142, 786432, 3, -196606, 786432, 3, -131070, 786432, 3, -65534, 786432, 3) -layer_1/name = "Terrain" -layer_1/z_index = 1 -layer_1/tile_data = PackedInt32Array(1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1, 393225, 786432, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 458752, 1, 327681, 720896, 1, 393217, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 393218, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 393219, 720896, 1, 65540, 458752, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 393220, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 458752, 1, 327685, 720896, 1, 393221, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 393222, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 393223, 458752, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 458752, 1, 262152, 720896, 1, 327688, 720896, 1, 393224, 720896, 1, 65546, 524288, 5, 65547, 524288, 5, 65548, 524288, 5, 65549, 524288, 5, 131082, 524288, 6, 131083, 524288, 6, 131084, 524288, 6, 131085, 524288, 6, 196618, 720896, 1, 262154, 720896, 1, 196619, 720896, 1, 262155, 720896, 1, 196620, 720896, 1, 262156, 720896, 1, 196621, 720896, 1, 262157, 720896, 1, 65550, 524288, 5, 65551, 524288, 5, 65552, 524288, 5, 131086, 524288, 6, 131087, 524288, 6, 131088, 524288, 6, 196622, 720896, 1, 196623, 720896, 1, 262159, 720896, 1, 262160, 720896, 1, 196624, 720896, 1, 262158, 720896, 1, 17, 720896, 4, 65553, 720896, 5, 131089, 720896, 5, 196625, 720896, 5, 262161, 720896, 5, 18, 786432, 4, 19, 786432, 4, 20, 786432, 4, 21, 786432, 4, 22, 786432, 4, 23, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 65555, 786432, 5, 131091, 589824, 6, 196627, 786432, 5, 262163, 786432, 5, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 655360, 6, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327697, 720896, 5, 393233, 720896, 5, 327698, 589824, 6, 393234, 786432, 5, 327699, 786432, 5, 393235, 786432, 5, 327700, 786432, 5, 393236, 786432, 5, 327701, 786432, 5, 393237, 786432, 5, 327702, 786432, 5, 393238, 786432, 5, 327703, 786432, 5, 393239, 786432, 5, -131062, 720896, 4, -131061, 786432, 4, -131060, 786432, 4, -65526, 720896, 6, -65525, 786432, 6, -65524, 786432, 6, -131056, 851968, 4, -65520, 851968, 6, -131059, 786432, 4, -131058, 786432, 4, -131057, 786432, 4, -65523, 786432, 6, -65522, 786432, 6, -65521, 786432, 6, -65536, 917504, 2, -65535, 983040, 2, -65534, 1048576, 2, -65533, 917504, 2, -65532, 983040, 2, -65531, 1048576, 2, -65530, 917504, 2, -65529, 983040, 2, -65528, 1048576, 2, 65535, 655360, 0, 131071, 655360, 1, 196607, 655360, 1, 262143, 655360, 1, 327679, 655360, 1, 393215, 655360, 1, 458751, 655360, 1, 524287, 655360, 1, 589823, 655360, 1, 0, 720896, 0, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 393216, 720896, 1, 458752, 720896, 1, 524288, 720896, 1, 524289, 720896, 1, 524290, 720896, 1, 524291, 720896, 1, 524292, 720896, 1, 524293, 720896, 1, 524294, 720896, 1, 524295, 720896, 1, 524296, 720896, 1, 524297, 786432, 1, 458761, 786432, 1, 458760, 720896, 1, 458759, 720896, 1, 458758, 458752, 1, 458757, 720896, 1, 458756, 720896, 1, 458755, 720896, 1, 458754, 720896, 1, 458753, 720896, 1, -262145, 851968, 4, -196609, 851968, 5, -131073, 851968, 5, -65537, 851968, 5, -1, 851968, 6, -262146, 786432, 4, -262147, 786432, 4, -196610, 589824, 6, -196611, 786432, 5, -6, 786432, 5, -5, 786432, 5, -4, 786432, 5, -3, 786432, 5, -2, 786432, 5, -65538, 786432, 5, -131074, 786432, 5, -131075, 786432, 5, -65539, 655360, 6, 65534, 851968, 5, 131070, 851968, 5, 196606, 851968, 5, 262142, 851968, 5, 327678, 851968, 5, 393214, 851968, 5, 458750, 851968, 5, 65533, 786432, 5, 65532, 786432, 5, 65531, 786432, 5, 65530, 786432, 5, 65529, 720896, 5, 131066, 786432, 5, 196602, 786432, 5, 262138, 786432, 5, 262139, 786432, 5, 327675, 786432, 5, 131068, 786432, 5, 131069, 786432, 5, 196605, 786432, 5, 262141, 786432, 5, 327677, 786432, 5, 393213, 786432, 5, 458749, 786432, 5, 393212, 786432, 5, 393211, 786432, 5, 458748, 786432, 5, 327676, 655360, 6, 262140, 786432, 5, 196604, 786432, 5, 131067, 786432, 5, 196603, 589824, 6, 458747, 786432, 5, 458746, 786432, 5, 393210, 786432, 5, 327674, 786432, 5, -7, 720896, 5, 131065, 720896, 5, 196601, 720896, 5, 262137, 720896, 5, 327673, 720896, 5, 393209, 720896, 5, 458745, 720896, 5, -327684, 720896, 3, -196594, 720896, 3, -196597, 720896, 3, -65518, 720896, 3, -65516, 720896, 3, -327686, 1048576, 5, -327685, 720896, 3, -196595, 917504, 6, -65514, 983040, 6, -327683, 983040, 5, -65513, 1048576, 5, -262151, 720896, 4, -196615, 720896, 5, -131079, 720896, 5, -65543, 720896, 5, -262150, 786432, 4, -196614, 655360, 6, -131078, 786432, 5, -65542, 786432, 5, -262149, 786432, 4, -196613, 786432, 5, -131077, 786432, 5, -65541, 786432, 5, -262148, 786432, 4, -196612, 786432, 5, -131076, 786432, 5, -65540, 786432, 5, 458769, 720896, 5, 458775, 786432, 5, 458774, 786432, 5, 458773, 786432, 5, 458772, 786432, 5, 458771, 786432, 5, 458770, 786432, 5, 327690, 720896, 1, 393226, 720896, 1, 458762, 720896, 1, 524298, 720896, 1, 327691, 720896, 1, 393227, 720896, 1, 458763, 720896, 1, 524299, 720896, 1, 327692, 720896, 1, 393228, 720896, 1, 458764, 720896, 1, 524300, 720896, 1, 327693, 720896, 1, 393229, 720896, 1, 458765, 720896, 1, 524301, 720896, 1, 327694, 720896, 1, 393230, 720896, 1, 458766, 720896, 1, 524302, 720896, 1, 327695, 720896, 1, 393231, 720896, 1, 458767, 720896, 1, 524303, 720896, 1, 327696, 720896, 1, 393232, 720896, 1, 458768, 720896, 1, 524304, 720896, 1, 29, 851968, 4, 65565, 851968, 5, 131101, 851968, 5, 196637, 851968, 5, 262173, 851968, 5, 327709, 851968, 5, 393245, 851968, 5, 458781, 851968, 5, 24, 786432, 4, 25, 786432, 4, 26, 786432, 4, 27, 786432, 4, 28, 786432, 4, 65560, 786432, 5, 65561, 786432, 5, 65562, 786432, 5, 65563, 786432, 5, 65564, 786432, 5, 131100, 786432, 5, 196636, 589824, 6, 131099, 786432, 5, 131098, 786432, 5, 131097, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 393240, 786432, 5, 458776, 786432, 5, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 393241, 786432, 5, 458777, 786432, 5, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 393242, 655360, 6, 458778, 786432, 5, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, 393243, 786432, 5, 458779, 786432, 5, 262172, 786432, 5, 327708, 786432, 5, 393244, 786432, 5, 458780, 786432, 5, -196593, 1048576, 6, -393182, 1048576, 6, -393185, 917504, 6, -393180, 983040, 6, -393184, 983040, 5, -65509, 720896, 3, -65510, 720896, 3, -393181, 720896, 3, -393183, 720896, 3, -65517, 720896, 3, -65515, 720896, 3, -327650, 720896, 4, -262114, 720896, 5, -196578, 720896, 5, -131042, 720896, 5, -65506, 720896, 5, -327649, 786432, 4, -327648, 786432, 4, -327647, 786432, 4, -327646, 786432, 4, -327645, 786432, 4, -327644, 786432, 4, -327643, 786432, 4, -65499, 786432, 5, -131035, 786432, 5, -196571, 786432, 5, -262107, 655360, 6, -262108, 786432, 5, -262109, 786432, 5, -262110, 786432, 5, -262111, 786432, 5, -262112, 786432, 5, -262113, 786432, 5, -196577, 655360, 6, -131041, 786432, 5, -65505, 786432, 5, -65500, 655360, 6, -131036, 589824, 6, -196572, 786432, 5, -196573, 786432, 5, -196574, 786432, 5, -196575, 786432, 5, -196576, 786432, 5, -131040, 589824, 6, -65504, 786432, 5, -65501, 786432, 5, -131037, 786432, 5, -131038, 786432, 5, -131039, 786432, 5, -65503, 786432, 5, -65502, 786432, 5, 524318, 720896, 6, 458782, 720896, 5, 393246, 720896, 5, 327710, 720896, 5, 262174, 720896, 5, 196638, 720896, 5, 131102, 720896, 5, 65566, 720896, 5, 30, 720896, 5, 524319, 786432, 6, 524320, 786432, 6, 524321, 786432, 6, 524322, 786432, 6, 524323, 786432, 6, 524324, 786432, 6, 524325, 786432, 6, 31, 786432, 5, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 393247, 655360, 6, 458783, 786432, 5, 32, 786432, 5, 65568, 786432, 5, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 393248, 786432, 5, 458784, 786432, 5, 33, 786432, 5, 65569, 786432, 5, 131105, 655360, 6, 196641, 786432, 5, 262177, 786432, 5, 327713, 786432, 5, 393249, 786432, 5, 458785, 786432, 5, 34, 786432, 5, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 655360, 6, 327714, 655360, 6, 393250, 786432, 5, 458786, 786432, 5, 35, 786432, 5, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 393251, 786432, 5, 458787, 786432, 5, 36, 655360, 6, 65572, 786432, 5, 131108, 786432, 5, 196644, 786432, 5, 262180, 786432, 5, 327716, 786432, 5, 393252, 786432, 5, 458788, 655360, 6, 37, 786432, 5, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 655360, 6, 327717, 786432, 5, 393253, 786432, 5, 458789, 786432, 5, 524281, 720896, 5, 524285, 786432, 5, 524284, 786432, 5, 524283, 786432, 5, 524282, 786432, 5, 589818, 786432, 5, 589819, 786432, 5, 589820, 786432, 5, 655356, 786432, 5, 655357, 786432, 5, 589821, 786432, 5, 655355, 786432, 5, 655354, 786432, 5, 720890, 786432, 5, 720891, 786432, 5, 720892, 786432, 5, 720893, 786432, 5, 720894, 851968, 5, 786429, 786432, 5, 786428, 786432, 5, 786427, 786432, 5, 786426, 786432, 5, 851962, 786432, 5, 917498, 786432, 5, 917499, 786432, 5, 851964, 786432, 5, 851965, 786432, 5, 917501, 786432, 5, 917500, 786432, 5, 851963, 786432, 5, 589817, 720896, 5, 655353, 720896, 5, 720889, 720896, 5, 786425, 720896, 5, 851961, 720896, 5, 917497, 720896, 5, 524286, 851968, 5, 589822, 851968, 5, 655358, 851968, 5, 786430, 851968, 5, 851966, 851968, 5, 917502, 851968, 5, 589824, 720896, 1, 655360, 720896, 1, 720896, 720896, 1, 786432, 720896, 1, 851968, 720896, 1, 589825, 720896, 1, 655361, 720896, 1, 720897, 720896, 1, 786433, 720896, 1, 851969, 720896, 1, 589826, 720896, 1, 655362, 720896, 1, 720898, 720896, 1, 786434, 720896, 1, 851970, 720896, 1, 589827, 720896, 1, 655363, 720896, 1, 720899, 720896, 1, 786435, 720896, 1, 851971, 720896, 1, 589828, 720896, 1, 655364, 720896, 1, 720900, 720896, 1, 786436, 720896, 1, 851972, 720896, 1, 589829, 720896, 1, 655365, 720896, 1, 720901, 720896, 1, 786437, 720896, 1, 851973, 720896, 1, 589830, 720896, 1, 655366, 720896, 1, 720902, 720896, 1, 786438, 720896, 1, 851974, 720896, 1, 589831, 720896, 1, 655367, 720896, 1, 720903, 720896, 1, 786439, 720896, 1, 851975, 720896, 1, 589832, 720896, 1, 655368, 720896, 1, 720904, 720896, 1, 786440, 720896, 1, 851976, 720896, 1, 589833, 786432, 1, 655369, 786432, 1, 720905, 786432, 1, 786441, 786432, 1, 851977, 786432, 1, 655359, 655360, 1, 720895, 655360, 1, 786431, 655360, 1, 851967, 655360, 1, 917503, 655360, 1, 589834, 720896, 1, 655370, 720896, 1, 720906, 720896, 1, 786442, 720896, 1, 851978, 720896, 1, 589835, 720896, 1, 655371, 720896, 1, 720907, 720896, 1, 786443, 720896, 1, 851979, 720896, 1, 589836, 720896, 1, 655372, 720896, 1, 720908, 720896, 1, 786444, 720896, 1, 851980, 720896, 1, 589837, 720896, 1, 655373, 720896, 1, 720909, 720896, 1, 786445, 720896, 1, 851981, 720896, 1, 589838, 720896, 1, 655374, 720896, 1, 720910, 720896, 1, 786446, 720896, 1, 851982, 720896, 1, 589839, 720896, 1, 655375, 720896, 1, 720911, 720896, 1, 786447, 720896, 1, 851983, 720896, 1, 589840, 720896, 1, 655376, 720896, 1, 720912, 720896, 1, 786448, 720896, 1, 851984, 720896, 1, 851985, 720896, 6, 851986, 786432, 6, 851987, 786432, 6, 851988, 786432, 6, 851989, 786432, 6, 851990, 786432, 6, 851991, 786432, 6, 851992, 786432, 6, 851993, 786432, 6, 851994, 786432, 6, 851995, 786432, 6, 851996, 786432, 6, 851997, 851968, 6, 524306, 786432, 5, 589842, 786432, 5, 655378, 786432, 5, 720914, 786432, 5, 786450, 786432, 5, 524307, 786432, 5, 589843, 786432, 5, 655379, 786432, 5, 720915, 786432, 5, 786451, 786432, 5, 524308, 786432, 5, 589844, 786432, 5, 655380, 786432, 5, 720916, 786432, 5, 786452, 786432, 5, 524309, 786432, 5, 589845, 786432, 5, 655381, 786432, 5, 720917, 786432, 5, 786453, 786432, 5, 524310, 786432, 5, 589846, 786432, 5, 655382, 786432, 5, 720918, 786432, 5, 786454, 786432, 5, 524311, 786432, 5, 589847, 786432, 5, 655383, 786432, 5, 720919, 786432, 5, 786455, 786432, 5, 524312, 786432, 5, 589848, 786432, 5, 655384, 786432, 5, 720920, 786432, 5, 786456, 786432, 5, 524313, 786432, 5, 589849, 786432, 5, 655385, 786432, 5, 720921, 786432, 5, 786457, 786432, 5, 524314, 786432, 5, 589850, 786432, 5, 655386, 786432, 5, 720922, 786432, 5, 786458, 786432, 5, 524315, 786432, 5, 589851, 786432, 5, 655387, 786432, 5, 720923, 786432, 5, 786459, 786432, 5, 524316, 786432, 5, 589852, 786432, 5, 655388, 786432, 5, 720924, 786432, 5, 786460, 786432, 5, 524305, 720896, 5, 589841, 720896, 5, 655377, 720896, 5, 720913, 720896, 5, 786449, 720896, 5, 524317, 851968, 5, 589853, 851968, 5, 655389, 851968, 5, 720925, 851968, 5, 786461, 851968, 5, -262106, 786432, 5, -196570, 786432, 5, -131034, 786432, 5, -65498, 786432, 5, 38, 786432, 5, 65574, 786432, 5, 131110, 655360, 6, 196646, 786432, 5, 262182, 786432, 5, 327718, 786432, 5, 393254, 786432, 5, 458790, 786432, 5, -262105, 786432, 5, -196569, 786432, 5, -131033, 786432, 5, -65497, 786432, 5, 39, 786432, 5, 65575, 786432, 5, 131111, 786432, 5, 196647, 786432, 5, 262183, 786432, 5, 327719, 786432, 5, 393255, 655360, 6, 458791, 786432, 5, -262104, 786432, 5, -196568, 786432, 5, -131032, 786432, 5, -65496, 786432, 5, 40, 655360, 6, 65576, 786432, 5, 131112, 786432, 5, 196648, 786432, 5, 262184, 655360, 6, 327720, 786432, 5, 393256, 786432, 5, 458792, 786432, 5, -262103, 786432, 5, -196567, 655360, 6, -131031, 786432, 5, -65495, 786432, 5, 41, 786432, 5, 65577, 786432, 5, 131113, 786432, 5, 196649, 786432, 5, 262185, 786432, 5, 327721, 786432, 5, 393257, 786432, 5, 458793, 786432, 5, -262102, 786432, 5, -196566, 786432, 5, -131030, 786432, 5, -65494, 786432, 5, 42, 786432, 5, 65578, 786432, 5, 131114, 655360, 6, 196650, 786432, 5, 262186, 786432, 5, 327722, 786432, 5, 393258, 786432, 5, 458794, 655360, 6, 524326, 786432, 6, 524327, 786432, 6, 524328, 786432, 6, 524329, 786432, 6, 524330, 786432, 6, -327642, 786432, 4, -327641, 786432, 4, -327640, 786432, 4, -327639, 786432, 4, -327638, 786432, 4, -327632, 851968, 4, -262096, 851968, 5, -196560, 851968, 5, -131024, 851968, 5, -65488, 851968, 5, 48, 851968, 5, 65584, 851968, 5, 131120, 851968, 5, 196656, 851968, 5, 262192, 851968, 5, 327728, 851968, 5, 393264, 851968, 5, 458800, 851968, 5, 524336, 851968, 6, -327637, 786432, 4, -327636, 786432, 4, -327635, 786432, 4, -327634, 786432, 4, -327633, 786432, 4, -262101, 786432, 5, -196565, 786432, 5, -131029, 655360, 6, -65493, 786432, 5, 43, 786432, 5, 65579, 786432, 5, 131115, 786432, 5, 196651, 786432, 5, 262187, 786432, 5, 327723, 655360, 6, 393259, 786432, 5, 458795, 786432, 5, -262100, 786432, 5, -196564, 786432, 5, -131028, 786432, 5, -65492, 786432, 5, 44, 655360, 6, 65580, 786432, 5, 131116, 786432, 5, 196652, 786432, 5, 262188, 786432, 5, 327724, 786432, 5, 393260, 786432, 5, 458796, 786432, 5, -262099, 786432, 5, -196563, 786432, 5, -131027, 786432, 5, -65491, 786432, 5, 45, 786432, 5, 65581, 655360, 6, 131117, 786432, 5, 196653, 786432, 5, 262189, 786432, 5, 327725, 786432, 5, 393261, 786432, 5, 458797, 786432, 5, -262098, 655360, 6, -196562, 786432, 5, -131026, 786432, 5, -65490, 786432, 5, 46, 786432, 5, 65582, 786432, 5, 131118, 786432, 5, 196654, 655360, 6, 262190, 786432, 5, 327726, 786432, 5, 393262, 786432, 5, 458798, 655360, 6, -262097, 786432, 5, -196561, 786432, 5, -131025, 786432, 5, -65489, 786432, 5, 47, 786432, 5, 65583, 786432, 5, 131119, 786432, 5, 196655, 786432, 5, 262191, 786432, 5, 327727, 786432, 5, 393263, 786432, 5, 458799, 786432, 5, 524331, 786432, 6, 524332, 786432, 6, 524333, 786432, 6, 524334, 786432, 6, 524335, 786432, 6) +tile_map_data = PackedByteArray("AAABAAAAAAALAAAAAAACAAAAAAALAAAAAAADAAAAAAALAAAAAAAEAAAAAAALAAAAAAAFAAAAAAALAAAAAAAGAAAAAAALAAAAAAAHAAAAAAALAAAAAAAIAAAAAAALAAAAAAAJAAAAAAAMAAAAAAAJAAEAAAAMAAEAAAAJAAIAAAAMAAEAAAAJAAMAAAAMAAEAAAAJAAQAAAAMAAEAAAAJAAUAAAAMAAEAAAAJAAYAAAAMAAEAAAABAAEAAAALAAEAAAABAAIAAAALAAEAAAABAAMAAAALAAEAAAABAAQAAAAHAAEAAAABAAUAAAALAAEAAAABAAYAAAALAAEAAAACAAEAAAALAAEAAAACAAIAAAALAAEAAAACAAMAAAALAAEAAAACAAQAAAALAAEAAAACAAUAAAALAAEAAAACAAYAAAALAAEAAAADAAEAAAALAAEAAAADAAIAAAALAAEAAAADAAMAAAALAAEAAAADAAQAAAALAAEAAAADAAUAAAALAAEAAAADAAYAAAALAAEAAAAEAAEAAAAHAAEAAAAEAAIAAAALAAEAAAAEAAMAAAALAAEAAAAEAAQAAAALAAEAAAAEAAUAAAALAAEAAAAEAAYAAAALAAEAAAAFAAEAAAALAAEAAAAFAAIAAAALAAEAAAAFAAMAAAALAAEAAAAFAAQAAAAHAAEAAAAFAAUAAAALAAEAAAAFAAYAAAALAAEAAAAGAAEAAAALAAEAAAAGAAIAAAALAAEAAAAGAAMAAAALAAEAAAAGAAQAAAALAAEAAAAGAAUAAAALAAEAAAAGAAYAAAALAAEAAAAHAAEAAAALAAEAAAAHAAIAAAALAAEAAAAHAAMAAAALAAEAAAAHAAQAAAALAAEAAAAHAAUAAAALAAEAAAAHAAYAAAAHAAEAAAAIAAEAAAALAAEAAAAIAAIAAAALAAEAAAAIAAMAAAAHAAEAAAAIAAQAAAALAAEAAAAIAAUAAAALAAEAAAAIAAYAAAALAAEAAAAKAAEAAAAIAAUAAAALAAEAAAAIAAUAAAAMAAEAAAAIAAUAAAANAAEAAAAIAAUAAAAKAAIAAAAIAAYAAAALAAIAAAAIAAYAAAAMAAIAAAAIAAYAAAANAAIAAAAIAAYAAAAKAAMAAAALAAEAAAAKAAQAAAALAAEAAAALAAMAAAALAAEAAAALAAQAAAALAAEAAAAMAAMAAAALAAEAAAAMAAQAAAALAAEAAAANAAMAAAALAAEAAAANAAQAAAALAAEAAAAOAAEAAAAIAAUAAAAPAAEAAAAIAAUAAAAQAAEAAAAIAAUAAAAOAAIAAAAIAAYAAAAPAAIAAAAIAAYAAAAQAAIAAAAIAAYAAAAOAAMAAAALAAEAAAAPAAMAAAALAAEAAAAPAAQAAAALAAEAAAAQAAQAAAALAAEAAAAQAAMAAAALAAEAAAAOAAQAAAALAAEAAAARAAAAAAALAAQAAAARAAEAAAALAAUAAAARAAIAAAALAAUAAAARAAMAAAALAAUAAAARAAQAAAALAAUAAAASAAAAAAAMAAQAAAATAAAAAAAMAAQAAAAUAAAAAAAMAAQAAAAVAAAAAAAMAAQAAAAWAAAAAAAMAAQAAAAXAAAAAAAMAAQAAAASAAEAAAAMAAUAAAASAAIAAAAMAAUAAAASAAMAAAAMAAUAAAASAAQAAAAMAAUAAAATAAEAAAAMAAUAAAATAAIAAAAJAAYAAAATAAMAAAAMAAUAAAATAAQAAAAMAAUAAAAUAAEAAAAMAAUAAAAUAAIAAAAMAAUAAAAUAAMAAAAMAAUAAAAUAAQAAAAMAAUAAAAVAAEAAAAMAAUAAAAVAAIAAAAMAAUAAAAVAAMAAAAMAAUAAAAVAAQAAAAMAAUAAAAWAAEAAAAMAAUAAAAWAAIAAAAMAAUAAAAWAAMAAAAMAAUAAAAWAAQAAAAKAAYAAAAXAAEAAAAMAAUAAAAXAAIAAAAMAAUAAAAXAAMAAAAMAAUAAAAXAAQAAAAMAAUAAAARAAUAAAALAAUAAAARAAYAAAALAAUAAAASAAUAAAAJAAYAAAASAAYAAAAMAAUAAAATAAUAAAAMAAUAAAATAAYAAAAMAAUAAAAUAAUAAAAMAAUAAAAUAAYAAAAMAAUAAAAVAAUAAAAMAAUAAAAVAAYAAAAMAAUAAAAWAAUAAAAMAAUAAAAWAAYAAAAMAAUAAAAXAAUAAAAMAAUAAAAXAAYAAAAMAAUAAAAKAP7/AAALAAQAAAALAP7/AAAMAAQAAAAMAP7/AAAMAAQAAAAKAP//AAALAAYAAAALAP//AAAMAAYAAAAMAP//AAAMAAYAAAAQAP7/AAANAAQAAAAQAP//AAANAAYAAAANAP7/AAAMAAQAAAAOAP7/AAAMAAQAAAAPAP7/AAAMAAQAAAANAP//AAAMAAYAAAAOAP//AAAMAAYAAAAPAP//AAAMAAYAAAADAP//AAAOAAIAAAAEAP//AAAPAAIAAAAFAP//AAAQAAIAAAAGAP//AAAOAAIAAAAHAP//AAAPAAIAAAAIAP//AAAQAAIAAAD//wAAAAAKAAAAAAD//wEAAAAKAAEAAAD//wIAAAAKAAEAAAD//wMAAAAKAAEAAAD//wQAAAAKAAEAAAD//wUAAAAKAAEAAAD//wYAAAAKAAEAAAD//wcAAAAKAAEAAAD//wgAAAAKAAEAAAAAAAAAAAALAAAAAAAAAAEAAAALAAEAAAAAAAIAAAALAAEAAAAAAAMAAAALAAEAAAAAAAQAAAALAAEAAAAAAAUAAAALAAEAAAAAAAYAAAALAAEAAAAAAAcAAAALAAEAAAAAAAgAAAALAAEAAAABAAgAAAALAAEAAAACAAgAAAALAAEAAAADAAgAAAALAAEAAAAEAAgAAAALAAEAAAAFAAgAAAALAAEAAAAGAAgAAAALAAEAAAAHAAgAAAALAAEAAAAIAAgAAAALAAEAAAAJAAgAAAAMAAEAAAAJAAcAAAAMAAEAAAAIAAcAAAALAAEAAAAHAAcAAAALAAEAAAAGAAcAAAAHAAEAAAAFAAcAAAALAAEAAAAEAAcAAAALAAEAAAADAAcAAAALAAEAAAACAAcAAAALAAEAAAABAAcAAAALAAEAAAD///v/AAANAAQAAAD///z/AAANAAUAAAD///3/AAANAAUAAAD///7/AAANAAUAAAD/////AAANAAYAAAD+//v/AAAMAAQAAAD9//v/AAAMAAQAAAD+//z/AAAJAAYAAAD9//z/AAAMAAUAAAD6////AAAMAAUAAAD7////AAAMAAUAAAD8////AAAMAAUAAAD9////AAAMAAUAAAD+////AAAMAAUAAAD+//7/AAAMAAUAAAD+//3/AAAMAAUAAAD9//3/AAAMAAUAAAD9//7/AAAKAAYAAAD+/wAAAAANAAUAAAD+/wEAAAANAAUAAAD+/wIAAAANAAUAAAD+/wMAAAANAAUAAAD+/wQAAAANAAUAAAD+/wUAAAANAAUAAAD+/wYAAAANAAUAAAD9/wAAAAAMAAUAAAD8/wAAAAAMAAUAAAD7/wAAAAAMAAUAAAD6/wAAAAAMAAUAAAD5/wAAAAALAAUAAAD6/wEAAAAMAAUAAAD6/wIAAAAMAAUAAAD6/wMAAAAMAAUAAAD7/wMAAAAMAAUAAAD7/wQAAAAMAAUAAAD8/wEAAAAMAAUAAAD9/wEAAAAMAAUAAAD9/wIAAAAMAAUAAAD9/wMAAAAMAAUAAAD9/wQAAAAMAAUAAAD9/wUAAAAMAAUAAAD9/wYAAAAMAAUAAAD8/wUAAAAMAAUAAAD7/wUAAAAMAAUAAAD8/wYAAAAMAAUAAAD8/wQAAAAKAAYAAAD8/wMAAAAMAAUAAAD8/wIAAAAMAAUAAAD7/wEAAAAMAAUAAAD7/wIAAAAJAAYAAAD7/wYAAAAMAAUAAAD6/wYAAAAMAAUAAAD6/wUAAAAMAAUAAAD6/wQAAAAMAAUAAAD5////AAALAAUAAAD5/wEAAAALAAUAAAD5/wIAAAALAAUAAAD5/wMAAAALAAUAAAD5/wQAAAALAAUAAAD5/wUAAAALAAUAAAD5/wYAAAALAAUAAAD8//r/AAALAAMAAAAOAP3/AAALAAMAAAALAP3/AAALAAMAAAASAP//AAALAAMAAAAUAP//AAALAAMAAAD6//r/AAAQAAUAAAD7//r/AAALAAMAAAANAP3/AAAOAAYAAAAWAP//AAAPAAYAAAD9//r/AAAPAAUAAAAXAP//AAAQAAUAAAD5//v/AAALAAQAAAD5//z/AAALAAUAAAD5//3/AAALAAUAAAD5//7/AAALAAUAAAD6//v/AAAMAAQAAAD6//z/AAAKAAYAAAD6//3/AAAMAAUAAAD6//7/AAAMAAUAAAD7//v/AAAMAAQAAAD7//z/AAAMAAUAAAD7//3/AAAMAAUAAAD7//7/AAAMAAUAAAD8//v/AAAMAAQAAAD8//z/AAAMAAUAAAD8//3/AAAMAAUAAAD8//7/AAAMAAUAAAARAAcAAAALAAUAAAARAAgAAAALAAYAAAAXAAcAAAAMAAUAAAAWAAcAAAAMAAUAAAAVAAcAAAAMAAUAAAAUAAcAAAAMAAUAAAATAAcAAAAMAAUAAAASAAcAAAAMAAUAAAASAAgAAAAMAAYAAAATAAgAAAAMAAYAAAAUAAgAAAAMAAYAAAAVAAgAAAAMAAYAAAAWAAgAAAAMAAYAAAAXAAgAAAAMAAYAAAAKAAUAAAALAAEAAAAKAAYAAAALAAEAAAAKAAcAAAALAAEAAAAKAAgAAAALAAEAAAALAAUAAAALAAEAAAALAAYAAAALAAEAAAALAAcAAAALAAEAAAALAAgAAAALAAEAAAAMAAUAAAALAAEAAAAMAAYAAAALAAEAAAAMAAcAAAALAAEAAAAMAAgAAAALAAEAAAANAAUAAAALAAEAAAANAAYAAAALAAEAAAANAAcAAAALAAEAAAANAAgAAAALAAEAAAAOAAUAAAALAAEAAAAOAAYAAAALAAEAAAAOAAcAAAALAAEAAAAOAAgAAAALAAEAAAAPAAUAAAALAAEAAAAPAAYAAAALAAEAAAAPAAcAAAALAAEAAAAPAAgAAAALAAEAAAAQAAUAAAALAAEAAAAQAAYAAAALAAEAAAAQAAcAAAALAAEAAAAQAAgAAAALAAEAAAAdAAAAAAANAAQAAAAdAAEAAAANAAUAAAAdAAIAAAANAAUAAAAdAAMAAAANAAUAAAAdAAQAAAANAAUAAAAdAAUAAAANAAUAAAAdAAYAAAANAAUAAAAdAAcAAAANAAUAAAAdAAgAAAANAAYAAAAYAAAAAAAMAAQAAAAZAAAAAAAMAAQAAAAaAAAAAAAMAAQAAAAbAAAAAAAMAAQAAAAcAAAAAAAMAAQAAAAYAAEAAAAMAAUAAAAZAAEAAAAMAAUAAAAaAAEAAAAMAAUAAAAbAAEAAAAMAAUAAAAcAAEAAAAMAAUAAAAcAAIAAAAMAAUAAAAcAAMAAAAJAAYAAAAbAAIAAAAMAAUAAAAaAAIAAAAMAAUAAAAZAAIAAAAMAAUAAAAYAAIAAAAMAAUAAAAYAAMAAAAMAAUAAAAYAAQAAAAMAAUAAAAYAAUAAAAMAAUAAAAYAAYAAAAMAAUAAAAYAAcAAAAMAAUAAAAYAAgAAAAMAAYAAAAZAAMAAAAMAAUAAAAZAAQAAAAMAAUAAAAZAAUAAAAMAAUAAAAZAAYAAAAMAAUAAAAZAAcAAAAMAAUAAAAZAAgAAAAMAAYAAAAaAAMAAAAMAAUAAAAaAAQAAAAMAAUAAAAaAAUAAAAMAAUAAAAaAAYAAAAKAAYAAAAaAAcAAAAMAAUAAAAaAAgAAAAMAAYAAAAbAAMAAAAMAAUAAAAbAAQAAAAMAAUAAAAbAAUAAAAMAAUAAAAbAAYAAAAMAAUAAAAbAAcAAAAMAAUAAAAbAAgAAAAMAAYAAAAcAAQAAAAMAAUAAAAcAAUAAAAMAAUAAAAcAAYAAAAMAAUAAAAcAAcAAAAMAAUAAAAcAAgAAAAMAAYAAAAPAP3/AAAQAAYAAAAiAPr/AAAQAAYAAAAfAPr/AAAOAAYAAAAkAPr/AAAPAAYAAAAgAPr/AAAPAAUAAAAbAP//AAALAAMAAAAaAP//AAALAAMAAAAjAPr/AAALAAMAAAAhAPr/AAALAAMAAAATAP//AAALAAMAAAAVAP//AAALAAMAAAAeAPv/AAALAAQAAAAeAPz/AAALAAUAAAAeAP3/AAALAAUAAAAeAP7/AAALAAUAAAAeAP//AAALAAUAAAAmAP//AAANAAUAAAAmAP7/AAANAAUAAAAmAP3/AAANAAUAAAAmAPv/AAANAAQAAAAfAPv/AAAMAAQAAAAgAPv/AAAMAAQAAAAhAPv/AAAMAAQAAAAiAPv/AAAMAAQAAAAjAPv/AAAMAAQAAAAkAPv/AAAMAAQAAAAlAPv/AAAMAAQAAAAmAPz/AAANAAUAAAAlAP//AAAMAAUAAAAlAP7/AAAMAAUAAAAlAP3/AAAMAAUAAAAlAPz/AAAMAAUAAAAkAPz/AAAMAAUAAAAjAPz/AAAMAAUAAAAiAPz/AAAMAAUAAAAhAPz/AAAMAAUAAAAgAPz/AAAMAAUAAAAfAPz/AAAMAAUAAAAfAP3/AAAKAAYAAAAfAP7/AAAMAAUAAAAfAP//AAAMAAUAAAAkAP//AAAKAAYAAAAkAP7/AAAJAAYAAAAkAP3/AAAMAAUAAAAjAP3/AAAMAAUAAAAiAP3/AAAMAAUAAAAhAP3/AAAMAAUAAAAgAP3/AAAMAAUAAAAgAP7/AAAJAAYAAAAgAP//AAAMAAUAAAAjAP//AAAMAAUAAAAjAP7/AAAMAAUAAAAiAP7/AAAMAAUAAAAhAP7/AAAMAAUAAAAhAP//AAAMAAUAAAAiAP//AAAMAAUAAAAeAAgAAAALAAYAAAAeAAcAAAALAAUAAAAeAAYAAAALAAUAAAAeAAUAAAALAAUAAAAeAAQAAAALAAUAAAAeAAMAAAALAAUAAAAeAAIAAAALAAUAAAAeAAEAAAALAAUAAAAeAAAAAAALAAUAAAAfAAgAAAAMAAYAAAAgAAgAAAAMAAYAAAAhAAgAAAAMAAYAAAAiAAgAAAAMAAYAAAAjAAgAAAAMAAYAAAAkAAgAAAAMAAYAAAAlAAgAAAAMAAYAAAAmAAgAAAANAAYAAAAmAAAAAAANAAUAAAAmAAEAAAANAAUAAAAmAAIAAAANAAUAAAAmAAMAAAANAAUAAAAmAAQAAAANAAUAAAAmAAUAAAANAAUAAAAmAAYAAAANAAUAAAAmAAcAAAANAAUAAAAfAAAAAAAMAAUAAAAfAAEAAAAMAAUAAAAfAAIAAAAMAAUAAAAfAAMAAAAMAAUAAAAfAAQAAAAMAAUAAAAfAAUAAAAMAAUAAAAfAAYAAAAKAAYAAAAfAAcAAAAMAAUAAAAgAAAAAAAMAAUAAAAgAAEAAAAMAAUAAAAgAAIAAAAMAAUAAAAgAAMAAAAMAAUAAAAgAAQAAAAMAAUAAAAgAAUAAAAMAAUAAAAgAAYAAAAMAAUAAAAgAAcAAAAMAAUAAAAhAAAAAAAMAAUAAAAhAAEAAAAMAAUAAAAhAAIAAAAKAAYAAAAhAAMAAAAMAAUAAAAhAAQAAAAMAAUAAAAhAAUAAAAMAAUAAAAhAAYAAAAMAAUAAAAhAAcAAAAMAAUAAAAiAAAAAAAMAAUAAAAiAAEAAAAMAAUAAAAiAAIAAAAMAAUAAAAiAAMAAAAMAAUAAAAiAAQAAAAKAAYAAAAiAAUAAAAKAAYAAAAiAAYAAAAMAAUAAAAiAAcAAAAMAAUAAAAjAAAAAAAMAAUAAAAjAAEAAAAMAAUAAAAjAAIAAAAMAAUAAAAjAAMAAAAMAAUAAAAjAAQAAAAMAAUAAAAjAAUAAAAMAAUAAAAjAAYAAAAMAAUAAAAjAAcAAAAMAAUAAAAkAAAAAAAKAAYAAAAkAAEAAAAMAAUAAAAkAAIAAAAMAAUAAAAkAAMAAAAMAAUAAAAkAAQAAAAMAAUAAAAkAAUAAAAMAAUAAAAkAAYAAAAMAAUAAAAkAAcAAAAKAAYAAAAlAAAAAAAMAAUAAAAlAAEAAAAMAAUAAAAlAAIAAAAMAAUAAAAlAAMAAAAMAAUAAAAlAAQAAAAMAAUAAAAlAAUAAAAMAAUAAAAlAAYAAAAMAAUAAAAlAAcAAAAMAAUAAAD6/wcAAAAMAAUAAAD7/wcAAAAMAAUAAAD8/wcAAAAMAAUAAAD9/wcAAAAMAAUAAAD5/wcAAAALAAUAAAD+/wcAAAANAAUAAAD5/wgAAAALAAYAAAD6/wgAAAAMAAYAAAD7/wgAAAAMAAYAAAD8/wgAAAAMAAYAAAD9/wgAAAAMAAYAAAD+/wgAAAANAAYAAAA=") +tile_set = SubResource("TileSet_na7gm") [node name="UI" type="CanvasLayer" parent="."] @@ -631,21 +234,26 @@ unique_name_in_owner = true visible = false [node name="Camera2D" type="Camera2D" parent="."] +physics_interpolation_mode = 1 position = Vector2(227, -28) +process_callback = 0 position_smoothing_speed = 10.0 [node name="PhantomCameraHost" type="Node" parent="Camera2D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("4_j7670") [node name="Player" type="Node" parent="."] [node name="PlayerPhantomCamera2D" type="Node2D" parent="Player" node_paths=PackedStringArray("follow_target")] unique_name_in_owner = true +top_level = true position = Vector2(227, -28) script = ExtResource("5_gvv7r") priority = 5 follow_mode = 2 -follow_target = NodePath("../CharacterBody2D/PlayerVisuals") +follow_target = NodePath("../CharacterBody2D") tween_resource = ExtResource("6_rwobr") tween_on_load = false follow_damping = true diff --git a/addons/phantom_camera/examples/example_scenes/2D/2d_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D/2d_example_scene.tscn index 46d40be..40aa4aa 100644 --- a/addons/phantom_camera/examples/example_scenes/2D/2d_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/2D/2d_example_scene.tscn @@ -12,545 +12,145 @@ [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"] texture = ExtResource("1_1utlo") 0:0/0 = 0 -0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_0/angular_velocity = 0.0 -0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_1/angular_velocity = 0.0 1:0/0 = 0 -1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_0/angular_velocity = 0.0 -1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_1/angular_velocity = 0.0 2:0/0 = 0 -2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_0/angular_velocity = 0.0 -2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_1/angular_velocity = 0.0 3:0/0 = 0 -3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_0/angular_velocity = 0.0 -3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_1/angular_velocity = 0.0 4:0/0 = 0 -4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_0/angular_velocity = 0.0 -4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_1/angular_velocity = 0.0 5:0/0 = 0 -5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_0/angular_velocity = 0.0 -5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_1/angular_velocity = 0.0 6:0/0 = 0 -6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_0/angular_velocity = 0.0 -6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_1/angular_velocity = 0.0 7:0/0 = 0 -7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_0/angular_velocity = 0.0 7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_1/angular_velocity = 0.0 0:1/0 = 0 -0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_0/angular_velocity = 0.0 -0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_1/angular_velocity = 0.0 1:1/0 = 0 -1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_0/angular_velocity = 0.0 -1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_1/angular_velocity = 0.0 2:1/0 = 0 -2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_0/angular_velocity = 0.0 -2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_1/angular_velocity = 0.0 3:1/0 = 0 -3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_0/angular_velocity = 0.0 -3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_1/angular_velocity = 0.0 4:1/0 = 0 -4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_0/angular_velocity = 0.0 -4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_1/angular_velocity = 0.0 5:1/0 = 0 -5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_0/angular_velocity = 0.0 -5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_1/angular_velocity = 0.0 7:1/0 = 0 -7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_0/angular_velocity = 0.0 7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_1/angular_velocity = 0.0 2:2/0 = 0 -2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_0/angular_velocity = 0.0 -2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_1/angular_velocity = 0.0 3:2/0 = 0 -3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_0/angular_velocity = 0.0 -3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_1/angular_velocity = 0.0 4:2/0 = 0 -4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_0/angular_velocity = 0.0 -4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_1/angular_velocity = 0.0 7:2/0 = 0 -7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_0/angular_velocity = 0.0 7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_1/angular_velocity = 0.0 3:3/0 = 0 -3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_0/angular_velocity = 0.0 -3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_1/angular_velocity = 0.0 4:3/0 = 0 -4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_0/angular_velocity = 0.0 -4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_1/angular_velocity = 0.0 5:3/0 = 0 -5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_0/angular_velocity = 0.0 -5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_1/angular_velocity = 0.0 7:3/0 = 0 -7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_0/angular_velocity = 0.0 7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_1/angular_velocity = 0.0 3:4/0 = 0 -3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_0/angular_velocity = 0.0 -3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_1/angular_velocity = 0.0 4:4/0 = 0 -4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_0/angular_velocity = 0.0 -4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_1/angular_velocity = 0.0 5:4/0 = 0 -5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_0/angular_velocity = 0.0 -5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_1/angular_velocity = 0.0 7:4/0 = 0 -7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_0/angular_velocity = 0.0 -7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_1/angular_velocity = 0.0 3:5/0 = 0 -3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_0/angular_velocity = 0.0 -3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_1/angular_velocity = 0.0 4:5/0 = 0 -4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_0/angular_velocity = 0.0 -4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_1/angular_velocity = 0.0 7:5/0 = 0 -7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_0/angular_velocity = 0.0 -7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_1/angular_velocity = 0.0 3:6/0 = 0 -3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_0/angular_velocity = 0.0 -3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_1/angular_velocity = 0.0 4:6/0 = 0 -4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_0/angular_velocity = 0.0 -4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_1/angular_velocity = 0.0 7:6/0 = 0 -7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_0/angular_velocity = 0.0 -7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_1/angular_velocity = 0.0 2:7/0 = 0 -2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_0/angular_velocity = 0.0 -2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_1/angular_velocity = 0.0 3:7/0 = 0 -3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_0/angular_velocity = 0.0 -3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_1/angular_velocity = 0.0 4:7/0 = 0 -4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_0/angular_velocity = 0.0 -4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_1/angular_velocity = 0.0 5:7/0 = 0 -5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_0/angular_velocity = 0.0 -5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_1/angular_velocity = 0.0 8:0/0 = 0 -8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_0/angular_velocity = 0.0 8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_1/angular_velocity = 0.0 9:0/0 = 0 -9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_0/angular_velocity = 0.0 9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_1/angular_velocity = 0.0 10:0/0 = 0 -10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_0/angular_velocity = 0.0 10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_1/angular_velocity = 0.0 11:0/0 = 0 -11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_0/angular_velocity = 0.0 11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_1/angular_velocity = 0.0 12:0/0 = 0 -12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_0/angular_velocity = 0.0 12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_1/angular_velocity = 0.0 13:0/0 = 0 -13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_0/angular_velocity = 0.0 13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0 = 0 -14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_0/angular_velocity = 0.0 -14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) 14:0/0/custom_data_0 = &"Sign" 15:0/0 = 0 -15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_0/angular_velocity = 0.0 -15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_1/angular_velocity = 0.0 16:0/0 = 0 -16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_0/angular_velocity = 0.0 -16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_1/angular_velocity = 0.0 8:1/0 = 0 -8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_0/angular_velocity = 0.0 8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_1/angular_velocity = 0.0 9:1/0 = 0 -9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_0/angular_velocity = 0.0 9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_1/angular_velocity = 0.0 10:1/0 = 0 -10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_0/angular_velocity = 0.0 10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_1/angular_velocity = 0.0 11:1/0 = 0 -11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_0/angular_velocity = 0.0 11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_1/angular_velocity = 0.0 12:1/0 = 0 -12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_0/angular_velocity = 0.0 12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_1/angular_velocity = 0.0 13:1/0 = 0 -13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_0/angular_velocity = 0.0 13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_1/angular_velocity = 0.0 14:1/0 = 0 -14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_0/angular_velocity = 0.0 -14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_1/angular_velocity = 0.0 15:1/0 = 0 -15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_0/angular_velocity = 0.0 -15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_1/angular_velocity = 0.0 16:1/0 = 0 -16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_0/angular_velocity = 0.0 -16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_1/angular_velocity = 0.0 8:2/0 = 0 -8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_0/angular_velocity = 0.0 8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_1/angular_velocity = 0.0 9:2/0 = 0 -9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_0/angular_velocity = 0.0 9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_1/angular_velocity = 0.0 10:2/0 = 0 -10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_0/angular_velocity = 0.0 10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_1/angular_velocity = 0.0 11:2/0 = 0 -11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_0/angular_velocity = 0.0 11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_1/angular_velocity = 0.0 12:2/0 = 0 -12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_0/angular_velocity = 0.0 12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_1/angular_velocity = 0.0 13:2/0 = 0 -13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_0/angular_velocity = 0.0 13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_1/angular_velocity = 0.0 14:2/0 = 0 -14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_0/angular_velocity = 0.0 -14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_1/angular_velocity = 0.0 15:2/0 = 0 -15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_0/angular_velocity = 0.0 -15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_1/angular_velocity = 0.0 16:2/0 = 0 -16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_0/angular_velocity = 0.0 -16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_1/angular_velocity = 0.0 8:3/0 = 0 -8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_0/angular_velocity = 0.0 8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_1/angular_velocity = 0.0 9:3/0 = 0 -9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_0/angular_velocity = 0.0 9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_1/angular_velocity = 0.0 10:3/0 = 0 -10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_0/angular_velocity = 0.0 10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_1/angular_velocity = 0.0 11:3/0 = 0 -11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_0/angular_velocity = 0.0 -11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_1/angular_velocity = 0.0 12:3/0 = 0 -12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_0/angular_velocity = 0.0 12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_1/angular_velocity = 0.0 13:3/0 = 0 -13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_0/angular_velocity = 0.0 13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_1/angular_velocity = 0.0 14:3/0 = 0 -14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_0/angular_velocity = 0.0 -14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_1/angular_velocity = 0.0 15:3/0 = 0 -15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_0/angular_velocity = 0.0 -15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_1/angular_velocity = 0.0 16:3/0 = 0 -16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_0/angular_velocity = 0.0 -16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_1/angular_velocity = 0.0 8:4/0 = 0 -8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_0/angular_velocity = 0.0 -8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_1/angular_velocity = 0.0 9:4/0 = 0 -9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_0/angular_velocity = 0.0 -9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_1/angular_velocity = 0.0 10:4/0 = 0 -10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_0/angular_velocity = 0.0 -10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_1/angular_velocity = 0.0 11:4/0 = 0 -11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_0/angular_velocity = 0.0 11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8) -11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_1/angular_velocity = 0.0 12:4/0 = 0 -12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_0/angular_velocity = 0.0 12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_1/angular_velocity = 0.0 13:4/0 = 0 -13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_0/angular_velocity = 0.0 13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8) -13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0 = 0 -14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_0/angular_velocity = 0.0 -14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 14:4/0/custom_data_0 = &"Inventory" 15:4/0 = 0 -15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_0/angular_velocity = 0.0 -15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_1/angular_velocity = 0.0 16:4/0 = 0 -16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_0/angular_velocity = 0.0 -16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_1/angular_velocity = 0.0 8:5/0 = 0 -8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_0/angular_velocity = 0.0 -8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_1/angular_velocity = 0.0 9:5/0 = 0 -9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_0/angular_velocity = 0.0 -9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_1/angular_velocity = 0.0 10:5/0 = 0 -10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_0/angular_velocity = 0.0 -10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_1/angular_velocity = 0.0 11:5/0 = 0 -11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_0/angular_velocity = 0.0 11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_1/angular_velocity = 0.0 12:5/0 = 0 -12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_0/angular_velocity = 0.0 12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_1/angular_velocity = 0.0 13:5/0 = 0 -13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_0/angular_velocity = 0.0 13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_1/angular_velocity = 0.0 14:5/0 = 0 -14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_0/angular_velocity = 0.0 -14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_1/angular_velocity = 0.0 15:5/0 = 0 -15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_0/angular_velocity = 0.0 -15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_1/angular_velocity = 0.0 16:5/0 = 0 -16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_0/angular_velocity = 0.0 -16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_1/angular_velocity = 0.0 8:6/0 = 0 -8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_0/angular_velocity = 0.0 -8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_1/angular_velocity = 0.0 9:6/0 = 0 -9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_0/angular_velocity = 0.0 -9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_1/angular_velocity = 0.0 10:6/0 = 0 -10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_0/angular_velocity = 0.0 -10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_1/angular_velocity = 0.0 11:6/0 = 0 -11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_0/angular_velocity = 0.0 11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5) -11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_1/angular_velocity = 0.0 12:6/0 = 0 -12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_0/angular_velocity = 0.0 12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_1/angular_velocity = 0.0 13:6/0 = 0 -13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_0/angular_velocity = 0.0 13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8) -13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_1/angular_velocity = 0.0 14:6/0 = 0 -14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_0/angular_velocity = 0.0 -14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_1/angular_velocity = 0.0 15:6/0 = 0 -15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_0/angular_velocity = 0.0 -15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_1/angular_velocity = 0.0 16:6/0 = 0 -16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_0/angular_velocity = 0.0 -16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_1/angular_velocity = 0.0 [sub_resource type="TileSet" id="TileSet_kf7eg"] physics_layer_0/collision_layer = 1 @@ -566,6 +166,7 @@ sources/0 = SubResource("TileSetAtlasSource_easgx") layer = -3 [node name="ColorRect" type="ColorRect" parent="Background"] +auto_translate_mode = 2 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 @@ -575,7 +176,6 @@ offset_right = 981.0 offset_bottom = 548.0 grow_horizontal = 2 grow_vertical = 2 -auto_translate = false localize_numeral_system = false color = Color(0.137255, 0.14902, 0.196078, 1) @@ -588,7 +188,7 @@ layer_0/name = "Background" layer_0/tile_data = PackedInt32Array(-393216, 655360, 2, -327680, 655360, 3, -262144, 655360, 3, -196608, 655360, 3, -131072, 655360, 3, -65536, 655360, 3, -393215, 720896, 2, -327679, 720896, 1, -262143, 720896, 1, -196607, 720896, 1, -131071, 720896, 1, -65535, 720896, 1, -393214, 786432, 2, -327678, 786432, 3, -262142, 786432, 3, -196606, 786432, 3, -131070, 786432, 3, -65534, 786432, 3) layer_1/name = "Terrain" layer_1/z_index = 1 -layer_1/tile_data = PackedInt32Array(1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1, 393225, 786432, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 458752, 1, 327681, 720896, 1, 393217, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 393218, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 393219, 720896, 1, 65540, 458752, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 393220, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 458752, 1, 327685, 720896, 1, 393221, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 393222, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 393223, 458752, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 458752, 1, 262152, 720896, 1, 327688, 720896, 1, 393224, 720896, 1, 65546, 524288, 5, 65547, 524288, 5, 65548, 524288, 5, 65549, 524288, 5, 131082, 524288, 6, 131083, 524288, 6, 131084, 524288, 6, 131085, 524288, 6, 196618, 720896, 1, 262154, 720896, 1, 196619, 720896, 1, 262155, 720896, 1, 196620, 720896, 1, 262156, 720896, 1, 196621, 720896, 1, 262157, 720896, 1, 65550, 524288, 5, 65551, 524288, 5, 65552, 524288, 5, 131086, 524288, 6, 131087, 524288, 6, 131088, 524288, 6, 196622, 720896, 1, 196623, 720896, 1, 262159, 720896, 1, 262160, 720896, 1, 196624, 720896, 1, 262158, 720896, 1, 17, 720896, 4, 65553, 720896, 5, 131089, 720896, 5, 196625, 720896, 5, 262161, 720896, 5, 18, 786432, 4, 19, 786432, 4, 20, 786432, 4, 21, 786432, 4, 22, 786432, 4, 23, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 65555, 786432, 5, 131091, 589824, 6, 196627, 786432, 5, 262163, 786432, 5, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 655360, 6, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327697, 720896, 5, 393233, 720896, 5, 327698, 589824, 6, 393234, 786432, 5, 327699, 786432, 5, 393235, 786432, 5, 327700, 786432, 5, 393236, 786432, 5, 327701, 786432, 5, 393237, 786432, 5, 327702, 786432, 5, 393238, 786432, 5, 327703, 786432, 5, 393239, 786432, 5, -131062, 720896, 4, -131061, 786432, 4, -131060, 786432, 4, -65526, 720896, 6, -65525, 786432, 6, -65524, 786432, 6, -131056, 851968, 4, -65520, 851968, 6, -131059, 786432, 4, -131058, 786432, 4, -131057, 786432, 4, -65523, 786432, 6, -65522, 786432, 6, -65521, 786432, 6, -196596, 917504, 0, -65536, 917504, 2, -65535, 983040, 2, -65534, 1048576, 2, -65533, 917504, 2, -65532, 983040, 2, -65531, 1048576, 2, -65530, 917504, 2, -65529, 983040, 2, -65528, 1048576, 2, 65535, 655360, 0, 131071, 655360, 1, 196607, 655360, 1, 262143, 655360, 1, 327679, 655360, 1, 393215, 655360, 1, 458751, 655360, 1, 524287, 655360, 1, 589823, 655360, 1, 0, 720896, 0, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 393216, 720896, 1, 458752, 720896, 1, 524288, 720896, 1, 524289, 720896, 1, 524290, 720896, 1, 524291, 720896, 1, 524292, 720896, 1, 524293, 720896, 1, 524294, 720896, 1, 524295, 720896, 1, 524296, 720896, 1, 524297, 786432, 1, 458761, 786432, 1, 458760, 720896, 1, 458759, 720896, 1, 458758, 458752, 1, 458757, 720896, 1, 458756, 720896, 1, 458755, 720896, 1, 458754, 720896, 1, 458753, 720896, 1, -262145, 851968, 4, -196609, 851968, 5, -131073, 851968, 5, -65537, 851968, 5, -1, 851968, 6, -262146, 786432, 4, -262147, 786432, 4, -196610, 589824, 6, -196611, 786432, 5, -6, 786432, 5, -5, 786432, 5, -4, 786432, 5, -3, 786432, 5, -2, 786432, 5, -65538, 786432, 5, -131074, 786432, 5, -131075, 786432, 5, -65539, 655360, 6, 65534, 851968, 5, 131070, 851968, 5, 196606, 851968, 5, 262142, 851968, 5, 327678, 851968, 5, 393214, 851968, 5, 458750, 851968, 5, 65533, 786432, 5, 65532, 786432, 5, 65531, 786432, 5, 65530, 786432, 5, 65529, 720896, 5, 131066, 786432, 5, 196602, 786432, 5, 262138, 786432, 5, 262139, 786432, 5, 327675, 786432, 5, 131068, 786432, 5, 131069, 786432, 5, 196605, 786432, 5, 262141, 786432, 5, 327677, 786432, 5, 393213, 786432, 5, 458749, 786432, 5, 393212, 786432, 5, 393211, 786432, 5, 458748, 786432, 5, 327676, 655360, 6, 262140, 786432, 5, 196604, 786432, 5, 131067, 786432, 5, 196603, 589824, 6, 458747, 786432, 5, 458746, 786432, 5, 393210, 786432, 5, 327674, 786432, 5, -7, 720896, 5, 131065, 720896, 5, 196601, 720896, 5, 262137, 720896, 5, 327673, 720896, 5, 393209, 720896, 5, 458745, 720896, 5, -327684, 720896, 3, -196594, 720896, 3, -196597, 720896, 3, -65518, 720896, 3, -65516, 720896, 3, -327686, 1048576, 5, -327685, 720896, 3, -196595, 917504, 6, -65514, 983040, 6, -327683, 983040, 5, -65513, 1048576, 5, -262151, 720896, 4, -196615, 720896, 5, -131079, 720896, 5, -65543, 720896, 5, -262150, 786432, 4, -196614, 655360, 6, -131078, 786432, 5, -65542, 786432, 5, -262149, 786432, 4, -196613, 786432, 5, -131077, 786432, 5, -65541, 786432, 5, -262148, 786432, 4, -196612, 786432, 5, -131076, 786432, 5, -65540, 786432, 5, 458769, 720896, 5, 524305, 720896, 6, 458775, 786432, 5, 458774, 786432, 5, 458773, 786432, 5, 458772, 786432, 5, 458771, 786432, 5, 458770, 786432, 5, 524306, 786432, 6, 524307, 786432, 6, 524308, 786432, 6, 524309, 786432, 6, 524310, 786432, 6, 524311, 786432, 6, 327690, 720896, 1, 393226, 720896, 1, 458762, 720896, 1, 524298, 720896, 1, 327691, 720896, 1, 393227, 720896, 1, 458763, 720896, 1, 524299, 720896, 1, 327692, 720896, 1, 393228, 720896, 1, 458764, 720896, 1, 524300, 720896, 1, 327693, 720896, 1, 393229, 720896, 1, 458765, 720896, 1, 524301, 720896, 1, 327694, 720896, 1, 393230, 720896, 1, 458766, 720896, 1, 524302, 720896, 1, 327695, 720896, 1, 393231, 720896, 1, 458767, 720896, 1, 524303, 720896, 1, 327696, 720896, 1, 393232, 720896, 1, 458768, 720896, 1, 524304, 720896, 1, 29, 851968, 4, 65565, 851968, 5, 131101, 851968, 5, 196637, 851968, 5, 262173, 851968, 5, 327709, 851968, 5, 393245, 851968, 5, 458781, 851968, 5, 524317, 851968, 6, -65511, 917504, 4, 24, 786432, 4, 25, 786432, 4, 26, 786432, 4, 27, 786432, 4, 28, 786432, 4, 65560, 786432, 5, 65561, 786432, 5, 65562, 786432, 5, 65563, 786432, 5, 65564, 786432, 5, 131100, 786432, 5, 196636, 589824, 6, 131099, 786432, 5, 131098, 786432, 5, 131097, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 393240, 786432, 5, 458776, 786432, 5, 524312, 786432, 6, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 393241, 786432, 5, 458777, 786432, 5, 524313, 786432, 6, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 393242, 655360, 6, 458778, 786432, 5, 524314, 786432, 6, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, 393243, 786432, 5, 458779, 786432, 5, 524315, 786432, 6, 262172, 786432, 5, 327708, 786432, 5, 393244, 786432, 5, 458780, 786432, 5, 524316, 786432, 6, -196593, 1048576, 6, -393182, 1048576, 6, -393185, 917504, 6, -393180, 983040, 6, -393184, 983040, 5, -65509, 720896, 3, -65510, 720896, 3, -393181, 720896, 3, -393183, 720896, 3, -65517, 720896, 3, -65515, 720896, 3, -327650, 720896, 4, -262114, 720896, 5, -196578, 720896, 5, -131042, 720896, 5, -65506, 720896, 5, -65498, 851968, 5, -131034, 851968, 5, -196570, 851968, 5, -327642, 851968, 4, -327649, 786432, 4, -327648, 786432, 4, -327647, 786432, 4, -327646, 786432, 4, -327645, 786432, 4, -327644, 786432, 4, -327643, 786432, 4, -262106, 851968, 5, -65499, 786432, 5, -131035, 786432, 5, -196571, 786432, 5, -262107, 786432, 5, -262108, 786432, 5, -262109, 786432, 5, -262110, 786432, 5, -262111, 786432, 5, -262112, 786432, 5, -262113, 786432, 5, -196577, 655360, 6, -131041, 786432, 5, -65505, 786432, 5, -65500, 655360, 6, -131036, 589824, 6, -196572, 786432, 5, -196573, 786432, 5, -196574, 786432, 5, -196575, 786432, 5, -196576, 786432, 5, -131040, 589824, 6, -65504, 786432, 5, -65501, 786432, 5, -131037, 786432, 5, -131038, 786432, 5, -131039, 786432, 5, -65503, 786432, 5, -65502, 786432, 5, 524318, 720896, 6, 458782, 720896, 5, 393246, 720896, 5, 327710, 720896, 5, 262174, 720896, 5, 196638, 720896, 5, 131102, 720896, 5, 65566, 720896, 5, 30, 720896, 5, 524319, 786432, 6, 524320, 786432, 6, 524321, 786432, 6, 524322, 786432, 6, 524323, 786432, 6, 524324, 786432, 6, 524325, 786432, 6, 524326, 851968, 6, 38, 851968, 5, 65574, 851968, 5, 131110, 851968, 5, 196646, 851968, 5, 262182, 851968, 5, 327718, 851968, 5, 393254, 851968, 5, 458790, 851968, 5, 31, 786432, 5, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 393247, 655360, 6, 458783, 786432, 5, 32, 786432, 5, 65568, 786432, 5, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 393248, 786432, 5, 458784, 786432, 5, 33, 786432, 5, 65569, 786432, 5, 131105, 655360, 6, 196641, 786432, 5, 262177, 786432, 5, 327713, 786432, 5, 393249, 786432, 5, 458785, 786432, 5, 34, 786432, 5, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 655360, 6, 327714, 655360, 6, 393250, 786432, 5, 458786, 786432, 5, 35, 786432, 5, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 393251, 786432, 5, 458787, 786432, 5, 36, 655360, 6, 65572, 786432, 5, 131108, 786432, 5, 196644, 786432, 5, 262180, 786432, 5, 327716, 786432, 5, 393252, 786432, 5, 458788, 655360, 6, 37, 786432, 5, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 786432, 5, 327717, 786432, 5, 393253, 786432, 5, 458789, 786432, 5, 524282, 786432, 5, 524283, 786432, 5, 524284, 786432, 5, 524285, 786432, 5, 524281, 720896, 5, 524286, 851968, 5, 589817, 720896, 6, 589818, 786432, 6, 589819, 786432, 6, 589820, 786432, 6, 589821, 786432, 6, 589822, 851968, 6) +layer_1/tile_data = PackedInt32Array(1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1, 393225, 786432, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 458752, 1, 327681, 720896, 1, 393217, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 393218, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 393219, 720896, 1, 65540, 458752, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 393220, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 458752, 1, 327685, 720896, 1, 393221, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 393222, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 393223, 458752, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 458752, 1, 262152, 720896, 1, 327688, 720896, 1, 393224, 720896, 1, 65546, 524288, 5, 65547, 524288, 5, 65548, 524288, 5, 65549, 524288, 5, 131082, 524288, 6, 131083, 524288, 6, 131084, 524288, 6, 131085, 524288, 6, 196618, 720896, 1, 262154, 720896, 1, 196619, 720896, 1, 262155, 720896, 1, 196620, 720896, 1, 262156, 720896, 1, 196621, 720896, 1, 262157, 720896, 1, 65550, 524288, 5, 65551, 524288, 5, 65552, 524288, 5, 131086, 524288, 6, 131087, 524288, 6, 131088, 524288, 6, 196622, 720896, 1, 196623, 720896, 1, 262159, 720896, 1, 262160, 720896, 1, 196624, 720896, 1, 262158, 720896, 1, 17, 720896, 4, 65553, 720896, 5, 131089, 720896, 5, 196625, 720896, 5, 262161, 720896, 5, 18, 786432, 4, 19, 786432, 4, 20, 786432, 4, 21, 786432, 4, 22, 786432, 4, 23, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 65555, 786432, 5, 131091, 589824, 6, 196627, 786432, 5, 262163, 786432, 5, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 655360, 6, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327697, 720896, 5, 393233, 720896, 5, 327698, 589824, 6, 393234, 786432, 5, 327699, 786432, 5, 393235, 786432, 5, 327700, 786432, 5, 393236, 786432, 5, 327701, 786432, 5, 393237, 786432, 5, 327702, 786432, 5, 393238, 786432, 5, 327703, 786432, 5, 393239, 786432, 5, -131062, 720896, 4, -131061, 786432, 4, -131060, 786432, 4, -65526, 720896, 6, -65525, 786432, 6, -65524, 786432, 6, -131056, 851968, 4, -65520, 851968, 6, -131059, 786432, 4, -131058, 786432, 4, -131057, 786432, 4, -65523, 786432, 6, -65522, 786432, 6, -65521, 786432, 6, -65536, 917504, 2, -65535, 983040, 2, -65534, 1048576, 2, -65533, 917504, 2, -65532, 983040, 2, -65531, 1048576, 2, -65530, 917504, 2, -65529, 983040, 2, -65528, 1048576, 2, 65535, 655360, 0, 131071, 655360, 1, 196607, 655360, 1, 262143, 655360, 1, 327679, 655360, 1, 393215, 655360, 1, 458751, 655360, 1, 524287, 655360, 1, 589823, 655360, 1, 0, 720896, 0, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 393216, 720896, 1, 458752, 720896, 1, 524288, 720896, 1, 524289, 720896, 1, 524290, 720896, 1, 524291, 720896, 1, 524292, 720896, 1, 524293, 720896, 1, 524294, 720896, 1, 524295, 720896, 1, 524296, 720896, 1, 524297, 786432, 1, 458761, 786432, 1, 458760, 720896, 1, 458759, 720896, 1, 458758, 458752, 1, 458757, 720896, 1, 458756, 720896, 1, 458755, 720896, 1, 458754, 720896, 1, 458753, 720896, 1, -262145, 851968, 4, -196609, 851968, 5, -131073, 851968, 5, -65537, 851968, 5, -1, 851968, 6, -262146, 786432, 4, -262147, 786432, 4, -196610, 589824, 6, -196611, 786432, 5, -6, 786432, 5, -5, 786432, 5, -4, 786432, 5, -3, 786432, 5, -2, 786432, 5, -65538, 786432, 5, -131074, 786432, 5, -131075, 786432, 5, -65539, 655360, 6, 65534, 851968, 5, 131070, 851968, 5, 196606, 851968, 5, 262142, 851968, 5, 327678, 851968, 5, 393214, 851968, 5, 458750, 851968, 5, 65533, 786432, 5, 65532, 786432, 5, 65531, 786432, 5, 65530, 786432, 5, 65529, 720896, 5, 131066, 786432, 5, 196602, 786432, 5, 262138, 786432, 5, 262139, 786432, 5, 327675, 786432, 5, 131068, 786432, 5, 131069, 786432, 5, 196605, 786432, 5, 262141, 786432, 5, 327677, 786432, 5, 393213, 786432, 5, 458749, 786432, 5, 393212, 786432, 5, 393211, 786432, 5, 458748, 786432, 5, 327676, 655360, 6, 262140, 786432, 5, 196604, 786432, 5, 131067, 786432, 5, 196603, 589824, 6, 458747, 786432, 5, 458746, 786432, 5, 393210, 786432, 5, 327674, 786432, 5, -7, 720896, 5, 131065, 720896, 5, 196601, 720896, 5, 262137, 720896, 5, 327673, 720896, 5, 393209, 720896, 5, 458745, 720896, 5, -327684, 720896, 3, -196594, 720896, 3, -196597, 720896, 3, -65518, 720896, 3, -65516, 720896, 3, -327686, 1048576, 5, -327685, 720896, 3, -196595, 917504, 6, -65514, 983040, 6, -327683, 983040, 5, -65513, 1048576, 5, -262151, 720896, 4, -196615, 720896, 5, -131079, 720896, 5, -65543, 720896, 5, -262150, 786432, 4, -196614, 655360, 6, -131078, 786432, 5, -65542, 786432, 5, -262149, 786432, 4, -196613, 786432, 5, -131077, 786432, 5, -65541, 786432, 5, -262148, 786432, 4, -196612, 786432, 5, -131076, 786432, 5, -65540, 786432, 5, 458769, 720896, 5, 524305, 720896, 6, 458775, 786432, 5, 458774, 786432, 5, 458773, 786432, 5, 458772, 786432, 5, 458771, 786432, 5, 458770, 786432, 5, 524306, 786432, 6, 524307, 786432, 6, 524308, 786432, 6, 524309, 786432, 6, 524310, 786432, 6, 524311, 786432, 6, 327690, 720896, 1, 393226, 720896, 1, 458762, 720896, 1, 524298, 720896, 1, 327691, 720896, 1, 393227, 720896, 1, 458763, 720896, 1, 524299, 720896, 1, 327692, 720896, 1, 393228, 720896, 1, 458764, 720896, 1, 524300, 720896, 1, 327693, 720896, 1, 393229, 720896, 1, 458765, 720896, 1, 524301, 720896, 1, 327694, 720896, 1, 393230, 720896, 1, 458766, 720896, 1, 524302, 720896, 1, 327695, 720896, 1, 393231, 720896, 1, 458767, 720896, 1, 524303, 720896, 1, 327696, 720896, 1, 393232, 720896, 1, 458768, 720896, 1, 524304, 720896, 1, 29, 851968, 4, 65565, 851968, 5, 131101, 851968, 5, 196637, 851968, 5, 262173, 851968, 5, 327709, 851968, 5, 393245, 851968, 5, 458781, 851968, 5, 524317, 851968, 6, -65511, 917504, 4, 24, 786432, 4, 25, 786432, 4, 26, 786432, 4, 27, 786432, 4, 28, 786432, 4, 65560, 786432, 5, 65561, 786432, 5, 65562, 786432, 5, 65563, 786432, 5, 65564, 786432, 5, 131100, 786432, 5, 196636, 589824, 6, 131099, 786432, 5, 131098, 786432, 5, 131097, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 393240, 786432, 5, 458776, 786432, 5, 524312, 786432, 6, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 393241, 786432, 5, 458777, 786432, 5, 524313, 786432, 6, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 393242, 655360, 6, 458778, 786432, 5, 524314, 786432, 6, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, 393243, 786432, 5, 458779, 786432, 5, 524315, 786432, 6, 262172, 786432, 5, 327708, 786432, 5, 393244, 786432, 5, 458780, 786432, 5, 524316, 786432, 6, -196593, 1048576, 6, -393182, 1048576, 6, -393185, 917504, 6, -393180, 983040, 6, -393184, 983040, 5, -65509, 720896, 3, -65510, 720896, 3, -393181, 720896, 3, -393183, 720896, 3, -65517, 720896, 3, -65515, 720896, 3, -327650, 720896, 4, -262114, 720896, 5, -196578, 720896, 5, -131042, 720896, 5, -65506, 720896, 5, -65498, 851968, 5, -131034, 851968, 5, -196570, 851968, 5, -327642, 851968, 4, -327649, 786432, 4, -327648, 786432, 4, -327647, 786432, 4, -327646, 786432, 4, -327645, 786432, 4, -327644, 786432, 4, -327643, 786432, 4, -262106, 851968, 5, -65499, 786432, 5, -131035, 786432, 5, -196571, 786432, 5, -262107, 786432, 5, -262108, 786432, 5, -262109, 786432, 5, -262110, 786432, 5, -262111, 786432, 5, -262112, 786432, 5, -262113, 786432, 5, -196577, 655360, 6, -131041, 786432, 5, -65505, 786432, 5, -65500, 655360, 6, -131036, 589824, 6, -196572, 786432, 5, -196573, 786432, 5, -196574, 786432, 5, -196575, 786432, 5, -196576, 786432, 5, -131040, 589824, 6, -65504, 786432, 5, -65501, 786432, 5, -131037, 786432, 5, -131038, 786432, 5, -131039, 786432, 5, -65503, 786432, 5, -65502, 786432, 5, 524318, 720896, 6, 458782, 720896, 5, 393246, 720896, 5, 327710, 720896, 5, 262174, 720896, 5, 196638, 720896, 5, 131102, 720896, 5, 65566, 720896, 5, 30, 720896, 5, 524319, 786432, 6, 524320, 786432, 6, 524321, 786432, 6, 524322, 786432, 6, 524323, 786432, 6, 524324, 786432, 6, 524325, 786432, 6, 524326, 851968, 6, 38, 851968, 5, 65574, 851968, 5, 131110, 851968, 5, 196646, 851968, 5, 262182, 851968, 5, 327718, 851968, 5, 393254, 851968, 5, 458790, 851968, 5, 31, 786432, 5, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 393247, 655360, 6, 458783, 786432, 5, 32, 786432, 5, 65568, 786432, 5, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 393248, 786432, 5, 458784, 786432, 5, 33, 786432, 5, 65569, 786432, 5, 131105, 655360, 6, 196641, 786432, 5, 262177, 786432, 5, 327713, 786432, 5, 393249, 786432, 5, 458785, 786432, 5, 34, 786432, 5, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 655360, 6, 327714, 655360, 6, 393250, 786432, 5, 458786, 786432, 5, 35, 786432, 5, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 393251, 786432, 5, 458787, 786432, 5, 36, 655360, 6, 65572, 786432, 5, 131108, 786432, 5, 196644, 786432, 5, 262180, 786432, 5, 327716, 786432, 5, 393252, 786432, 5, 458788, 655360, 6, 37, 786432, 5, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 786432, 5, 327717, 786432, 5, 393253, 786432, 5, 458789, 786432, 5, 524282, 786432, 5, 524283, 786432, 5, 524284, 786432, 5, 524285, 786432, 5, 524281, 720896, 5, 524286, 851968, 5, 589817, 720896, 6, 589818, 786432, 6, 589819, 786432, 6, 589820, 786432, 6, 589821, 786432, 6, 589822, 851968, 6, -196596, 917504, 0) [node name="UI" type="CanvasLayer" parent="."] @@ -613,9 +213,12 @@ text = "[WASD] to move [node name="Camera2D" type="Camera2D" parent="."] position = Vector2(227, -28) zoom = Vector2(1.5, 1.5) +process_callback = 0 editor_draw_limits = true [node name="PhantomCameraHost" type="Node" parent="Camera2D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("4_54fc4") [node name="Player" type="Node" parent="."] @@ -623,6 +226,7 @@ script = ExtResource("4_54fc4") [node name="PlayerPhantomCamera2D" type="Node2D" parent="Player" node_paths=PackedStringArray("follow_target")] unique_name_in_owner = true process_priority = -1 +top_level = true position = Vector2(227, -28) script = ExtResource("2_mgsut") priority = 10 diff --git a/addons/phantom_camera/examples/example_scenes/2D/2d_follow_framed_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D/2d_follow_framed_example_scene.tscn index 69d1d70..74cac59 100644 --- a/addons/phantom_camera/examples/example_scenes/2D/2d_follow_framed_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/2D/2d_follow_framed_example_scene.tscn @@ -12,545 +12,145 @@ [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"] texture = ExtResource("1_27o77") 0:0/0 = 0 -0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_0/angular_velocity = 0.0 -0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_1/angular_velocity = 0.0 1:0/0 = 0 -1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_0/angular_velocity = 0.0 -1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_1/angular_velocity = 0.0 2:0/0 = 0 -2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_0/angular_velocity = 0.0 -2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_1/angular_velocity = 0.0 3:0/0 = 0 -3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_0/angular_velocity = 0.0 -3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_1/angular_velocity = 0.0 4:0/0 = 0 -4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_0/angular_velocity = 0.0 -4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_1/angular_velocity = 0.0 5:0/0 = 0 -5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_0/angular_velocity = 0.0 -5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_1/angular_velocity = 0.0 6:0/0 = 0 -6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_0/angular_velocity = 0.0 -6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_1/angular_velocity = 0.0 7:0/0 = 0 -7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_0/angular_velocity = 0.0 7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_1/angular_velocity = 0.0 0:1/0 = 0 -0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_0/angular_velocity = 0.0 -0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_1/angular_velocity = 0.0 1:1/0 = 0 -1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_0/angular_velocity = 0.0 -1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_1/angular_velocity = 0.0 2:1/0 = 0 -2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_0/angular_velocity = 0.0 -2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_1/angular_velocity = 0.0 3:1/0 = 0 -3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_0/angular_velocity = 0.0 -3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_1/angular_velocity = 0.0 4:1/0 = 0 -4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_0/angular_velocity = 0.0 -4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_1/angular_velocity = 0.0 5:1/0 = 0 -5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_0/angular_velocity = 0.0 -5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_1/angular_velocity = 0.0 7:1/0 = 0 -7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_0/angular_velocity = 0.0 7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_1/angular_velocity = 0.0 2:2/0 = 0 -2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_0/angular_velocity = 0.0 -2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_1/angular_velocity = 0.0 3:2/0 = 0 -3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_0/angular_velocity = 0.0 -3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_1/angular_velocity = 0.0 4:2/0 = 0 -4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_0/angular_velocity = 0.0 -4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_1/angular_velocity = 0.0 7:2/0 = 0 -7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_0/angular_velocity = 0.0 7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_1/angular_velocity = 0.0 3:3/0 = 0 -3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_0/angular_velocity = 0.0 -3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_1/angular_velocity = 0.0 4:3/0 = 0 -4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_0/angular_velocity = 0.0 -4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_1/angular_velocity = 0.0 5:3/0 = 0 -5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_0/angular_velocity = 0.0 -5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_1/angular_velocity = 0.0 7:3/0 = 0 -7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_0/angular_velocity = 0.0 7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_1/angular_velocity = 0.0 3:4/0 = 0 -3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_0/angular_velocity = 0.0 -3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_1/angular_velocity = 0.0 4:4/0 = 0 -4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_0/angular_velocity = 0.0 -4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_1/angular_velocity = 0.0 5:4/0 = 0 -5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_0/angular_velocity = 0.0 -5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_1/angular_velocity = 0.0 7:4/0 = 0 -7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_0/angular_velocity = 0.0 -7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_1/angular_velocity = 0.0 3:5/0 = 0 -3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_0/angular_velocity = 0.0 -3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_1/angular_velocity = 0.0 4:5/0 = 0 -4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_0/angular_velocity = 0.0 -4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_1/angular_velocity = 0.0 7:5/0 = 0 -7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_0/angular_velocity = 0.0 -7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_1/angular_velocity = 0.0 3:6/0 = 0 -3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_0/angular_velocity = 0.0 -3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_1/angular_velocity = 0.0 4:6/0 = 0 -4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_0/angular_velocity = 0.0 -4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_1/angular_velocity = 0.0 7:6/0 = 0 -7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_0/angular_velocity = 0.0 -7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_1/angular_velocity = 0.0 2:7/0 = 0 -2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_0/angular_velocity = 0.0 -2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_1/angular_velocity = 0.0 3:7/0 = 0 -3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_0/angular_velocity = 0.0 -3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_1/angular_velocity = 0.0 4:7/0 = 0 -4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_0/angular_velocity = 0.0 -4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_1/angular_velocity = 0.0 5:7/0 = 0 -5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_0/angular_velocity = 0.0 -5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_1/angular_velocity = 0.0 8:0/0 = 0 -8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_0/angular_velocity = 0.0 8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_1/angular_velocity = 0.0 9:0/0 = 0 -9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_0/angular_velocity = 0.0 9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_1/angular_velocity = 0.0 10:0/0 = 0 -10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_0/angular_velocity = 0.0 10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_1/angular_velocity = 0.0 11:0/0 = 0 -11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_0/angular_velocity = 0.0 11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_1/angular_velocity = 0.0 12:0/0 = 0 -12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_0/angular_velocity = 0.0 12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_1/angular_velocity = 0.0 13:0/0 = 0 -13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_0/angular_velocity = 0.0 13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0 = 0 -14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_0/angular_velocity = 0.0 -14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) 14:0/0/custom_data_0 = &"Sign" 15:0/0 = 0 -15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_0/angular_velocity = 0.0 -15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_1/angular_velocity = 0.0 16:0/0 = 0 -16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_0/angular_velocity = 0.0 -16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_1/angular_velocity = 0.0 8:1/0 = 0 -8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_0/angular_velocity = 0.0 8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_1/angular_velocity = 0.0 9:1/0 = 0 -9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_0/angular_velocity = 0.0 9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_1/angular_velocity = 0.0 10:1/0 = 0 -10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_0/angular_velocity = 0.0 10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_1/angular_velocity = 0.0 11:1/0 = 0 -11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_0/angular_velocity = 0.0 11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_1/angular_velocity = 0.0 12:1/0 = 0 -12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_0/angular_velocity = 0.0 12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_1/angular_velocity = 0.0 13:1/0 = 0 -13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_0/angular_velocity = 0.0 13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_1/angular_velocity = 0.0 14:1/0 = 0 -14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_0/angular_velocity = 0.0 -14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_1/angular_velocity = 0.0 15:1/0 = 0 -15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_0/angular_velocity = 0.0 -15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_1/angular_velocity = 0.0 16:1/0 = 0 -16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_0/angular_velocity = 0.0 -16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_1/angular_velocity = 0.0 8:2/0 = 0 -8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_0/angular_velocity = 0.0 8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_1/angular_velocity = 0.0 9:2/0 = 0 -9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_0/angular_velocity = 0.0 9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_1/angular_velocity = 0.0 10:2/0 = 0 -10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_0/angular_velocity = 0.0 10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_1/angular_velocity = 0.0 11:2/0 = 0 -11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_0/angular_velocity = 0.0 11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_1/angular_velocity = 0.0 12:2/0 = 0 -12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_0/angular_velocity = 0.0 12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_1/angular_velocity = 0.0 13:2/0 = 0 -13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_0/angular_velocity = 0.0 13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_1/angular_velocity = 0.0 14:2/0 = 0 -14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_0/angular_velocity = 0.0 -14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_1/angular_velocity = 0.0 15:2/0 = 0 -15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_0/angular_velocity = 0.0 -15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_1/angular_velocity = 0.0 16:2/0 = 0 -16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_0/angular_velocity = 0.0 -16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_1/angular_velocity = 0.0 8:3/0 = 0 -8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_0/angular_velocity = 0.0 8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_1/angular_velocity = 0.0 9:3/0 = 0 -9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_0/angular_velocity = 0.0 9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_1/angular_velocity = 0.0 10:3/0 = 0 -10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_0/angular_velocity = 0.0 10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_1/angular_velocity = 0.0 11:3/0 = 0 -11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_0/angular_velocity = 0.0 -11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_1/angular_velocity = 0.0 12:3/0 = 0 -12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_0/angular_velocity = 0.0 12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_1/angular_velocity = 0.0 13:3/0 = 0 -13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_0/angular_velocity = 0.0 13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_1/angular_velocity = 0.0 14:3/0 = 0 -14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_0/angular_velocity = 0.0 -14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_1/angular_velocity = 0.0 15:3/0 = 0 -15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_0/angular_velocity = 0.0 -15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_1/angular_velocity = 0.0 16:3/0 = 0 -16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_0/angular_velocity = 0.0 -16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_1/angular_velocity = 0.0 8:4/0 = 0 -8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_0/angular_velocity = 0.0 -8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_1/angular_velocity = 0.0 9:4/0 = 0 -9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_0/angular_velocity = 0.0 -9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_1/angular_velocity = 0.0 10:4/0 = 0 -10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_0/angular_velocity = 0.0 -10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_1/angular_velocity = 0.0 11:4/0 = 0 -11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_0/angular_velocity = 0.0 11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8) -11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_1/angular_velocity = 0.0 12:4/0 = 0 -12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_0/angular_velocity = 0.0 12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_1/angular_velocity = 0.0 13:4/0 = 0 -13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_0/angular_velocity = 0.0 13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8) -13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0 = 0 -14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_0/angular_velocity = 0.0 -14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 14:4/0/custom_data_0 = &"Inventory" 15:4/0 = 0 -15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_0/angular_velocity = 0.0 -15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_1/angular_velocity = 0.0 16:4/0 = 0 -16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_0/angular_velocity = 0.0 -16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_1/angular_velocity = 0.0 8:5/0 = 0 -8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_0/angular_velocity = 0.0 -8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_1/angular_velocity = 0.0 9:5/0 = 0 -9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_0/angular_velocity = 0.0 -9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_1/angular_velocity = 0.0 10:5/0 = 0 -10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_0/angular_velocity = 0.0 -10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_1/angular_velocity = 0.0 11:5/0 = 0 -11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_0/angular_velocity = 0.0 11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_1/angular_velocity = 0.0 12:5/0 = 0 -12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_0/angular_velocity = 0.0 12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_1/angular_velocity = 0.0 13:5/0 = 0 -13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_0/angular_velocity = 0.0 13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_1/angular_velocity = 0.0 14:5/0 = 0 -14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_0/angular_velocity = 0.0 -14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_1/angular_velocity = 0.0 15:5/0 = 0 -15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_0/angular_velocity = 0.0 -15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_1/angular_velocity = 0.0 16:5/0 = 0 -16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_0/angular_velocity = 0.0 -16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_1/angular_velocity = 0.0 8:6/0 = 0 -8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_0/angular_velocity = 0.0 -8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_1/angular_velocity = 0.0 9:6/0 = 0 -9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_0/angular_velocity = 0.0 -9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_1/angular_velocity = 0.0 10:6/0 = 0 -10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_0/angular_velocity = 0.0 -10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_1/angular_velocity = 0.0 11:6/0 = 0 -11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_0/angular_velocity = 0.0 11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5) -11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_1/angular_velocity = 0.0 12:6/0 = 0 -12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_0/angular_velocity = 0.0 12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_1/angular_velocity = 0.0 13:6/0 = 0 -13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_0/angular_velocity = 0.0 13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8) -13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_1/angular_velocity = 0.0 14:6/0 = 0 -14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_0/angular_velocity = 0.0 -14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_1/angular_velocity = 0.0 15:6/0 = 0 -15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_0/angular_velocity = 0.0 -15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_1/angular_velocity = 0.0 16:6/0 = 0 -16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_0/angular_velocity = 0.0 -16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_1/angular_velocity = 0.0 [sub_resource type="TileSet" id="TileSet_kf7eg"] physics_layer_0/collision_layer = 1 @@ -566,6 +166,7 @@ sources/0 = SubResource("TileSetAtlasSource_easgx") layer = -3 [node name="ColorRect" type="ColorRect" parent="Background"] +auto_translate_mode = 2 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 @@ -575,7 +176,6 @@ offset_right = 947.0 offset_bottom = 578.0 grow_horizontal = 2 grow_vertical = 2 -auto_translate = false localize_numeral_system = false color = Color(0.137255, 0.14902, 0.196078, 1) @@ -603,14 +203,18 @@ visible = false [node name="Camera2D" type="Camera2D" parent="."] position = Vector2(282, -29) zoom = Vector2(2, 2) +process_callback = 0 [node name="PhantomCameraHost" type="Node" parent="Camera2D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("4_mylkx") [node name="Player" type="Node" parent="."] [node name="PlayerPhantomCamera2D" type="Node2D" parent="Player" node_paths=PackedStringArray("follow_target")] unique_name_in_owner = true +top_level = true position = Vector2(282, -29) script = ExtResource("5_lwx5e") priority = 5 @@ -620,8 +224,8 @@ zoom = Vector2(2, 2) tween_resource = ExtResource("6_tju6r") tween_on_load = false follow_damping = true -dead_zone_width = 0.416 -dead_zone_height = 0.63 +dead_zone_width = 0.4 +dead_zone_height = 0.8 show_viewfinder_in_play = true draw_limits = true diff --git a/addons/phantom_camera/examples/example_scenes/2D/2d_follow_group_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D/2d_follow_group_example_scene.tscn index c07f5c1..103729b 100644 --- a/addons/phantom_camera/examples/example_scenes/2D/2d_follow_group_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/2D/2d_follow_group_example_scene.tscn @@ -13,545 +13,145 @@ [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"] texture = ExtResource("1_5kqbp") 0:0/0 = 0 -0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_0/angular_velocity = 0.0 -0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_1/angular_velocity = 0.0 1:0/0 = 0 -1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_0/angular_velocity = 0.0 -1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_1/angular_velocity = 0.0 2:0/0 = 0 -2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_0/angular_velocity = 0.0 -2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_1/angular_velocity = 0.0 3:0/0 = 0 -3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_0/angular_velocity = 0.0 -3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_1/angular_velocity = 0.0 4:0/0 = 0 -4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_0/angular_velocity = 0.0 -4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_1/angular_velocity = 0.0 5:0/0 = 0 -5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_0/angular_velocity = 0.0 -5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_1/angular_velocity = 0.0 6:0/0 = 0 -6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_0/angular_velocity = 0.0 -6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_1/angular_velocity = 0.0 7:0/0 = 0 -7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_0/angular_velocity = 0.0 7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_1/angular_velocity = 0.0 0:1/0 = 0 -0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_0/angular_velocity = 0.0 -0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_1/angular_velocity = 0.0 1:1/0 = 0 -1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_0/angular_velocity = 0.0 -1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_1/angular_velocity = 0.0 2:1/0 = 0 -2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_0/angular_velocity = 0.0 -2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_1/angular_velocity = 0.0 3:1/0 = 0 -3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_0/angular_velocity = 0.0 -3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_1/angular_velocity = 0.0 4:1/0 = 0 -4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_0/angular_velocity = 0.0 -4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_1/angular_velocity = 0.0 5:1/0 = 0 -5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_0/angular_velocity = 0.0 -5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_1/angular_velocity = 0.0 7:1/0 = 0 -7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_0/angular_velocity = 0.0 7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_1/angular_velocity = 0.0 2:2/0 = 0 -2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_0/angular_velocity = 0.0 -2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_1/angular_velocity = 0.0 3:2/0 = 0 -3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_0/angular_velocity = 0.0 -3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_1/angular_velocity = 0.0 4:2/0 = 0 -4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_0/angular_velocity = 0.0 -4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_1/angular_velocity = 0.0 7:2/0 = 0 -7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_0/angular_velocity = 0.0 7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_1/angular_velocity = 0.0 3:3/0 = 0 -3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_0/angular_velocity = 0.0 -3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_1/angular_velocity = 0.0 4:3/0 = 0 -4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_0/angular_velocity = 0.0 -4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_1/angular_velocity = 0.0 5:3/0 = 0 -5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_0/angular_velocity = 0.0 -5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_1/angular_velocity = 0.0 7:3/0 = 0 -7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_0/angular_velocity = 0.0 7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_1/angular_velocity = 0.0 3:4/0 = 0 -3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_0/angular_velocity = 0.0 -3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_1/angular_velocity = 0.0 4:4/0 = 0 -4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_0/angular_velocity = 0.0 -4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_1/angular_velocity = 0.0 5:4/0 = 0 -5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_0/angular_velocity = 0.0 -5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_1/angular_velocity = 0.0 7:4/0 = 0 -7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_0/angular_velocity = 0.0 -7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_1/angular_velocity = 0.0 3:5/0 = 0 -3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_0/angular_velocity = 0.0 -3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_1/angular_velocity = 0.0 4:5/0 = 0 -4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_0/angular_velocity = 0.0 -4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_1/angular_velocity = 0.0 7:5/0 = 0 -7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_0/angular_velocity = 0.0 -7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_1/angular_velocity = 0.0 3:6/0 = 0 -3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_0/angular_velocity = 0.0 -3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_1/angular_velocity = 0.0 4:6/0 = 0 -4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_0/angular_velocity = 0.0 -4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_1/angular_velocity = 0.0 7:6/0 = 0 -7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_0/angular_velocity = 0.0 -7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_1/angular_velocity = 0.0 2:7/0 = 0 -2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_0/angular_velocity = 0.0 -2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_1/angular_velocity = 0.0 3:7/0 = 0 -3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_0/angular_velocity = 0.0 -3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_1/angular_velocity = 0.0 4:7/0 = 0 -4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_0/angular_velocity = 0.0 -4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_1/angular_velocity = 0.0 5:7/0 = 0 -5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_0/angular_velocity = 0.0 -5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_1/angular_velocity = 0.0 8:0/0 = 0 -8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_0/angular_velocity = 0.0 8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_1/angular_velocity = 0.0 9:0/0 = 0 -9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_0/angular_velocity = 0.0 9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_1/angular_velocity = 0.0 10:0/0 = 0 -10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_0/angular_velocity = 0.0 10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_1/angular_velocity = 0.0 11:0/0 = 0 -11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_0/angular_velocity = 0.0 11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_1/angular_velocity = 0.0 12:0/0 = 0 -12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_0/angular_velocity = 0.0 12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_1/angular_velocity = 0.0 13:0/0 = 0 -13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_0/angular_velocity = 0.0 13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0 = 0 -14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_0/angular_velocity = 0.0 -14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) 14:0/0/custom_data_0 = &"Sign" 15:0/0 = 0 -15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_0/angular_velocity = 0.0 -15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_1/angular_velocity = 0.0 16:0/0 = 0 -16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_0/angular_velocity = 0.0 -16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_1/angular_velocity = 0.0 8:1/0 = 0 -8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_0/angular_velocity = 0.0 8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_1/angular_velocity = 0.0 9:1/0 = 0 -9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_0/angular_velocity = 0.0 9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_1/angular_velocity = 0.0 10:1/0 = 0 -10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_0/angular_velocity = 0.0 10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_1/angular_velocity = 0.0 11:1/0 = 0 -11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_0/angular_velocity = 0.0 11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_1/angular_velocity = 0.0 12:1/0 = 0 -12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_0/angular_velocity = 0.0 12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_1/angular_velocity = 0.0 13:1/0 = 0 -13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_0/angular_velocity = 0.0 13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_1/angular_velocity = 0.0 14:1/0 = 0 -14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_0/angular_velocity = 0.0 -14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_1/angular_velocity = 0.0 15:1/0 = 0 -15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_0/angular_velocity = 0.0 -15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_1/angular_velocity = 0.0 16:1/0 = 0 -16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_0/angular_velocity = 0.0 -16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_1/angular_velocity = 0.0 8:2/0 = 0 -8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_0/angular_velocity = 0.0 8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_1/angular_velocity = 0.0 9:2/0 = 0 -9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_0/angular_velocity = 0.0 9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_1/angular_velocity = 0.0 10:2/0 = 0 -10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_0/angular_velocity = 0.0 10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_1/angular_velocity = 0.0 11:2/0 = 0 -11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_0/angular_velocity = 0.0 11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_1/angular_velocity = 0.0 12:2/0 = 0 -12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_0/angular_velocity = 0.0 12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_1/angular_velocity = 0.0 13:2/0 = 0 -13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_0/angular_velocity = 0.0 13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_1/angular_velocity = 0.0 14:2/0 = 0 -14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_0/angular_velocity = 0.0 -14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_1/angular_velocity = 0.0 15:2/0 = 0 -15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_0/angular_velocity = 0.0 -15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_1/angular_velocity = 0.0 16:2/0 = 0 -16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_0/angular_velocity = 0.0 -16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_1/angular_velocity = 0.0 8:3/0 = 0 -8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_0/angular_velocity = 0.0 8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_1/angular_velocity = 0.0 9:3/0 = 0 -9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_0/angular_velocity = 0.0 9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_1/angular_velocity = 0.0 10:3/0 = 0 -10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_0/angular_velocity = 0.0 10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_1/angular_velocity = 0.0 11:3/0 = 0 -11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_0/angular_velocity = 0.0 -11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_1/angular_velocity = 0.0 12:3/0 = 0 -12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_0/angular_velocity = 0.0 12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_1/angular_velocity = 0.0 13:3/0 = 0 -13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_0/angular_velocity = 0.0 13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_1/angular_velocity = 0.0 14:3/0 = 0 -14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_0/angular_velocity = 0.0 -14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_1/angular_velocity = 0.0 15:3/0 = 0 -15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_0/angular_velocity = 0.0 -15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_1/angular_velocity = 0.0 16:3/0 = 0 -16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_0/angular_velocity = 0.0 -16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_1/angular_velocity = 0.0 8:4/0 = 0 -8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_0/angular_velocity = 0.0 -8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_1/angular_velocity = 0.0 9:4/0 = 0 -9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_0/angular_velocity = 0.0 -9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_1/angular_velocity = 0.0 10:4/0 = 0 -10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_0/angular_velocity = 0.0 -10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_1/angular_velocity = 0.0 11:4/0 = 0 -11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_0/angular_velocity = 0.0 11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8) -11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_1/angular_velocity = 0.0 12:4/0 = 0 -12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_0/angular_velocity = 0.0 12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_1/angular_velocity = 0.0 13:4/0 = 0 -13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_0/angular_velocity = 0.0 13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8) -13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0 = 0 -14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_0/angular_velocity = 0.0 -14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 14:4/0/custom_data_0 = &"Inventory" 15:4/0 = 0 -15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_0/angular_velocity = 0.0 -15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_1/angular_velocity = 0.0 16:4/0 = 0 -16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_0/angular_velocity = 0.0 -16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_1/angular_velocity = 0.0 8:5/0 = 0 -8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_0/angular_velocity = 0.0 -8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_1/angular_velocity = 0.0 9:5/0 = 0 -9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_0/angular_velocity = 0.0 -9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_1/angular_velocity = 0.0 10:5/0 = 0 -10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_0/angular_velocity = 0.0 -10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_1/angular_velocity = 0.0 11:5/0 = 0 -11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_0/angular_velocity = 0.0 11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_1/angular_velocity = 0.0 12:5/0 = 0 -12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_0/angular_velocity = 0.0 12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_1/angular_velocity = 0.0 13:5/0 = 0 -13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_0/angular_velocity = 0.0 13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_1/angular_velocity = 0.0 14:5/0 = 0 -14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_0/angular_velocity = 0.0 -14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_1/angular_velocity = 0.0 15:5/0 = 0 -15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_0/angular_velocity = 0.0 -15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_1/angular_velocity = 0.0 16:5/0 = 0 -16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_0/angular_velocity = 0.0 -16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_1/angular_velocity = 0.0 8:6/0 = 0 -8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_0/angular_velocity = 0.0 -8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_1/angular_velocity = 0.0 9:6/0 = 0 -9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_0/angular_velocity = 0.0 -9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_1/angular_velocity = 0.0 10:6/0 = 0 -10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_0/angular_velocity = 0.0 -10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_1/angular_velocity = 0.0 11:6/0 = 0 -11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_0/angular_velocity = 0.0 11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5) -11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_1/angular_velocity = 0.0 12:6/0 = 0 -12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_0/angular_velocity = 0.0 12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_1/angular_velocity = 0.0 13:6/0 = 0 -13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_0/angular_velocity = 0.0 13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8) -13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_1/angular_velocity = 0.0 14:6/0 = 0 -14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_0/angular_velocity = 0.0 -14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_1/angular_velocity = 0.0 15:6/0 = 0 -15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_0/angular_velocity = 0.0 -15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_1/angular_velocity = 0.0 16:6/0 = 0 -16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_0/angular_velocity = 0.0 -16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_1/angular_velocity = 0.0 [sub_resource type="TileSet" id="TileSet_kf7eg"] physics_layer_0/collision_layer = 1 @@ -573,6 +173,7 @@ ease = 2 layer = -3 [node name="ColorRect" type="ColorRect" parent="Background"] +auto_translate_mode = 2 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 @@ -582,7 +183,6 @@ offset_right = 981.0 offset_bottom = 548.0 grow_horizontal = 2 grow_vertical = 2 -auto_translate = false localize_numeral_system = false color = Color(0.137255, 0.14902, 0.196078, 1) @@ -608,10 +208,13 @@ unique_name_in_owner = true visible = false [node name="Camera2D" type="Camera2D" parent="."] -position = Vector2(107, -172.5) +position = Vector2(186, -172.5) +zoom = Vector2(1.5, 1.5) position_smoothing_speed = 8.0 [node name="PhantomCameraHost" type="Node" parent="Camera2D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("4_2efwt") [node name="Label" type="Label" parent="."] @@ -625,15 +228,19 @@ text = "[WASD] to move [Space] to jump" [node name="PhantomCamera2D" type="Node2D" parent="." node_paths=PackedStringArray("follow_targets")] -position = Vector2(107, -172.5) +top_level = true +position = Vector2(186, -172.5) script = ExtResource("6_diuy4") priority = 10 follow_mode = 3 follow_targets = [NodePath("../GroupNPCSprite"), NodePath("../CharacterBody2D/PlayerVisuals")] +zoom = Vector2(1.5, 1.5) tween_resource = SubResource("Resource_spy00") tween_on_load = false follow_damping = true auto_zoom = true +auto_zoom_min = 0.5 +auto_zoom_max = 1.5 auto_zoom_margin = Vector4(200, 0, 200, 0) draw_limits = true diff --git a/addons/phantom_camera/examples/example_scenes/2D/2d_follow_path_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D/2d_follow_path_example_scene.tscn index 9fb9454..247a15b 100644 --- a/addons/phantom_camera/examples/example_scenes/2D/2d_follow_path_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/2D/2d_follow_path_example_scene.tscn @@ -12,545 +12,145 @@ [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"] texture = ExtResource("1_17ngo") 0:0/0 = 0 -0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_0/angular_velocity = 0.0 -0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_1/angular_velocity = 0.0 1:0/0 = 0 -1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_0/angular_velocity = 0.0 -1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_1/angular_velocity = 0.0 2:0/0 = 0 -2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_0/angular_velocity = 0.0 -2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_1/angular_velocity = 0.0 3:0/0 = 0 -3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_0/angular_velocity = 0.0 -3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_1/angular_velocity = 0.0 4:0/0 = 0 -4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_0/angular_velocity = 0.0 -4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_1/angular_velocity = 0.0 5:0/0 = 0 -5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_0/angular_velocity = 0.0 -5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_1/angular_velocity = 0.0 6:0/0 = 0 -6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_0/angular_velocity = 0.0 -6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_1/angular_velocity = 0.0 7:0/0 = 0 -7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_0/angular_velocity = 0.0 7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_1/angular_velocity = 0.0 0:1/0 = 0 -0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_0/angular_velocity = 0.0 -0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_1/angular_velocity = 0.0 1:1/0 = 0 -1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_0/angular_velocity = 0.0 -1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_1/angular_velocity = 0.0 2:1/0 = 0 -2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_0/angular_velocity = 0.0 -2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_1/angular_velocity = 0.0 3:1/0 = 0 -3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_0/angular_velocity = 0.0 -3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_1/angular_velocity = 0.0 4:1/0 = 0 -4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_0/angular_velocity = 0.0 -4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_1/angular_velocity = 0.0 5:1/0 = 0 -5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_0/angular_velocity = 0.0 -5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_1/angular_velocity = 0.0 7:1/0 = 0 -7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_0/angular_velocity = 0.0 7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_1/angular_velocity = 0.0 2:2/0 = 0 -2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_0/angular_velocity = 0.0 -2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_1/angular_velocity = 0.0 3:2/0 = 0 -3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_0/angular_velocity = 0.0 -3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_1/angular_velocity = 0.0 4:2/0 = 0 -4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_0/angular_velocity = 0.0 -4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_1/angular_velocity = 0.0 7:2/0 = 0 -7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_0/angular_velocity = 0.0 7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_1/angular_velocity = 0.0 3:3/0 = 0 -3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_0/angular_velocity = 0.0 -3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_1/angular_velocity = 0.0 4:3/0 = 0 -4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_0/angular_velocity = 0.0 -4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_1/angular_velocity = 0.0 5:3/0 = 0 -5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_0/angular_velocity = 0.0 -5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_1/angular_velocity = 0.0 7:3/0 = 0 -7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_0/angular_velocity = 0.0 7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_1/angular_velocity = 0.0 3:4/0 = 0 -3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_0/angular_velocity = 0.0 -3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_1/angular_velocity = 0.0 4:4/0 = 0 -4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_0/angular_velocity = 0.0 -4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_1/angular_velocity = 0.0 5:4/0 = 0 -5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_0/angular_velocity = 0.0 -5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_1/angular_velocity = 0.0 7:4/0 = 0 -7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_0/angular_velocity = 0.0 -7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_1/angular_velocity = 0.0 3:5/0 = 0 -3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_0/angular_velocity = 0.0 -3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_1/angular_velocity = 0.0 4:5/0 = 0 -4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_0/angular_velocity = 0.0 -4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_1/angular_velocity = 0.0 7:5/0 = 0 -7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_0/angular_velocity = 0.0 -7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_1/angular_velocity = 0.0 3:6/0 = 0 -3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_0/angular_velocity = 0.0 -3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_1/angular_velocity = 0.0 4:6/0 = 0 -4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_0/angular_velocity = 0.0 -4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_1/angular_velocity = 0.0 7:6/0 = 0 -7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_0/angular_velocity = 0.0 -7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_1/angular_velocity = 0.0 2:7/0 = 0 -2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_0/angular_velocity = 0.0 -2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_1/angular_velocity = 0.0 3:7/0 = 0 -3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_0/angular_velocity = 0.0 -3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_1/angular_velocity = 0.0 4:7/0 = 0 -4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_0/angular_velocity = 0.0 -4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_1/angular_velocity = 0.0 5:7/0 = 0 -5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_0/angular_velocity = 0.0 -5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_1/angular_velocity = 0.0 8:0/0 = 0 -8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_0/angular_velocity = 0.0 8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_1/angular_velocity = 0.0 9:0/0 = 0 -9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_0/angular_velocity = 0.0 9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_1/angular_velocity = 0.0 10:0/0 = 0 -10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_0/angular_velocity = 0.0 10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_1/angular_velocity = 0.0 11:0/0 = 0 -11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_0/angular_velocity = 0.0 11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_1/angular_velocity = 0.0 12:0/0 = 0 -12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_0/angular_velocity = 0.0 12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_1/angular_velocity = 0.0 13:0/0 = 0 -13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_0/angular_velocity = 0.0 13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0 = 0 -14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_0/angular_velocity = 0.0 -14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) 14:0/0/custom_data_0 = &"Sign" 15:0/0 = 0 -15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_0/angular_velocity = 0.0 -15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_1/angular_velocity = 0.0 16:0/0 = 0 -16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_0/angular_velocity = 0.0 -16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_1/angular_velocity = 0.0 8:1/0 = 0 -8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_0/angular_velocity = 0.0 8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_1/angular_velocity = 0.0 9:1/0 = 0 -9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_0/angular_velocity = 0.0 9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_1/angular_velocity = 0.0 10:1/0 = 0 -10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_0/angular_velocity = 0.0 10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_1/angular_velocity = 0.0 11:1/0 = 0 -11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_0/angular_velocity = 0.0 11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_1/angular_velocity = 0.0 12:1/0 = 0 -12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_0/angular_velocity = 0.0 12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_1/angular_velocity = 0.0 13:1/0 = 0 -13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_0/angular_velocity = 0.0 13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_1/angular_velocity = 0.0 14:1/0 = 0 -14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_0/angular_velocity = 0.0 -14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_1/angular_velocity = 0.0 15:1/0 = 0 -15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_0/angular_velocity = 0.0 -15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_1/angular_velocity = 0.0 16:1/0 = 0 -16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_0/angular_velocity = 0.0 -16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_1/angular_velocity = 0.0 8:2/0 = 0 -8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_0/angular_velocity = 0.0 8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_1/angular_velocity = 0.0 9:2/0 = 0 -9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_0/angular_velocity = 0.0 9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_1/angular_velocity = 0.0 10:2/0 = 0 -10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_0/angular_velocity = 0.0 10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_1/angular_velocity = 0.0 11:2/0 = 0 -11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_0/angular_velocity = 0.0 11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_1/angular_velocity = 0.0 12:2/0 = 0 -12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_0/angular_velocity = 0.0 12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_1/angular_velocity = 0.0 13:2/0 = 0 -13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_0/angular_velocity = 0.0 13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_1/angular_velocity = 0.0 14:2/0 = 0 -14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_0/angular_velocity = 0.0 -14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_1/angular_velocity = 0.0 15:2/0 = 0 -15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_0/angular_velocity = 0.0 -15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_1/angular_velocity = 0.0 16:2/0 = 0 -16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_0/angular_velocity = 0.0 -16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_1/angular_velocity = 0.0 8:3/0 = 0 -8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_0/angular_velocity = 0.0 8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_1/angular_velocity = 0.0 9:3/0 = 0 -9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_0/angular_velocity = 0.0 9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_1/angular_velocity = 0.0 10:3/0 = 0 -10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_0/angular_velocity = 0.0 10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_1/angular_velocity = 0.0 11:3/0 = 0 -11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_0/angular_velocity = 0.0 -11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_1/angular_velocity = 0.0 12:3/0 = 0 -12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_0/angular_velocity = 0.0 12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_1/angular_velocity = 0.0 13:3/0 = 0 -13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_0/angular_velocity = 0.0 13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_1/angular_velocity = 0.0 14:3/0 = 0 -14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_0/angular_velocity = 0.0 -14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_1/angular_velocity = 0.0 15:3/0 = 0 -15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_0/angular_velocity = 0.0 -15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_1/angular_velocity = 0.0 16:3/0 = 0 -16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_0/angular_velocity = 0.0 -16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_1/angular_velocity = 0.0 8:4/0 = 0 -8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_0/angular_velocity = 0.0 -8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_1/angular_velocity = 0.0 9:4/0 = 0 -9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_0/angular_velocity = 0.0 -9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_1/angular_velocity = 0.0 10:4/0 = 0 -10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_0/angular_velocity = 0.0 -10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_1/angular_velocity = 0.0 11:4/0 = 0 -11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_0/angular_velocity = 0.0 11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8) -11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_1/angular_velocity = 0.0 12:4/0 = 0 -12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_0/angular_velocity = 0.0 12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_1/angular_velocity = 0.0 13:4/0 = 0 -13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_0/angular_velocity = 0.0 13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8) -13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0 = 0 -14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_0/angular_velocity = 0.0 -14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 14:4/0/custom_data_0 = &"Inventory" 15:4/0 = 0 -15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_0/angular_velocity = 0.0 -15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_1/angular_velocity = 0.0 16:4/0 = 0 -16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_0/angular_velocity = 0.0 -16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_1/angular_velocity = 0.0 8:5/0 = 0 -8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_0/angular_velocity = 0.0 -8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_1/angular_velocity = 0.0 9:5/0 = 0 -9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_0/angular_velocity = 0.0 -9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_1/angular_velocity = 0.0 10:5/0 = 0 -10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_0/angular_velocity = 0.0 -10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_1/angular_velocity = 0.0 11:5/0 = 0 -11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_0/angular_velocity = 0.0 11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_1/angular_velocity = 0.0 12:5/0 = 0 -12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_0/angular_velocity = 0.0 12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_1/angular_velocity = 0.0 13:5/0 = 0 -13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_0/angular_velocity = 0.0 13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_1/angular_velocity = 0.0 14:5/0 = 0 -14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_0/angular_velocity = 0.0 -14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_1/angular_velocity = 0.0 15:5/0 = 0 -15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_0/angular_velocity = 0.0 -15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_1/angular_velocity = 0.0 16:5/0 = 0 -16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_0/angular_velocity = 0.0 -16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_1/angular_velocity = 0.0 8:6/0 = 0 -8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_0/angular_velocity = 0.0 -8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_1/angular_velocity = 0.0 9:6/0 = 0 -9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_0/angular_velocity = 0.0 -9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_1/angular_velocity = 0.0 10:6/0 = 0 -10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_0/angular_velocity = 0.0 -10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_1/angular_velocity = 0.0 11:6/0 = 0 -11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_0/angular_velocity = 0.0 11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5) -11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_1/angular_velocity = 0.0 12:6/0 = 0 -12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_0/angular_velocity = 0.0 12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_1/angular_velocity = 0.0 13:6/0 = 0 -13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_0/angular_velocity = 0.0 13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8) -13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_1/angular_velocity = 0.0 14:6/0 = 0 -14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_0/angular_velocity = 0.0 -14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_1/angular_velocity = 0.0 15:6/0 = 0 -15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_0/angular_velocity = 0.0 -15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_1/angular_velocity = 0.0 16:6/0 = 0 -16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_0/angular_velocity = 0.0 -16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_1/angular_velocity = 0.0 [sub_resource type="TileSet" id="TileSet_kf7eg"] physics_layer_0/collision_layer = 1 @@ -572,6 +172,7 @@ point_count = 2 layer = -3 [node name="ColorRect" type="ColorRect" parent="Background"] +auto_translate_mode = 2 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 @@ -581,7 +182,6 @@ offset_right = 981.0 offset_bottom = 548.0 grow_horizontal = 2 grow_vertical = 2 -auto_translate = false localize_numeral_system = false color = Color(0.137255, 0.14902, 0.196078, 1) @@ -609,8 +209,11 @@ visible = false [node name="Camera2D" type="Camera2D" parent="."] position = Vector2(374, -216) zoom = Vector2(1.5, 1.5) +process_callback = 0 [node name="PhantomCameraHost" type="Node" parent="Camera2D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("4_yddet") [node name="Label" type="Label" parent="."] @@ -638,6 +241,7 @@ text = "[WASD] to move [node name="PlayerPhantomCamera2D" type="Node2D" parent="." node_paths=PackedStringArray("follow_target", "follow_path")] unique_name_in_owner = true +top_level = true position = Vector2(374, -216) script = ExtResource("5_x25dj") priority = 10 diff --git a/addons/phantom_camera/examples/example_scenes/2D/2d_limit_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D/2d_limit_example_scene.tscn index fdfb571..f1f7e7f 100644 --- a/addons/phantom_camera/examples/example_scenes/2D/2d_limit_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/2D/2d_limit_example_scene.tscn @@ -12,545 +12,145 @@ [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"] texture = ExtResource("1_wmhqb") 0:0/0 = 0 -0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_0/angular_velocity = 0.0 -0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_1/angular_velocity = 0.0 1:0/0 = 0 -1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_0/angular_velocity = 0.0 -1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_1/angular_velocity = 0.0 2:0/0 = 0 -2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_0/angular_velocity = 0.0 -2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_1/angular_velocity = 0.0 3:0/0 = 0 -3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_0/angular_velocity = 0.0 -3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_1/angular_velocity = 0.0 4:0/0 = 0 -4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_0/angular_velocity = 0.0 -4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_1/angular_velocity = 0.0 5:0/0 = 0 -5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_0/angular_velocity = 0.0 -5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_1/angular_velocity = 0.0 6:0/0 = 0 -6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_0/angular_velocity = 0.0 -6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_1/angular_velocity = 0.0 7:0/0 = 0 -7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_0/angular_velocity = 0.0 7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_1/angular_velocity = 0.0 0:1/0 = 0 -0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_0/angular_velocity = 0.0 -0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_1/angular_velocity = 0.0 1:1/0 = 0 -1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_0/angular_velocity = 0.0 -1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_1/angular_velocity = 0.0 2:1/0 = 0 -2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_0/angular_velocity = 0.0 -2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_1/angular_velocity = 0.0 3:1/0 = 0 -3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_0/angular_velocity = 0.0 -3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_1/angular_velocity = 0.0 4:1/0 = 0 -4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_0/angular_velocity = 0.0 -4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_1/angular_velocity = 0.0 5:1/0 = 0 -5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_0/angular_velocity = 0.0 -5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_1/angular_velocity = 0.0 7:1/0 = 0 -7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_0/angular_velocity = 0.0 7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_1/angular_velocity = 0.0 2:2/0 = 0 -2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_0/angular_velocity = 0.0 -2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_1/angular_velocity = 0.0 3:2/0 = 0 -3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_0/angular_velocity = 0.0 -3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_1/angular_velocity = 0.0 4:2/0 = 0 -4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_0/angular_velocity = 0.0 -4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_1/angular_velocity = 0.0 7:2/0 = 0 -7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_0/angular_velocity = 0.0 7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_1/angular_velocity = 0.0 3:3/0 = 0 -3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_0/angular_velocity = 0.0 -3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_1/angular_velocity = 0.0 4:3/0 = 0 -4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_0/angular_velocity = 0.0 -4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_1/angular_velocity = 0.0 5:3/0 = 0 -5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_0/angular_velocity = 0.0 -5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_1/angular_velocity = 0.0 7:3/0 = 0 -7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_0/angular_velocity = 0.0 7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_1/angular_velocity = 0.0 3:4/0 = 0 -3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_0/angular_velocity = 0.0 -3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_1/angular_velocity = 0.0 4:4/0 = 0 -4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_0/angular_velocity = 0.0 -4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_1/angular_velocity = 0.0 5:4/0 = 0 -5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_0/angular_velocity = 0.0 -5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_1/angular_velocity = 0.0 7:4/0 = 0 -7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_0/angular_velocity = 0.0 -7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_1/angular_velocity = 0.0 3:5/0 = 0 -3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_0/angular_velocity = 0.0 -3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_1/angular_velocity = 0.0 4:5/0 = 0 -4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_0/angular_velocity = 0.0 -4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_1/angular_velocity = 0.0 7:5/0 = 0 -7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_0/angular_velocity = 0.0 -7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_1/angular_velocity = 0.0 3:6/0 = 0 -3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_0/angular_velocity = 0.0 -3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_1/angular_velocity = 0.0 4:6/0 = 0 -4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_0/angular_velocity = 0.0 -4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_1/angular_velocity = 0.0 7:6/0 = 0 -7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_0/angular_velocity = 0.0 -7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_1/angular_velocity = 0.0 2:7/0 = 0 -2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_0/angular_velocity = 0.0 -2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_1/angular_velocity = 0.0 3:7/0 = 0 -3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_0/angular_velocity = 0.0 -3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_1/angular_velocity = 0.0 4:7/0 = 0 -4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_0/angular_velocity = 0.0 -4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_1/angular_velocity = 0.0 5:7/0 = 0 -5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_0/angular_velocity = 0.0 -5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_1/angular_velocity = 0.0 8:0/0 = 0 -8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_0/angular_velocity = 0.0 8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_1/angular_velocity = 0.0 9:0/0 = 0 -9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_0/angular_velocity = 0.0 9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_1/angular_velocity = 0.0 10:0/0 = 0 -10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_0/angular_velocity = 0.0 10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_1/angular_velocity = 0.0 11:0/0 = 0 -11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_0/angular_velocity = 0.0 11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_1/angular_velocity = 0.0 12:0/0 = 0 -12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_0/angular_velocity = 0.0 12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_1/angular_velocity = 0.0 13:0/0 = 0 -13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_0/angular_velocity = 0.0 13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0 = 0 -14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_0/angular_velocity = 0.0 -14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) 14:0/0/custom_data_0 = &"Sign" 15:0/0 = 0 -15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_0/angular_velocity = 0.0 -15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_1/angular_velocity = 0.0 16:0/0 = 0 -16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_0/angular_velocity = 0.0 -16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_1/angular_velocity = 0.0 8:1/0 = 0 -8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_0/angular_velocity = 0.0 8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_1/angular_velocity = 0.0 9:1/0 = 0 -9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_0/angular_velocity = 0.0 9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_1/angular_velocity = 0.0 10:1/0 = 0 -10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_0/angular_velocity = 0.0 10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_1/angular_velocity = 0.0 11:1/0 = 0 -11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_0/angular_velocity = 0.0 11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_1/angular_velocity = 0.0 12:1/0 = 0 -12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_0/angular_velocity = 0.0 12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_1/angular_velocity = 0.0 13:1/0 = 0 -13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_0/angular_velocity = 0.0 13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_1/angular_velocity = 0.0 14:1/0 = 0 -14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_0/angular_velocity = 0.0 -14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_1/angular_velocity = 0.0 15:1/0 = 0 -15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_0/angular_velocity = 0.0 -15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_1/angular_velocity = 0.0 16:1/0 = 0 -16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_0/angular_velocity = 0.0 -16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_1/angular_velocity = 0.0 8:2/0 = 0 -8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_0/angular_velocity = 0.0 8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_1/angular_velocity = 0.0 9:2/0 = 0 -9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_0/angular_velocity = 0.0 9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_1/angular_velocity = 0.0 10:2/0 = 0 -10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_0/angular_velocity = 0.0 10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_1/angular_velocity = 0.0 11:2/0 = 0 -11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_0/angular_velocity = 0.0 11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_1/angular_velocity = 0.0 12:2/0 = 0 -12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_0/angular_velocity = 0.0 12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_1/angular_velocity = 0.0 13:2/0 = 0 -13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_0/angular_velocity = 0.0 13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_1/angular_velocity = 0.0 14:2/0 = 0 -14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_0/angular_velocity = 0.0 -14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_1/angular_velocity = 0.0 15:2/0 = 0 -15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_0/angular_velocity = 0.0 -15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_1/angular_velocity = 0.0 16:2/0 = 0 -16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_0/angular_velocity = 0.0 -16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_1/angular_velocity = 0.0 8:3/0 = 0 -8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_0/angular_velocity = 0.0 8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_1/angular_velocity = 0.0 9:3/0 = 0 -9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_0/angular_velocity = 0.0 9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_1/angular_velocity = 0.0 10:3/0 = 0 -10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_0/angular_velocity = 0.0 10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_1/angular_velocity = 0.0 11:3/0 = 0 -11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_0/angular_velocity = 0.0 -11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_1/angular_velocity = 0.0 12:3/0 = 0 -12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_0/angular_velocity = 0.0 12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_1/angular_velocity = 0.0 13:3/0 = 0 -13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_0/angular_velocity = 0.0 13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_1/angular_velocity = 0.0 14:3/0 = 0 -14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_0/angular_velocity = 0.0 -14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_1/angular_velocity = 0.0 15:3/0 = 0 -15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_0/angular_velocity = 0.0 -15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_1/angular_velocity = 0.0 16:3/0 = 0 -16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_0/angular_velocity = 0.0 -16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_1/angular_velocity = 0.0 8:4/0 = 0 -8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_0/angular_velocity = 0.0 -8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_1/angular_velocity = 0.0 9:4/0 = 0 -9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_0/angular_velocity = 0.0 -9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_1/angular_velocity = 0.0 10:4/0 = 0 -10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_0/angular_velocity = 0.0 -10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_1/angular_velocity = 0.0 11:4/0 = 0 -11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_0/angular_velocity = 0.0 11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8) -11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_1/angular_velocity = 0.0 12:4/0 = 0 -12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_0/angular_velocity = 0.0 12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_1/angular_velocity = 0.0 13:4/0 = 0 -13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_0/angular_velocity = 0.0 13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8) -13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0 = 0 -14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_0/angular_velocity = 0.0 -14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 14:4/0/custom_data_0 = &"Inventory" 15:4/0 = 0 -15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_0/angular_velocity = 0.0 -15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_1/angular_velocity = 0.0 16:4/0 = 0 -16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_0/angular_velocity = 0.0 -16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_1/angular_velocity = 0.0 8:5/0 = 0 -8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_0/angular_velocity = 0.0 -8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_1/angular_velocity = 0.0 9:5/0 = 0 -9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_0/angular_velocity = 0.0 -9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_1/angular_velocity = 0.0 10:5/0 = 0 -10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_0/angular_velocity = 0.0 -10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_1/angular_velocity = 0.0 11:5/0 = 0 -11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_0/angular_velocity = 0.0 11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_1/angular_velocity = 0.0 12:5/0 = 0 -12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_0/angular_velocity = 0.0 12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_1/angular_velocity = 0.0 13:5/0 = 0 -13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_0/angular_velocity = 0.0 13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_1/angular_velocity = 0.0 14:5/0 = 0 -14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_0/angular_velocity = 0.0 -14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_1/angular_velocity = 0.0 15:5/0 = 0 -15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_0/angular_velocity = 0.0 -15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_1/angular_velocity = 0.0 16:5/0 = 0 -16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_0/angular_velocity = 0.0 -16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_1/angular_velocity = 0.0 8:6/0 = 0 -8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_0/angular_velocity = 0.0 -8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_1/angular_velocity = 0.0 9:6/0 = 0 -9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_0/angular_velocity = 0.0 -9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_1/angular_velocity = 0.0 10:6/0 = 0 -10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_0/angular_velocity = 0.0 -10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_1/angular_velocity = 0.0 11:6/0 = 0 -11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_0/angular_velocity = 0.0 11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5) -11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_1/angular_velocity = 0.0 12:6/0 = 0 -12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_0/angular_velocity = 0.0 12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_1/angular_velocity = 0.0 13:6/0 = 0 -13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_0/angular_velocity = 0.0 13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8) -13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_1/angular_velocity = 0.0 14:6/0 = 0 -14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_0/angular_velocity = 0.0 -14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_1/angular_velocity = 0.0 15:6/0 = 0 -15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_0/angular_velocity = 0.0 -15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_1/angular_velocity = 0.0 16:6/0 = 0 -16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_0/angular_velocity = 0.0 -16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_1/angular_velocity = 0.0 [sub_resource type="TileSet" id="TileSet_kf7eg"] physics_layer_0/collision_layer = 1 @@ -588,6 +188,7 @@ script = ExtResource("1_ijqyv") layer = -3 [node name="ColorRect" type="ColorRect" parent="Background"] +auto_translate_mode = 2 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 @@ -597,7 +198,6 @@ offset_right = 981.0 offset_bottom = 548.0 grow_horizontal = 2 grow_vertical = 2 -auto_translate = false localize_numeral_system = false color = Color(0.137255, 0.14902, 0.196078, 1) metadata/_edit_lock_ = true @@ -636,11 +236,12 @@ visible = false [node name="CharacterBody2D" parent="." instance=ExtResource("5_pr2x5")] unique_name_in_owner = true -position = Vector2(66, -50) +position = Vector2(66, -28) [node name="RoomLeftPhantomCamera2D" type="Node2D" parent="." node_paths=PackedStringArray("follow_target")] unique_name_in_owner = true -position = Vector2(66, -113.205) +top_level = true +position = Vector2(66, -91.205) script = ExtResource("4_4b648") priority = 5 follow_mode = 2 @@ -664,6 +265,7 @@ debug_color = Color(0, 0.6, 0.701961, 0.0313726) [node name="RoomCentrePhantomCamera2D" type="Node2D" parent="."] unique_name_in_owner = true +top_level = true position = Vector2(1474, -149) script = ExtResource("4_4b648") follow_mode = 2 @@ -693,6 +295,7 @@ debug_color = Color(0, 0.6, 0.701961, 0) [node name="RoomRightPhantomCamera2D" type="Node2D" parent="."] unique_name_in_owner = true +top_level = true position = Vector2(2347, -156) scale = Vector2(1.0024, 1) script = ExtResource("4_4b648") @@ -703,8 +306,9 @@ follow_damping = true draw_limits = true [node name="Camera2D" type="Camera2D" parent="."] -position = Vector2(66, -113.205) +position = Vector2(66, -91.205) zoom = Vector2(2, 2) +process_callback = 0 limit_left = -387 limit_top = -528 limit_right = 433 @@ -713,6 +317,8 @@ position_smoothing_speed = 10.0 editor_draw_limits = true [node name="PhantomCameraHost" type="Node" parent="Camera2D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("9_w5e16") [editable path="CharacterBody2D"] diff --git a/addons/phantom_camera/examples/example_scenes/2D/2d_tweening_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/2D/2d_tweening_example_scene.tscn index 24d9a1a..4a72e81 100644 --- a/addons/phantom_camera/examples/example_scenes/2D/2d_tweening_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/2D/2d_tweening_example_scene.tscn @@ -14,545 +14,145 @@ [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"] texture = ExtResource("1_oo2bo") 0:0/0 = 0 -0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_0/angular_velocity = 0.0 -0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:0/0/physics_layer_1/angular_velocity = 0.0 1:0/0 = 0 -1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_0/angular_velocity = 0.0 -1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:0/0/physics_layer_1/angular_velocity = 0.0 2:0/0 = 0 -2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_0/angular_velocity = 0.0 -2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:0/0/physics_layer_1/angular_velocity = 0.0 3:0/0 = 0 -3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_0/angular_velocity = 0.0 -3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:0/0/physics_layer_1/angular_velocity = 0.0 4:0/0 = 0 -4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_0/angular_velocity = 0.0 -4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:0/0/physics_layer_1/angular_velocity = 0.0 5:0/0 = 0 -5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_0/angular_velocity = 0.0 -5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:0/0/physics_layer_1/angular_velocity = 0.0 6:0/0 = 0 -6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_0/angular_velocity = 0.0 -6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -6:0/0/physics_layer_1/angular_velocity = 0.0 7:0/0 = 0 -7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_0/angular_velocity = 0.0 7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:0/0/physics_layer_1/angular_velocity = 0.0 0:1/0 = 0 -0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_0/angular_velocity = 0.0 -0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -0:1/0/physics_layer_1/angular_velocity = 0.0 1:1/0 = 0 -1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_0/angular_velocity = 0.0 -1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -1:1/0/physics_layer_1/angular_velocity = 0.0 2:1/0 = 0 -2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_0/angular_velocity = 0.0 -2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:1/0/physics_layer_1/angular_velocity = 0.0 3:1/0 = 0 -3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_0/angular_velocity = 0.0 -3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:1/0/physics_layer_1/angular_velocity = 0.0 4:1/0 = 0 -4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_0/angular_velocity = 0.0 -4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:1/0/physics_layer_1/angular_velocity = 0.0 5:1/0 = 0 -5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_0/angular_velocity = 0.0 -5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:1/0/physics_layer_1/angular_velocity = 0.0 7:1/0 = 0 -7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_0/angular_velocity = 0.0 7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:1/0/physics_layer_1/angular_velocity = 0.0 2:2/0 = 0 -2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_0/angular_velocity = 0.0 -2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:2/0/physics_layer_1/angular_velocity = 0.0 3:2/0 = 0 -3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_0/angular_velocity = 0.0 -3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:2/0/physics_layer_1/angular_velocity = 0.0 4:2/0 = 0 -4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_0/angular_velocity = 0.0 -4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:2/0/physics_layer_1/angular_velocity = 0.0 7:2/0 = 0 -7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_0/angular_velocity = 0.0 7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:2/0/physics_layer_1/angular_velocity = 0.0 3:3/0 = 0 -3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_0/angular_velocity = 0.0 -3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:3/0/physics_layer_1/angular_velocity = 0.0 4:3/0 = 0 -4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_0/angular_velocity = 0.0 -4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:3/0/physics_layer_1/angular_velocity = 0.0 7:3/0 = 0 -7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_0/angular_velocity = 0.0 7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:3/0/physics_layer_1/angular_velocity = 0.0 3:4/0 = 0 -3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_0/angular_velocity = 0.0 -3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:4/0/physics_layer_1/angular_velocity = 0.0 4:4/0 = 0 -4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_0/angular_velocity = 0.0 -4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:4/0/physics_layer_1/angular_velocity = 0.0 5:4/0 = 0 -5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_0/angular_velocity = 0.0 -5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:4/0/physics_layer_1/angular_velocity = 0.0 7:4/0 = 0 -7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_0/angular_velocity = 0.0 -7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:4/0/physics_layer_1/angular_velocity = 0.0 3:5/0 = 0 -3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_0/angular_velocity = 0.0 -3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:5/0/physics_layer_1/angular_velocity = 0.0 4:5/0 = 0 -4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_0/angular_velocity = 0.0 -4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:5/0/physics_layer_1/angular_velocity = 0.0 7:5/0 = 0 -7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_0/angular_velocity = 0.0 -7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:5/0/physics_layer_1/angular_velocity = 0.0 3:6/0 = 0 -3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_0/angular_velocity = 0.0 -3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:6/0/physics_layer_1/angular_velocity = 0.0 4:6/0 = 0 -4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_0/angular_velocity = 0.0 -4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:6/0/physics_layer_1/angular_velocity = 0.0 7:6/0 = 0 -7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_0/angular_velocity = 0.0 -7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -7:6/0/physics_layer_1/angular_velocity = 0.0 2:7/0 = 0 -2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_0/angular_velocity = 0.0 -2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -2:7/0/physics_layer_1/angular_velocity = 0.0 3:7/0 = 0 -3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_0/angular_velocity = 0.0 -3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -3:7/0/physics_layer_1/angular_velocity = 0.0 4:7/0 = 0 -4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_0/angular_velocity = 0.0 -4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -4:7/0/physics_layer_1/angular_velocity = 0.0 5:7/0 = 0 -5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_0/angular_velocity = 0.0 -5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:7/0/physics_layer_1/angular_velocity = 0.0 8:0/0 = 0 -8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_0/angular_velocity = 0.0 8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:0/0/physics_layer_1/angular_velocity = 0.0 9:0/0 = 0 -9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_0/angular_velocity = 0.0 9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:0/0/physics_layer_1/angular_velocity = 0.0 10:0/0 = 0 -10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_0/angular_velocity = 0.0 10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:0/0/physics_layer_1/angular_velocity = 0.0 11:0/0 = 0 -11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_0/angular_velocity = 0.0 11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:0/0/physics_layer_1/angular_velocity = 0.0 12:0/0 = 0 -12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_0/angular_velocity = 0.0 12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:0/0/physics_layer_1/angular_velocity = 0.0 13:0/0 = 0 -13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_0/angular_velocity = 0.0 13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0 = 0 -14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_0/angular_velocity = 0.0 -14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:0/0/physics_layer_1/angular_velocity = 0.0 14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) 14:0/0/custom_data_0 = &"Sign" 15:0/0 = 0 -15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_0/angular_velocity = 0.0 -15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:0/0/physics_layer_1/angular_velocity = 0.0 16:0/0 = 0 -16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_0/angular_velocity = 0.0 -16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:0/0/physics_layer_1/angular_velocity = 0.0 8:1/0 = 0 -8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_0/angular_velocity = 0.0 8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:1/0/physics_layer_1/angular_velocity = 0.0 9:1/0 = 0 -9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_0/angular_velocity = 0.0 9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:1/0/physics_layer_1/angular_velocity = 0.0 10:1/0 = 0 -10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_0/angular_velocity = 0.0 10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:1/0/physics_layer_1/angular_velocity = 0.0 11:1/0 = 0 -11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_0/angular_velocity = 0.0 11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:1/0/physics_layer_1/angular_velocity = 0.0 12:1/0 = 0 -12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_0/angular_velocity = 0.0 12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:1/0/physics_layer_1/angular_velocity = 0.0 13:1/0 = 0 -13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_0/angular_velocity = 0.0 13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:1/0/physics_layer_1/angular_velocity = 0.0 14:1/0 = 0 -14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_0/angular_velocity = 0.0 -14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:1/0/physics_layer_1/angular_velocity = 0.0 15:1/0 = 0 -15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_0/angular_velocity = 0.0 -15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:1/0/physics_layer_1/angular_velocity = 0.0 16:1/0 = 0 -16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_0/angular_velocity = 0.0 -16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:1/0/physics_layer_1/angular_velocity = 0.0 8:2/0 = 0 -8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_0/angular_velocity = 0.0 8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:2/0/physics_layer_1/angular_velocity = 0.0 9:2/0 = 0 -9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_0/angular_velocity = 0.0 9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:2/0/physics_layer_1/angular_velocity = 0.0 10:2/0 = 0 -10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_0/angular_velocity = 0.0 10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:2/0/physics_layer_1/angular_velocity = 0.0 11:2/0 = 0 -11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_0/angular_velocity = 0.0 11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:2/0/physics_layer_1/angular_velocity = 0.0 12:2/0 = 0 -12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_0/angular_velocity = 0.0 12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:2/0/physics_layer_1/angular_velocity = 0.0 13:2/0 = 0 -13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_0/angular_velocity = 0.0 13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:2/0/physics_layer_1/angular_velocity = 0.0 14:2/0 = 0 -14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_0/angular_velocity = 0.0 -14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:2/0/physics_layer_1/angular_velocity = 0.0 15:2/0 = 0 -15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_0/angular_velocity = 0.0 -15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:2/0/physics_layer_1/angular_velocity = 0.0 16:2/0 = 0 -16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_0/angular_velocity = 0.0 -16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:2/0/physics_layer_1/angular_velocity = 0.0 8:3/0 = 0 -8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_0/angular_velocity = 0.0 8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:3/0/physics_layer_1/angular_velocity = 0.0 9:3/0 = 0 -9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_0/angular_velocity = 0.0 9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:3/0/physics_layer_1/angular_velocity = 0.0 10:3/0 = 0 -10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_0/angular_velocity = 0.0 10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:3/0/physics_layer_1/angular_velocity = 0.0 11:3/0 = 0 -11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_0/angular_velocity = 0.0 -11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:3/0/physics_layer_1/angular_velocity = 0.0 12:3/0 = 0 -12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_0/angular_velocity = 0.0 12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:3/0/physics_layer_1/angular_velocity = 0.0 13:3/0 = 0 -13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_0/angular_velocity = 0.0 13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:3/0/physics_layer_1/angular_velocity = 0.0 14:3/0 = 0 -14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_0/angular_velocity = 0.0 -14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:3/0/physics_layer_1/angular_velocity = 0.0 15:3/0 = 0 -15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_0/angular_velocity = 0.0 -15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:3/0/physics_layer_1/angular_velocity = 0.0 16:3/0 = 0 -16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_0/angular_velocity = 0.0 -16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:3/0/physics_layer_1/angular_velocity = 0.0 8:4/0 = 0 -8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_0/angular_velocity = 0.0 -8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:4/0/physics_layer_1/angular_velocity = 0.0 9:4/0 = 0 -9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_0/angular_velocity = 0.0 -9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:4/0/physics_layer_1/angular_velocity = 0.0 10:4/0 = 0 -10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_0/angular_velocity = 0.0 -10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:4/0/physics_layer_1/angular_velocity = 0.0 11:4/0 = 0 -11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_0/angular_velocity = 0.0 11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8) -11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:4/0/physics_layer_1/angular_velocity = 0.0 12:4/0 = 0 -12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_0/angular_velocity = 0.0 12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:4/0/physics_layer_1/angular_velocity = 0.0 13:4/0 = 0 -13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_0/angular_velocity = 0.0 13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8) -13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0 = 0 -14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_0/angular_velocity = 0.0 -14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:4/0/physics_layer_1/angular_velocity = 0.0 14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) 14:4/0/custom_data_0 = &"Inventory" 15:4/0 = 0 -15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_0/angular_velocity = 0.0 -15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:4/0/physics_layer_1/angular_velocity = 0.0 16:4/0 = 0 -16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_0/angular_velocity = 0.0 -16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:4/0/physics_layer_1/angular_velocity = 0.0 8:5/0 = 0 -8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_0/angular_velocity = 0.0 -8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:5/0/physics_layer_1/angular_velocity = 0.0 9:5/0 = 0 -9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_0/angular_velocity = 0.0 -9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:5/0/physics_layer_1/angular_velocity = 0.0 10:5/0 = 0 -10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_0/angular_velocity = 0.0 -10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:5/0/physics_layer_1/angular_velocity = 0.0 11:5/0 = 0 -11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_0/angular_velocity = 0.0 11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:5/0/physics_layer_1/angular_velocity = 0.0 12:5/0 = 0 -12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_0/angular_velocity = 0.0 12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:5/0/physics_layer_1/angular_velocity = 0.0 13:5/0 = 0 -13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_0/angular_velocity = 0.0 13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:5/0/physics_layer_1/angular_velocity = 0.0 14:5/0 = 0 -14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_0/angular_velocity = 0.0 -14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:5/0/physics_layer_1/angular_velocity = 0.0 15:5/0 = 0 -15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_0/angular_velocity = 0.0 -15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:5/0/physics_layer_1/angular_velocity = 0.0 16:5/0 = 0 -16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_0/angular_velocity = 0.0 -16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:5/0/physics_layer_1/angular_velocity = 0.0 8:6/0 = 0 -8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_0/angular_velocity = 0.0 -8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -8:6/0/physics_layer_1/angular_velocity = 0.0 9:6/0 = 0 -9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_0/angular_velocity = 0.0 -9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -9:6/0/physics_layer_1/angular_velocity = 0.0 10:6/0 = 0 -10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_0/angular_velocity = 0.0 -10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -10:6/0/physics_layer_1/angular_velocity = 0.0 11:6/0 = 0 -11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_0/angular_velocity = 0.0 11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5) -11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -11:6/0/physics_layer_1/angular_velocity = 0.0 12:6/0 = 0 -12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_0/angular_velocity = 0.0 12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -12:6/0/physics_layer_1/angular_velocity = 0.0 13:6/0 = 0 -13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_0/angular_velocity = 0.0 13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8) -13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -13:6/0/physics_layer_1/angular_velocity = 0.0 14:6/0 = 0 -14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_0/angular_velocity = 0.0 -14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -14:6/0/physics_layer_1/angular_velocity = 0.0 15:6/0 = 0 -15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_0/angular_velocity = 0.0 -15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -15:6/0/physics_layer_1/angular_velocity = 0.0 16:6/0 = 0 -16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_0/angular_velocity = 0.0 -16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) -16:6/0/physics_layer_1/angular_velocity = 0.0 5:3/0 = 0 -5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_0/angular_velocity = 0.0 -5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) -5:3/0/physics_layer_1/angular_velocity = 0.0 [sub_resource type="TileSet" id="TileSet_kf7eg"] physics_layer_0/collision_layer = 1 @@ -595,6 +195,7 @@ ease = 2 layer = -3 [node name="ColorRect" type="ColorRect" parent="Background"] +auto_translate_mode = 2 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 @@ -604,7 +205,6 @@ offset_right = 981.0 offset_bottom = 548.0 grow_horizontal = 2 grow_vertical = 2 -auto_translate = false localize_numeral_system = false color = Color(0.137255, 0.14902, 0.196078, 1) @@ -631,15 +231,19 @@ visible = false [node name="Camera2D" type="Camera2D" parent="."] position = Vector2(227, -28) +process_callback = 0 position_smoothing_speed = 10.0 [node name="PhantomCameraHost" type="Node" parent="Camera2D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("4_bb7en") [node name="Player" type="Node" parent="."] [node name="PlayerPhantomCamera2D" type="Node2D" parent="Player" node_paths=PackedStringArray("follow_target")] unique_name_in_owner = true +top_level = true position = Vector2(227, -28) script = ExtResource("5_kikl5") priority = 5 diff --git a/addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn b/addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn index 7d2ec5c..2ff6075 100644 --- a/addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn +++ b/addons/phantom_camera/examples/example_scenes/2D/sub_scenes/playable_character_2d.tscn @@ -2,7 +2,7 @@ [ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/player_character_body_2d.gd" id="1_jnc14"] [ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="2_62b2n"] -[ext_resource type="Texture2D" uid="uid://ci76plsequlrq" path="res://addons/phantom_camera/examples/textures/2D/player_sprite.svg" id="2_yr8cm"] +[ext_resource type="Texture2D" uid="uid://cscjjt55iw2cu" path="res://addons/phantom_camera/examples/textures/2D/player_sprite.svg" id="2_yr8cm"] [ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd" id="4_rloon"] [ext_resource type="Resource" uid="uid://cecrnq0wnkexh" path="res://addons/phantom_camera/examples/resources/tween/item_focus_phantom_camera_2d_tween.tres" id="5_4iyk1"] [ext_resource type="Resource" uid="uid://cllveybboaqk5" path="res://addons/phantom_camera/examples/resources/tween/inventory_phantom_camera_2d_tween.tres" id="6_2h6fv"] diff --git a/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_example_scene.tscn new file mode 100644 index 0000000..c3c90f4 --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_example_scene.tscn @@ -0,0 +1,407 @@ +[gd_scene load_steps=41 format=3 uid="uid://cypbptekk8etg"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_u86qq"] +[ext_resource type="PackedScene" uid="uid://bulsh7s0ibmao" path="res://addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_3d.tscn" id="2_jl1he"] +[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="3_an0dt"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller_4.4.gd" id="3_yfuq5"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="4_iy6qn"] +[ext_resource type="Resource" uid="uid://cptfoggk2ok67" path="res://addons/phantom_camera/examples/resources/tween/player_phantom_camera_3d_tween.tres" id="5_0ku52"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="6_prr6u"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/npc.gd" id="7_nl3ax"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="8_xvqcg"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/3d_trigger_area.gd" id="9_hqgwi"] +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="10_cd0kn"] + +[sub_resource type="Resource" id="Resource_jtk1d"] +script = ExtResource("6_prr6u") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="Resource" id="Resource_o161n"] +script = ExtResource("6_prr6u") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="BoxMesh" id="BoxMesh_7tjw4"] +size = Vector3(2, 0.5, 4) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_hpllm"] +transparency = 1 +albedo_color = Color(0.988235, 0.478431, 0.905882, 0.0901961) + +[sub_resource type="BoxShape3D" id="BoxShape3D_65o6h"] +size = Vector3(2, 0.5, 4) + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_tpc7d"] + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_g0eml"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_v5iy7"] +albedo_color = Color(0.988235, 0.478431, 0.905882, 1) + +[sub_resource type="Resource" id="Resource_tpvee"] +script = ExtResource("8_xvqcg") +duration = 0.0 +transition = 0 +ease = 2 + +[sub_resource type="Resource" id="Resource_bxbnv"] +script = ExtResource("6_prr6u") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="BoxShape3D" id="BoxShape3D_wcrbb"] +size = Vector3(6.8, 0.1, 5.4) + +[sub_resource type="Resource" id="Resource_7ih0k"] +script = ExtResource("8_xvqcg") +duration = 0.0 +transition = 0 +ease = 2 + +[sub_resource type="Resource" id="Resource_4iyps"] +script = ExtResource("6_prr6u") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="BoxShape3D" id="BoxShape3D_ctyr8"] +size = Vector3(7.4, 0.1, 3.6) + +[sub_resource type="Resource" id="Resource_x5y0u"] +script = ExtResource("8_xvqcg") +duration = 0.0 +transition = 0 +ease = 2 + +[sub_resource type="Resource" id="Resource_pgiyx"] +script = ExtResource("6_prr6u") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="BoxShape3D" id="BoxShape3D_ua072"] +size = Vector3(6.8, 0.1, 3.6) + +[sub_resource type="BoxMesh" id="BoxMesh_ugc3s"] +size = Vector3(1, 1, 2) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_68thd"] +albedo_color = Color(0.34902, 0.862745, 0.854902, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_wphly"] +size = Vector3(1, 0.5, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_gyp5s"] +size = Vector3(20, 40, 30) + +[sub_resource type="BoxShape3D" id="BoxShape3D_lfaqs"] +size = Vector3(20, 40, 30) + +[sub_resource type="BoxMesh" id="BoxMesh_n70lt"] +size = Vector3(14, 40, 6) + +[sub_resource type="BoxShape3D" id="BoxShape3D_jxmqm"] +size = Vector3(14, 40, 6) + +[sub_resource type="BoxMesh" id="BoxMesh_x0tgm"] +size = Vector3(8, 40, 1) + +[sub_resource type="BoxShape3D" id="BoxShape3D_t67ef"] +size = Vector3(50, 40, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_rmslh"] +size = Vector3(0.5, 6, 13.5) + +[sub_resource type="BoxMesh" id="BoxMesh_242ij"] +size = Vector3(2, 3, 3) + +[sub_resource type="BoxMesh" id="BoxMesh_niuda"] +size = Vector3(8, 6, 0.5) + +[node name="Root" type="Node3D"] + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 0.948876, 0.315649, 0, -0.315649, 0.948876, -2.53871, 2, 9.76232) + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 +script = ExtResource("1_u86qq") + +[node name="PlayerGroup" type="Node" parent="."] + +[node name="PlayerCharacterBody3D" parent="PlayerGroup" instance=ExtResource("2_jl1he")] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.53871, 0.5, 7.26232) +script = ExtResource("3_yfuq5") + +[node name="MovementInstructionsLabel" type="Label3D" parent="PlayerGroup"] +transform = Transform3D(1, 0, 0, 0, 0.866025, 0.5, 0, -0.5, 0.866025, -2.47682, -0.0708016, 7.93048) +modulate = Color(0.294118, 1, 0.631373, 1) +text = "[WASD] to move" +font = ExtResource("3_an0dt") +font_size = 48 + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="PlayerGroup" node_paths=PackedStringArray("follow_target")] +unique_name_in_owner = true +transform = Transform3D(0.999858, 0, 0, 0, 0.94884, 0.315632, 0, -0.315637, 0.948825, -2.53871, 2, 9.76232) +top_level = true +script = ExtResource("4_iy6qn") +priority = 10 +follow_mode = 2 +follow_target = NodePath("../PlayerCharacterBody3D") +tween_resource = ExtResource("5_0ku52") +tween_on_load = false +camera_3d_resource = SubResource("Resource_jtk1d") +follow_offset = Vector3(0, 1.5, 2.5) +follow_damping = true + +[node name="NPCGroup" type="Node" parent="."] + +[node name="NPCPhantomCamera3D" type="Node3D" parent="NPCGroup"] +unique_name_in_owner = true +transform = Transform3D(0.616596, -0.109786, 0.779587, -2.23517e-08, 0.990229, 0.13945, -0.78728, -0.0859841, 0.610571, -2.98802, 1.50739, 1.19719) +script = ExtResource("4_iy6qn") +tween_resource = ExtResource("5_0ku52") +camera_3d_resource = SubResource("Resource_o161n") + +[node name="NPCDescriptionLabel" type="Label3D" parent="NPCGroup"] +transform = Transform3D(1, 0, 0, 0, 0.866026, 0.5, 0, -0.5, 0.866025, -3.04693, 0.367287, 0.953757) +text = "Input Example" +font = ExtResource("3_an0dt") + +[node name="NPCDialogueExampleLabel" type="Label3D" parent="NPCGroup"] +unique_name_in_owner = true +transform = Transform3D(1, 4.54671e-10, 1.65487e-10, 4.25644e-10, 0.939693, 0.34202, 0, -0.34202, 0.939693, -4.46738, 1.58641, -0.253679) +modulate = Color(1, 0.603922, 0.254902, 1) +text = "Press [ F ] to change camera" +font = ExtResource("3_an0dt") + +[node name="NPCInteractionZoneMesh" type="MeshInstance3D" parent="NPCGroup"] +transform = Transform3D(0.819152, 4.83851e-10, -0.573576, -3.92481e-09, 1, -6.3473e-09, 0.573576, 7.45058e-09, 0.819152, -3.46138, -0.4, 0.875321) +mesh = SubResource("BoxMesh_7tjw4") +skeleton = NodePath("../..") +surface_material_override/0 = SubResource("StandardMaterial3D_hpllm") +metadata/_edit_group_ = true + +[node name="NPCInteractionArea3D" type="Area3D" parent="NPCGroup/NPCInteractionZoneMesh"] +unique_name_in_owner = true +transform = Transform3D(1, -2.68591e-26, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +monitorable = false + +[node name="NPCInterationCollisionShape3D" type="CollisionShape3D" parent="NPCGroup/NPCInteractionZoneMesh/NPCInteractionArea3D"] +shape = SubResource("BoxShape3D_65o6h") + +[node name="NPC" type="StaticBody3D" parent="NPCGroup"] +transform = Transform3D(1, 4.83851e-10, 0, 4.25644e-10, 1, -7.45058e-09, 0, 7.45058e-09, 1, -4.56338, 0.5, -0.272679) +script = ExtResource("7_nl3ax") + +[node name="PlayerCollisionShape3D2" type="CollisionShape3D" parent="NPCGroup/NPC"] +transform = Transform3D(1, -2.68591e-26, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +shape = SubResource("CapsuleShape3D_tpc7d") + +[node name="NPCMesh" type="MeshInstance3D" parent="NPCGroup/NPC"] +transform = Transform3D(1, -2.68591e-26, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +mesh = SubResource("CapsuleMesh_g0eml") +skeleton = NodePath("../../..") +surface_material_override/0 = SubResource("StandardMaterial3D_v5iy7") + +[node name="MoveToLocation" type="Node3D" parent="NPCGroup"] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.70084, 0.5, 0.962891) + +[node name="FixedCameraTriggerZone" type="Node" parent="."] + +[node name="FixedCameraLabel" type="Label3D" parent="FixedCameraTriggerZone"] +unique_name_in_owner = true +transform = Transform3D(0.939693, 0.280167, -0.196175, 1.49012e-08, 0.573577, 0.819152, 0.34202, -0.769751, 0.538986, -0.538716, -0.247626, 3.13456) +text = "Fixed Camera +Example" +font = ExtResource("3_an0dt") + +[node name="NorthRoomPhantomCamera3D" type="Node3D" parent="FixedCameraTriggerZone"] +transform = Transform3D(0.38357, -0.555836, 0.737507, -0.105898, 0.766851, 0.633027, -0.917417, -0.320912, 0.235279, 6.89638, 4.73986, 0.115512) +script = ExtResource("4_iy6qn") +tween_resource = SubResource("Resource_tpvee") +camera_3d_resource = SubResource("Resource_bxbnv") + +[node name="NorthRoomTrigger" type="Area3D" parent="FixedCameraTriggerZone" node_paths=PackedStringArray("area_pcam")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3, -0.45, -0.9) +priority = 5 +script = ExtResource("9_hqgwi") +area_pcam = NodePath("../NorthRoomPhantomCamera3D") +metadata/_edit_group_ = true + +[node name="CollisionShape3D" type="CollisionShape3D" parent="FixedCameraTriggerZone/NorthRoomTrigger"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.6, 0, -0.4) +shape = SubResource("BoxShape3D_wcrbb") + +[node name="EntryRoomPhantomCamera3D" type="Node3D" parent="FixedCameraTriggerZone"] +transform = Transform3D(0.258818, -0.482963, 0.836515, 1.3027e-15, 0.866025, 0.499999, -0.965924, -0.129409, 0.224143, 6.69741, 4.73364, 4.02374) +script = ExtResource("4_iy6qn") +tween_resource = SubResource("Resource_7ih0k") +camera_3d_resource = SubResource("Resource_4iyps") + +[node name="EntryRoomTrigger" type="Area3D" parent="FixedCameraTriggerZone" node_paths=PackedStringArray("area_pcam")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.00003, -0.454982, 3.00572) +priority = 5 +script = ExtResource("9_hqgwi") +area_pcam = NodePath("../EntryRoomPhantomCamera3D") +metadata/_edit_group_ = true + +[node name="CollisionShape3D" type="CollisionShape3D" parent="FixedCameraTriggerZone/EntryRoomTrigger"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.3, 0, 0.2) +shape = SubResource("BoxShape3D_ctyr8") + +[node name="SouthRoomPhantomCamera3D" type="Node3D" parent="FixedCameraTriggerZone"] +transform = Transform3D(-0.766043, -0.492403, 0.413175, 0, 0.642787, 0.766043, -0.642786, 0.586825, -0.492403, 6.89741, 4.73364, 5.62374) +script = ExtResource("4_iy6qn") +tween_resource = SubResource("Resource_x5y0u") +camera_3d_resource = SubResource("Resource_pgiyx") + +[node name="SouthRoomTrigger" type="Area3D" parent="FixedCameraTriggerZone" node_paths=PackedStringArray("area_pcam")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3, -0.45, 6.7) +priority = 5 +script = ExtResource("9_hqgwi") +area_pcam = NodePath("../SouthRoomPhantomCamera3D") +metadata/_edit_group_ = true + +[node name="CollisionShape3D" type="CollisionShape3D" parent="FixedCameraTriggerZone/SouthRoomTrigger"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.6, 0, 0.1) +shape = SubResource("BoxShape3D_ua072") + +[node name="CSGMesh3D" type="CSGMesh3D" parent="FixedCameraTriggerZone"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.14238, 1.82571, 2.88655) +mesh = SubResource("BoxMesh_ugc3s") +material = SubResource("StandardMaterial3D_68thd") + +[node name="CSGMesh3D2" type="CSGMesh3D" parent="FixedCameraTriggerZone/CSGMesh3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.00192642, -0.0120339, 0.00494432) +operation = 2 +mesh = SubResource("BoxMesh_wphly") +material = SubResource("StandardMaterial3D_68thd") + +[node name="Environment" type="Node" parent="."] + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="Environment" type="Node3D" parent="Environment"] + +[node name="Floor" parent="Environment/Environment" instance=ExtResource("10_cd0kn")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="West Wall" type="StaticBody3D" parent="Environment/Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16, 0.5, 0) +metadata/_edit_group_ = true +metadata/_edit_lock_ = true + +[node name="MeshInstance3D2" type="MeshInstance3D" parent="Environment/Environment/West Wall"] +mesh = SubResource("BoxMesh_gyp5s") +skeleton = NodePath("") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Environment/Environment/West Wall"] +shape = SubResource("BoxShape3D_lfaqs") + +[node name="East Wall" type="StaticBody3D" parent="Environment/Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 16.999, 0.502, 0) +metadata/_edit_group_ = true +metadata/_edit_lock_ = true + +[node name="MeshInstance3D2" type="MeshInstance3D" parent="Environment/Environment/East Wall"] +mesh = SubResource("BoxMesh_gyp5s") +skeleton = NodePath("") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Environment/Environment/East Wall"] +shape = SubResource("BoxShape3D_lfaqs") + +[node name="North Wall" type="StaticBody3D" parent="Environment/Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, -6.90828) +metadata/_edit_group_ = true +metadata/_edit_lock_ = true + +[node name="MeshInstance3D2" type="MeshInstance3D" parent="Environment/Environment/North Wall"] +mesh = SubResource("BoxMesh_n70lt") +skeleton = NodePath("") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Environment/Environment/North Wall"] +shape = SubResource("BoxShape3D_jxmqm") + +[node name="South Wall" type="StaticBody3D" parent="Environment/Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.25, 0.5, 9.087) +metadata/_edit_group_ = true + +[node name="MeshInstance3D3" type="MeshInstance3D" parent="Environment/Environment/South Wall"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 0, 0) +mesh = SubResource("BoxMesh_x0tgm") +skeleton = NodePath("") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Environment/Environment/South Wall"] +shape = SubResource("BoxShape3D_t67ef") + +[node name="FixedCamOuterWall" type="CSGMesh3D" parent="Environment/Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, 2) +use_collision = true +mesh = SubResource("BoxMesh_rmslh") + +[node name="FixedCamOuterDoorway" type="CSGMesh3D" parent="Environment/Environment/FixedCamOuterWall"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1.5, 1) +operation = 2 +mesh = SubResource("BoxMesh_242ij") + +[node name="FixedCamNorthWall" type="CSGMesh3D" parent="Environment/Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 2.5, 1) +use_collision = true +mesh = SubResource("BoxMesh_niuda") + +[node name="FixedCamNorthDoorway" type="CSGMesh3D" parent="Environment/Environment/FixedCamNorthWall"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1.5, 0) +operation = 2 +mesh = SubResource("BoxMesh_242ij") + +[node name="FixedCamSouthWall" type="CSGMesh3D" parent="Environment/Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 2.5, 5.1) +use_collision = true +mesh = SubResource("BoxMesh_niuda") + +[node name="FixedCamSouthDoorway" type="CSGMesh3D" parent="Environment/Environment/FixedCamSouthWall"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1.50541, 1.19209e-07) +operation = 2 +mesh = SubResource("BoxMesh_242ij") diff --git a/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_framed_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_framed_example_scene.tscn new file mode 100644 index 0000000..427c6cc --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_framed_example_scene.tscn @@ -0,0 +1,155 @@ +[gd_scene load_steps=11 format=3 uid="uid://cx7x48cpi8gcd"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_6uslv"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="2_5cpe8"] +[ext_resource type="Resource" uid="uid://cptfoggk2ok67" path="res://addons/phantom_camera/examples/resources/tween/player_phantom_camera_3d_tween.tres" id="3_422w7"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="4_4qurp"] +[ext_resource type="PackedScene" uid="uid://bulsh7s0ibmao" path="res://addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_3d.tscn" id="5_uw36d"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller_4.4.gd" id="6_fcomr"] +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="6_i060b"] +[ext_resource type="Texture2D" uid="uid://c7ja4woxol8yc" path="res://addons/phantom_camera/examples/textures/3D/checker_pattern_dark.png" id="7_iyghi"] + +[sub_resource type="Resource" id="Resource_wg1pr"] +script = ExtResource("4_4qurp") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_auy8m"] +albedo_texture = ExtResource("7_iyghi") +uv1_triplanar = true +uv1_world_triplanar = true + +[node name="Root" type="Node3D"] + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 0.793353, 0.608762, 0, -0.608762, 0.793353, 0.083587, 2.94168, 5.22787) + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 +script = ExtResource("1_6uslv") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="Player" type="Node" parent="."] + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="Player" node_paths=PackedStringArray("follow_target")] +unique_name_in_owner = true +transform = Transform3D(0.99995, 0, 0, 0, 0.79324, 0.608671, 0, -0.608675, 0.793235, 0.083587, 2.94168, 5.22787) +top_level = true +script = ExtResource("2_5cpe8") +follow_mode = 5 +follow_target = NodePath("../PlayerCharacterBody3D2") +tween_resource = ExtResource("3_422w7") +tween_on_load = false +camera_3d_resource = SubResource("Resource_wg1pr") +follow_damping = true +follow_distance = 4.0 +dead_zone_width = 0.139 +dead_zone_height = 0.14 +show_viewfinder_in_play = true +spring_length = 4.0 + +[node name="PlayerCharacterBody3D2" parent="Player" instance=ExtResource("5_uw36d")] +script = ExtResource("6_fcomr") + +[node name="Environment" type="Node" parent="."] + +[node name="Floor" parent="Environment" instance=ExtResource("6_i060b")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="CSGCylinder3D" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.636134, 0.805455, -6.37532) +use_collision = true +radius = 1.71971 +height = 2.61091 +sides = 32 + +[node name="CSGCylinder3D5" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7.54597, -0.540694, -3.39517) +use_collision = true +radius = 1.53269 +height = 2.5036 +sides = 32 + +[node name="CSGCylinder3D6" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.64877, -1.50101, 1.22863) +use_collision = true +radius = 1.57419 +height = 3.47475 +sides = 32 + +[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10.4732, 0.805455, -8.78984) +use_collision = true +radius = 0.956285 +height = 2.61091 +sides = 32 + +[node name="CSGSphere3D" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.40027, -1.69814, 3.36997) +use_collision = true +radius = 3.34732 +rings = 32 + +[node name="CSGSphere3D2" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.13768, -0.599204, -1.04651) +use_collision = true +radius = 2.65844 +rings = 32 + +[node name="CSGSphere3D3" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -11.7976, -0.599204, -2.42244) +use_collision = true +radius = 2.14606 +rings = 32 + +[node name="CSGTorus3D2" type="CSGTorus3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.84078, -0.497663, 4.44352) +use_collision = true +inner_radius = 0.971543 +outer_radius = 2.15226 +sides = 32 +ring_sides = 18 + +[node name="CSGBox3D" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.52545, 6.53866, -12.6331) +use_collision = true +size = Vector3(178.429, 14.0773, 1) +material = SubResource("StandardMaterial3D_auy8m") + +[node name="CSGBox3D2" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.88916, 0.760708, -6.1376) +use_collision = true +size = Vector3(2.64182, 2.52142, 2.30997) + +[node name="CSGBox3D5" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.83837, -0.241718, 7.14677) +use_collision = true +size = Vector3(3.80964, 1.67049, 0.932048) + +[node name="CSGBox3D3" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.34377, 0.138478, -4.36159) +use_collision = true +size = Vector3(1.53893, 1.27695, 1.80814) + +[node name="CSGBox3D6" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10.9834, 0.138478, -1.89037) +use_collision = true +size = Vector3(4.03502, 1.27695, 5.2198) + +[node name="CSGBox3D4" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8.38147, 0.0440434, 8.36617) +use_collision = true +size = Vector3(4.57784, 1.08809, 3.11285) diff --git a/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_glued_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_glued_example_scene.tscn new file mode 100644 index 0000000..302db04 --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_glued_example_scene.tscn @@ -0,0 +1,209 @@ +[gd_scene load_steps=15 format=3 uid="uid://d2lx45noxq685"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_7a3wq"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="2_158c0"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="3_ganw1"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="4_kig2n"] +[ext_resource type="PackedScene" uid="uid://bulsh7s0ibmao" path="res://addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_3d.tscn" id="5_caky3"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller_4.4.gd" id="6_b6ic4"] +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="6_kkbaa"] +[ext_resource type="Texture2D" uid="uid://c7ja4woxol8yc" path="res://addons/phantom_camera/examples/textures/3D/checker_pattern_dark.png" id="7_i1dbs"] + +[sub_resource type="Resource" id="Resource_ucp3e"] +script = ExtResource("3_ganw1") +duration = 1.0 +transition = 0 +ease = 2 + +[sub_resource type="Resource" id="Resource_ab013"] +script = ExtResource("4_kig2n") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_2h36r"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_w3olp"] +albedo_color = Color(0.227451, 0.337255, 0.576471, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_cw102"] +albedo_color = Color(0.227451, 0.337255, 0.576471, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_auy8m"] +albedo_texture = ExtResource("7_i1dbs") +uv1_triplanar = true +uv1_world_triplanar = true + +[node name="Node3D" type="Node3D"] + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 0.638767, 0.7694, 0, -0.7694, 0.638768, 0, 6.39, 7) + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 +script = ExtResource("1_7a3wq") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="Player" type="Node" parent="."] + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="Player" node_paths=PackedStringArray("follow_target")] +unique_name_in_owner = true +transform = Transform3D(0.999954, 0, 0, 0, 0.638683, 0.769345, 0, -0.769298, 0.638723, 0, 6.39, 7) +top_level = true +script = ExtResource("2_158c0") +priority = 5 +follow_mode = 1 +follow_target = NodePath("../PlayerCharacterBody3D") +tween_resource = SubResource("Resource_ucp3e") +tween_on_load = false +camera_3d_resource = SubResource("Resource_ab013") +follow_damping = true +follow_damping_value = Vector3(0.3, 0.3, 0.3) + +[node name="PlayerCharacterBody3D" parent="Player" instance=ExtResource("5_caky3")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 6.39, 7) +script = ExtResource("6_b6ic4") +enable_gravity = false + +[node name="PlayerVisual" parent="Player/PlayerCharacterBody3D" index="2"] +visible = false + +[node name="NPCs" type="Node" parent="."] + +[node name="PlayerMeshInstance3D" type="MeshInstance3D" parent="NPCs"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.04486, 0.519002, -1.52506) +mesh = SubResource("CapsuleMesh_2h36r") +skeleton = NodePath("") +surface_material_override/0 = SubResource("StandardMaterial3D_w3olp") + +[node name="PlayerMeshInstance3D2" type="MeshInstance3D" parent="NPCs"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.51494, 0.519, 4.06618) +mesh = SubResource("CapsuleMesh_2h36r") +skeleton = NodePath("") +surface_material_override/0 = SubResource("StandardMaterial3D_cw102") + +[node name="Environment" type="Node" parent="."] + +[node name="Floor" parent="Environment" instance=ExtResource("6_kkbaa")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="CSGCylinder3D" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.62737, 0.805455, -6.37532) +use_collision = true +radius = 1.71971 +height = 2.61091 +sides = 32 + +[node name="CSGCylinder3D5" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 24.9378, 0.31181, -5.46661) +use_collision = true +radius = 2.77591 +height = 1.62362 +sides = 32 + +[node name="CSGCylinder3D6" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.58617, 0.31181, 6.6322) +use_collision = true +radius = 1.57419 +height = 3.47475 +sides = 32 + +[node name="CSGCylinder3D3" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 14.774, 0.201103, 2.71259) +use_collision = true +radius = 1.41311 +height = 1.40221 +sides = 32 + +[node name="CSGCylinder3D4" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.40488, 0.201101, 11.6804) +use_collision = true +radius = 2.21673 +height = 7.88261 +sides = 32 + +[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8.20971, 0.805455, -8.78984) +use_collision = true +radius = 0.956285 +height = 2.61091 +sides = 32 + +[node name="CSGSphere3D" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 14.9771, -1.69814, -6.51262) +use_collision = true +radius = 3.34732 +rings = 32 + +[node name="CSGSphere3D2" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.555532, -0.599204, 8.81048) +use_collision = true +radius = 2.65844 +rings = 32 + +[node name="CSGSphere3D3" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14.0611, -0.599204, -2.42244) +use_collision = true +radius = 2.14606 +rings = 32 + +[node name="CSGTorus3D" type="CSGTorus3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.21187, -1.90735e-06, 0.346393) +use_collision = true +inner_radius = 1.3 +outer_radius = 2.0 +sides = 32 +ring_sides = 18 + +[node name="CSGTorus3D2" type="CSGTorus3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 21.9283, -1.90735e-06, 7.89765) +use_collision = true +inner_radius = 0.971543 +outer_radius = 2.15226 +sides = 32 +ring_sides = 18 + +[node name="CSGBox3D" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.49828, 6.53866, -12.6331) +use_collision = true +size = Vector3(178.429, 14.0773, 1) +material = SubResource("StandardMaterial3D_auy8m") + +[node name="CSGBox3D2" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.15267, 0.760708, -6.1376) +use_collision = true +size = Vector3(2.64182, 2.52142, 2.30997) + +[node name="CSGBox3D5" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 14.3427, 0.335247, 8.22829) +use_collision = true +size = Vector3(3.80964, 1.67049, 0.932048) + +[node name="CSGBox3D3" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.08027, 0.138478, -4.36159) +use_collision = true +size = Vector3(1.53893, 1.27695, 1.80814) + +[node name="CSGBox3D6" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14.7748, 0.138478, 5.20734) +use_collision = true +size = Vector3(4.03502, 1.27695, 5.2198) + +[node name="CSGBox3D4" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 30.1473, 1.78638, -1.60318) +use_collision = true +size = Vector3(4.57784, 4.57276, 3.11285) + +[editable path="Player/PlayerCharacterBody3D"] diff --git a/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_group_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_group_example_scene.tscn new file mode 100644 index 0000000..01be18f --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_group_example_scene.tscn @@ -0,0 +1,179 @@ +[gd_scene load_steps=14 format=3 uid="uid://cqy81q5p0tsda"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_3iw7y"] +[ext_resource type="PackedScene" uid="uid://bulsh7s0ibmao" path="res://addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_3d.tscn" id="2_vcfky"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller_4.4.gd" id="3_2idlr"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="3_65wck"] +[ext_resource type="Resource" uid="uid://cptfoggk2ok67" path="res://addons/phantom_camera/examples/resources/tween/player_phantom_camera_3d_tween.tres" id="4_b0eay"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="5_i3ale"] +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="6_5hq8j"] +[ext_resource type="Texture2D" uid="uid://c7ja4woxol8yc" path="res://addons/phantom_camera/examples/textures/3D/checker_pattern_dark.png" id="7_7lab4"] + +[sub_resource type="Resource" id="Resource_1iman"] +script = ExtResource("5_i3ale") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_2h36r"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_w3olp"] +albedo_color = Color(0.227451, 0.337255, 0.576471, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_cw102"] +albedo_color = Color(0.227451, 0.337255, 0.576471, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_auy8m"] +albedo_texture = ExtResource("7_7lab4") +uv1_triplanar = true +uv1_world_triplanar = true + +[node name="Node3D" type="Node3D"] + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 0.906308, 0.422618, 0, -0.422618, 0.906308, -7.26116, 5.72974, 12.279) + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 +script = ExtResource("1_3iw7y") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="Player" type="Node" parent="."] + +[node name="PlayerCharacterBody3D2" parent="Player" instance=ExtResource("2_vcfky")] +script = ExtResource("3_2idlr") + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="Player" node_paths=PackedStringArray("follow_targets")] +unique_name_in_owner = true +transform = Transform3D(0.999954, 0, 0, 0, 0.906188, 0.422588, 0, -0.422562, 0.906243, -7.26116, 5.72974, 12.279) +top_level = true +script = ExtResource("3_65wck") +priority = 5 +follow_mode = 3 +follow_targets = [NodePath("../PlayerCharacterBody3D2"), NodePath("../../NPCs/PlayerMeshInstance3D"), NodePath("../../NPCs/PlayerMeshInstance3D2")] +tween_resource = ExtResource("4_b0eay") +tween_on_load = false +camera_3d_resource = SubResource("Resource_1iman") +follow_damping = true +follow_distance = 5.0 +auto_follow_distance = true +auto_follow_distance_min = 5.0 +auto_follow_distance_max = 15.0 +auto_follow_distance_divisor = 20.0 +spring_length = 5.0 + +[node name="NPCs" type="Node" parent="."] + +[node name="PlayerMeshInstance3D" type="MeshInstance3D" parent="NPCs"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14.6059, 0.519002, 0.128472) +mesh = SubResource("CapsuleMesh_2h36r") +skeleton = NodePath("") +surface_material_override/0 = SubResource("StandardMaterial3D_w3olp") + +[node name="PlayerMeshInstance3D2" type="MeshInstance3D" parent="NPCs"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10.0461, 0.519, 0.249913) +mesh = SubResource("CapsuleMesh_2h36r") +skeleton = NodePath("") +surface_material_override/0 = SubResource("StandardMaterial3D_cw102") + +[node name="Environment" type="Node" parent="."] + +[node name="Floor" parent="Environment" instance=ExtResource("6_5hq8j")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="Wall" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.52545, 6.53866, -12.6331) +use_collision = true +size = Vector3(178.429, 14.0773, 1) +material = SubResource("StandardMaterial3D_auy8m") + +[node name="CSGCylinder3D" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -13.6511, 0.805455, -6.37532) +use_collision = true +radius = 1.71971 +height = 2.61091 +sides = 32 + +[node name="CSGCylinder3D5" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.9141, 0.31181, -5.46661) +use_collision = true +radius = 2.77591 +height = 1.62362 +sides = 32 + +[node name="CSGCylinder3D6" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -21.6099, 0.31181, 6.6322) +use_collision = true +radius = 1.57419 +height = 3.47475 +sides = 32 + +[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.81402, 0.805455, -8.78984) +use_collision = true +radius = 0.956285 +height = 2.61091 +sides = 32 + +[node name="CSGSphere3D" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.95333, -1.69814, -6.51262) +use_collision = true +radius = 3.34732 +rings = 32 + +[node name="CSGSphere3D2" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -11.4682, -0.599204, 8.81048) +use_collision = true +radius = 2.65844 +rings = 32 + +[node name="CSGSphere3D3" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -26.0848, -0.599204, -2.42244) +use_collision = true +radius = 2.14606 +rings = 32 + +[node name="CSGTorus3D2" type="CSGTorus3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.90455, -1.90735e-06, 7.89765) +use_collision = true +inner_radius = 0.971543 +outer_radius = 2.15226 +sides = 32 +ring_sides = 18 + +[node name="CSGBox3D2" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -21.1764, 0.760708, -6.1376) +use_collision = true +size = Vector3(2.64182, 2.52142, 2.30997) + +[node name="CSGBox3D5" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.31901, 0.335247, 8.22829) +use_collision = true +size = Vector3(3.80964, 1.67049, 0.932048) + +[node name="CSGBox3D3" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.94346, 0.138478, -4.36159) +use_collision = true +size = Vector3(1.53893, 1.27695, 1.80814) + +[node name="CSGBox3D6" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -26.7985, 0.138478, 5.20734) +use_collision = true +size = Vector3(4.03502, 1.27695, 5.2198) + +[node name="CSGBox3D4" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 18.1236, 1.78638, -1.60318) +use_collision = true +size = Vector3(4.57784, 4.57276, 3.11285) diff --git a/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_path_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_path_example_scene.tscn new file mode 100644 index 0000000..fb8d086 --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_path_example_scene.tscn @@ -0,0 +1,241 @@ +[gd_scene load_steps=25 format=3 uid="uid://oo1y1sjdmr6k"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_p8ccw"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="2_8itog"] +[ext_resource type="Resource" uid="uid://cptfoggk2ok67" path="res://addons/phantom_camera/examples/resources/tween/player_phantom_camera_3d_tween.tres" id="3_xqpq0"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="4_akuuo"] +[ext_resource type="PackedScene" uid="uid://bulsh7s0ibmao" path="res://addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_3d.tscn" id="5_0nadx"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller_4.4.gd" id="6_7h7mx"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="6_mkxip"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/path_follow.gd" id="7_g1m51"] +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="8_a1h2k"] +[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="9_rk5lh"] + +[sub_resource type="Resource" id="Resource_ofv2c"] +script = ExtResource("4_akuuo") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="Resource" id="Resource_01tho"] +script = ExtResource("6_mkxip") +duration = 1.2 +transition = 3 +ease = 2 + +[sub_resource type="Resource" id="Resource_syh5m"] +script = ExtResource("4_akuuo") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="Curve3D" id="Curve3D_b33df"] +_data = { +"points": PackedVector3Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10), +"tilts": PackedFloat32Array(0, 0) +} +point_count = 2 + +[sub_resource type="BoxShape3D" id="BoxShape3D_aovgi"] +size = Vector3(6, 0.1, 10) + +[sub_resource type="BoxMesh" id="BoxMesh_0hdeh"] +size = Vector3(6, 0.1, 10) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_fsm1b"] +transparency = 1 +albedo_color = Color(0.988235, 0.478431, 0.905882, 0.0901961) + +[sub_resource type="Resource" id="Resource_xci4c"] +script = ExtResource("4_akuuo") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="Curve3D" id="Curve3D_8uw2x"] +_data = { +"points": PackedVector3Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0), +"tilts": PackedFloat32Array(0, 0) +} +point_count = 2 + +[sub_resource type="BoxShape3D" id="BoxShape3D_ctnqu"] +size = Vector3(12, 0.1, 4) + +[sub_resource type="BoxMesh" id="BoxMesh_f6dp8"] +size = Vector3(12, 0.1, 4) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_gwnkj"] +transparency = 1 +albedo_color = Color(0.568403, 0.988235, 0.762724, 0.0901961) + +[sub_resource type="BoxMesh" id="BoxMesh_7l3dh"] + +[sub_resource type="BoxMesh" id="BoxMesh_as6ok"] + +[node name="Root" type="Node3D"] + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(0.999996, -0.00216283, 0.00184472, 0, 0.648938, 0.760841, -0.00284268, -0.760838, 0.648936, 0, 2.507, 1.5) + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 +script = ExtResource("1_p8ccw") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")] +unique_name_in_owner = true +transform = Transform3D(0.999807, -0.00216249, 0.00184445, 0, 0.648836, 0.760728, -0.00284214, -0.760718, 0.648839, 0, 2.507, 1.5) +top_level = true +script = ExtResource("2_8itog") +priority = 10 +follow_mode = 2 +follow_target = NodePath("../PlayerCharacterBody3D2") +tween_resource = ExtResource("3_xqpq0") +tween_on_load = false +camera_3d_resource = SubResource("Resource_ofv2c") +follow_offset = Vector3(0, 2, 1.5) +follow_damping = true + +[node name="PlayerCharacterBody3D2" parent="." instance=ExtResource("5_0nadx")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.507, 0) +script = ExtResource("6_7h7mx") + +[node name="Paths" type="Node" parent="."] + +[node name="PathPhantomCamera3D" type="Node3D" parent="Paths" node_paths=PackedStringArray("follow_target", "follow_path")] +transform = Transform3D(-4.37114e-08, -1, -4.37114e-08, 0, -4.37114e-08, 1, -1, 4.37114e-08, 1.91069e-15, -0.31028, 7.9199, -1.60976) +top_level = true +script = ExtResource("2_8itog") +priority = 2 +follow_mode = 4 +follow_target = NodePath("../../PlayerCharacterBody3D2") +follow_path = NodePath("../FollowPath") +tween_resource = SubResource("Resource_01tho") +camera_3d_resource = SubResource("Resource_syh5m") +follow_damping = true + +[node name="FollowPath" type="Path3D" parent="Paths"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.31028, 7.9199, -1.60976) +curve = SubResource("Curve3D_b33df") + +[node name="StraightPathFollowTrigger" type="Area3D" parent="Paths" node_paths=PackedStringArray("path_pcam")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0420399, -0.45, -6.73666) +priority = 5 +script = ExtResource("7_g1m51") +path_pcam = NodePath("../PathPhantomCamera3D") +metadata/_edit_group_ = true + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Paths/StraightPathFollowTrigger"] +shape = SubResource("BoxShape3D_aovgi") + +[node name="NPCInteractionZoneMesh" type="MeshInstance3D" parent="Paths/StraightPathFollowTrigger/CollisionShape3D"] +mesh = SubResource("BoxMesh_0hdeh") +skeleton = NodePath("../../../..") +surface_material_override/0 = SubResource("StandardMaterial3D_fsm1b") +metadata/_edit_group_ = true + +[node name="PathPhantomCamera3D2" type="Node3D" parent="Paths" node_paths=PackedStringArray("follow_target", "follow_path")] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 7.9199, -13.4572) +top_level = true +visible = false +script = ExtResource("2_8itog") +priority = 2 +follow_mode = 4 +follow_target = NodePath("../../PlayerCharacterBody3D2") +follow_path = NodePath("../FollowPath2") +tween_resource = SubResource("Resource_01tho") +camera_3d_resource = SubResource("Resource_xci4c") +follow_damping = true +follow_damping_value = Vector3(0.6, 0.1, 0.1) + +[node name="FollowPath2" type="Path3D" parent="Paths"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.97141, 7.9199, -13.4572) +curve = SubResource("Curve3D_8uw2x") + +[node name="StraightPathFollowTrigger2" type="Area3D" parent="Paths" node_paths=PackedStringArray("path_pcam")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0420399, 0, -13.7367) +priority = 5 +script = ExtResource("7_g1m51") +path_pcam = NodePath("../PathPhantomCamera3D2") +metadata/_edit_group_ = true + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Paths/StraightPathFollowTrigger2"] +shape = SubResource("BoxShape3D_ctnqu") + +[node name="NPCInteractionZoneMesh" type="MeshInstance3D" parent="Paths/StraightPathFollowTrigger2/CollisionShape3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.45, 0) +mesh = SubResource("BoxMesh_f6dp8") +skeleton = NodePath("../../../..") +surface_material_override/0 = SubResource("StandardMaterial3D_gwnkj") +metadata/_edit_group_ = true + +[node name="Environment" type="Node" parent="."] + +[node name="Floor" parent="Environment" instance=ExtResource("8_a1h2k")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="Floor3" parent="Environment" instance=ExtResource("8_a1h2k")] +transform = Transform3D(6, 0, 0, 0, 1, 0, 0, 0, 1, -0.44204, 0, 1.76334) + +[node name="Floor2" parent="Environment/Floor3" instance=ExtResource("8_a1h2k")] +transform = Transform3D(0.166667, 0, 0, 0, 3, 0, 0, 0, 14, -0.516667, 1, -6.5) + +[node name="Floor5" parent="Environment/Floor3" instance=ExtResource("8_a1h2k")] +transform = Transform3D(0.166667, 0, 0, 0, 3, 0, 0, 0, 14, 0.65, 1, -6.5) + +[node name="Floor4" parent="Environment/Floor3" instance=ExtResource("8_a1h2k")] +transform = Transform3D(2, 0, 0, 0, 3, 0, 0, 0, 1, 0.0666667, 1, -18) + +[node name="Floor6" parent="Environment/Floor3" instance=ExtResource("8_a1h2k")] +transform = Transform3D(0.333333, 0, 0, 0, 3, 0, 0, 0, 1, -0.766667, 1, -13) +mesh = SubResource("BoxMesh_7l3dh") + +[node name="Floor8" parent="Environment/Floor3" instance=ExtResource("8_a1h2k")] +transform = Transform3D(0.166667, 0, 0, 0, 3, 0, 0, 0, 6, -1.01667, 1, -15.5) +mesh = SubResource("BoxMesh_as6ok") + +[node name="Floor9" parent="Environment/Floor3" instance=ExtResource("8_a1h2k")] +transform = Transform3D(0.166667, 0, 0, 0, 3, 0, 0, 0, 6, 1.15, 1, -15.5) +mesh = SubResource("BoxMesh_as6ok") + +[node name="Floor7" parent="Environment/Floor3" instance=ExtResource("8_a1h2k")] +transform = Transform3D(0.333333, 0, 0, 0, 3, 0, 0, 0, 1, 0.9, 1, -13) +mesh = SubResource("BoxMesh_7l3dh") + +[node name="NPCDescriptionLabel" type="Label3D" parent="Environment"] +transform = Transform3D(5.21541e-08, -1, -7.7486e-07, -1.10675e-15, 2.23517e-07, 0.999999, -0.999999, -7.45058e-08, -5.68829e-14, -3.47306, 2.59595, -5.51755) +text = "Camera follows player while confined to a Path3D" +font = ExtResource("9_rk5lh") +font_size = 64 + +[node name="MovementInstructionsLabel" type="Label3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, -0.02174, -0.455369, 0.570585) +modulate = Color(0.294118, 1, 0.631373, 1) +text = "[WASD] to move" +font = ExtResource("9_rk5lh") +font_size = 48 diff --git a/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_simple_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_simple_example_scene.tscn new file mode 100644 index 0000000..49ab893 --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_simple_example_scene.tscn @@ -0,0 +1,162 @@ +[gd_scene load_steps=12 format=3 uid="uid://c7uyfhhnrmkbx"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_gt67h"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="2_4ltlo"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="3_hldrt"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="4_pqibl"] +[ext_resource type="PackedScene" uid="uid://bulsh7s0ibmao" path="res://addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_3d.tscn" id="5_o4k7v"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller_4.4.gd" id="6_8yuc5"] +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="6_m6ich"] +[ext_resource type="Texture2D" uid="uid://c7ja4woxol8yc" path="res://addons/phantom_camera/examples/textures/3D/checker_pattern_dark.png" id="7_pagh0"] + +[sub_resource type="Resource" id="Resource_28vpp"] +script = ExtResource("3_hldrt") +duration = 1.0 +transition = 0 +ease = 2 + +[sub_resource type="Resource" id="Resource_axopo"] +script = ExtResource("4_pqibl") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_auy8m"] +albedo_texture = ExtResource("7_pagh0") +uv1_triplanar = true +uv1_world_triplanar = true + +[node name="Node3D2" type="Node3D"] + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 0.906308, 0.422618, 0, -0.422618, 0.906308, -13.2122, 2.5, 10.4016) + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 +script = ExtResource("1_gt67h") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="Player" type="Node" parent="."] + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="Player" node_paths=PackedStringArray("follow_target")] +unique_name_in_owner = true +transform = Transform3D(0.999954, 0, 0, 0, 0.906188, 0.422588, 0, -0.422562, 0.906243, -13.2122, 2.5, 10.4016) +top_level = true +script = ExtResource("2_4ltlo") +priority = 10 +follow_mode = 2 +follow_target = NodePath("../PlayerCharacterBody3D") +tween_resource = SubResource("Resource_28vpp") +tween_on_load = false +camera_3d_resource = SubResource("Resource_axopo") +follow_offset = Vector3(0, 2, 2) +follow_damping = true + +[node name="PlayerCharacterBody3D" parent="Player" instance=ExtResource("5_o4k7v")] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -13.2122, 0.5, 8.40162) +script = ExtResource("6_8yuc5") + +[node name="NPCs" type="Node" parent="."] + +[node name="Environment" type="Node" parent="."] + +[node name="Floor" parent="Environment" instance=ExtResource("6_m6ich")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="CSGCylinder3D" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -13.6511, 0.805455, -6.37532) +use_collision = true +radius = 1.71971 +height = 2.61091 +sides = 32 + +[node name="CSGCylinder3D5" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -21.8332, -0.540694, -3.39517) +use_collision = true +radius = 1.53269 +height = 2.5036 +sides = 32 + +[node name="CSGCylinder3D6" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.936, -1.50101, 1.22863) +use_collision = true +radius = 1.57419 +height = 3.47475 +sides = 32 + +[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.81402, 0.805455, -8.78984) +use_collision = true +radius = 0.956285 +height = 2.61091 +sides = 32 + +[node name="CSGSphere3D" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -23.6875, -1.69814, 3.36997) +use_collision = true +radius = 3.34732 +rings = 32 + +[node name="CSGSphere3D2" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.14955, -0.599204, -1.04651) +use_collision = true +radius = 2.65844 +rings = 32 + +[node name="CSGSphere3D3" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -26.0848, -0.599204, -2.42244) +use_collision = true +radius = 2.14606 +rings = 32 + +[node name="CSGTorus3D2" type="CSGTorus3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.44645, -0.497663, 4.44352) +use_collision = true +inner_radius = 0.971543 +outer_radius = 2.15226 +sides = 32 +ring_sides = 18 + +[node name="CSGBox3D" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.52545, 6.53866, -12.6331) +use_collision = true +size = Vector3(178.429, 14.0773, 1) +material = SubResource("StandardMaterial3D_auy8m") + +[node name="CSGBox3D2" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -21.1764, 0.760708, -6.1376) +use_collision = true +size = Vector3(2.64182, 2.52142, 2.30997) + +[node name="CSGBox3D5" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -18.1256, 0.335247, 7.14677) +use_collision = true +size = Vector3(3.80964, 1.67049, 0.932048) + +[node name="CSGBox3D3" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.94346, 0.138478, -4.36159) +use_collision = true +size = Vector3(1.53893, 1.27695, 1.80814) + +[node name="CSGBox3D6" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.30382, 0.138478, -1.89037) +use_collision = true +size = Vector3(4.03502, 1.27695, 5.2198) + +[node name="CSGBox3D4" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.04727, 0.0440434, 8.36617) +use_collision = true +size = Vector3(4.57784, 1.08809, 3.11285) diff --git a/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_third_person_attribtues_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_third_person_attribtues_example_scene.tscn new file mode 100644 index 0000000..1a86f2e --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_third_person_attribtues_example_scene.tscn @@ -0,0 +1,218 @@ +[gd_scene load_steps=22 format=3 uid="uid://bklrp02eywxsx"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="1_s26cy"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="2_m2d6w"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="3_l7kg8"] +[ext_resource type="PackedScene" uid="uid://mskcwn1a1v6d" path="res://addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_third_person_3d.tscn" id="4_qcyfd"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="5_8von1"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller_third_person_4.4.gd" id="5_tarnu"] +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="6_o1fj6"] +[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="7_amcmx"] +[ext_resource type="Texture2D" uid="uid://c3mskbmvnpwux" path="res://addons/phantom_camera/examples/textures/3D/target.png" id="8_rjcgw"] + +[sub_resource type="Resource" id="Resource_8fhct"] +script = ExtResource("2_m2d6w") +duration = 0.3 +transition = 2 +ease = 1 + +[sub_resource type="Resource" id="Resource_7m0fv"] +script = ExtResource("3_l7kg8") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="CameraAttributesPractical" id="CameraAttributesPractical_i42vj"] +dof_blur_far_enabled = true +dof_blur_far_distance = 5.99 +dof_blur_near_enabled = true +dof_blur_near_distance = 0.05 +dof_blur_amount = 0.21 + +[sub_resource type="Resource" id="Resource_e7t18"] +script = ExtResource("2_m2d6w") +duration = 0.4 +transition = 2 +ease = 1 + +[sub_resource type="Resource" id="Resource_jogxh"] +script = ExtResource("3_l7kg8") +cull_mask = 1048575 +h_offset = 1.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="CameraAttributesPractical" id="CameraAttributesPractical_fvhx5"] +dof_blur_far_enabled = true +dof_blur_far_distance = 31.1 +dof_blur_near_enabled = true +dof_blur_near_distance = 1.79 + +[sub_resource type="CameraAttributesPractical" id="CameraAttributesPractical_5mfg2"] +dof_blur_far_enabled = true +dof_blur_far_distance = 5.99 +dof_blur_near_enabled = true +dof_blur_near_distance = 0.05 +dof_blur_amount = 0.21 + +[sub_resource type="BoxMesh" id="BoxMesh_wsigl"] +size = Vector3(1, 10, 20) + +[sub_resource type="Resource" id="Resource_afrr1"] +script = ExtResource("2_m2d6w") +duration = 0.6 +transition = 3 +ease = 1 + +[sub_resource type="Resource" id="Resource_unpfd"] +script = ExtResource("3_l7kg8") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="CylinderMesh" id="CylinderMesh_sm466"] +top_radius = 1.51 +height = 0.2 + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_hp48l"] +transparency = 1 +albedo_texture = ExtResource("8_rjcgw") +uv1_scale = Vector3(1.91, 1.91, 1.91) +uv1_offset = Vector3(0.025, -0.927, 0) + +[node name="Root" type="Node3D"] + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 0.866025, 0.499999, 0, -0.5, 0.866023, -0.0194088, 2.25688, 9.63713) +script = ExtResource("1_s26cy") +priority = 10 +follow_mode = 6 +follow_target = NodePath("../PlayerCharacterBody3D") +tween_resource = SubResource("Resource_8fhct") +tween_on_load = false +camera_3d_resource = SubResource("Resource_7m0fv") +attributes = SubResource("CameraAttributesPractical_i42vj") +follow_damping = true +follow_distance = 3.5 +spring_length = 3.5 + +[node name="PlayerAimPhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")] +unique_name_in_owner = true +transform = Transform3D(0.953716, -0.0418501, 0.297778, 0, 0.990266, 0.139173, -0.300705, -0.132731, 0.944432, 0.427258, 1.68564, 7.6237) +script = ExtResource("1_s26cy") +follow_mode = 6 +follow_target = NodePath("../PlayerCharacterBody3D") +tween_resource = SubResource("Resource_e7t18") +tween_on_load = false +camera_3d_resource = SubResource("Resource_jogxh") +attributes = SubResource("CameraAttributesPractical_fvhx5") +follow_offset = Vector3(0, 0.97, -0.399) +follow_damping_value = Vector3(0, 0, 0) +follow_distance = 1.5 +spring_length = 1.5 + +[node name="PlayerCharacterBody3D" parent="." instance=ExtResource("4_qcyfd")] +unique_name_in_owner = true +transform = Transform3D(0.999903, 0.0139622, 0, -0.0139622, 0.999903, 0, 0, 0, 1, -0.0194088, 0.506884, 6.60605) +script = ExtResource("5_tarnu") + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 0.866025, 0.5, 0, -0.5, 0.866025, -0.0194088, 2.25688, 9.63713) +attributes = SubResource("CameraAttributesPractical_5mfg2") + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 +script = ExtResource("5_8von1") + +[node name="Environment" type="Node" parent="."] + +[node name="Floor" parent="Environment" instance=ExtResource("6_o1fj6")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="Wall" parent="Environment" instance=ExtResource("6_o1fj6")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.5, 4.5, 0) +mesh = SubResource("BoxMesh_wsigl") +metadata/_edit_lock_ = true + +[node name="Wall2" parent="Environment" instance=ExtResource("6_o1fj6")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.5, 4.5, 0) +mesh = SubResource("BoxMesh_wsigl") +metadata/_edit_lock_ = true + +[node name="Wall3" parent="Environment" instance=ExtResource("6_o1fj6")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 4.5, 10.5) +mesh = SubResource("BoxMesh_wsigl") +metadata/_edit_lock_ = true + +[node name="Wall4" parent="Environment" instance=ExtResource("6_o1fj6")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 4.5, -9.5) +mesh = SubResource("BoxMesh_wsigl") +metadata/_edit_lock_ = true + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="CeilingPhantomCamera3D" type="Node3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(-4.37114e-08, -1, 2.98023e-08, 0, 2.98023e-08, 1, -1, 4.37114e-08, -1.3027e-15, -0.200665, 13.366, -0.162648) +script = ExtResource("1_s26cy") +tween_resource = SubResource("Resource_afrr1") +camera_3d_resource = SubResource("Resource_unpfd") + +[node name="MovementInstructionsLabel" type="Label3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.0505604, -0.484909, 1.44357) +visible = false +modulate = Color(0.294118, 1, 0.631373, 1) +text = "[WASD] to move" +font = ExtResource("7_amcmx") +font_size = 48 + +[node name="MovementInstructionsLabel3" type="Label3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.0505604, -0.484909, 0.817134) +visible = false +modulate = Color(0.294118, 1, 0.631373, 1) +text = "[Right Mouse Click] to \"aim\"" +font = ExtResource("7_amcmx") +font_size = 48 + +[node name="MovementInstructionsLabel2" type="Label3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, -0.0440154, -0.490478, -6.30248) +visible = false +modulate = Color(0.294118, 1, 0.631373, 1) +text = "[Space] to toggle PCam" +font = ExtResource("7_amcmx") +font_size = 48 + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0.260217, 1.60477, -9.07797) +mesh = SubResource("CylinderMesh_sm466") +surface_material_override/0 = SubResource("StandardMaterial3D_hp48l") + +[node name="MeshInstance3D3" type="MeshInstance3D" parent="."] +transform = Transform3D(-1, -8.74228e-08, 3.82137e-15, 0, -4.37114e-08, -1, 8.74228e-08, -1, 4.37114e-08, 0.0525861, 1.60477, 9.98156) +mesh = SubResource("CylinderMesh_sm466") +surface_material_override/0 = SubResource("StandardMaterial3D_hp48l") + +[editable path="PlayerCharacterBody3D"] diff --git a/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_third_person_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_third_person_example_scene.tscn new file mode 100644 index 0000000..2df24a9 --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_follow_third_person_example_scene.tscn @@ -0,0 +1,185 @@ +[gd_scene load_steps=17 format=3 uid="uid://ceelq6qrb41uf"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="2_47xf2"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller_third_person_4.4.gd" id="2_uhq7m"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="2_whx47"] +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="4_lii5s"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="5_jt2lp"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="5_oc4q1"] +[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="7_kg7u1"] +[ext_resource type="PackedScene" uid="uid://mskcwn1a1v6d" path="res://addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_third_person_3d.tscn" id="7_kut0u"] + +[sub_resource type="Resource" id="Resource_8fhct"] +script = ExtResource("2_47xf2") +duration = 0.3 +transition = 2 +ease = 1 + +[sub_resource type="Resource" id="Resource_7m0fv"] +script = ExtResource("5_jt2lp") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="Resource" id="Resource_e7t18"] +script = ExtResource("2_47xf2") +duration = 0.4 +transition = 2 +ease = 1 + +[sub_resource type="Resource" id="Resource_jogxh"] +script = ExtResource("5_jt2lp") +cull_mask = 1048575 +h_offset = 1.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="BoxMesh" id="BoxMesh_wsigl"] +size = Vector3(1, 10, 20) + +[sub_resource type="BoxMesh" id="BoxMesh_bj3re"] +size = Vector3(1, 7, 7) + +[sub_resource type="Resource" id="Resource_afrr1"] +script = ExtResource("2_47xf2") +duration = 0.6 +transition = 3 +ease = 1 + +[sub_resource type="Resource" id="Resource_ioijp"] +script = ExtResource("5_jt2lp") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[node name="Root" type="Node3D"] + +[node name="PlayerCharacterBody3D" parent="." instance=ExtResource("7_kut0u")] +unique_name_in_owner = true +script = ExtResource("2_uhq7m") + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 0.866023, 0.499997, 0, -0.499999, 0.866021, -0.0194088, 2.25687, 3.01475) +script = ExtResource("2_whx47") +priority = 10 +follow_mode = 6 +follow_target = NodePath("../PlayerCharacterBody3D") +tween_resource = SubResource("Resource_8fhct") +tween_on_load = false +camera_3d_resource = SubResource("Resource_7m0fv") +follow_damping = true +follow_distance = 3.5 +spring_length = 3.5 + +[node name="PlayerAimPhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")] +unique_name_in_owner = true +transform = Transform3D(0.953716, -0.0104945, 0.300522, 0, 0.99939, 0.0348995, -0.300706, -0.0332842, 0.953135, 0.431374, 1.35923, 1.01438) +script = ExtResource("2_whx47") +follow_mode = 6 +follow_target = NodePath("../PlayerCharacterBody3D") +tween_resource = SubResource("Resource_e7t18") +tween_on_load = false +camera_3d_resource = SubResource("Resource_jogxh") +follow_offset = Vector3(0, 0.8, -0.399) +follow_distance = 1.5 +spring_length = 1.5 + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 0.866025, 0.5, 0, -0.5, 0.866025, -0.0194088, 2.25687, 3.01475) + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 +script = ExtResource("5_oc4q1") + +[node name="Environment" type="Node" parent="."] + +[node name="Floor" parent="Environment" instance=ExtResource("4_lii5s")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="Wall" parent="Environment" instance=ExtResource("4_lii5s")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.5, 4.5, 0) +mesh = SubResource("BoxMesh_wsigl") +metadata/_edit_lock_ = true + +[node name="Wall5" parent="Environment" instance=ExtResource("4_lii5s")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.133, 3, -6.5) +mesh = SubResource("BoxMesh_bj3re") +metadata/_edit_lock_ = true + +[node name="Wall6" parent="Environment" instance=ExtResource("4_lii5s")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 3, 0) +mesh = SubResource("BoxMesh_bj3re") +metadata/_edit_lock_ = true + +[node name="Wall7" parent="Environment" instance=ExtResource("4_lii5s")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.5, 3, 0) +mesh = SubResource("BoxMesh_bj3re") +metadata/_edit_lock_ = true + +[node name="Wall2" parent="Environment" instance=ExtResource("4_lii5s")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.5, 4.5, 0) +mesh = SubResource("BoxMesh_wsigl") +metadata/_edit_lock_ = true + +[node name="Wall3" parent="Environment" instance=ExtResource("4_lii5s")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 4.5, 10.5) +mesh = SubResource("BoxMesh_wsigl") +metadata/_edit_lock_ = true + +[node name="Wall4" parent="Environment" instance=ExtResource("4_lii5s")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 4.5, -9.5) +mesh = SubResource("BoxMesh_wsigl") +metadata/_edit_lock_ = true + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="CeilingPhantomCamera3D" type="Node3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(-4.37114e-08, -1, 2.98023e-08, 0, 2.98023e-08, 1, -1, 4.37114e-08, -1.3027e-15, -0.200665, 13.366, -0.162648) +script = ExtResource("2_whx47") +tween_resource = SubResource("Resource_afrr1") +camera_3d_resource = SubResource("Resource_ioijp") + +[node name="MovementInstructionsLabel" type="Label3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.0505604, -0.484909, 1.44357) +modulate = Color(0.294118, 1, 0.631373, 1) +text = "[WASD] to move" +font = ExtResource("7_kg7u1") +font_size = 48 + +[node name="MovementInstructionsLabel3" type="Label3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.0505604, -0.484909, 0.817134) +modulate = Color(0.294118, 1, 0.631373, 1) +text = "[Right Mouse Click] to \"aim\"" +font = ExtResource("7_kg7u1") +font_size = 48 + +[node name="MovementInstructionsLabel2" type="Label3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, -0.0440154, -0.490478, -6.30248) +modulate = Color(0.294118, 1, 0.631373, 1) +text = "[Space] to toggle PCam" +font = ExtResource("7_kg7u1") +font_size = 48 diff --git a/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_look_at_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_look_at_example_scene.tscn new file mode 100644 index 0000000..c85deb1 --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_look_at_example_scene.tscn @@ -0,0 +1,197 @@ +[gd_scene load_steps=15 format=3 uid="uid://dsfixtpa5xwqt"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_jbmnd"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="2_t3gk2"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="3_b2lea"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="4_mqo2b"] +[ext_resource type="PackedScene" uid="uid://bulsh7s0ibmao" path="res://addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_3d.tscn" id="5_pxkua"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller_4.4.gd" id="6_3rtu0"] +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="6_uuxs3"] +[ext_resource type="Texture2D" uid="uid://c7ja4woxol8yc" path="res://addons/phantom_camera/examples/textures/3D/checker_pattern_dark.png" id="7_0dyt0"] + +[sub_resource type="Resource" id="Resource_pwcgo"] +script = ExtResource("3_b2lea") +duration = 1.0 +transition = 0 +ease = 2 + +[sub_resource type="Resource" id="Resource_ft2w3"] +script = ExtResource("4_mqo2b") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_2h36r"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_w3olp"] +albedo_color = Color(0.227451, 0.337255, 0.576471, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_cw102"] +albedo_color = Color(0.227451, 0.337255, 0.576471, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_auy8m"] +albedo_texture = ExtResource("7_0dyt0") +uv1_triplanar = true +uv1_world_triplanar = true + +[node name="Root" type="Node3D"] + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(0.998682, 0.0324725, -0.0397495, 0, 0.774433, 0.632656, 0.0513272, -0.631822, 0.773412, -0.137901, 4.03222, 6.36446) + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 +script = ExtResource("1_jbmnd") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="PhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("look_at_target")] +transform = Transform3D(0.998682, 0.0324725, -0.0397495, 0, 0.774433, 0.632656, 0.0513272, -0.631822, 0.773413, -0.137901, 4.03222, 6.36446) +script = ExtResource("2_t3gk2") +priority = 10 +look_at_mode = 2 +look_at_target = NodePath("../PlayerCharacterBody3D2") +tween_resource = SubResource("Resource_pwcgo") +tween_on_load = false +camera_3d_resource = SubResource("Resource_ft2w3") +look_at_damping = true + +[node name="PlayerCharacterBody3D2" parent="." instance=ExtResource("5_pxkua")] +script = ExtResource("6_3rtu0") + +[node name="NPCs" type="Node" parent="."] + +[node name="PlayerMeshInstance3D" type="MeshInstance3D" parent="NPCs"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.96028, 0.519002, -1.52506) +mesh = SubResource("CapsuleMesh_2h36r") +skeleton = NodePath("") +surface_material_override/0 = SubResource("StandardMaterial3D_w3olp") + +[node name="PlayerMeshInstance3D2" type="MeshInstance3D" parent="NPCs"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.59952, 0.519, 4.06618) +mesh = SubResource("CapsuleMesh_2h36r") +skeleton = NodePath("") +surface_material_override/0 = SubResource("StandardMaterial3D_cw102") + +[node name="Environment" type="Node" parent="."] + +[node name="Floor" parent="Environment" instance=ExtResource("6_uuxs3")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="CSGCylinder3D" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.00548, 0.805455, -6.37532) +use_collision = true +radius = 1.71971 +height = 2.61091 +sides = 32 + +[node name="CSGCylinder3D5" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 25.5597, 0.31181, -5.46661) +use_collision = true +radius = 2.77591 +height = 1.62362 +sides = 32 + +[node name="CSGCylinder3D6" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -8.96428, 0.31181, 6.6322) +use_collision = true +radius = 1.57419 +height = 3.47475 +sides = 32 + +[node name="CSGCylinder3D3" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 15.3959, 0.201103, 2.71259) +use_collision = true +radius = 1.41311 +height = 1.40221 +sides = 32 + +[node name="CSGCylinder3D4" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8.02677, 0.201101, 11.6804) +use_collision = true +radius = 2.21673 +height = 7.88261 +sides = 32 + +[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8.8316, 0.805455, -8.78984) +use_collision = true +radius = 0.956285 +height = 2.61091 +sides = 32 + +[node name="CSGSphere3D" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 15.5989, -1.69814, -6.51262) +use_collision = true +radius = 3.34732 +rings = 32 + +[node name="CSGSphere3D2" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.17742, -0.599204, 8.81048) +use_collision = true +radius = 2.65844 +rings = 32 + +[node name="CSGSphere3D3" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -13.4392, -0.599204, -2.42244) +use_collision = true +radius = 2.14606 +rings = 32 + +[node name="CSGTorus3D" type="CSGTorus3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.58998, -1.90735e-06, 0.346393) +use_collision = true +inner_radius = 1.3 +outer_radius = 2.0 +sides = 32 +ring_sides = 18 + +[node name="CSGTorus3D2" type="CSGTorus3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 22.5502, -1.90735e-06, 7.89765) +use_collision = true +inner_radius = 0.971543 +outer_radius = 2.15226 +sides = 32 +ring_sides = 18 + +[node name="CSGBox3D" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10.1202, 6.53866, -12.6331) +use_collision = true +size = Vector3(178.429, 14.0773, 1) +material = SubResource("StandardMaterial3D_auy8m") + +[node name="CSGBox3D2" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -8.53078, 0.760708, -6.1376) +use_collision = true +size = Vector3(2.64182, 2.52142, 2.30997) + +[node name="CSGBox3D5" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 14.9646, 0.335247, 8.22829) +use_collision = true +size = Vector3(3.80964, 1.67049, 0.932048) + +[node name="CSGBox3D3" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.70216, 0.138478, -4.36159) +use_collision = true +size = Vector3(1.53893, 1.27695, 1.80814) + +[node name="CSGBox3D6" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14.1529, 0.138478, 5.20734) +use_collision = true +size = Vector3(4.03502, 1.27695, 5.2198) + +[node name="CSGBox3D4" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 30.7692, 1.78638, -1.60318) +use_collision = true +size = Vector3(4.57784, 4.57276, 3.11285) diff --git a/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_noise_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_noise_example_scene.tscn new file mode 100644 index 0000000..1c7a8b7 --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_noise_example_scene.tscn @@ -0,0 +1,192 @@ +[gd_scene load_steps=21 format=3 uid="uid://d0fyuvesb472p"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_25rmy"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller_first_person_4.4.gd" id="2_7nd2u"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/phantom_camera_noise_3d.gd" id="3_t4fhv"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="4_tnm2f"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="5_4webr"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="6_dmm4a"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_3d.gd" id="7_2vtho"] +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="8_bw5oq"] +[ext_resource type="Texture2D" uid="uid://c7ja4woxol8yc" path="res://addons/phantom_camera/examples/textures/3D/checker_pattern_dark.png" id="9_jpkpr"] +[ext_resource type="FontFile" uid="uid://dve7mgsjik4dg" path="res://addons/phantom_camera/fonts/Nunito-Regular.ttf" id="10_8pr3k"] +[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="11_vp57v"] + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_yvgu3"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_vc6km"] +albedo_color = Color(0.988235, 0.498039, 0.498039, 1) + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_lsrh7"] +radius = 0.269454 + +[sub_resource type="Resource" id="Resource_lhgur"] +script = ExtResource("5_4webr") +duration = 1.0 +transition = 0 +ease = 2 + +[sub_resource type="Resource" id="Resource_ghjuj"] +script = ExtResource("6_dmm4a") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="Resource" id="Resource_2l4w0"] +script = ExtResource("3_t4fhv") +amplitude = 40.0 +frequency = 0.2 +randomize_noise_seed = 0 +noise_seed = 0 +rotational_noise = true +positional_noise = false +rotational_multiplier_x = 1.0 +rotational_multiplier_y = 1.0 +rotational_multiplier_z = 0.0 +positional_multiplier_x = 0.1 +positional_multiplier_y = 0.1 +positional_multiplier_z = 0.1 + +[sub_resource type="Resource" id="Resource_6tnhy"] +script = ExtResource("3_t4fhv") +amplitude = 10.0 +frequency = 20.0 +randomize_noise_seed = 0 +noise_seed = 928 +rotational_noise = true +positional_noise = false +rotational_multiplier_x = 1.0 +rotational_multiplier_y = 1.0 +rotational_multiplier_z = 0.1 +positional_multiplier_x = 1.0 +positional_multiplier_y = 1.0 +positional_multiplier_z = 1.0 + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_qi01t"] +albedo_texture = ExtResource("9_jpkpr") +uv1_triplanar = true +uv1_world_triplanar = true + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ey47a"] +bg_color = Color(0.0784314, 0.109804, 0.129412, 1) +border_width_right = 4 +border_width_bottom = 4 +border_color = Color(0.227451, 0.72549, 0.603922, 1) +corner_radius_bottom_right = 20 +expand_margin_bottom = 6.0 + +[node name="Root" type="Node3D"] + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(-0.0642313, 0.122871, 0.990342, 0, 0.992391, -0.123126, -0.997935, -0.00790852, -0.0637426, -16.46, 0.503767, 4.249) + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 +script = ExtResource("1_25rmy") + +[node name="PlayerCharacterBody3D" type="CharacterBody3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(0.999897, 0.0143636, 0, -0.0143636, 0.999897, 0, 0, 0, 1, -16.46, 0.503767, 4.249) +script = ExtResource("2_7nd2u") + +[node name="PlayerVisual" type="MeshInstance3D" parent="PlayerCharacterBody3D"] +unique_name_in_owner = true +mesh = SubResource("CapsuleMesh_yvgu3") +surface_material_override/0 = SubResource("StandardMaterial3D_vc6km") + +[node name="PlayerArea3D" type="Area3D" parent="PlayerCharacterBody3D"] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="PlayerCharacterBody3D/PlayerArea3D"] +shape = SubResource("CapsuleShape3D_lsrh7") + +[node name="PlayerCollisionShape3D" type="CollisionShape3D" parent="PlayerCharacterBody3D"] +shape = SubResource("CapsuleShape3D_lsrh7") + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")] +unique_name_in_owner = true +transform = Transform3D(0.00441533, 0, 0.999915, 0, 0.999995, 0, -0.999923, 0, 0.00441529, -16.46, 0.503767, 4.249) +top_level = true +script = ExtResource("4_tnm2f") +priority = 10 +follow_mode = 2 +follow_target = NodePath("../PlayerCharacterBody3D") +tween_resource = SubResource("Resource_lhgur") +tween_on_load = false +camera_3d_resource = SubResource("Resource_ghjuj") +noise = SubResource("Resource_2l4w0") +noise_emitter_layer = 1 + +[node name="PlayerPhantomCameraNoiseEmitter3D" type="Node3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(-4.37085e-08, 0, 0.999925, 0, 0.999995, 0, -0.999933, 0, -4.37081e-08, -16.46, 0.503767, 4.249) +script = ExtResource("7_2vtho") +noise = SubResource("Resource_6tnhy") +duration = 0.1 +decay_time = 0.1 + +[node name="Environment" type="Node" parent="."] + +[node name="Floor" parent="Environment" instance=ExtResource("8_bw5oq")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="CSGBox3D" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.525, 6.539, 2.5) +use_collision = true +size = Vector3(178.429, 14.0773, 1) +material = SubResource("StandardMaterial3D_qi01t") + +[node name="CSGBox3D3" type="CSGBox3D" parent="Environment"] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 8.83707, 6.53866, -1.80739) +use_collision = true +size = Vector3(178.429, 14.0773, 1) +material = SubResource("StandardMaterial3D_qi01t") + +[node name="CSGBox3D4" type="CSGBox3D" parent="Environment"] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -38.9392, 6.53866, -1.80739) +use_collision = true +size = Vector3(178.429, 14.0773, 1) +material = SubResource("StandardMaterial3D_qi01t") + +[node name="CSGBox3D2" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.525, 6.539, 6) +use_collision = true +size = Vector3(178.429, 14.0773, 1) +material = SubResource("StandardMaterial3D_qi01t") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="EmitterTip" type="Panel" parent="."] +unique_name_in_owner = true +visible = false +anchors_preset = -1 +anchor_right = 0.3 +anchor_bottom = 0.1 +theme_override_styles/panel = SubResource("StyleBoxFlat_ey47a") + +[node name="Guidance" type="RichTextLabel" parent="EmitterTip"] +layout_mode = 1 +anchors_preset = -1 +anchor_top = 0.5 +anchor_right = 1.0 +anchor_bottom = 0.5 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_vertical = 8 +theme_override_fonts/normal_font = ExtResource("10_8pr3k") +theme_override_fonts/bold_font = ExtResource("11_vp57v") +theme_override_font_sizes/normal_font_size = 18 +theme_override_font_sizes/bold_font_size = 24 +bbcode_enabled = true +text = "[center]Press [b]Q[/b] to trigger Noise Emitter" +fit_content = true diff --git a/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_tweening_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_tweening_example_scene.tscn new file mode 100644 index 0000000..76ee9a4 --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D-4.4/3d_tweening_example_scene.tscn @@ -0,0 +1,286 @@ +[gd_scene load_steps=23 format=3 uid="uid://cvnbgtbaxwj5p"] + +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="1_d55xf"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="2_d1opf"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="3_4whss"] +[ext_resource type="Resource" uid="uid://cptfoggk2ok67" path="res://addons/phantom_camera/examples/resources/tween/player_phantom_camera_3d_tween.tres" id="4_8ap1e"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="5_1sgnu"] +[ext_resource type="PackedScene" uid="uid://bulsh7s0ibmao" path="res://addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_3d.tscn" id="6_lr46m"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/3d_trigger_area.gd" id="7_istoq"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller_4.4.gd" id="7_x1jex"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="8_qepee"] +[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="9_ptb3h"] + +[sub_resource type="Resource" id="Resource_0dtvs"] +script = ExtResource("5_1sgnu") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="BoxShape3D" id="BoxShape3D_j6fha"] +size = Vector3(5, 0.1, 4) + +[sub_resource type="BoxMesh" id="BoxMesh_xg4en"] +size = Vector3(5, 0.1, 4) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_2dct5"] +transparency = 1 +albedo_color = Color(0.988235, 0.478431, 0.905882, 0.0901961) + +[sub_resource type="Resource" id="Resource_v8ndi"] +script = ExtResource("8_qepee") +duration = 0.6 +transition = 0 +ease = 2 + +[sub_resource type="Resource" id="Resource_kmep1"] +script = ExtResource("5_1sgnu") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="Resource" id="Resource_uxg44"] +script = ExtResource("8_qepee") +duration = 0.3 +transition = 1 +ease = 2 + +[sub_resource type="Resource" id="Resource_eu3bc"] +script = ExtResource("5_1sgnu") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="Resource" id="Resource_0nci0"] +script = ExtResource("8_qepee") +duration = 0.3 +transition = 8 +ease = 2 + +[sub_resource type="Resource" id="Resource_u0lff"] +script = ExtResource("5_1sgnu") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="Resource" id="Resource_50m5g"] +script = ExtResource("8_qepee") +duration = 1.2 +transition = 10 +ease = 2 + +[sub_resource type="Resource" id="Resource_rexf8"] +script = ExtResource("5_1sgnu") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[node name="Root" type="Node3D"] + +[node name="Environment" type="Node" parent="."] + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="Floor" parent="Environment" instance=ExtResource("1_d55xf")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0.083587, 2.507, 4.05493) + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 +script = ExtResource("2_d1opf") + +[node name="------------------" type="Node" parent="."] + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")] +unique_name_in_owner = true +transform = Transform3D(0.999889, 0, 0, 0, 0.707092, 0.707088, 0, -0.707092, 0.707088, 0.083587, 2.507, 4.05493) +top_level = true +script = ExtResource("3_4whss") +priority = 3 +follow_mode = 2 +follow_target = NodePath("../PlayerCharacterBody3D2") +tween_resource = ExtResource("4_8ap1e") +tween_on_load = false +camera_3d_resource = SubResource("Resource_0dtvs") +follow_offset = Vector3(0, 2, 2) +follow_damping = true + +[node name="PlayerCharacterBody3D2" parent="." instance=ExtResource("6_lr46m")] +script = ExtResource("7_x1jex") + +[node name="-------------------" type="Node" parent="."] + +[node name="Tweening Example" type="Node3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -1.97) + +[node name="Linear" type="Node3D" parent="Tweening Example"] + +[node name="EntryRoomTrigger" type="Area3D" parent="Tweening Example/Linear" node_paths=PackedStringArray("area_pcam")] +priority = 5 +script = ExtResource("7_istoq") +area_pcam = NodePath("../PhantomCamera3D") +metadata/_edit_group_ = true + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Tweening Example/Linear/EntryRoomTrigger"] +shape = SubResource("BoxShape3D_j6fha") + +[node name="NPCInteractionZoneMesh" type="MeshInstance3D" parent="Tweening Example/Linear/EntryRoomTrigger"] +mesh = SubResource("BoxMesh_xg4en") +skeleton = NodePath("../../../../..") +surface_material_override/0 = SubResource("StandardMaterial3D_2dct5") +metadata/_edit_group_ = true + +[node name="PhantomCamera3D" type="Node3D" parent="Tweening Example/Linear"] +transform = Transform3D(1, 0, 0, 0, 0.642788, 0.766044, 0, -0.766044, 0.642788, 0, 4.8, 3.3) +script = ExtResource("3_4whss") +tween_resource = SubResource("Resource_v8ndi") +camera_3d_resource = SubResource("Resource_kmep1") + +[node name="TweenNameLabel" type="Label3D" parent="Tweening Example/Linear"] +transform = Transform3D(1, 0, 0, 0, 0.695913, 0.718126, 0, -0.718126, 0.695913, -1.8, 0.5, 0) +text = "Transition Type: +Linear + +Duration: +0.6s" +font = ExtResource("9_ptb3h") +font_size = 48 + +[node name="Sine" type="Node3D" parent="Tweening Example"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -7.4) + +[node name="EntryRoomTrigger" type="Area3D" parent="Tweening Example/Sine" node_paths=PackedStringArray("area_pcam")] +priority = 5 +script = ExtResource("7_istoq") +area_pcam = NodePath("../PhantomCamera3D") +metadata/_edit_group_ = true + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Tweening Example/Sine/EntryRoomTrigger"] +shape = SubResource("BoxShape3D_j6fha") + +[node name="NPCInteractionZoneMesh" type="MeshInstance3D" parent="Tweening Example/Sine/EntryRoomTrigger"] +mesh = SubResource("BoxMesh_xg4en") +skeleton = NodePath("../../../../..") +surface_material_override/0 = SubResource("StandardMaterial3D_2dct5") +metadata/_edit_group_ = true + +[node name="PhantomCamera3D" type="Node3D" parent="Tweening Example/Sine"] +transform = Transform3D(1, 0, 0, 0, 0.642788, 0.766044, 0, -0.766044, 0.642788, 0, 4.8, 3.3) +script = ExtResource("3_4whss") +tween_resource = SubResource("Resource_uxg44") +camera_3d_resource = SubResource("Resource_eu3bc") + +[node name="TweenNameLabel" type="Label3D" parent="Tweening Example/Sine"] +transform = Transform3D(1, 0, 0, 0, 0.695913, 0.718126, 0, -0.718126, 0.695913, 1.7, 0.5, 0) +text = "Transition Type: +Sine + +Duration: +0.3s" +font = ExtResource("9_ptb3h") +font_size = 72 + +[node name="Circ" type="Node3D" parent="Tweening Example"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -14.1) + +[node name="EntryRoomTrigger" type="Area3D" parent="Tweening Example/Circ" node_paths=PackedStringArray("area_pcam")] +priority = 5 +script = ExtResource("7_istoq") +area_pcam = NodePath("../PhantomCamera3D") +metadata/_edit_group_ = true + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Tweening Example/Circ/EntryRoomTrigger"] +shape = SubResource("BoxShape3D_j6fha") + +[node name="NPCInteractionZoneMesh" type="MeshInstance3D" parent="Tweening Example/Circ/EntryRoomTrigger"] +mesh = SubResource("BoxMesh_xg4en") +skeleton = NodePath("../../../../..") +surface_material_override/0 = SubResource("StandardMaterial3D_2dct5") +metadata/_edit_group_ = true + +[node name="PhantomCamera3D" type="Node3D" parent="Tweening Example/Circ"] +transform = Transform3D(1, 0, 0, 0, 0.642788, 0.766044, 0, -0.766044, 0.642788, 0, 4.8, 3.3) +script = ExtResource("3_4whss") +tween_resource = SubResource("Resource_0nci0") +camera_3d_resource = SubResource("Resource_u0lff") + +[node name="TweenNameLabel" type="Label3D" parent="Tweening Example/Circ"] +transform = Transform3D(1, 0, 0, 0, 0.695913, 0.718126, 0, -0.718126, 0.695913, -1.8, 0.5, 0) +text = "Transition Type: +Circ + +Duration: +0.3s" +font = ExtResource("9_ptb3h") +font_size = 72 + +[node name="Back" type="Node3D" parent="Tweening Example"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -21) + +[node name="EntryRoomTrigger" type="Area3D" parent="Tweening Example/Back" node_paths=PackedStringArray("area_pcam")] +priority = 5 +script = ExtResource("7_istoq") +area_pcam = NodePath("../PhantomCamera3D") +metadata/_edit_group_ = true + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Tweening Example/Back/EntryRoomTrigger"] +shape = SubResource("BoxShape3D_j6fha") + +[node name="NPCInteractionZoneMesh" type="MeshInstance3D" parent="Tweening Example/Back/EntryRoomTrigger"] +mesh = SubResource("BoxMesh_xg4en") +skeleton = NodePath("../../../../..") +surface_material_override/0 = SubResource("StandardMaterial3D_2dct5") +metadata/_edit_group_ = true + +[node name="PhantomCamera3D" type="Node3D" parent="Tweening Example/Back"] +transform = Transform3D(1, 0, 0, 0, 0.642788, 0.766044, 0, -0.766044, 0.642788, -0.8, 4.8, 3.3) +script = ExtResource("3_4whss") +tween_resource = SubResource("Resource_50m5g") +camera_3d_resource = SubResource("Resource_rexf8") + +[node name="TweenNameLabel" type="Label3D" parent="Tweening Example/Back"] +transform = Transform3D(1, 0, 0, 0, 0.695913, 0.718126, 0, -0.718126, 0.695913, 1.7, 0.5, 0) +text = "Transition Type: +Back + +Duration: +1.2s" +font = ExtResource("9_ptb3h") +font_size = 48 diff --git a/addons/phantom_camera/examples/example_scenes/3D-4.4/sub_scenes/playable_character_3d.tscn b/addons/phantom_camera/examples/example_scenes/3D-4.4/sub_scenes/playable_character_3d.tscn new file mode 100644 index 0000000..03bfcae --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D-4.4/sub_scenes/playable_character_3d.tscn @@ -0,0 +1,31 @@ +[gd_scene load_steps=5 format=3 uid="uid://cb83in8f0tbb1"] + +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller.gd" id="1_tm04f"] + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_8efyg"] + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_2cfaw"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_r3ldp"] +albedo_color = Color(0.988235, 0.498039, 0.498039, 1) + +[node name="PlayerCharacterBody3D2" type="CharacterBody3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.083587, 0.507, 2.05493) +script = ExtResource("1_tm04f") +metadata/_edit_group_ = true + +[node name="PlayerArea3D" type="Area3D" parent="."] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="PlayerArea3D"] +shape = SubResource("CapsuleShape3D_8efyg") + +[node name="PlayerCollisionShape3D" type="CollisionShape3D" parent="."] +shape = SubResource("CapsuleShape3D_8efyg") + +[node name="PlayerVisual" type="Node3D" parent="."] +unique_name_in_owner = true + +[node name="PlayerModel" type="MeshInstance3D" parent="PlayerVisual"] +mesh = SubResource("CapsuleMesh_2cfaw") +skeleton = NodePath("../..") +surface_material_override/0 = SubResource("StandardMaterial3D_r3ldp") diff --git a/addons/phantom_camera/examples/example_scenes/3D-4.4/sub_scenes/playable_character_third_person_3d.tscn b/addons/phantom_camera/examples/example_scenes/3D-4.4/sub_scenes/playable_character_third_person_3d.tscn new file mode 100644 index 0000000..17bb808 --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D-4.4/sub_scenes/playable_character_third_person_3d.tscn @@ -0,0 +1,43 @@ +[gd_scene load_steps=6 format=3 uid="uid://bhd1kwv2fwj1y"] + +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller_third_person.gd" id="1_5s24o"] + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_s61dn"] + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_47f0o"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_mv4do"] +albedo_color = Color(0.988235, 0.498039, 0.498039, 1) + +[sub_resource type="PrismMesh" id="PrismMesh_wg1x3"] +size = Vector3(0.5, 0.5, 0.3) + +[node name="PlayerCharacterBody3D" type="CharacterBody3D"] +transform = Transform3D(0.999903, 0.0139622, 0, -0.0139622, 0.999903, 0, 0, 0, 1, -0.0194088, 0.506884, -0.0163251) +collision_layer = 2 +script = ExtResource("1_5s24o") +metadata/_edit_group_ = true + +[node name="PlayerArea3D" type="Area3D" parent="."] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="PlayerArea3D"] +shape = SubResource("CapsuleShape3D_s61dn") + +[node name="PlayerCollisionShape3D" type="CollisionShape3D" parent="."] +shape = SubResource("CapsuleShape3D_s61dn") + +[node name="PlayerVisual" type="Node3D" parent="."] +unique_name_in_owner = true + +[node name="PlayerMeshInstance3D" type="MeshInstance3D" parent="PlayerVisual"] +transform = Transform3D(1, 0, 0, 0, 1, 4.65661e-10, 0, 0, 1, 0, 0, 0) +mesh = SubResource("CapsuleMesh_47f0o") +skeleton = NodePath("../..") +surface_material_override/0 = SubResource("StandardMaterial3D_mv4do") + +[node name="PlayerDirection" type="MeshInstance3D" parent="PlayerVisual"] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, -9.31323e-10, 1, 4.65661e-10, 2.98023e-08, 0, 1, -0.0156226, 1.08631, 0) +mesh = SubResource("PrismMesh_wg1x3") +skeleton = NodePath("../..") +surface_material_override/0 = SubResource("StandardMaterial3D_mv4do") diff --git a/addons/phantom_camera/examples/example_scenes/3D/3d_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3d_example_scene.tscn index 553ddeb..19c1c13 100644 --- a/addons/phantom_camera/examples/example_scenes/3D/3d_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/3D/3d_example_scene.tscn @@ -16,14 +16,24 @@ script = ExtResource("4_m2vbn") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="Resource" id="Resource_o161n"] script = ExtResource("4_m2vbn") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="BoxMesh" id="BoxMesh_7tjw4"] size = Vector3(2, 0.5, 4) @@ -53,7 +63,12 @@ script = ExtResource("4_m2vbn") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="BoxShape3D" id="BoxShape3D_wcrbb"] size = Vector3(6.8, 0.1, 5.4) @@ -69,7 +84,12 @@ script = ExtResource("4_m2vbn") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="BoxShape3D" id="BoxShape3D_ctyr8"] size = Vector3(7.4, 0.1, 3.6) @@ -85,7 +105,12 @@ script = ExtResource("4_m2vbn") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="BoxShape3D" id="BoxShape3D_ua072"] size = Vector3(6.8, 0.1, 3.6) @@ -130,9 +155,11 @@ size = Vector3(8, 6, 0.5) [node name="MainCamera3D" type="Camera3D" parent="."] unique_name_in_owner = true -transform = Transform3D(0.999858, 0, 0, 0, 0.94884, 0.315632, 0, -0.315637, 0.948825, -2.53871, 2, 9.76232) +transform = Transform3D(1, 0, 0, 0, 0.948876, 0.315649, 0, -0.315649, 0.948876, -2.53871, 2, 9.76232) [node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("1_wn7ww") [node name="PlayerGroup" type="Node" parent="."] @@ -151,6 +178,7 @@ font_size = 48 [node name="PlayerPhantomCamera3D" type="Node3D" parent="PlayerGroup" node_paths=PackedStringArray("follow_target")] unique_name_in_owner = true transform = Transform3D(0.999858, 0, 0, 0, 0.94884, 0.315632, 0, -0.315637, 0.948825, -2.53871, 2, 9.76232) +top_level = true script = ExtResource("2_y3dy8") priority = 10 follow_mode = 2 diff --git a/addons/phantom_camera/examples/example_scenes/3D/3d_follow_framed_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_framed_example_scene.tscn index b17abcf..a14363a 100644 --- a/addons/phantom_camera/examples/example_scenes/3D/3d_follow_framed_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_framed_example_scene.tscn @@ -13,7 +13,12 @@ script = ExtResource("4_oqbub") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_auy8m"] albedo_texture = ExtResource("5_c0upu") @@ -24,9 +29,11 @@ uv1_world_triplanar = true [node name="MainCamera3D" type="Camera3D" parent="."] unique_name_in_owner = true -transform = Transform3D(0.99995, 0, 0, 0, 0.79324, 0.608671, 0, -0.608675, 0.793235, 0.083587, 2.94168, 5.22787) +transform = Transform3D(1, 0, 0, 0, 0.793353, 0.608762, 0, -0.608762, 0.793353, 0.083587, 2.94168, 5.22787) [node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("1_7824u") [node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] @@ -38,6 +45,7 @@ metadata/_edit_lock_ = true [node name="PlayerPhantomCamera3D" type="Node3D" parent="Player" node_paths=PackedStringArray("follow_target")] unique_name_in_owner = true transform = Transform3D(0.99995, 0, 0, 0, 0.79324, 0.608671, 0, -0.608675, 0.793235, 0.083587, 2.94168, 5.22787) +top_level = true script = ExtResource("2_g1bv4") follow_mode = 5 follow_target = NodePath("../PlayerCharacterBody3D2/PlayerVisual") @@ -46,8 +54,8 @@ tween_on_load = false camera_3d_resource = SubResource("Resource_wg1pr") follow_damping = true follow_distance = 4.0 -dead_zone_width = 0.384 -dead_zone_height = 0.669 +dead_zone_width = 0.161 +dead_zone_height = 0.386 show_viewfinder_in_play = true spring_length = 4.0 diff --git a/addons/phantom_camera/examples/example_scenes/3D/3d_follow_glued_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_glued_example_scene.tscn index 0d7b543..10acd87 100644 --- a/addons/phantom_camera/examples/example_scenes/3D/3d_follow_glued_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_glued_example_scene.tscn @@ -19,7 +19,12 @@ script = ExtResource("4_evdoo") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="CapsuleMesh" id="CapsuleMesh_2h36r"] @@ -38,9 +43,11 @@ uv1_world_triplanar = true [node name="MainCamera3D" type="Camera3D" parent="."] unique_name_in_owner = true -transform = Transform3D(0.999954, 0, 0, 0, 0.638683, 0.769345, 0, -0.769298, 0.638723, -5.60519e-45, 6.39, 7) +transform = Transform3D(1, 0, 0, 0, 0.638767, 0.7694, 0, -0.7694, 0.638768, 0, 6.39, 7) [node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("1_pmeux") [node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] @@ -51,7 +58,8 @@ metadata/_edit_lock_ = true [node name="PlayerPhantomCamera3D" type="Node3D" parent="Player" node_paths=PackedStringArray("follow_target")] unique_name_in_owner = true -transform = Transform3D(0.999954, 0, 0, 0, 0.638683, 0.769345, 0, -0.769298, 0.638723, -5.60519e-45, 6.39, 7) +transform = Transform3D(0.999954, 0, 0, 0, 0.638683, 0.769345, 0, -0.769298, 0.638723, 0, 6.39, 7) +top_level = true script = ExtResource("2_q1ygp") priority = 5 follow_mode = 1 diff --git a/addons/phantom_camera/examples/example_scenes/3D/3d_follow_group_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_group_example_scene.tscn index 9ef95a5..2c927d4 100644 --- a/addons/phantom_camera/examples/example_scenes/3D/3d_follow_group_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_group_example_scene.tscn @@ -13,7 +13,12 @@ script = ExtResource("5_70gws") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="CapsuleMesh" id="CapsuleMesh_2h36r"] @@ -32,9 +37,11 @@ uv1_world_triplanar = true [node name="MainCamera3D" type="Camera3D" parent="."] unique_name_in_owner = true -transform = Transform3D(0.999954, 0, 0, 0, 0.906188, 0.422588, 0, -0.422562, 0.906243, -7.26116, 5.72974, 12.279) +transform = Transform3D(1, 0, 0, 0, 0.906308, 0.422618, 0, -0.422618, 0.906308, -7.26116, 5.72974, 12.279) [node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("3_wr1tj") [node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] @@ -48,6 +55,7 @@ metadata/_edit_lock_ = true [node name="PlayerPhantomCamera3D" type="Node3D" parent="Player" node_paths=PackedStringArray("follow_targets")] unique_name_in_owner = true transform = Transform3D(0.999954, 0, 0, 0, 0.906188, 0.422588, 0, -0.422562, 0.906243, -7.26116, 5.72974, 12.279) +top_level = true script = ExtResource("2_pi7mp") priority = 5 follow_mode = 3 diff --git a/addons/phantom_camera/examples/example_scenes/3D/3d_follow_path_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_path_example_scene.tscn index 4228afd..9de651d 100644 --- a/addons/phantom_camera/examples/example_scenes/3D/3d_follow_path_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_path_example_scene.tscn @@ -15,7 +15,12 @@ script = ExtResource("4_hni7n") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="Resource" id="Resource_01tho"] script = ExtResource("4_lfwkm") @@ -28,7 +33,12 @@ script = ExtResource("4_hni7n") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="Curve3D" id="Curve3D_b33df"] _data = { @@ -52,7 +62,12 @@ script = ExtResource("4_hni7n") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="Curve3D" id="Curve3D_8uw2x"] _data = { @@ -79,9 +94,11 @@ albedo_color = Color(0.568403, 0.988235, 0.762724, 0.0901961) [node name="MainCamera3D" type="Camera3D" parent="."] unique_name_in_owner = true -transform = Transform3D(0.999807, -0.00216249, 0.00184445, 0, 0.648836, 0.760728, -0.00284214, -0.760718, 0.648839, 0, 2.507, 1.5) +transform = Transform3D(0.999996, -0.00216283, 0.00184472, 0, 0.648938, 0.760841, -0.00284268, -0.760838, 0.648936, 0, 2.507, 1.5) [node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("1_lm5n8") [node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] @@ -91,6 +108,7 @@ metadata/_edit_lock_ = true [node name="PlayerPhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")] unique_name_in_owner = true transform = Transform3D(0.999807, -0.00216249, 0.00184445, 0, 0.648836, 0.760728, -0.00284214, -0.760718, 0.648839, 0, 2.507, 1.5) +top_level = true script = ExtResource("3_bd7x3") priority = 10 follow_mode = 2 @@ -108,6 +126,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.507, 0) [node name="PathPhantomCamera3D" type="Node3D" parent="Paths" node_paths=PackedStringArray("follow_target", "follow_path")] transform = Transform3D(-4.37114e-08, -1, -4.37114e-08, 0, -4.37114e-08, 1, -1, 4.37114e-08, 1.91069e-15, -0.31028, 7.9199, -1.60976) +top_level = true script = ExtResource("3_bd7x3") priority = 2 follow_mode = 4 @@ -139,6 +158,7 @@ metadata/_edit_group_ = true [node name="PathPhantomCamera3D2" type="Node3D" parent="Paths" node_paths=PackedStringArray("follow_target", "follow_path")] transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 7.9199, -13.4572) +top_level = true visible = false script = ExtResource("3_bd7x3") priority = 2 diff --git a/addons/phantom_camera/examples/example_scenes/3D/3d_follow_simple_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_simple_example_scene.tscn index f81396f..59247c9 100644 --- a/addons/phantom_camera/examples/example_scenes/3D/3d_follow_simple_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_simple_example_scene.tscn @@ -1,12 +1,12 @@ -[gd_scene load_steps=14 format=3 uid="uid://buglvjwpn85ny"] +[gd_scene load_steps=11 format=3 uid="uid://buglvjwpn85ny"] [ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_3tok8"] [ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="2_grjck"] [ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="3_j3f4l"] -[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller.gd" id="3_uymu2"] [ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="4_4u2y6"] [ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="4_sielv"] [ext_resource type="Texture2D" uid="uid://c7ja4woxol8yc" path="res://addons/phantom_camera/examples/textures/3D/checker_pattern_dark.png" id="5_1tybo"] +[ext_resource type="PackedScene" uid="uid://bulsh7s0ibmao" path="res://addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_3d.tscn" id="5_7ywxt"] [sub_resource type="Resource" id="Resource_28vpp"] script = ExtResource("3_j3f4l") @@ -19,14 +19,12 @@ script = ExtResource("4_sielv") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 - -[sub_resource type="CapsuleMesh" id="CapsuleMesh_pda7a"] - -[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_u74j7"] -albedo_color = Color(0.988235, 0.498039, 0.498039, 1) - -[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_3xplc"] +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_auy8m"] albedo_texture = ExtResource("5_1tybo") @@ -37,9 +35,11 @@ uv1_world_triplanar = true [node name="MainCamera3D" type="Camera3D" parent="."] unique_name_in_owner = true -transform = Transform3D(0.999954, 0, 0, 0, 0.906188, 0.422588, 0, -0.422562, 0.906243, -13.1946, 2.34415, 10.4086) +transform = Transform3D(1, 0, 0, 0, 0.906308, 0.422618, 0, -0.422618, 0.906308, -13.2122, 2.5, 10.4016) [node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("1_3tok8") [node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] @@ -50,35 +50,21 @@ metadata/_edit_lock_ = true [node name="PlayerPhantomCamera3D" type="Node3D" parent="Player" node_paths=PackedStringArray("follow_target")] unique_name_in_owner = true -transform = Transform3D(0.999954, 0, 0, 0, 0.906188, 0.422588, 0, -0.422562, 0.906243, -13.1946, 2.34415, 10.4086) +transform = Transform3D(0.999954, 0, 0, 0, 0.906188, 0.422588, 0, -0.422562, 0.906243, -13.2122, 2.5, 10.4016) +top_level = true script = ExtResource("2_grjck") priority = 10 follow_mode = 2 -follow_target = NodePath("../PlayerCharacterBody3D2") +follow_target = NodePath("../PlayerCharacterBody3D/PlayerVisual") tween_resource = SubResource("Resource_28vpp") tween_on_load = false camera_3d_resource = SubResource("Resource_axopo") follow_offset = Vector3(0, 2, 2) follow_damping = true -[node name="PlayerCharacterBody3D2" type="CharacterBody3D" parent="Player"] -unique_name_in_owner = true -transform = Transform3D(0.999897, 0.0143636, 0, -0.0143636, 0.999897, 0, 0, 0, 1, -13.1946, 0.344147, 8.40857) -script = ExtResource("3_uymu2") -metadata/_edit_group_ = true - -[node name="PlayerModel" type="MeshInstance3D" parent="Player/PlayerCharacterBody3D2"] +[node name="PlayerCharacterBody3D" parent="Player" instance=ExtResource("5_7ywxt")] unique_name_in_owner = true -mesh = SubResource("CapsuleMesh_pda7a") -surface_material_override/0 = SubResource("StandardMaterial3D_u74j7") - -[node name="PlayerArea3D" type="Area3D" parent="Player/PlayerCharacterBody3D2"] - -[node name="CollisionShape3D" type="CollisionShape3D" parent="Player/PlayerCharacterBody3D2/PlayerArea3D"] -shape = SubResource("CapsuleShape3D_3xplc") - -[node name="PlayerCollisionShape3D" type="CollisionShape3D" parent="Player/PlayerCharacterBody3D2"] -shape = SubResource("CapsuleShape3D_3xplc") +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -13.2122, 0.5, 8.40162) [node name="NPCs" type="Node" parent="."] @@ -172,3 +158,5 @@ size = Vector3(4.03502, 1.27695, 5.2198) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.04727, 0.0440434, 8.36617) use_collision = true size = Vector3(4.57784, 1.08809, 3.11285) + +[editable path="Player/PlayerCharacterBody3D"] diff --git a/addons/phantom_camera/examples/example_scenes/3D/3d_follow_third_person_attribtues_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_third_person_attribtues_example_scene.tscn new file mode 100644 index 0000000..019328f --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_third_person_attribtues_example_scene.tscn @@ -0,0 +1,216 @@ +[gd_scene load_steps=21 format=3 uid="uid://5pjtxclcnx4f"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="1_s26cy"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="2_m2d6w"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="3_l7kg8"] +[ext_resource type="PackedScene" uid="uid://mskcwn1a1v6d" path="res://addons/phantom_camera/examples/example_scenes/3D/sub_scenes/playable_character_third_person_3d.tscn" id="4_qcyfd"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="5_8von1"] +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="6_o1fj6"] +[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="7_amcmx"] +[ext_resource type="Texture2D" uid="uid://c3mskbmvnpwux" path="res://addons/phantom_camera/examples/textures/3D/target.png" id="8_rjcgw"] + +[sub_resource type="Resource" id="Resource_8fhct"] +script = ExtResource("2_m2d6w") +duration = 0.3 +transition = 2 +ease = 1 + +[sub_resource type="Resource" id="Resource_7m0fv"] +script = ExtResource("3_l7kg8") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="CameraAttributesPractical" id="CameraAttributesPractical_i42vj"] +dof_blur_far_enabled = true +dof_blur_far_distance = 5.99 +dof_blur_near_enabled = true +dof_blur_near_distance = 0.05 +dof_blur_amount = 0.21 + +[sub_resource type="Resource" id="Resource_e7t18"] +script = ExtResource("2_m2d6w") +duration = 0.4 +transition = 2 +ease = 1 + +[sub_resource type="Resource" id="Resource_jogxh"] +script = ExtResource("3_l7kg8") +cull_mask = 1048575 +h_offset = 1.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="CameraAttributesPractical" id="CameraAttributesPractical_fvhx5"] +dof_blur_far_enabled = true +dof_blur_far_distance = 31.1 +dof_blur_near_enabled = true +dof_blur_near_distance = 1.79 + +[sub_resource type="CameraAttributesPractical" id="CameraAttributesPractical_724n8"] +dof_blur_far_enabled = true +dof_blur_far_distance = 5.99 +dof_blur_near_enabled = true +dof_blur_near_distance = 0.05 +dof_blur_amount = 0.21 + +[sub_resource type="BoxMesh" id="BoxMesh_wsigl"] +size = Vector3(1, 10, 20) + +[sub_resource type="Resource" id="Resource_afrr1"] +script = ExtResource("2_m2d6w") +duration = 0.6 +transition = 3 +ease = 1 + +[sub_resource type="Resource" id="Resource_unpfd"] +script = ExtResource("3_l7kg8") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="CylinderMesh" id="CylinderMesh_sm466"] +top_radius = 1.51 +height = 0.2 + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_hp48l"] +transparency = 1 +albedo_texture = ExtResource("8_rjcgw") +uv1_scale = Vector3(1.91, 1.91, 1.91) +uv1_offset = Vector3(0.025, -0.927, 0) + +[node name="Root" type="Node3D"] + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 0.866025, 0.499999, 0, -0.5, 0.866023, -0.0194088, 2.25688, 9.63713) +script = ExtResource("1_s26cy") +priority = 10 +follow_mode = 6 +follow_target = NodePath("../PlayerCharacterBody3D/PlayerVisual") +tween_resource = SubResource("Resource_8fhct") +tween_on_load = false +camera_3d_resource = SubResource("Resource_7m0fv") +attributes = SubResource("CameraAttributesPractical_i42vj") +follow_damping = true +follow_distance = 3.5 +spring_length = 3.5 + +[node name="PlayerAimPhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")] +unique_name_in_owner = true +transform = Transform3D(0.953716, -0.0418501, 0.297778, 0, 0.990266, 0.139173, -0.300705, -0.132731, 0.944432, 0.427258, 1.68564, 7.6237) +script = ExtResource("1_s26cy") +follow_mode = 6 +follow_target = NodePath("../PlayerCharacterBody3D/PlayerVisual") +tween_resource = SubResource("Resource_e7t18") +tween_on_load = false +camera_3d_resource = SubResource("Resource_jogxh") +attributes = SubResource("CameraAttributesPractical_fvhx5") +follow_offset = Vector3(0, 0.97, -0.399) +follow_damping_value = Vector3(0, 0, 0) +follow_distance = 1.5 +spring_length = 1.5 + +[node name="PlayerCharacterBody3D" parent="." instance=ExtResource("4_qcyfd")] +unique_name_in_owner = true +transform = Transform3D(0.999903, 0.0139622, 0, -0.0139622, 0.999903, 0, 0, 0, 1, -0.0194088, 0.506884, 6.60605) + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 0.866025, 0.5, 0, -0.5, 0.866025, -0.0194088, 2.25688, 9.63713) +attributes = SubResource("CameraAttributesPractical_724n8") + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 +script = ExtResource("5_8von1") + +[node name="Environment" type="Node" parent="."] + +[node name="Floor" parent="Environment" instance=ExtResource("6_o1fj6")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="Wall" parent="Environment" instance=ExtResource("6_o1fj6")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.5, 4.5, 0) +mesh = SubResource("BoxMesh_wsigl") +metadata/_edit_lock_ = true + +[node name="Wall2" parent="Environment" instance=ExtResource("6_o1fj6")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.5, 4.5, 0) +mesh = SubResource("BoxMesh_wsigl") +metadata/_edit_lock_ = true + +[node name="Wall3" parent="Environment" instance=ExtResource("6_o1fj6")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 4.5, 10.5) +mesh = SubResource("BoxMesh_wsigl") +metadata/_edit_lock_ = true + +[node name="Wall4" parent="Environment" instance=ExtResource("6_o1fj6")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 4.5, -9.5) +mesh = SubResource("BoxMesh_wsigl") +metadata/_edit_lock_ = true + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="CeilingPhantomCamera3D" type="Node3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(-4.37114e-08, -1, 2.98023e-08, 0, 2.98023e-08, 1, -1, 4.37114e-08, -1.3027e-15, -0.200665, 13.366, -0.162648) +script = ExtResource("1_s26cy") +tween_resource = SubResource("Resource_afrr1") +camera_3d_resource = SubResource("Resource_unpfd") + +[node name="MovementInstructionsLabel" type="Label3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.0505604, -0.484909, 1.44357) +visible = false +modulate = Color(0.294118, 1, 0.631373, 1) +text = "[WASD] to move" +font = ExtResource("7_amcmx") +font_size = 48 + +[node name="MovementInstructionsLabel3" type="Label3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.0505604, -0.484909, 0.817134) +visible = false +modulate = Color(0.294118, 1, 0.631373, 1) +text = "[Right Mouse Click] to \"aim\"" +font = ExtResource("7_amcmx") +font_size = 48 + +[node name="MovementInstructionsLabel2" type="Label3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, -0.0440154, -0.490478, -6.30248) +visible = false +modulate = Color(0.294118, 1, 0.631373, 1) +text = "[Space] to toggle PCam" +font = ExtResource("7_amcmx") +font_size = 48 + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0.260217, 1.60477, -9.07797) +mesh = SubResource("CylinderMesh_sm466") +surface_material_override/0 = SubResource("StandardMaterial3D_hp48l") + +[node name="MeshInstance3D3" type="MeshInstance3D" parent="."] +transform = Transform3D(-1, -8.74228e-08, 3.82137e-15, 0, -4.37114e-08, -1, 8.74228e-08, -1, 4.37114e-08, 0.0525861, 1.60477, 9.98156) +mesh = SubResource("CylinderMesh_sm466") +surface_material_override/0 = SubResource("StandardMaterial3D_hp48l") + +[editable path="PlayerCharacterBody3D"] diff --git a/addons/phantom_camera/examples/example_scenes/3D/3d_follow_third_person_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_third_person_example_scene.tscn index 5c1f34c..d7fae5e 100644 --- a/addons/phantom_camera/examples/example_scenes/3D/3d_follow_third_person_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/3D/3d_follow_third_person_example_scene.tscn @@ -11,7 +11,7 @@ [sub_resource type="Resource" id="Resource_8fhct"] script = ExtResource("2_47xf2") duration = 0.3 -transition = 3 +transition = 2 ease = 1 [sub_resource type="Resource" id="Resource_7m0fv"] @@ -19,7 +19,12 @@ script = ExtResource("5_jt2lp") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="Resource" id="Resource_e7t18"] script = ExtResource("2_47xf2") @@ -32,7 +37,12 @@ script = ExtResource("5_jt2lp") cull_mask = 1048575 h_offset = 1.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="BoxMesh" id="BoxMesh_wsigl"] size = Vector3(1, 10, 20) @@ -46,24 +56,32 @@ duration = 0.6 transition = 3 ease = 1 -[sub_resource type="Resource" id="Resource_y5dqe"] +[sub_resource type="Resource" id="Resource_ioijp"] script = ExtResource("5_jt2lp") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [node name="Root" type="Node3D"] +[node name="PlayerCharacterBody3D" parent="." instance=ExtResource("7_kut0u")] +unique_name_in_owner = true + [node name="PlayerPhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")] unique_name_in_owner = true -transform = Transform3D(1, 0, 0, 0, 0.866025, 0.499999, 0, -0.5, 0.866023, -0.0194088, 2.25688, 3.01476) +transform = Transform3D(1, 0, 0, 0, 0.866023, 0.499997, 0, -0.499999, 0.866021, -0.0194088, 2.25687, 3.01475) script = ExtResource("2_whx47") priority = 10 follow_mode = 6 follow_target = NodePath("../PlayerCharacterBody3D/PlayerVisual") tween_resource = SubResource("Resource_8fhct") -tween_on_load = null +tween_on_load = false camera_3d_resource = SubResource("Resource_7m0fv") follow_damping = true follow_distance = 3.5 @@ -71,27 +89,24 @@ spring_length = 3.5 [node name="PlayerAimPhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")] unique_name_in_owner = true -transform = Transform3D(0.953716, -0.0104945, 0.300522, 0, 0.99939, 0.0348995, -0.300706, -0.0332842, 0.953135, 0.431374, 1.35923, 1.41338) +transform = Transform3D(0.953716, -0.0104945, 0.300522, 0, 0.99939, 0.0348995, -0.300706, -0.0332842, 0.953135, 0.431374, 1.35923, 1.01438) script = ExtResource("2_whx47") follow_mode = 6 follow_target = NodePath("../PlayerCharacterBody3D/PlayerVisual") tween_resource = SubResource("Resource_e7t18") -tween_on_load = null +tween_on_load = false camera_3d_resource = SubResource("Resource_jogxh") -follow_offset = Vector3(0, 0.8, 0) -follow_damping = true +follow_offset = Vector3(0, 0.8, -0.399) follow_distance = 1.5 spring_length = 1.5 -[node name="PlayerCharacterBody3D" parent="." instance=ExtResource("7_kut0u")] -unique_name_in_owner = true - [node name="MainCamera3D" type="Camera3D" parent="."] unique_name_in_owner = true -transform = Transform3D(1, 0, 0, 0, 0.866025, 0.499999, 0, -0.5, 0.866023, -0.0194088, 2.25688, 3.01476) -current = true +transform = Transform3D(1, 0, 0, 0, 0.866025, 0.5, 0, -0.5, 0.866025, -0.0194088, 2.25687, 3.01475) [node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("5_oc4q1") [node name="Environment" type="Node" parent="."] @@ -144,8 +159,7 @@ unique_name_in_owner = true transform = Transform3D(-4.37114e-08, -1, 2.98023e-08, 0, 2.98023e-08, 1, -1, 4.37114e-08, -1.3027e-15, -0.200665, 13.366, -0.162648) script = ExtResource("2_whx47") tween_resource = SubResource("Resource_afrr1") -tween_on_load = null -camera_3d_resource = SubResource("Resource_y5dqe") +camera_3d_resource = SubResource("Resource_ioijp") [node name="MovementInstructionsLabel" type="Label3D" parent="."] transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.0505604, -0.484909, 1.44357) diff --git a/addons/phantom_camera/examples/example_scenes/3D/3d_look_at_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3d_look_at_example_scene.tscn index d6fa268..cc5c045 100644 --- a/addons/phantom_camera/examples/example_scenes/3D/3d_look_at_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/3D/3d_look_at_example_scene.tscn @@ -19,7 +19,12 @@ script = ExtResource("4_m3qpq") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="CapsuleMesh" id="CapsuleMesh_2h36r"] @@ -34,32 +39,31 @@ albedo_texture = ExtResource("5_u5qhp") uv1_triplanar = true uv1_world_triplanar = true -[node name="Node3D" type="Node3D"] +[node name="Root" type="Node3D"] [node name="MainCamera3D" type="Camera3D" parent="."] unique_name_in_owner = true -transform = Transform3D(0.998682, 0.0324725, -0.0397495, 0, 0.774433, 0.632656, 0.0513272, -0.631822, 0.773413, -0.137901, 4.03222, 6.36446) +transform = Transform3D(0.998682, 0.0324725, -0.0397495, 0, 0.774433, 0.632656, 0.0513272, -0.631822, 0.773412, -0.137901, 4.03222, 6.36446) [node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] -process_priority = 100 +process_priority = 300 +process_physics_priority = 300 script = ExtResource("1_lldvu") [node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) metadata/_edit_lock_ = true -[node name="PhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("look_at_target", "look_at_targets")] +[node name="PhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("look_at_target")] transform = Transform3D(0.998682, 0.0324725, -0.0397495, 0, 0.774433, 0.632656, 0.0513272, -0.631822, 0.773413, -0.137901, 4.03222, 6.36446) script = ExtResource("2_8md3q") priority = 10 look_at_mode = 2 look_at_target = NodePath("../PlayerCharacterBody3D2/PlayerVisual") -look_at_targets = [null, NodePath("../NPCs/PlayerMeshInstance3D")] tween_resource = SubResource("Resource_pwcgo") tween_on_load = false camera_3d_resource = SubResource("Resource_ft2w3") look_at_damping = true -look_at_damping_value = 0.1 [node name="PlayerCharacterBody3D2" parent="." instance=ExtResource("1_i2pjc")] diff --git a/addons/phantom_camera/examples/example_scenes/3D/3d_noise_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3d_noise_example_scene.tscn new file mode 100644 index 0000000..8a76989 --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D/3d_noise_example_scene.tscn @@ -0,0 +1,209 @@ +[gd_scene load_steps=22 format=3 uid="uid://p7s5t3tthmo"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_ggfbg"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd" id="2_dreow"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="3_f8fcw"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd" id="4_mjtut"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/phantom_camera_noise_3d.gd" id="4_poyyk"] +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3d_cube_dark.tscn" id="5_d6uqs"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller_first_person.gd" id="6_fbad7"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_3d.gd" id="6_n8u0x"] +[ext_resource type="Texture2D" uid="uid://c7ja4woxol8yc" path="res://addons/phantom_camera/examples/textures/3D/checker_pattern_dark.png" id="6_vpla5"] +[ext_resource type="FontFile" uid="uid://dve7mgsjik4dg" path="res://addons/phantom_camera/fonts/Nunito-Regular.ttf" id="10_0thai"] +[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="11_i8r8q"] + +[sub_resource type="Resource" id="Resource_t3bgw"] +script = ExtResource("4_poyyk") +amplitude = 30.0 +frequency = 2.0 +randomize_noise_seed = 1 +noise_seed = 0 +rotational_noise = true +positional_noise = false +rotational_multiplier_x = 0.1 +rotational_multiplier_y = 0.1 +rotational_multiplier_z = 0.0 +positional_multiplier_x = 0.0 +positional_multiplier_y = 0.0 +positional_multiplier_z = 0.0 + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_yvgu3"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_vc6km"] +albedo_color = Color(0.988235, 0.498039, 0.498039, 1) + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_lsrh7"] +radius = 0.269454 + +[sub_resource type="Resource" id="Resource_lhgur"] +script = ExtResource("3_f8fcw") +duration = 1.0 +transition = 0 +ease = 2 + +[sub_resource type="Resource" id="Resource_ghjuj"] +script = ExtResource("4_mjtut") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +projection = 0 +fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 + +[sub_resource type="Resource" id="Resource_2l4w0"] +script = ExtResource("4_poyyk") +amplitude = 40.0 +frequency = 0.2 +randomize_noise_seed = 0 +noise_seed = 0 +rotational_noise = true +positional_noise = false +rotational_multiplier_x = 1.0 +rotational_multiplier_y = 1.0 +rotational_multiplier_z = 0.0 +positional_multiplier_x = 0.1 +positional_multiplier_y = 0.1 +positional_multiplier_z = 0.1 + +[sub_resource type="Resource" id="Resource_6tnhy"] +script = ExtResource("4_poyyk") +amplitude = 10.0 +frequency = 4.2 +randomize_noise_seed = 0 +noise_seed = 928 +rotational_noise = true +positional_noise = false +rotational_multiplier_x = 1.0 +rotational_multiplier_y = 1.0 +rotational_multiplier_z = 0.1 +positional_multiplier_x = 1.0 +positional_multiplier_y = 1.0 +positional_multiplier_z = 1.0 + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_qi01t"] +albedo_texture = ExtResource("6_vpla5") +uv1_triplanar = true +uv1_world_triplanar = true + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ey47a"] +bg_color = Color(0.0784314, 0.109804, 0.129412, 1) +border_width_right = 4 +border_width_bottom = 4 +border_color = Color(0.227451, 0.72549, 0.603922, 1) +corner_radius_bottom_right = 20 +expand_margin_bottom = 6.0 + +[node name="Root" type="Node3D"] + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(-0.0348243, 0.0245683, 0.999091, 0, 0.999698, -0.0245832, -0.999393, -0.000856094, -0.0348138, -16.46, 0.503767, 4.249) + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 +script = ExtResource("1_ggfbg") + +[node name="PlayerCharacterBody3D" type="CharacterBody3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(0.999897, 0.0143636, 0, -0.0143636, 0.999897, 0, 0, 0, 1, -16.46, 0.503767, 4.249) +script = ExtResource("6_fbad7") +run_noise = SubResource("Resource_t3bgw") + +[node name="PlayerVisual" type="MeshInstance3D" parent="PlayerCharacterBody3D"] +unique_name_in_owner = true +visible = false +mesh = SubResource("CapsuleMesh_yvgu3") +surface_material_override/0 = SubResource("StandardMaterial3D_vc6km") + +[node name="PlayerArea3D" type="Area3D" parent="PlayerCharacterBody3D"] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="PlayerCharacterBody3D/PlayerArea3D"] +shape = SubResource("CapsuleShape3D_lsrh7") + +[node name="PlayerCollisionShape3D" type="CollisionShape3D" parent="PlayerCharacterBody3D"] +shape = SubResource("CapsuleShape3D_lsrh7") + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")] +unique_name_in_owner = true +transform = Transform3D(0.00441533, 0, 0.999915, 0, 0.999995, 0, -0.999923, 0, 0.00441529, -16.46, 0.503767, 4.249) +top_level = true +script = ExtResource("2_dreow") +priority = 10 +follow_mode = 2 +follow_target = NodePath("../PlayerCharacterBody3D") +tween_resource = SubResource("Resource_lhgur") +tween_on_load = false +camera_3d_resource = SubResource("Resource_ghjuj") +noise = SubResource("Resource_2l4w0") +noise_emitter_layer = 1 + +[node name="PlayerPhantomCameraNoiseEmitter3D" type="Node3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(-4.37085e-08, 0, 0.999925, 0, 0.999995, 0, -0.999933, 0, -4.37081e-08, -16.46, 0.503767, 4.249) +script = ExtResource("6_n8u0x") +noise = SubResource("Resource_6tnhy") +duration = 0.1 +decay_time = 0.1 + +[node name="Environment" type="Node" parent="."] + +[node name="Floor" parent="Environment" instance=ExtResource("5_d6uqs")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="CSGBox3D" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.525, 6.539, 2.5) +use_collision = true +size = Vector3(178.429, 14.0773, 1) +material = SubResource("StandardMaterial3D_qi01t") + +[node name="CSGBox3D3" type="CSGBox3D" parent="Environment"] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 8.83707, 6.53866, -1.80739) +use_collision = true +size = Vector3(178.429, 14.0773, 1) +material = SubResource("StandardMaterial3D_qi01t") + +[node name="CSGBox3D4" type="CSGBox3D" parent="Environment"] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -38.9392, 6.53866, -1.80739) +use_collision = true +size = Vector3(178.429, 14.0773, 1) +material = SubResource("StandardMaterial3D_qi01t") + +[node name="CSGBox3D2" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.525, 6.539, 6) +use_collision = true +size = Vector3(178.429, 14.0773, 1) +material = SubResource("StandardMaterial3D_qi01t") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="EmitterTip" type="Panel" parent="."] +unique_name_in_owner = true +visible = false +anchors_preset = -1 +anchor_right = 0.3 +anchor_bottom = 0.1 +theme_override_styles/panel = SubResource("StyleBoxFlat_ey47a") + +[node name="Guidance" type="RichTextLabel" parent="EmitterTip"] +layout_mode = 1 +anchors_preset = -1 +anchor_top = 0.5 +anchor_right = 1.0 +anchor_bottom = 0.5 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_vertical = 8 +theme_override_fonts/normal_font = ExtResource("10_0thai") +theme_override_fonts/bold_font = ExtResource("11_i8r8q") +theme_override_font_sizes/normal_font_size = 18 +theme_override_font_sizes/bold_font_size = 24 +bbcode_enabled = true +text = "[center]Press [b]Q[/b] to trigger Noise Emitter" +fit_content = true diff --git a/addons/phantom_camera/examples/example_scenes/3D/3d_tweening_example_scene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3d_tweening_example_scene.tscn index eeba110..44ac8b8 100644 --- a/addons/phantom_camera/examples/example_scenes/3D/3d_tweening_example_scene.tscn +++ b/addons/phantom_camera/examples/example_scenes/3D/3d_tweening_example_scene.tscn @@ -15,7 +15,12 @@ script = ExtResource("5_cn3g7") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="BoxShape3D" id="BoxShape3D_j6fha"] size = Vector3(5, 0.1, 4) @@ -38,7 +43,12 @@ script = ExtResource("5_cn3g7") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="Resource" id="Resource_uxg44"] script = ExtResource("6_wup4d") @@ -51,7 +61,12 @@ script = ExtResource("5_cn3g7") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="Resource" id="Resource_0nci0"] script = ExtResource("6_wup4d") @@ -64,7 +79,12 @@ script = ExtResource("5_cn3g7") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [sub_resource type="Resource" id="Resource_50m5g"] script = ExtResource("6_wup4d") @@ -77,7 +97,12 @@ script = ExtResource("5_cn3g7") cull_mask = 1048575 h_offset = 0.0 v_offset = 0.0 +projection = 0 fov = 75.0 +size = 1.0 +frustum_offset = Vector2(0, 0) +near = 0.05 +far = 4000.0 [node name="Root" type="Node3D"] @@ -93,9 +118,11 @@ metadata/_edit_lock_ = true [node name="MainCamera3D" type="Camera3D" parent="."] unique_name_in_owner = true -transform = Transform3D(0.999889, 0, 0, 0, 0.707092, 0.707088, 0, -0.707092, 0.707088, 0.083587, 2.507, 4.05493) +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0.083587, 2.507, 4.05493) [node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +process_priority = 300 +process_physics_priority = 300 script = ExtResource("2_b2yrt") [node name="------------------" type="Node" parent="."] @@ -103,6 +130,7 @@ script = ExtResource("2_b2yrt") [node name="PlayerPhantomCamera3D" type="Node3D" parent="." node_paths=PackedStringArray("follow_target")] unique_name_in_owner = true transform = Transform3D(0.999889, 0, 0, 0, 0.707092, 0.707088, 0, -0.707092, 0.707088, 0.083587, 2.507, 4.05493) +top_level = true script = ExtResource("3_m2w30") priority = 3 follow_mode = 2 diff --git a/addons/phantom_camera/examples/scripts/2D/2d_room_limit_tween.gd.uid b/addons/phantom_camera/examples/scripts/2D/2d_room_limit_tween.gd.uid new file mode 100644 index 0000000..df09cbd --- /dev/null +++ b/addons/phantom_camera/examples/scripts/2D/2d_room_limit_tween.gd.uid @@ -0,0 +1 @@ +uid://d4insihf88cqw diff --git a/addons/phantom_camera/examples/scripts/2D/2d_room_limit_tween_4.3.gd.uid b/addons/phantom_camera/examples/scripts/2D/2d_room_limit_tween_4.3.gd.uid new file mode 100644 index 0000000..f853dae --- /dev/null +++ b/addons/phantom_camera/examples/scripts/2D/2d_room_limit_tween_4.3.gd.uid @@ -0,0 +1 @@ +uid://cupi3if7b3l2e diff --git a/addons/phantom_camera/examples/scripts/2D/2d_trigger_area.gd.uid b/addons/phantom_camera/examples/scripts/2D/2d_trigger_area.gd.uid new file mode 100644 index 0000000..6f6b213 --- /dev/null +++ b/addons/phantom_camera/examples/scripts/2D/2d_trigger_area.gd.uid @@ -0,0 +1 @@ +uid://b3oiv82uroykv diff --git a/addons/phantom_camera/examples/scripts/2D/player_character_body_2d.gd b/addons/phantom_camera/examples/scripts/2D/player_character_body_2d.gd index c7fd488..8003bb3 100644 --- a/addons/phantom_camera/examples/scripts/2D/player_character_body_2d.gd +++ b/addons/phantom_camera/examples/scripts/2D/player_character_body_2d.gd @@ -47,8 +47,8 @@ var InputMovementDic: Dictionary = { func _ready() -> void: - _player_area2d.connect("body_shape_entered", _show_prompt) - _player_area2d.connect("body_shape_exited", _hide_prompt) + _player_area2d.body_shape_entered.connect(_show_prompt) + _player_area2d.body_shape_exited.connect(_hide_prompt) _ui_sign = owner.get_node("%UISign") @@ -187,4 +187,3 @@ func _hide_prompt(body_rid: RID, body: Node2D, body_shape_index: int, local_shap _interactive_UI = null _interactive_object = InteractiveType.NONE _active_pcam = null - diff --git a/addons/phantom_camera/examples/scripts/2D/player_character_body_2d.gd.uid b/addons/phantom_camera/examples/scripts/2D/player_character_body_2d.gd.uid new file mode 100644 index 0000000..798760d --- /dev/null +++ b/addons/phantom_camera/examples/scripts/2D/player_character_body_2d.gd.uid @@ -0,0 +1 @@ +uid://7mcexsmtdhmj diff --git a/addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd b/addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd index 590b5ae..41ab5e2 100644 --- a/addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd +++ b/addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd @@ -6,6 +6,7 @@ extends CharacterBody2D @onready var _interaction_prompt: Panel = %InteractionPrompt @onready var _ui_sign: Control @onready var _dark_overlay: ColorRect = %DarkOverlay +@onready var _noise_emitter: PhantomCameraNoiseEmitter2D const KEY_STRINGNAME: StringName = "Key" const ACTION_STRINGNAME: StringName = "Action" @@ -44,8 +45,8 @@ var InputMovementDic: Dictionary = { func _ready() -> void: - _player_area2d.connect("body_shape_entered", _show_prompt) - _player_area2d.connect("body_shape_exited", _hide_prompt) + _player_area2d.body_shape_entered.connect(_show_prompt) + _player_area2d.body_shape_exited.connect(_hide_prompt) _ui_sign = owner.get_node("%UISign") @@ -88,6 +89,10 @@ func _unhandled_input(event: InputEvent) -> void: _hide_interactive_node(_interactive_UI) _interactive_node_logic() + if Input.is_physical_key_pressed(KEY_Q): + if get_node_or_null("%PlayerPhantomCameraNoiseEmitter2D"): + %PlayerPhantomCameraNoiseEmitter2D.emit() + func _show_interactive_node(UI: Control) -> void: UI.modulate.a = 0 @@ -137,11 +142,10 @@ func _physics_process(delta: float) -> void: func _show_prompt(body_rid: RID, body: Node2D, body_shape_index: int, local_shape: int) -> void: - if body is TileMap: - var tile_map: TileMap = body - + if body.is_class("TileMapLayer"): # TODO - Using string reference to support Godot 4.2 + var tile_map := body var tile_coords: Vector2i = tile_map.get_coords_for_body_rid(body_rid) - var cell_data: TileData = tile_map.get_cell_tile_data(1, tile_coords) + var cell_data: TileData = tile_map.get_cell_tile_data(tile_coords) if cell_data: var cell_data_type: StringName = cell_data.get_custom_data("Type") @@ -161,11 +165,11 @@ func _show_prompt(body_rid: RID, body: Node2D, body_shape_index: int, local_shap func _hide_prompt(body_rid: RID, body: Node2D, body_shape_index: int, local_shape: int) -> void: - if body is TileMap: - var tile_map: TileMap = body + if body.is_class("TileMapLayer"): # TODO - Using string reference to support Godot 4.2 + var tile_map := body var tile_coords: Vector2i = tile_map.get_coords_for_body_rid(body_rid) - var cell_data: TileData = tile_map.get_cell_tile_data(1, tile_coords) + var cell_data: TileData = tile_map.get_cell_tile_data(tile_coords) if cell_data: _interaction_prompt.set_visible(false) @@ -173,4 +177,3 @@ func _hide_prompt(body_rid: RID, body: Node2D, body_shape_index: int, local_shap _interactive_UI = null _interactive_object = InteractiveType.NONE _active_pcam = null - diff --git a/addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd.uid b/addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd.uid new file mode 100644 index 0000000..717c71a --- /dev/null +++ b/addons/phantom_camera/examples/scripts/2D/player_character_body_2d_4.3.gd.uid @@ -0,0 +1 @@ +uid://c0hw1qepj2ii0 diff --git a/addons/phantom_camera/examples/scripts/3D/3d_trigger_area.gd.uid b/addons/phantom_camera/examples/scripts/3D/3d_trigger_area.gd.uid new file mode 100644 index 0000000..81d37c7 --- /dev/null +++ b/addons/phantom_camera/examples/scripts/3D/3d_trigger_area.gd.uid @@ -0,0 +1 @@ +uid://dre5kicdywurd diff --git a/addons/phantom_camera/examples/scripts/3D/npc.gd.uid b/addons/phantom_camera/examples/scripts/3D/npc.gd.uid new file mode 100644 index 0000000..4b27b2b --- /dev/null +++ b/addons/phantom_camera/examples/scripts/3D/npc.gd.uid @@ -0,0 +1 @@ +uid://70uuot7hvdop diff --git a/addons/phantom_camera/examples/scripts/3D/path_follow.gd.uid b/addons/phantom_camera/examples/scripts/3D/path_follow.gd.uid new file mode 100644 index 0000000..9b40b8e --- /dev/null +++ b/addons/phantom_camera/examples/scripts/3D/path_follow.gd.uid @@ -0,0 +1 @@ +uid://c17en7rr4yjwf diff --git a/addons/phantom_camera/examples/scripts/3D/player_controller.gd.uid b/addons/phantom_camera/examples/scripts/3D/player_controller.gd.uid new file mode 100644 index 0000000..85e5d54 --- /dev/null +++ b/addons/phantom_camera/examples/scripts/3D/player_controller.gd.uid @@ -0,0 +1 @@ +uid://cqpmld6a0i40c diff --git a/addons/phantom_camera/examples/scripts/3D/player_controller_4.4.gd b/addons/phantom_camera/examples/scripts/3D/player_controller_4.4.gd new file mode 100644 index 0000000..b1e6c61 --- /dev/null +++ b/addons/phantom_camera/examples/scripts/3D/player_controller_4.4.gd @@ -0,0 +1,84 @@ +extends CharacterBody3D + +@export var SPEED: float = 5.0 +@export var JUMP_VELOCITY: float = 4.5 +@export var enable_gravity = true + +@onready var _camera: Camera3D + +# Get the gravity from the project settings to be synced with RigidBody nodes. +var gravity: float = 9.8 + +var movement_enabled: bool = true + +const KEY_STRINGNAME: StringName = "Key" +const ACTION_STRINGNAME: StringName = "Action" + +const INPUT_MOVE_UP_STRINGNAME: StringName = "move_up" +const INPUT_MOVE_DOWM_STRINGNAME: StringName = "move_down" +const INPUT_MOVE_LEFT_STRINGNAME: StringName = "move_left" +const INPUT_MOVE_RIGHT_STRINGNAME: StringName = "move_right" + +var InputMovementDic: Dictionary = { + INPUT_MOVE_UP_STRINGNAME: { + KEY_STRINGNAME: KEY_W, + ACTION_STRINGNAME: INPUT_MOVE_UP_STRINGNAME + }, + INPUT_MOVE_DOWM_STRINGNAME: { + KEY_STRINGNAME: KEY_S, + ACTION_STRINGNAME: INPUT_MOVE_DOWM_STRINGNAME + }, + INPUT_MOVE_LEFT_STRINGNAME: { + KEY_STRINGNAME: KEY_A, + ACTION_STRINGNAME: INPUT_MOVE_LEFT_STRINGNAME + }, + INPUT_MOVE_RIGHT_STRINGNAME: { + KEY_STRINGNAME: KEY_D, + ACTION_STRINGNAME: INPUT_MOVE_RIGHT_STRINGNAME + }, +} + + +func _ready() -> void: + for input in InputMovementDic: + var key_val = InputMovementDic[input].get(KEY_STRINGNAME) + var action_val = InputMovementDic[input].get(ACTION_STRINGNAME) + + _camera = owner.get_node("%MainCamera3D") + + var movement_input = InputEventKey.new() + movement_input.physical_keycode = key_val + InputMap.add_action(action_val) + InputMap.action_add_event(action_val, movement_input) + + +func _physics_process(delta: float) -> void: + # Add the gravity. + if enable_gravity and not is_on_floor(): + velocity.y -= gravity * delta + + if not movement_enabled: return + + # Get the input direction and handle the movement/deceleration. + # As good practice, you should replace UI actions with custom gameplay actions. + var input_dir: Vector2 = Input.get_vector( + INPUT_MOVE_LEFT_STRINGNAME, + INPUT_MOVE_RIGHT_STRINGNAME, + INPUT_MOVE_UP_STRINGNAME, + INPUT_MOVE_DOWM_STRINGNAME + ) + + var direction: Vector3 = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized() + if direction: + var move_dir: Vector3 = Vector3.ZERO + move_dir.x = direction.x + move_dir.z = direction.z + + move_dir = move_dir.rotated(Vector3.UP, _camera.rotation.y).normalized() + velocity.x = move_dir.x * SPEED + velocity.z = move_dir.z * SPEED + else: + velocity.x = move_toward(velocity.x, 0, SPEED) + velocity.z = move_toward(velocity.z, 0, SPEED) + + move_and_slide() \ No newline at end of file diff --git a/addons/phantom_camera/examples/scripts/3D/player_controller_4.4.gd.uid b/addons/phantom_camera/examples/scripts/3D/player_controller_4.4.gd.uid new file mode 100644 index 0000000..489a883 --- /dev/null +++ b/addons/phantom_camera/examples/scripts/3D/player_controller_4.4.gd.uid @@ -0,0 +1 @@ +uid://dwhk1i10b32ei diff --git a/addons/phantom_camera/examples/scripts/3D/player_controller_first_person.gd b/addons/phantom_camera/examples/scripts/3D/player_controller_first_person.gd new file mode 100644 index 0000000..7e2da3f --- /dev/null +++ b/addons/phantom_camera/examples/scripts/3D/player_controller_first_person.gd @@ -0,0 +1,54 @@ +extends "player_controller.gd" + +@onready var _player_pcam: PhantomCamera3D = %PlayerPhantomCamera3D + +@onready var _player_character: CharacterBody3D = %PlayerCharacterBody3D + +@export var mouse_sensitivity: float = 0.05 + +@export var min_pitch: float = -89.9 +@export var max_pitch: float = 50 + +@export var min_yaw: float = 0 +@export var max_yaw: float = 360 + +@export var run_noise: PhantomCameraNoise3D + +func _ready() -> void: + super() + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) + + if get_node_or_null("%PlayerPhantomCameraNoiseEmitter3D"): + %EmitterTip.visible = true + + +func _physics_process(delta: float) -> void: + super(delta) + + +func _unhandled_input(event: InputEvent) -> void: + if event is InputEventKey: + if get_node_or_null("%PlayerPhantomCameraNoiseEmitter3D"): + if event.keycode == KEY_Q and event.is_pressed(): + %PlayerPhantomCameraNoiseEmitter3D.emit() + + if event is InputEventMouseMotion: + var pcam_rotation_degrees: Vector3 + + # Assigns the current 3D rotation of the SpringArm3D node - so it starts off where it is in the editor + pcam_rotation_degrees = _player_pcam.rotation_degrees + + # Change the X rotation + pcam_rotation_degrees.x -= event.relative.y * mouse_sensitivity + + # Clamp the rotation in the X axis so it go over or under the target + pcam_rotation_degrees.x = clampf(pcam_rotation_degrees.x, min_pitch, max_pitch) + + # Change the Y rotation value + pcam_rotation_degrees.y -= event.relative.x * mouse_sensitivity + + # Sets the rotation to fully loop around its target, but witout going below or exceeding 0 and 360 degrees respectively + pcam_rotation_degrees.y = wrapf(pcam_rotation_degrees.y, min_yaw, max_yaw) + + # Change the SpringArm3D node's rotation and rotate around its target + _player_pcam.rotation_degrees = pcam_rotation_degrees diff --git a/addons/phantom_camera/examples/scripts/3D/player_controller_first_person.gd.uid b/addons/phantom_camera/examples/scripts/3D/player_controller_first_person.gd.uid new file mode 100644 index 0000000..c0f8bee --- /dev/null +++ b/addons/phantom_camera/examples/scripts/3D/player_controller_first_person.gd.uid @@ -0,0 +1 @@ +uid://1xkmomho8uqo diff --git a/addons/phantom_camera/examples/scripts/3D/player_controller_first_person_4.4.gd b/addons/phantom_camera/examples/scripts/3D/player_controller_first_person_4.4.gd new file mode 100644 index 0000000..33e4601 --- /dev/null +++ b/addons/phantom_camera/examples/scripts/3D/player_controller_first_person_4.4.gd @@ -0,0 +1,54 @@ +extends "player_controller_4.4.gd" + +@onready var _player_pcam: PhantomCamera3D = %PlayerPhantomCamera3D + +@onready var _player_character: CharacterBody3D = %PlayerCharacterBody3D + +@export var mouse_sensitivity: float = 0.05 + +@export var min_pitch: float = -89.9 +@export var max_pitch: float = 50 + +@export var min_yaw: float = 0 +@export var max_yaw: float = 360 + +@export var run_noise: PhantomCameraNoise3D + +func _ready() -> void: + super() + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) + + if get_node_or_null("%PlayerPhantomCameraNoiseEmitter3D"): + %EmitterTip.visible = true + + +func _physics_process(delta: float) -> void: + super(delta) + + +func _unhandled_input(event: InputEvent) -> void: + if event is InputEventKey: + if get_node_or_null("%PlayerPhantomCameraNoiseEmitter3D"): + if event.keycode == KEY_Q and event.is_pressed(): + %PlayerPhantomCameraNoiseEmitter3D.emit() + + if event is InputEventMouseMotion: + var pcam_rotation_degrees: Vector3 + + # Assigns the current 3D rotation of the SpringArm3D node - so it starts off where it is in the editor + pcam_rotation_degrees = _player_pcam.rotation_degrees + + # Change the X rotation + pcam_rotation_degrees.x -= event.relative.y * mouse_sensitivity + + # Clamp the rotation in the X axis so it go over or under the target + pcam_rotation_degrees.x = clampf(pcam_rotation_degrees.x, min_pitch, max_pitch) + + # Change the Y rotation value + pcam_rotation_degrees.y -= event.relative.x * mouse_sensitivity + + # Sets the rotation to fully loop around its target, but witout going below or exceeding 0 and 360 degrees respectively + pcam_rotation_degrees.y = wrapf(pcam_rotation_degrees.y, min_yaw, max_yaw) + + # Change the SpringArm3D node's rotation and rotate around its target + _player_pcam.rotation_degrees = pcam_rotation_degrees diff --git a/addons/phantom_camera/examples/scripts/3D/player_controller_first_person_4.4.gd.uid b/addons/phantom_camera/examples/scripts/3D/player_controller_first_person_4.4.gd.uid new file mode 100644 index 0000000..a3ac4a1 --- /dev/null +++ b/addons/phantom_camera/examples/scripts/3D/player_controller_first_person_4.4.gd.uid @@ -0,0 +1 @@ +uid://6epjre2axgsh diff --git a/addons/phantom_camera/examples/scripts/3D/player_controller_third_person.gd b/addons/phantom_camera/examples/scripts/3D/player_controller_third_person.gd index 9bd3a76..f5d5579 100644 --- a/addons/phantom_camera/examples/scripts/3D/player_controller_third_person.gd +++ b/addons/phantom_camera/examples/scripts/3D/player_controller_third_person.gd @@ -17,11 +17,11 @@ extends "player_controller.gd" func _ready() -> void: super() - + _player_pcam = owner.get_node("%PlayerPhantomCamera3D") _aim_pcam = owner.get_node("%PlayerAimPhantomCamera3D") _ceiling_pcam = owner.get_node("%CeilingPhantomCamera3D") - + if _player_pcam.get_follow_mode() == _player_pcam.FollowMode.THIRD_PERSON: Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) @@ -38,13 +38,12 @@ func _unhandled_input(event: InputEvent) -> void: if _player_pcam.get_follow_mode() == _player_pcam.FollowMode.THIRD_PERSON: var active_pcam: PhantomCamera3D - if is_instance_valid(_aim_pcam): - _set_pcam_rotation(_player_pcam, event) - _set_pcam_rotation(_aim_pcam, event) - if _player_pcam.get_priority() > _aim_pcam.get_priority(): - _toggle_aim_pcam(event) - else: - _toggle_aim_pcam(event) + _set_pcam_rotation(_player_pcam, event) + _set_pcam_rotation(_aim_pcam, event) + if _player_pcam.get_priority() > _aim_pcam.get_priority(): + _toggle_aim_pcam(event) + else: + _toggle_aim_pcam(event) if event is InputEventKey and event.pressed: if event.keycode == KEY_SPACE: diff --git a/addons/phantom_camera/examples/scripts/3D/player_controller_third_person.gd.uid b/addons/phantom_camera/examples/scripts/3D/player_controller_third_person.gd.uid new file mode 100644 index 0000000..4377e00 --- /dev/null +++ b/addons/phantom_camera/examples/scripts/3D/player_controller_third_person.gd.uid @@ -0,0 +1 @@ +uid://tru1srjkculj diff --git a/addons/phantom_camera/examples/scripts/3D/player_controller_third_person_4.4.gd b/addons/phantom_camera/examples/scripts/3D/player_controller_third_person_4.4.gd new file mode 100644 index 0000000..7c81185 --- /dev/null +++ b/addons/phantom_camera/examples/scripts/3D/player_controller_third_person_4.4.gd @@ -0,0 +1,85 @@ +extends "player_controller_4.4.gd" + +@onready var _player_pcam: PhantomCamera3D +@onready var _aim_pcam: PhantomCamera3D +@onready var _player_direction: Node3D = %PlayerDirection +@onready var _ceiling_pcam: PhantomCamera3D + +@export var mouse_sensitivity: float = 0.05 + +@export var min_pitch: float = -89.9 +@export var max_pitch: float = 50 + +@export var min_yaw: float = 0 +@export var max_yaw: float = 360 + + +func _ready() -> void: + super() + + _player_pcam = owner.get_node("%PlayerPhantomCamera3D") + _aim_pcam = owner.get_node("%PlayerAimPhantomCamera3D") + _ceiling_pcam = owner.get_node("%CeilingPhantomCamera3D") + + if _player_pcam.get_follow_mode() == _player_pcam.FollowMode.THIRD_PERSON: + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) + +func _physics_process(delta: float) -> void: + super(delta) + + if velocity.length() > 0.2: + var look_direction: Vector2 = Vector2(velocity.z, velocity.x) + _player_direction.rotation.y = look_direction.angle() + + +func _unhandled_input(event: InputEvent) -> void: + if _player_pcam.get_follow_mode() == _player_pcam.FollowMode.THIRD_PERSON: + var active_pcam: PhantomCamera3D + + _set_pcam_rotation(_player_pcam, event) + _set_pcam_rotation(_aim_pcam, event) + if _player_pcam.get_priority() > _aim_pcam.get_priority(): + _toggle_aim_pcam(event) + else: + _toggle_aim_pcam(event) + + if event is InputEventKey and event.pressed: + if event.keycode == KEY_SPACE: + if _ceiling_pcam.get_priority() < 30 and _player_pcam.is_active(): + _ceiling_pcam.set_priority(30) + else: + _ceiling_pcam.set_priority(1) + + +func _set_pcam_rotation(pcam: PhantomCamera3D, event: InputEvent) -> void: + if event is InputEventMouseMotion: + var pcam_rotation_degrees: Vector3 + + # Assigns the current 3D rotation of the SpringArm3D node - so it starts off where it is in the editor + pcam_rotation_degrees = pcam.get_third_person_rotation_degrees() + + # Change the X rotation + pcam_rotation_degrees.x -= event.relative.y * mouse_sensitivity + + # Clamp the rotation in the X axis so it go over or under the target + pcam_rotation_degrees.x = clampf(pcam_rotation_degrees.x, min_pitch, max_pitch) + + # Change the Y rotation value + pcam_rotation_degrees.y -= event.relative.x * mouse_sensitivity + + # Sets the rotation to fully loop around its target, but witout going below or exceeding 0 and 360 degrees respectively + pcam_rotation_degrees.y = wrapf(pcam_rotation_degrees.y, min_yaw, max_yaw) + + # Change the SpringArm3D node's rotation and rotate around its target + pcam.set_third_person_rotation_degrees(pcam_rotation_degrees) + + +func _toggle_aim_pcam(event: InputEvent) -> void: + if event is InputEventMouseButton \ + and event.is_pressed() \ + and event.button_index == 2 \ + and (_player_pcam.is_active() or _aim_pcam.is_active()): + if _player_pcam.get_priority() > _aim_pcam.get_priority(): + _aim_pcam.set_priority(30) + else: + _aim_pcam.set_priority(0) diff --git a/addons/phantom_camera/examples/scripts/3D/player_controller_third_person_4.4.gd.uid b/addons/phantom_camera/examples/scripts/3D/player_controller_third_person_4.4.gd.uid new file mode 100644 index 0000000..0293f12 --- /dev/null +++ b/addons/phantom_camera/examples/scripts/3D/player_controller_third_person_4.4.gd.uid @@ -0,0 +1 @@ +uid://b6luh4c44tv75 diff --git a/addons/phantom_camera/examples/textures/2D/player_sprite.svg.import b/addons/phantom_camera/examples/textures/2D/player_sprite.svg.import index 41dc9dc..84c750b 100644 --- a/addons/phantom_camera/examples/textures/2D/player_sprite.svg.import +++ b/addons/phantom_camera/examples/textures/2D/player_sprite.svg.import @@ -2,7 +2,7 @@ importer="texture" type="CompressedTexture2D" -uid="uid://ci76plsequlrq" +uid="uid://cscjjt55iw2cu" path="res://.godot/imported/player_sprite.svg-8862ecb19e12152eb892607676f3831f.ctex" metadata={ "vram_texture": false diff --git a/addons/phantom_camera/examples/textures/3D/target.png b/addons/phantom_camera/examples/textures/3D/target.png new file mode 100644 index 0000000000000000000000000000000000000000..96fed6562974104c8764f7ad79acc8d46c4300f5 GIT binary patch literal 96068 zcmdRU19K%^wDyUOi6)tNVoq$FIGKrU+qP{^Y#S%G?TKyM#?AYEb$`U|s@}U7`st^7 zt*Tyo^$wGj7DIyn0S^EGkR-%~(_`Vi4Z+puS`< z2YE3;K-DDPF#rHgFDt1iB4#W3rT;&1e13j@@dO74{~BRnVBX)~At50@K0Xi;5noTwGipA0Ol5;?U92b8~a+>+5lGaYI8x&(F_&eSPol?ov}z2?z+3 zl$0bTB_AFh+S=MQH8oF8PRh#4uCA^Q4-eno-k6!0g@uI&1_rjbw-*-|cXoC-IXRDy zk1sDTv9Ym5MMZ6FY*trSCnhG=*VpOj=*Gsz*x1dGxPWFUmy^8 zc6Qd&({pokE!c?*8l7uZV~UK|#Uj=x81u9xpGik&zK`aq;>2c}7M?Sy|bk zp`oClAbENDl9H0XzP`@RP8AiE&CN||X=xG?5*;0#l$4a;zkk!v(3qNE4gj7~m78Dd185t=nD=R80CM6}6mX_YoO;Ucn zeNIPtX$1hdQOMmlsQ1fP3`Hqwzr5B%9Bq;Eu>nHT2A;=LmsF%U_$_8wo34fF<=wSk zYBj)O_9)LpbB8QncDV)sfCwNVETHJRa<*>fuwse^*b+$T3mqduecT2NGD@E<70Ew* ze(IbmP8gcFFso4<#P;8MN|NdL&#m7(mv8ca063zJau;=I^C%GmbXiLe4`+|Pif>z% zEuGuePbZ9-=|7F`-qw#^38QsBNAFK{yxw85xiepn?}&A>EBuKN^G!iVkMMs!hXBA} zO!o#o4Crd3x%z)*gXzNqHhfl^~OYg z72)Ru)DR}Fn#+E!XvSpAOuF(usiTxNsfPl(rRzHb%RNapBD35Gtg1Tk&ArUr=mEYu zDwcG;BaYL&3QF&`EZ*oYHv)=ncLe~zXIIUM*y@{?r-Hn2hZ*$;dFPZ3iGezxI|idO zQ{Q zxZptmNSD{X%v5cbS3F!+c<9*pq`K_@h*k^d8HQ2Ve*MnwdqCPfE;!*p05BCV#VF4< zS1fU!V0-dv((*LxpIp26RJKSBxh%Xsu^*6nAb{qW!R2O_bJTH0%EeV?umCff z%8SMy{!}Rw?kgLZJe7c0&r0)-I<~TVn*~03ytAkv+#h%)RsX-c%Q8fVVl;{<+@P;@{TWX<015n<|Ybll{OY zvJo%U7gm>I*>lxS_~WwVDm?=vU;s0m7O>=HS4bD?Obj@iH2QnlTA%8bX&A(Oi4CA2 zZ%SeDq8rxEbh(Y=RRd&1dQXE6!vi=hq_H+Q08G{M)|%q4crzk>Yuo@FWxN;7Sc51- zrQ{7DpjJ#LcK63I7I-XO^1rtLNEx)&AibVfSRfWH!LCDUX1}KfHb2)eIMKeC%KUNE zU+I}hZYvlyK!KvqyrZLtV4^1GW_6VO|(N%O}+o{|rLkvbr3Nt5RXQza#x zLpD~KZ8!lTN^qJ1LJt-dIXhY~Te9%yekb7xvf(O8>;T))I+}S*b6S9`mfsHqz&vIN z2*43^Lfu?jmN{Dms`B?22XtR(22WOPH4K`stOL5OY0umIFGT|y@e2U$3iRfG_Z6So z>Z02m0j^?BPV7orJt&dIE}Y-MeK%#xePYG7v)9JI=RpFxiW*KvbFLgt-DN5OTb0J= zeu;=z(1ou1t%86JqVLb9s2kQSuu<(0R}Os?2Ip7hB$qNe{m6h135y%Ks=&=_;?3^@ zfG3@?=`GB56Fi!fFcQF9$iUo}QQKt{|dg3q(V*nIWes`KI6j(}@p9PoqO_)t@9>IAy>+R?6rcw)* zayYkzUEh-L2jhTivhMTiqnfhFL+*yd(;ji%!bb32KRz6a$H&{ows5EU02n@8jqYJ` z41#xW|2GolhNzsYItT2wz0_mG0GRTWTwI~x7$+b5NqrG(YVgqt=MWvh(ScXK6hOyYTRCX|9;1#%Zb-o>u%u_S-Ced0cWCa=|J#AB3MWP=ds|0 z0;Jkt1$|8QckuGNE5RLJyx?ToMyww|aHaH-&G`~6*f z4Vc}bfT+1v>w?rh$Rw2@H0)&yIi=R!b1;T5P+Laqs0zYdPBsE{0I1%WTAGFy6@qk{f0iR z@46|kst45D@mVezHF$eh`)Eu7#@42&0vXn){^f>GdBqgK7lE#08Veo@3UUQ}KN_vh zkOs-+H`U)p0(Zas`Y^qoNp;iM2t+)@5O|~6*?&0tNGCHa-y%m+Mt#_|)`Au4GsZkN z#tv^uj%6}#`KBDQE^qmCh}i%9NL1Rg6prGy^Btnn(Ioi|ZYZan z_=mWA$`O=Q`Hc!JYdGytqX1V8nYOSgp)VOdZJytg&3d|RfWCI5!WQv5F z(F43|E!vm>@fYTBojn=Wf3ruJkr_m{0d1*@Hkewns&WkY+mie`4bk_+F14TW;BVc6 z$vXhfWYsD^XxIKVw0+E+e(>S^;6%(B@L0k^G6!KL-(qE|YG2Q?ltrRia5xn<4?jo1 z-eP#7R31(2-c6Zxog!dwvuN4qCvB{v5^f<_4g;HV7zp^2_cam&fH66%F`!0dXO4yN z3Dldf`exxLY)6BP>WlSw2!PYCrbIt_5ZRWW3hNLJYS*NKQNnZM`Yx%PGegL-G_d9|pb9zQ(ula`xVFo}_D@k)BZChd z1PKyp8_(0Bt~|rhd7#7~XAqp7bFRENuU1Y@DxTOSFGg)LE_0 zCz!|}dGoT(z4s8#;uFS5u6fm4k9I+5xloAmU5FQdF!8ZG+;5fEQB=PmE;U;9{ba-m z4N5Z-bQe75=5c!I16jCqy18CAY*+10h`6*{xbE$UZLYPjJ!~JB_Pu%v!YQ?hXhQ#- zvh?UZ87-Jm0Vd?X<5%fLX zV1F>^k)UytC+*p>ZHi-%O(kp^C|s#V5jynmqIA_@y)^n)4C~Ma=oh#Au0d0=^XuHM zX{H=4Q8?B@a>UkkT2o-Unm<98DI6SE zN*X6K!aB?oUg*gm8wtORiw~{ zh?7&Gu@q~q{n5ee_`Y*R;57GZnc4IDrDZky;x3ah97@*K;RlkAi1Rr0t=812-WK|z z+Iwkk&lvq-7^Mctmoi1ENw7OQ>%7{B_2a-TQAt{x=kvgI>eQKASav}DI|ev$lT&~$ zKB#CODC6S3(|ki|Q}nv30rU83EHdW)W!G!8?F8cEx5>QKz3(Pt3PaJ<@$nn^C8g|Q(0le<4GQ?6hRP|T+#9f<%ps!fV z0;eLqj#)NOj&9fib%>A<1U)li+)CjNw=9d4G>njeOVPP@G8fs3wWRX{!JQWJ7^j{@ z0yYZ9&_a~It?CaI5@e`deN`G7TDG=qR7&Va4vo%7?4QfJ*fI}CUdVJjg(uIEkEH5El^l3l;| zey}B6iqv(>(-Oh{S%hmAp{d$XGN-JC%_>v{_9Rx)VOn9TP}as9J-0LcBcvqlI~QRn zYu@=bM9}DcQp#|K+&@x=)^`rJx|#4pS^g@&=h5+0Pe!b}@8TZG9w3W7pANZ9q=kQ0 zAMQ6)Z7Y6%cK;WW>r9&r0RW}z;1R1X?I?30CvgkS_tv}tLLa-(?_ ztA#i|-FB>uunD06S}=AYsy5I1rXB#AY9U(Az-nz}Aex#Rh5>H;ohZjp31DzK*UvWh zv%J&#@e)8m37gne3j!NXpu>fn2db-7Q=$(KXhl^3E1JHvA>?g1@Rv~wcS!eOZl;F! zO=gCenr`pZsbItNb+|#Zz2+m1(Uge8yTZz^Th3ETdRE$`>;O))l1DUGfpfywkOfS) zNBNh!fUGM25BfBIF>gSvNrS0?7Qso=X*l>Y;|%W>4h@lom|w+2gL-`qOaOW~0Nz`* zdA3fOA>wcp4ajz)9GU}FTg`r7dnSY0I-{alqCiQLl|bQ3(Rk&yUB@8ZsLexiiJk$G ztp4b60pGXI*_}`}(@7o59;qdl;a5?Y)hSq#LZ<;(Q5j&HXFJBi3pdJR-o=^g2d}T* zVVmQdwvyu(ac<%@xC|%9%JIU?J~_!e4PJo@IzBC)S4~s(eNe(HE0=t&Z6W(syx34OFw+O~bFUIC7`JfRH$-Js{<#ze^%mK(qT*IjCGF!NiA6E) z?Xf=YL7;Yq%rlt>rEl0N>4Y-28MyiG+=hFz*k6_;;+s7!`wMtb+1g6vfR5?1ss*3f zM81HR3i%}WYMyYE@?9)gJE1Nt3C?5V*6?1r1@g(SDBd2#h$5|x8&?^Y*M;0t&G4%( z`M!J)ealCCiIU;KT4##)5fM#|n_R=iBiy0sSq%s3Nqd>+ynM~48JVD!SPb3D%d8yN zUPVowyd1Dux=ciRz_YMnwv7pzPP|dqn`E<$Q}Hb}uB^a7akw39w#W#Z9e%AO$vRo1 z{k*4bfr_^t;p$-+>M8%wl4lwOJ^4BPG5jvxNUgHF$KskOfz$r8Xje6W;7U_*Zsb?2 zF4ApK4<4RbU1cVA+a~7;)s$aleypa(Io8C+1x++`SjRW9AWqc|r6fP$+6-ctOP-?y zPYM6;D47rKCcHw^OQf^F8`a6!h6Jmw1Q&^Dg!K*TartL=1Y9CJ<79a6<#%#?NsUG6 z-m{}ikS`1On2P!mAgs1Vd24J`4M9YrD0x-q@y(>rIX4nw1Z3)0k{ncSkZ?mA)^OS} z^$-TGrYc8w2oz*tZ47n$uW-vw zauq5FB7*XZ6VNrMsX0-0Zir^X;I6|mp53XssDIt03nkJ8ryx#tn0$PHDV=?w;PmE0 zIdq$Rgj*{q%!&@OoM?n06+k_N=i?N;1fbcr^1_liQ=G%oB3WZopnwmmxd8n!q?=%_ zZ_NGmp>o{h*dwjyOx#Va6muSjIi&;p7A&9Q6+5cnM_}_WNsR9#Qg_GG=%BY0?&9U zQ2HjjLb|W~L{WM{uzqAe_!7ZichrW7u^wk4qJ3%ZMIp)oaay1l(-f+C_#-soY!Yy* zlSw&_5FUR`f(Gm*)*)V4p(yzj+D}(%8EY8TsCH`Rk1xRMoAi2nW^(gEO{O_|0$nhM`fwug_Bo)>KiN4X!aUo^g-~pm!xj z5dv!5Am6hP^gS2wDtko{tM+9`bzKn{v}}-a{aXaiLUBv9-4LX$fJ6oxD3hH!qN?F7 zHOxkw({L^j9AT}uqVyXKd|Ty8qxz`a{KMS(ViXl07%d!-}_eI(+&m&fKWWh zGs7r@tq^4cSI$1+pV$RU04H011BN8RNGF&%DynSHn~rw-ns#tS!<6NG?~JENa)>#K zpku_&WEJP4aB%8bBTAC=ltq9k_$-bm4K8lpIN(0@oR&EIOIM<^V`o1Sg4Tx_jwoCF zXDz3%9U6FVUn^1g80GRI8U}VUZ*3U1FVv&Pg(N$1U5?0f%scO6Roo45ve>3eLc!rS zWd&l|*TIq!rU$GYA({fwZ9p8MP$d}2yI+)+DEEl4e5ZdO+Gji_t7LS5*VoIL?nU%Q zJvg8ugx2C~M)%#oPq)$_S}jo$$9O~JxxJkr=$r1|oS+#&nNFSg;PAFy6DiZ0 zDN*CpOM~8N!r`Zn(8juctaM0$?i- z_eT%nJIwRov%9nO6 z!^v>we5J#D9Q570V za^jz0+m3&C&&RN^J)uIkJb@c_bNI0A(M?@SLx#}6aCsGo)F#h4-efGu-heMR>Ixls zE?>MuI;Fjhc%hLyB2;8N8=u!>U4$TrVWu9KAR7$ZF93)yfNktNOMqMOS;1!B(z+ut zsyUvGj{W^l5r|=y5wdAKCm6wBkBB|;ii#%m#YTYAQLXm^UAcdq96!FnW@ZjaB<9&o zHbT^Tjofqo5nD$;7A8`hk&dMrFvzfi=}$Lk^pN{E!lM2SHtLRqbX4o05kmFu9_fbR zgQWvDQ1G|^6UVWW91S4J%_lA^v<*$(R8;r%A>4;V+o&{G0Z>uG5=O|Q{zkkGYl+^p zi}AT4oC{Dbf7jXZx!&8r)Ac|b@ZodaB{Kro&F?YeBQGHK+Y0;ij2%${c;5c*f_O1R z!-s=Bb!gBZG-78upQ^9js`n+dKQGu@7np_m0pV+3c%a@Bmpai54FuK2 z+qf9JpaNb4!9q%EzYb<@)-V+Our&)>0=k{KbrIWEbb` z4EbaxC@Hx~JH29a!^8e@=%d6-L1+GRcb(#~^S$Z#zVcFCb@)_1Vyh)zjj^7hre%#; zA0jV#B+p%*nf;62CEX7bkQ+qeDW|WUC_d8`^YwVwz0YP$1gN1yG)~+=3p8(g1PEBW#Sv0^@ad?C^jzY+sp_4 zUvf~?J|_DhC%zLpn%*|v^9`{~Hk8?&`OcVk;l0_BVL4rh++7jQwJPJqHRF7P!27@a zO1IDn3A<|42bJj0y55stE>Rq*yCOrba5)s>T!7<0ZE)kg4pzZ2djTnv;~_ z>%0zT4BsE@kZS6n@fnmU|Nf!4xcu($%n;Hn14gD6Ev*p$5N{@J{vmlY?ny2751Wz< z6A39pX=fR!0u?{9pF>SD%q?0X_$-zLrsYOn7(Xz-XoPGM%P7Sa`6CI+ZB3>{R+uRh?)3law*-M#x)CwCJY)aGnkhv z)x~eJGg~k38wndm6BI|+7ng(ur&p~1i9h=DH|9A=3EO041RX@WIhSMUt3zuVHA1ER+_`92 z>>jf&)5SqfPNri0g9prVXbM<1i@C?5eM#N)vCNA8`hc=dIX?E=n=}l56#nzY8`JLu zqi5=t)@)TxN!X}^_n=J`28A(QhW=<8kIPZ>+Zd(mBK4E@#%xvY@3L086T#+U__#ZBGjW(=h(y|4kCz_Qcxw+9I9@lT z=27SG_&Qo*R}h{TEKaJ+0t)OD7NPp2xxOuz2d$x6<*9b$HBtF|pZ~t|TJ9-A>=o~X zJc}3I;#p5bt&9+J)0mDWqQ^xGj8tj~@9g3|n`adpyV`7SR*QpsR7J4qphAYExo;P1 z;V$WpwNxw3GPNco@=C9DAU!B6Je)4#+cQea;5;Sne&2s1JQF$7YB_sVo%&HLbI(_Bv!}p3fHCzw8{etQ68tA{;I- zIFD$#BqS0{TAm1LJ@Bd8$S|1eS|9%b=1>mjkskKlz#IFs$sZXZr>nMjgM`#f=pmp# zFZmcRmePb{Nq7!>JKdU#*7svHnjWOC=L`LdorC1qi&Y`3uV4B_H1D@|ipZSNaE-WF zzcSxX-r~v;Tw@{#`Ew9WFxmWBjjU$m;_?s%H9g*+2TfdjUeXRj7WnEDef7t9IMXjIqm_D@OL`^$9A^ zFl29&|3RfXwzo4yO)7;GK}L0?!fr0zI@eW)II6ZBQ4&Lz-YDowPeZY|hZ+oP-4#5U%xM_P#xo@+9<)tfMk&jrAuC->0hWb%@Rud8J9SlLSe0r_O#Wrbb@SCzzzFOwA2#(d@x+Z4e-d5%jJSyuzWFQWC*hyBXxKPtEZakK*)M zu`tfF%R*-o?x(fK(51kP4x08pby1`cugcLxe4lOfy(MACmK3)j+MPYNqkfjn`1hZC z7dhd5Rn8+9)p&mIhD(t4wpWOlxXVRTK2b}Vt6*J1&LIuqT*w~o>^hD|^J3!FaBuCc z+Cm^vw$`^@vmF=fCLHkL8WiD1ikd*fCqtGvq&0b^M5 zV|x5#wXZb6O;a6gM|uX_wHd#rfuvIcPv=uMNwO1q>@Y05*7v`hPwK|0s ze@(LjRPOkED``p(Ym$4V;z_Drne9)`1_hCSGaK604{$1Qw1s>p?E+{d$^O%$uweTW z-DIQ2nxd4M>=1xjIMo+~RACmD@@( z`!F0;Z4He)xusX{UyHztw`~*pa*PDK5!#UU5=g`)=-Tphrz#pSt7nfQSp) zD}osEq~>8N<&d$o%`_)=k@m2y$<#-PvUZn%n>CB`VAa$9#!8S{m#=u%i0~`S;Ro*q zF+5#;>uD(ojO1>{5>hJESjo-s-}@H%-O-_>h~on$S5FKz(}i!QF=J(dSdfLUGhK1cEaYdlH~@j@|jS~UvRqP&pdlADm*|oPd9%NQ==uyaCpo$ln)4@@ZU>R>kqjS(486euA zYeBmO+XJe7PM^`^PU)~v`=i|x>7HOgy++lPVcn>e@*EQwky!7?mpkQt4Nc8g!EzZR zD0D1}?sl`^p;E8X?TAOLUXjeIiTP5}d;x{iN_aq#F6rZwh`njgW9G`F zMP%#ciU{5oW@CI=ru7S{DOrqc>4<5Wb&L@~9q(lMaxhRBIRpCT+>2VN`ypnSx1WU9 ztz>gPDHapPVR5^j!t$OUKARJT96)Ndey5bTYe~tyiNf^F90=c3LuA`(LUNK1^L`zP zTu6C`<#kEq=lMAGFqEgMNXL+{FZ-o2(QRD^dXIWIY3yKA+9#^pUg;!p*pv$e$+{jv z9K>1|j{uuz-stKdKggL~1bf_m1*Xf1WvTCgx{4%h#>J5kna9Gx7s_bh%S-#~2!%ch zx^)4HFK74-Z@IiBf=2wFzs13>CZaM7gD}1-O9TJ$N zWS5WbCFgG2=p&BhLeF}+jRd1D%E(6NmUfO*j^7`+a11IK3_*3-5TpAEl{W-uHw})E z3^VQLH+g&1%hlmMD!y(f@0xa8UtOrf7p&bHT~a@Y8tZvGM_Ye1*p$*3h#8UKy^oshR-Jc;lfE@CG$BQaQtt{HrOFh2E(|%O1u@^tLKl-vUh;fIS+Nm z!;C4<83HrDFDAadbTdEu9%Y{w_i*3|bSrZoolG+A>|8QC6~tY99j#P}>FCL$%cULj z^}_K#rZ$#+M6^uo-W198P8-#a8Ao_T_y5h**K*-y;RNgHV+W^-0*xgZ`%ww6iBWzV z=T@ZsVLYfMI*wC?a$L-M=vqy5Xk0&EVjG9>@! zX&Xdt@U8NM^8u*c{9RFD)NRGj+sE!W2OtQJJm44M^6x|ITlEkEoq38Lq~1*3-jvp} zkF8)-8K}EzcwFn>JsMm)!-RY-UDeMc7>%_lpWFVufv%bEZ$+ZWof_c6fY%u!0~S@dYoA(BcGxt7`BzQ?v~vdeP1#Wz!V7Z` zaTWlGrYVIt25oLuCzL@*-MB1}=f-)AAU4@xR-iGhx5(+AlJ{Xt`PGKxJm@WaXz5fb zQQiji-2a~1k5ze@^9XjY-A-KIal%v{4fjO*hSVGEV9+9>fX|Oc zbn~2rsTse!F43*+-=>#TpS&F{^&n%nrfR3$2}HA&5mQtm)G3udV55+0+M0XZi&4BE3R4pnYP#+Ojd&Swh5afJ+ks+Y5-zmfEw@j1OtMl{Ia0 z%e$Q{FXxH12spm+pgR5>F?>lg&v6861{P1WSo5@u@2Gcv{Md8L zNhwtU)}YND*@{Q=z@Nhkf(#G7HB8bD+<@lp2T_mZ6aN{tSNKLW|3a9+d1xPunKk4s za;)@qkCPzqVP(N5qy@_Tau1d!2w!GwOJ^CX_n(F|#BVxT-&TOGcMKEffGt$$^mQ4Q z)4=L27gyLPCuQE;{QC_vi&S$*e{iTRwpSPRF%3eznXnD?KX%`)EON| zBMdRTZKoH&UY+6503oW#vyLL<_97Z~=vRLN+4c~-Y^Yfq78IfYb0yJB_NpF6KZhpq zp2!4o?e(3Cw6`Ki)an(lPP4QolUF{?!7pF>iI$&RL)^hjxl3Uu{a@{_4 zNIv^N6EX!s+lcX?AjR2ZQd zmQh0<1hFR{-*=->Qs$lK&j^PI->l3Z2>W*{H$}j6|9Ec>n9?rC9a&UWZGS2Rjfz7d zkMY8*>{4$XLO&W&w|1^uQ{YBXQ1R1qmj#FAs`{vKpl1A#k~(O$srkxLE=OTJg{j}j|4WfDejmO-A=WkB%&js4q*eK7Z)MtA?RljdpVE@Vmk zYMP#N8Y0otu?H{ScS8j44(%#^<1KTQ46 z=`Qt5xb+4Y<6^Be{ks@8w?4u{Q)1MvRjl~Jqmn5zos_96uZa@s_#!+^WxiSU>$MEf zu(WC%(j~qM(0rI5B2h<)O;)&zy_pO-BOp}kKQ5_#ira949-t=-*3eo9a5)fvtYJ1A z^y|z&AID$!I_ZuRo-x+Rx0iWP&t>Z-C4HYfKDAYq2EoPXr7mKHJ<*W7pBK|B7}O{) z(Y8tAvG3Ff7qQZ+hmX~at=#{hW@FN+rvZ;TdM2&Y*lCUA4iLmi^Ma|ZXoI;_!bXf1K1TW{^ zO5MwDwrjo;k(IXg%?ip1aV5A&>R z@m*@xHHvLFSIpexR!xT9vi({xFIM#&M_29i&GH>DnNjD_DN3ZWUMf>b@D~IBi^u03 z4Fnmra__&P^S=+GR)h?Cj~21a_00M24Ylc^61J(_m+MZw36X>?@B+h6vhh@P|S<+}A%ipER{TqLz zxaD{7QS+#diZZEs%;1gqEffS&i4c68dKdDdUT84}i-*$ZqlQPQNSj+e8`g;)qEP2? z^c{PCgQuLnZk5OC7pPT_(~@4gzy9OtYq^Z03i&>O&{o!H5{UX z34Tx6*#|!$0`7jkPMoc3+^jPKgTx-No|5%^aCMxHWcmwbPG-cSc)tpm5w6|mwzPGv z0=4HZ?ww?}&KNE>St=3C(W2gc+H1=CW1Mp}eJ-djUxi4rx@y291*kW0EB735t(9Dg z$9bV5@wD5HrKwxyE-3K=?=ap^<+SXXGd=W3yU_=3gCO4Eoa`v1#;O^`s}Za9*WAhO&T+vxn+S=EBDoNiB~nw+Xk^K!=TpVT zI}xV!fX^_yZU?0-Ll>G1Ibzr7ddHSumzKrQlxy6B#Wp1P#PYXFPkD?Kjn^GCyiksG zsL8&eeg%m@UJ_3E-?U6oao0?AJ(RZ_4nl6?nluLBX4jl}p==hAXd@mw_|%J3SS?#6 zHsMLmFeMSM9+PpwiKR0`nLBpZVP)4u!X+}Q~$YNSrdzvDW@(e#QKo9E&%x6JgA zkKQFU$RGb?pvY~TYr-O_YLn+>3U%(@>o$6#MVxilH4i>7c(-oUb)xf^)5XtTgqV_8 zsj}$0rTnU|{)0`QM#j#EZ{YT|CX4b~3GuHpczvBggKH)vUa3j(-Ph`!Io=I`Pz<#^ zI{mS)KYfjR!=SRKW~bzVG)MMGa>pbsoS^@RTQh0KZf7qR4~4E5tQE#$h?ILUUfTYv zGMfGnLQygDyPRR=E0Su{*xz5`y=00ZQ;>DXX`1CmWjf=EC?y;Y#|5g13KoxYpmzmgDBR~=inF)M>5G#q z8r6o~$FxRsSWC$Iq{D&a6XZr8{BABYrFYdDM-@$|S3{N9Arwy-TDs<COLKbQl<_EzKL1p-MrYe^(ecXBS^K zRiQh{M(0~cF{+rmUg814>*V$BU`9uPgk79B+=`gTN6d!QW42f;(WRvbh4~#nW_*yW86Av`o4(JF>mTI5=H#<%f-u0X@b-6= zAc@Y1J8b25*9@JsIvkfBzF*w*ylm(b8W&bUfZZqkFr&eq4^p9^LpmN4o!krH(>gR;=H3VY5#`bF$>EV>cYxwUwi18_6u8qUPOIEfh zA9c@yS7Vm&yFlo3hxj}5bhX@9avYz|&bVpL0*EzS)_oG;aUMtHrFt);BImF_0)F3xv-JD*k=OOK^zA(_kC@;i^C0dTJq!Q)`a|iNn4ZrIN>xLW zG!2CyAwNWMaf#nINuC>8iG#h0rRX1e3QEmPAlF!bZ4h&^R1H-BW?1J;A{{UwIW6Sz zY6>?l?Q9}vg9*Y6e5F*#aw9^!NBPlgo0;BqS4 zu9mGUHWlFCwyprTiEeHlcXVLct3Gkrgl=|oygYsB3GJ#scQm+J5jrEB{dFuX#K zk44oO?bz`HJRIEr#!%xN(f11OmozQnGE585XNy{>Awd!9OZohh*0=ewh&zGPBEC#8 zHcbz2DNnHdk=PPTxHskYLo6Jd8s3h$c#r&=y%OJGI3tQ5i*0B}swBDJ_ z?w<3X8cF*u=W8=a*5)(%?Y+GH7nFNOwXV_ELg%&K2WQCST!Za`}f6%h&H1VMyzVs=x{UR zsyDG^a*#DxF z^D&>KWf63VqAfZ?N?tlr%lG9)yjvZsLi7`a4fTeejdMCZz5d$Hg-O>3r6lxJ!o;Vu~PP)M600ELd`q;IXNQvdi#a$IC5^Q_tuDx#@w-KdU&*^#MPmO4>TE*1( zBgnrSkJ?Q17N)J>w{D-L*-`1=qC(VfOOX7s0IlyeK}IYbtzx)dx;&SyK(|}nc+L$R zfu@UAL2XLj1R4J8?a)L6{~lObr0x{VyzI*(-julaPrP3_|m9qWCDhqyB|Omd(ms%R+HpKo52n{NIWl-2pt0n}>q zVi_>D*EwV!SauSyoxfoDK^RkB%aflz5i3+PIg-+DrI*-~RrQ9Gmo21_Q{Mw$>F`}6 zpR*CE$dUJ6lE`Fk^6k3EOAjyv;Z!hOc+f6D2^Cc&TR9%aGYF{Gs^6=ajmr{+ z@R;n?X<-=E^b;@c`XeB!)e1kv+rq7o6T3>y2YA<@52zL674J%uGy8HXQ4qoH?Wi(;&+S_s~mq zc)wD=PN;(Z+$$X^-$}K*Dc!e3WOinrPiQ;XuA-7*TRI%)Ego&O4Mlz{7M6UK zS?HuZ;nGQg+xV9*jea#5PkZt!#pJAD7C>0aYS33x0;er5wA-IJkr!=X;_s0#dv3Ix z{cjbSo)VE$%Wt03dLWRqOo1IM&u(X=h*YZSn8Sq39=D3ys?$90%Ky7)W~07SiWz8) z-W@Tuo*)sOAB(s8n3WK}39YFQpC0|Pm_^5r=7sNm8TzUd6QYc*)kZaNG7NW2xUaGQ z_uN;7KHl1s$3;#5^fSL;sj&B?Q6D%j`bc+_;RHPUIm7ykHX;xgNRBaGF8?YH~rHxd^~ zuZ=q;cWwSe%&i4pJ-?>MKtdcjRk}2X+{H?P>;9C=_~`i6pw9Tc8?sUA?q7}#oPPi< ziEN1MxtunR%;6#UoR8gqqbScu?i026;ThF1w%C|PGv5uM1}(8KAV#XQ>)|HQXYo04 zN!LlIL?g3oA7V{aAfPaHx$-}qi)yTwYF6Dws;34sQfftJBsNy9ehS(=&8QT9wYSE* zm!vV02!hfy$TorZ{m~}MRITF9B!?>YhQVL$t(0#j6BnY^aBXD2TnOEu*U_1?^1*1V z@0w>+{<}H4+W4`1l|1qxe{aYKYaN{?E7mbKpWMH0M!|>stM}%xQ@+f*I9Lxo(J&R0 z>#5HIZV{B{QIDw(E2VNP;=(Ei1UoRU{~kmpx~)B6)8((H8rhwexFvuPr*lem%N z3O+t%Se`F*&WC`7ORxO)-~)W^_rH%PsgYDXg%IFRt>3{*MBmaj9l1^TUMuBj6iwy* zQgC0AeN+duhg_h*%BwA3lKNq_{{+94#kp;wFLV_P6%d5U|8Da=$0u)+@P7byK#9K< zJ>%OP12H+_M_=`Br)C1&J2id|v4RH-*egf!`RD8CpJx{IWlSx`uY1bC=(5hsUON5=JSbxiQPuVU$Q^mta#A->m- z!&)DIrJXEx26$)&kN8knqxz;&+;a3dIw)E^Cg=_$`aL~+Zn{XAbYB5Pg56;k31dWm zSl$lBU*{B*P;^+kPR|(v6Y@dWzt=;yY#pO80z`%$7jKT+^yj&p&ei+u>(-)$=y3m; zKgow+`+g6(lFfqvk)x%`L)Q3Qzi0D|;AdZk7K#SXtkQFZEAjzYcf~=X43<+80gY+4 zY5)Kr07*naR3b@rv4g~MO@9U2HNCICm_Bzp+;34Te@mZr-a(q&H%>hSh%61C+s_>7 zRaxq0+AcWZkUn=h+;4@S{!s8!_LF2FltDEFi1^Q0d9MBJaa7(+eS%{(=yRvT{lApS z2Va@}4Ef#!r4S$*3^;fn^Od}n3g~kO#SZs2`3w3p=F?+lK|6I2AUfof*`GRkLEcEs z^tsdFuGirnlwYPWWj;He9HIyUM2|uH`=38hx6whpl{w6Fr^8)-Mb3>(>#331q5#pQ z|9kVN;PNB%O6YT^!(EN9)uZlez<6Q|9;5sLM4QQ=@kEl_r*0y_sb%!JN3z3xqn!P( z*NDelm-V#Rc97Z!5PcfHHJ(bc52+tB>aCAlmxeBi7|ZmIjR(a;t~=j&QVi!%`2b>p z`Cj+@0dWgm(rX9Vf-Z^_Pd_4Oef7t?O*{X?-no7?d1Ya|T3f_Rt#;a_w%%J?r`pjq zI#bLF5D0`M5-=nr1W7Cg!w5u?n}SpYL_qSg|4yx-4yEuA-6d^u`Gk$jww!0MwfBRE< zj5&`G1tZEs*%74@Jfb9@fm`weR7R0uKVJDX`1j1oPSL?otxsjfBScA3^|Bw$+yO7T z1?<(ZpV}xAEZYNTc_X&3Rmq+rR#V4xM~KptRf-NPSF^Cq(*(ETdzMihMS$IKhQAN~ zt!Wn>2rsoW*Ab#T?HQs2%K-RHQw!XRFQ+;RpO3b{6+Gr(JDTVL&zealIzpBPhv?of z*RhRL;6YpPm8+fsiA2lY|7tW88S zdNa0{{UNz!O$J9h6S9P)=>&%t)daS2TF@3eaUT^@n0$+7^GEs6KGr7qt&ipb6I^Ul zI5^&Bn|NSuHQm-derg$Vxt-2Ojek;|KEn*W%v zwT%xJaus76$&+)`*u&$qD$o}ETPmdR_yNwv#-UxTS8(*Z*ud--YaBg$+&|g+Tl3TV zH=T`<*?THOqx0tdr_H~$P98a4&T-x`NAV-MF~)%1(!CDt^EzQQHBwkZ2zQ}*SQoT| zjRZ1M%8*Iwk77+FBAIa0eAM2eI={2-2=_~=U%q)Uuuk6v4N)IB(h=f z8oF<#N(!9~XhR4uLqAeWbBPUmd40@kOLYs_aO7o&{mgI--9D%*ui86a9%;y@b(V;- zMzNs=yWuEYL-!RMsFOnGM>OX$Bm0)%2BX#-<}}60YH*k`T#d2(DmC3{(HXt0i(i7n z^1EV#%@gQBT&-x!y^T64RQ4r++1dr|T4EcFs&ZLG(xg@;XrUX9 zqD_6?%T^7cuodklssz}ldJQrooo0e*EPAy2%(bI}TmPqw+4Z(-v~%=uT$Z_W48_1k zft&ign`$X|R;>iHvLD%{hGoXNVK#4%5+{9n`5i9@$H}I9(04sy#SCOXNDEdxtVN_#wy_X$7B21A^=5DzJY?DH;k!gu* zshEP~Q!sbB0PIe=A_JV-$mA8#pli#u8V<)jn$cQE33o#zIWKc?&OKn0*ud6$GZj;C ztU)_00d^*b%sU+~Ggrju{jYuaFnLR*-CWFF5i#njMedUGz$QVP$Ne{IreIk19WMx# z!YlIov72Sdk-8N$+w&-?W|L_(@xCxZ6o~AIrS0P-p;GKwM%5Gq%fVc!9@mowGbP40 zmS07rJf^{H;jQ38_k}K#kIk|oK$^%xEYAsE5-P=KR84`ib3HEz6{5XDU|>@>F=d6F z@_hGtG?Y*Qh^&V%j#JKu&7{PG^iJT1r(l~CAy#ala+29&^f9gvH3(p9fhXF(FUlYjE}U1+10+2enfm ze2Hb%r?BpGtx{YtV|USzs;-O{z88%2L6%GZj5{lM>g3h`0ndE~yR-e0>L~!efU>Cv zcAjw6RdJ!L^CxDgU}-Rovg#^2jOl!QS{N)NPI3DHckXizR+GdpsGb(*2Q24-y^<0* z;rZ@S=BJ>@x7B7-2St-iyQ7`^EGUi+iQ5Ig!WzSYwa}}npBCfey-*e%fOVaF;=t@vvR8t(odI+_f3Tk1tZ-KI>5!G*sr9B`t^fNC7 zN`cXuLe-;iiXGLn4Qasm48qK>>4g=$Q0u&9J2jM`Avry$Uei7%EPz!OGb;tg2{YBz zQfVyHS?<5UICW8&@oP}8iBn6V*7*}^C^@HwV3WT4!PE+VCCGIXZ zZwTxTTiP4vA=C=dL8wYi4$N7QLr^}`iW zP1I5IasbJaYSglyURkg6Q<|8I7NN+-jtsGd*5c=>>tYyX6$`@7%xQr7G+Rd9cw`6 zA0+pP3R<2r=Anf+*O5mp6RT8roZ=2$h;dni21<)S>kFXXbZ(}Snw$Mlbre3(m~~y& zMUKK7-(9kW)*bhL>0QIDkGoSINJbOT|)9bX7!qwe;W}ta^W~!uiK_O2!$Q?W1 z^^`@Fng*?C$bl;3TthWA$CT&4Bbjgl(@(BdONv%4obEhNQgX0cI~FRJ@hJE0oD{W4 zGITZQnLE_Y$9K!9r)IGn$$}3ty(CRkdt|o1n&*_VC7p@|4@1j1_wJnNC7JmqXnPK* z;UAw-Prc7K-vilCa{|*zBz+62Cz*NXJiKCEJ1kB!kFn-LR70$0OdCK=%-QuZ71ev} zM)DCoXq*xhrr7>!F3#x;lqtxhXEbmZ&qh>3te-J$(1oU~B`>?kS(4<8lIzM&HID0Ue03Az_)RQ$iGsiw1iB`?vVOzM!F2=(Y0GtLZ>Z5BQo z6oksW8UGq*1A7 zi}#r)@NPNA?ZS*RNP~+GQdPZU)e0cXVYa~PSBZ&EH<@{+Q?6rI29anoin+U|akNy7 zX;a!DEr8SvYvo7ORd4wxkl{)(57^}ti4J8k*Sy2WyFtM>g;q|{nMT$B#8}od0%-xH z7BC-DSG{4wS2$+VmLobw+8HsS=@Q>qy~{X`(^Mg{=`?d3)LV+4im~fe$QrwIKo8MZ zY@o7w%{Cy%xCa@Tu8Rpwwfv-iLy0My0z^KUIzH)mL#muW)&XgNT%Z-+L1pz98xwJi zRs(rIR}31Y z1SLH)%g|og1Ji>xHz^Xv(5O77v_nx7QnI)+tmrX_E8ci*q6ecBk4Kl2GxdCwT z(>i&C1;kpQ1FYkSCmurXlQPGdSITSoa4_ys+u7eesV-B7F>4UVuK9R`1;pn#*1CZh zii9*j&b$)$Nu^;xMR`FEA67l-jeBS46*8G(0CDl3;H>XD9$>-P3bMlemW(*$X^4Ay zWv9F%ZzPtrF5dm2SV$=%Vp;DooH~VswLHM0D@2bz8Bdz?PElS_R*>luE8a^I&&g0& z>RyG&vBuPMIG205?3aC2c10GIMNmKlqeYE^3ldb^8jBhcQIIHB z{qOoiPfuG`1n7EIU!+`9pqbN|S1ef24)fd!m!PwTg! zKA!8V;bhHT2|tIzPQMXS+hoClO=&#lFRO*62G;ap1h~Wfj0NrKFL9eZ#*>4p9)zDq zaQCp=AjvUt_WS^k_;5RhUAI$MpkD~PcoC3kL3ytCdd(cYsoL5u{GSLU*LsbUIujMv z1dsSGP7BNHkA$2ZSTBM7kB9-?sVQ@sHuAD{b5M8-B&3$9!r~$V9E9MEhkl?2R&*nY z*Mg59u+YEC@tHG@x;ckRNs#Fm;s%jCYI2dn$(9ogV9}k7Fq2$;!j|exHHg&zeeHri+P_ zDiwrZhNlxQL#D*Qwua#MINHx+jupkkIxMhuVtoHK&h>K&_=?kB?lD(1pHrD2{BoRg zc|WJtz{b%6-aJGGhTIMQ>Z@2x1M5);=lM7IdeiE0|JAq_UkSewg&ub{lpARK-o~*W z8dM7_YO#T0o484w!p|6Yr~r@z=;;q8se`Cir z9*?wAsC~y%eYJ1_#VokRG9@Ya`l{PkUI^z$R1OH!kHmCmi$|;Z+K1asQ>qqL6k;jG zD(7$_Q-n_o&NlhwoK}!1{#Z?JsEF-bfdiq&`<)2h+9rN|@Pz%5`-E zdQT7BUI__0_!1 z5PP)In(IgDueTrk?g8b(TzphU{*|7@w$1QivsHlil@JZIXZrY z`!hdTAhS(rUzo+m;&DH*^&{L?BeaKo28G%8TohQFAl9e}!TkI*Tv!gcNde{hcTkw^ z?}X!S!s`OuR2OKYzm*VTH+iV9-lw?v_b@l_gAX6v4>{5QP)0=gUYKnpx;X(If?o@Z zyF*Jo6lPaCD6m#TZ1EE2x@Vdr&eYFKLD3k!Zx>?JSLiTkSN0@6A z?Q;=ob^T~7MQHhla*|?;@d9fb#16EL0T0k}a&Odw=7-MeFpenC>WtBuPTCfLvN>|ylBr)>K=-+f34U5L6iy@N0Fx5x(S zfqf)|%$P3QXtu!m8sgavD8CNvC#%Rq`|Yc2triuc5W&n&yJGzUXfgTnXW}@D>rRN)y{|LRbBQx71tDMEYArD???Y-| z3DMoenlv7Qz3pJ@JYaDRIheCbXP)N}up>Dq!17T)Y+Kty`TBWKh;jt7<84P_BYENI z6pHH69tNv6Pd=|kCFlA1Hkb(T}Qe+i}vJ6lkgIQ)vXrmt0jyx z&yg~eN8jLThxG-cr4i+Bfq=w(+mU!2JO_Cf#dH}%^A>$IrAC5{DkDoz1$Ck?KyU} zJe01}I06vCT*C_+a=4G4dX!j}GDuxvtialYVEqv4_|q6xG9sOJmAv+vQnkRuz^L80 ztmZDXxsQ5ZGA`S1vQ=NLWO(u}k|#gmK9%p-)$v{R%F_ZBDTZg=`?!te<0PIl8JvD; zs=)dX!TBJ`kL$Sqso7n-6V8oOmKMP1usa-i3Tu=C)N;la1gC4XWOUZiM{?t2tX!m; zmGI#jWoUto%7bRZ^E9{YMYReMl*TPFRAB8yP>#B+c@x_zxoviowlq=sS)e0f%4&SZ z-=*3lZV!p)Dg>v7mW@J|jFL{{h5M;maoy^^o%6{`&VmK(K5sQdv8ve=2GQJ%pmd#` zWuuHGqlF}?xJ6ZpdaIXZ8?^jNFoJfgXV^!vgR9?>Xl8T@%`6+;xE|4k9U=|;^gwkY z>8erb*77UC4gzPbK7+8r*$85}8!^AK>|G-T)(V6Nqn3?4fXYPNgwbyge^XKxEMd&( zXTs;y+0|<#md6m3T3I%_ia>Ud^g=jBmF;Yss$D&zj4YT!Tzj|8SiMEH2&P1i5b+b&}wsP0gO_Q9>51A>o+KX#ES+9`&SUSd8P^e=<>EZ6i<}7zTOo zL#Ra5q*)Z~v<@X>!6K4PE*%XILd`*1hBb^BN!@0lzFHnbp!y8Rd9Omp26(lRpqcUbtQ2E>krq;fg!4C9zN zfi4+P-W9x{#oi#+6w?x*X_iq!4I2}y9St*$3ml(?uE0vQ_W*8F))oAqz+Mab0MZbo zWmsnjgubI44Ks`$&g-m#xdN-o+^^opG=3$xLLkFh3|Cx38lo~D!|*s^3JbldVFkfs zK@(VKk&@76ZNR-k<5z+^m>a~(xrekvzFJt*3i74~!j6Uj=YUI2geV9J-PVM;O4(NM zhy6Lm0(la-QZUksAsF!^;c9MuwT0lXpeuwgkh=Wbm@HSfE7uAhanIUQiMjIzl(7&O z2|vXaSUUmi206=d8;}$3myC(>@dRaB!6y=)7z^gpL@UG{#qir01n{|mT3;<(0AM#6 zMSFU^QZV^#oB1QbuhF z@);#r!82aidN7sO6OAy1;rAe+h4mS zA$Fue``pI>bZ(x9tgluQTHc))Pety`G*T zwFbcKZjPe{fjUqWvLwZOQj}c>@w|i}T;{exM8# z^jcElV*%w>L9n*fJ%@PpstQAIH=u>Jh>u^GlVk&Oa)L}0MvkdLn53urmQLm|HAD&L%~hFKvsY;z*PX7z=MQ@ zGlbVL5^xD90b_;ka)2U>l#1TflGgAsrtUi>Ev85+{i?}LKy1|oax zM0hpu{?%;^yMz-YOJD`o?*N=;QXI4kD8Hq4)OR9D*;EkTM314%gv7JY$1ws5Aagrx z#QitXPia48Nz;+`f3SD%Urk?G6km0$kB&Nywo^M+>vWd2(@t%zbyhJ82!W7Vroh=X3AbKe706-*eB|Irn_` z;a&cyIl1?nRIQ~miPX&6n$nQF-4p1^^A|N2#Kx+B#-=BDx~8S>>7P&jcQ97aT;$K| z33%EchDsx~S$a}43ddt}ZaHuVRx4#|k#k5snXoZ;!if9#l)HbCclT?I*;uCb3^Reu zp)jE5#ptb$A$``J0eFmY684_wvENG}*AF0bt&X_I7gtLl z(OJx!4@fg+0M_+TtLXHF$#80Jv_;f`W9rB><-*5!e$I^$YQyRBxm>Fw?(suEBrr>caChEkNV@Gz*V;KHr1iOd zgI?K(>>BWU^0V};riAoCL#})ej{4J-Pqn(`bNMbsUwsDXvQP#GuH&x!IYYkO&erC} z6iRMi)IX4dIqTt(VE#@$wMiqR*^E2y|GZvX%w07*naRB|yv zU%e;46}T4?k_T!1>h#M-6xZ8YEys<_{6H)v$w;IOLf^J6dKDexv)0aq+gs^6532fK1j zIPa4*+93^tlveRfe)@)Zfwe$>JVLBPT(r#%S4~)vliQ(n^0jDj7i~(i3SA>^-JA4! z^cj%?YGJImLf&Tc!c!Bk~cn&FRo_(-uo_fK6G)>q5rSBfe|DBgml)#LoET0ErH@g?fY zH>|4ac@+Bdbs+1-Xf+^MdSRTmF=z$s%lT5Y!1`J|f8R19@fhqEaw*>rsrate#uuxr zV%1YGeDLt+Cu@AX0Q*PrXPW{uYjKP*c)cN>$qyv!t5vhb^Vg|?I1NZI$EVcowOSc} z|MYO>L0Fa4%TcKs>qV%q#-Hpc%+MXuI4BTL5DMpa1fSJ58)H)C_!zv|0|aZuSBE6VFwxhyR14 zFE3Zs(&XSR(s8U`QH%eU@Ft7!`v_9yn~i=VRbPD}J_H#iqb04Vd)-Pe$UD@Z;n$}@ z9lV;FRu8CH|3zWZ{jhTPqxjy>n17LPHo9C*uqFw{V99mVwN5}RZ zIEoL#k9FtLQ|zH{e(q-VpS=iDOQrKD)Cy~<_yA-KWB0Hg2)*nSTB)0RpEa*k7sa=Y zm7!7fvucNbU+iT~5BLzIj)>=Rtw@2jM*K`b3gYK)7U@bm2I0+y8m)pGYXgNUiQ=x@ z^K`UtJaHD9ns0F=_w=y zA>9XE0e^UoqS(HN;8gr3ZIM=3UrA>z4Y5_N5H%s&!v2CVcdzaBFSCDGmC*EIv_I4K z2>X$(uyRobvgwGSw=VHDZlyqh^@()SqKFH90M-5IL?_R>U6vQW(|KD|1Wj{{`E4I~ zKf|8Vyo4gV8^P&O=`;$o!dfmq_7ENomy=1?nQbvz64JLp#q?t^WVik3w=VSYq3lMJ z5$>)H;xELP;sn+P>69@%8m^IUb3MBI@4Rhu)k|~hw!s-gwa4l$I@i!bJ{Pq|%Z=dl zoOBxhCQV<>Ss|UWMnd3~p{8OR(N(YA;*wYI3#;szNrZcCUMJ4(bQh4QPDT7~%9c*! ziaEjr)&l8_F+3U`>5rwELeSoNx5w{N$urYP8L`-L?IQZ*!Ah?Re~^>Z*9=|(CtUkZVd;bh2@h@<2qUTYSsI~`C@o9 zpr)>y$vN|Zt#ilu+f?Wz4!hedjXTF7^08%;s7AD~!bgO&ID3^Sfi+8d)Ey;6-2f^3 zo+M|?5j!0qQ`-hq2l1*kLHuz z>e(&?J3KaSf=-KpkF1E)!fGHe`lE0b=PnT>uvSWsxu3Lw6<>tF$+FDC^(7fml~;mL zXrsi+Yyh9w6%f(a2!uY6&f-Uc1lB*Kzh@CXOK$)*u+qSfO@+1Am9`@)uT)|s9`(iG zhh5N)SVRk}PWsQ>zsS*7pGl9nAmIw%0;S61+)UYZUgecSg2W1@*%pZr@al&i5YLDY zkWNWwaiJK2wO%+=sf2z@1L(uHni6cDblJAxIk~-1#f(hsuS@jk1tk5gFtj)dA2?V8YL;M(Hdr7b37e z5YAI8;a3x=fwh@CNs(t&F)NL!fRT@5c1bMm_+}SqW6o{DYl8HJgd1e&t2rx#^W*~r z+dfbOi)(>pm4SQBB^56W4DPk*(VCk+inN6lSM&-eam5@F0&9VAnlcEUHS1bwx7o^X~3KbSxbEFU#H+G8-99IaHzLPMp; z8qbCntl=og49g9mvr{;S^HvKGSbr2w(jGvdRdX6x5vm1NZp4=QrOpgYl(*Rup%q)G zjYf_cR_bK{pLd0mxIlowdPg`%gs)aO=1h*=(A4Ps!II)tGpJI9inD!|1nDEH9oAWn z8P-hzozlnL*Ck$Gt$JTJMT8M|Py?%-TDv@URId6Wl__92zu#;}oc2>s=qP7Upd9cn zE_@;9>{SUDSWAV68Nt)`Cg##&EwKDnl&y^578NOMYzf*iisgr%Pnctd6$Q{K-TrZH z!Ufh}g)?+Pevs|Rz}(sU(6l&cMb*mJ;VT1R$0$~EC-is@aei(U%4bvhnEU66)>m)N zmrW31#GSLgXUydI6m-Rj-8JQ`erZGR8iT#(oYhkMDyrNTOG%?!5s7W{k_ zaY5dQqJlg{zy}J55RHHcN(GJicb!hB(`l=T;yLH8weMR0;H)ZSL_NFJYvN zH`Rf545^fvJny<`c{QQEgXYm?`?7mJw*4@Yw>etLuQpt)c1~;ff_TV0EywmV?#!8Gng3FU z&*gn=2E(2Yxu8C+QAvd)fp31xG5z=)C@h7bHkvJ&h62jbc zqp7Gwv#%l;Dal3$yJr{k{fs!4o^24GO7MBxVd)WW!R`=N!K;G!Y!d%0;ER2E`9|~5 zZHbJ?M!_AMmfb-kiR z*6nNN`x9j(7dnSuJJq%DMhqS)jL^Mo?K zKf$u=6n|L$6=?pVqCFQ_E3qvq4c?-rNy;Wi=%QYV#no;8%vdQ4;a`Xg`VE?Ri0}PI z2FX$GE|(s>Br(FmFxn^3gJJvX7R3j8{dBzAi3v} zi%#Sb?4jG6z1CODK7{7u61-=U3>mHE+hWmZF!hY+cDwN332EA(nWxeHhWJ_zX7PuO z9){-c!(|=|thLzo)P-(Nhe&G6Gjt*E^m%i6Cow2NA^b1W>=}AsknS(clic)xZ@)HS z6ZpBu0&6!k8#VAlu=aEKWd~ir>uxcZb|y|sO$h&wLVI)FYrEYXVH0##U2a! zk;ek-6KFQ@XR4G_c%`p`F5VqBmvq`RyIpvG8Qk7&!!f#_P|q=2e*(VdfIYkL6L0m^ zU$CvIQ1wtpaF;IJ1K{8(0QD~E<3FEP+)C>X5t>aM+PW7vX3p&-LjQwvWKJ| zgkMKRjV-%hVEX}&DQFGApO^cg`TMJf0_%M_sNGuVzmc9r7Uxa{Oy!w-8ZIil6gq9~ zCJZ!?@qZ|tg4Y3b909TOzKV`Qrr`v7A+&MKvFIj`LP^Zi_m9` z#it^(7ZvT1z*-4yM6Kw~c!|Ono5>=arSwvgC%quND)N#IxxmRdF7h8zu=)g@#z|=U z)_NqcHbb+3zCQ0b#deD;WZC7ho!kuIOfHMNUz!bb_#0p~<>-F+l)(+Bxnf(BnWUoW zqQYx7Su)Ky1KB&91B&bppaq$|_q@0HA~8W`?@#uS6Icon*{^R5R1>q}?@LYD@^43TY;E2BI$l2B5+qz;7FM?sPi zhZy1F{Q(1~`@l&ogl2Dv2LfvYG65lQ^ND3xLzp;471z>?q?3tpX#>Ftlsz)y5{*=} zA7kiFoI$^Y06nsGXQYpDM_(8|!w}X=sKVN8f{kQy{fLx-;0%r!8M~WsjEZ)Ow>Ico zh@dALdN9l#dW^eo7TkL7F|_GtnSxquzl~gSH(t6xa0>BHY}7)n?-(d&TF z?72V8eK+#wcc2>&!&6?a=g|W;GD&irRDs|etUM+RQn9{=fKea%O$6wf_#e40u(l$9 z{*U0c)2jlO!x%L2WXkuWB!S>8E|^$u5ObP|bBbG7ncyTsuR8hEZGE*0`Rn~T;DvjJ zc>--ztq>EFtIy9!4+u`H$0|d8_Wnm!JFcaep zC9EFx2p5l)t_rNLkUt&#Db^u^iI`Lctic%mMFm%p_kiC^LU}}lUm_qh4V%JQMf9Mk|kqyfA`IHLlVlPEjS-u2LW9Kka@WbdaZp5h_9fuLa6 zq~r6V;ohKz&Bz_XTx^pW!FRgDL=D19=_^5aX*9DhChQ=34>E>N=NLAF$B?<(?V7;a z3jEbquq~#O;0Q@HZl<06K>n?AzThRg0^}~UpNH!?f&*SBHigJ52tIX7U#&v681Ngz z1XqR*@k1f;J7&oN4_u%>yazKzf3QEUbqkh%NPC4sd8_?s_d+e-z$$Ax&}S2Oupd`Q_| z2tyD`<@TGsJX8}5m7c?9umza9o$lzX=qTWC&crsCHhhQUxpkdY!>zBbDc1|(Kqz~ZdLEz6R%`})fvJmH=8C{ti)=0zp{=DFKeDy(jPmQDP7|s1%Jf2bP|vNfdTEG` zdxRf{us1$K_k2EZMPPk_e7M2(w_EtZi)ZZRMe3=E2^GroLbxzTt+4!aG(=y(XLBA~ zqGkhAx6~DZwFCHzd$8RN|5ZtLHB0DJJLxtYJ~VzYWop+2ga}$pn8jUI$Fw zdv55fcai7Q7C_s|EdFTUAWe#(9)T4YQjQnGi6QE@ggnEr`ta+4*mEzCUt%s_;exllMFF$I;u(h3jUT7_pb5-N0;cXyE(ol*fxmYW z+u3U2eJztFKOA7zSDJq%gdL;IYdm?@dG*3`S&O}W=m9WwU%4Q#Rs(-8_Ug(m{LG)j z61JE}V8t{my9?pRx6GTLn^;&b#^3%p1Wn)!FmqcYYfnx9`^D)ccuy-~iCWAfuwwQq zw+jepB34*chgevigy(V(G=C|`z3lZ7wI}B(wkUwV^xz*?-Q9hXXO!6m3_K*BbV75R zp$wkn0QTh8o50jLzb$7c@YgOt+sRq@n01aNW}V_adixrc*98Zvf}6PG~#HhxfCKEFtS4@4-8$tS;byc-YAZ3&*AKR9=VXuNe3g@WyW( z7FZtun@I<>ndHJB7V}vmRugYl7*? zTgd=?z+$<4U0q9?6Y7-F1uV4EI#X2&3B~v;pWC7NdkoCnCWi&qcHnPqfVPqle7s`W zKQT<363)dbp$k}udqC?>eIyje-a%*bJ~V%Wz|6hltiJmFM%+(*1Z^azbc%5Zv$P|q zZ^kR13uwsuiPfJ1Ec4v)yBF9m2C8t0+ZgSrz*-AzBgxP<0)N*bfn`h17;8T0Pf<1( z@KAk{)uUMEx#RE4!M+=c+{XUgQGxXZ@RwpQdVYlNVm&0mYLqn_gu0c>1<3q=l+~xY zNEj|bC$a^aKIDbZOC1$hJ8(ZVDG%91D$qU5M>19>zMM1{{DZx7e~Rin z8)GNat4Wi_v}tBylIrfjBJ9GlT;*a|xmiS44M7nEgb0eduz+|2L=eQ-Am9azYoz~O zFEec?6OHaUi}`%t^FBYFU*GR@Ja)DdBCXE5s%U}t) zPZp5OBD#W2YZ$7%Ihu|jxZ8ShNB^$#-P481_~cON+o}4Cb-l+UIsc;n93Kh%`zvz1 zx9(#7)V0viWIS0o-Ca{_F>^wrCq@5Tq8j+l(19#R&yXJjBey<{0oEtnX9lXRe!0oD zi#P(&nR5SK>%&u^)}}IgKq?VE2Yz$Q^|CG)zY)gipMHTZ_iugA6=lWmsGD2jk$)s8E_mI(eRaXf!pGR7A*7? z-NB$uv801mBptw#O`Ck5b|i`?ezeKjqKV?f4$Fh@ClfV)V0tvrr6&l3=tam6xWH}p zLJQWHWZ@{Fo2X?83pE&1H2;w!)^mTCI(tGRKe{OijNI%wXnFBnYLZ-sRiqItpP}Q3 z9&`eC*`%!r3*3Sg+({M=dTaJ!4f8MAg_~g)V137hmsNq1{jrMt<}AyU|I>7aqK=8o zkX(erScy(~gC+B2^INdcvJs`Pm^mh4pY8+|jepX5?f+6kd?LbQQ0`RRF4_MdT~*Yv z;2sHVlW-UVQ8Ieq2Ek3{w_u?!CeW|D)}?`6p*Aj;Vig4gmPfj2;$aDB zTj>Q@v=_a=#ci|sEm*T;(P)J0)maJi)S(0TVDU>&6V_k2FI+;Gw&2di-y~t3&I=m;Iygua*+ z%LP@fPy$-|v=h2Uc$$mbCevH6(93)e!?o(Rf@!Ml)ie6RW=}inzvVATUXJwFm3q7D zy+d%CWKLq+DE%+7o($e?E^eC*Z^6nSFKM995SB}rranPWeayp7x^wcfPnhby@$!zW zq#(x%Bz_a&$-zLB+-$&2hOb>?_7<%DWTm2Csh?D^Oku&YMV@CJ^g!8yPo9>Fy<00h zrN^!|iBV|!K|=IW{C+NO={QHYh5NhpjL$+0STPyyHpxV-NJW7omO?U(N3tG8alzOIO@QS>{6Gd8on8nnIJ zgKoLARB-_9N!F$Pj0ah{d^CM!SX<5WHcs*4#f!Ii(c;D3EkTOAOK^9W;O@nOyIUzx zToSxMaRQX$g+kvvzxVoo%(>3&$j;8*o1HVGovcOFk8k4kdNPK!rK{7<)PD*T+8)ME z(m6q?H>qF!IZ7>O;oJijoPA_`WmfzXrLw9lAt<8A@+e4{>mcLRP#!1)?<*}< zVT>r%>Z1v}`#~0d#+wpu6lTwvPi%UO#oe{a-FXysfbtoXe7G zgH9oPYNW{Ab%4^dmPGS8Jc<5~$2u-~hmQ#cfX+ka!l_A?qb2jb=@4yDgUvys-`Kyb z&4fQ||zhG%3@=_C9szf1u@mYHhw6#mfne~pkF~;=E+v2Lik+Qp@{09fTPKJ5Rtmq{t zIU+m86BwIZA^!lMZRck2FKFe5JsF65y(l(zMC6v!tBv9LdNVDfrvP$fn12I*YBqaz z`E9kBHc~SZiHt2p+R~$fHzrd zS=AatrH;%^Y}0pbt@Lx99g@7Z+V1mC1ExzB3PN-XAE~5y!#AJQ8Y%rw{;&YZSQZRP zHphizb+o@c`?gQI2<9D~jNwYkhRyd)7Hn66GThQq>;!tx3~{5AMRR`r{BiBMsWP{} zw|&OP!0Lp;KI7uuIjrt|3DIYt<@=JJt@@c;lnvyfO^?WClfPtm)6GOCKz?5&xx==E z^pIUlLpyyrld3KHYWWPeHGSX^PxE)BVn@n7s?-MH1%6t))==W{QUNR%`B0nn zM+Yq-H!+FH!so>YfY}ZWGxZ;!y+t+mKz}w$xS$@!g>1%y<{0J;5#^^VCKjLj1^sbk zSaGv!&lG8-(+#KbKaL+5G-=9a=e*197mnEuLx0@gzoz8T#l29eYff}p zDs*?0=Z+9KMly_e5Q=lm=s;=9?Jh0tUa);HSIg&_)7E1gi%Id#W&ev5uUTw{ZDUbGjiVH@hOu&wf+qy?Z2xa|BnQ&w+BlM zH){H}fDs#_Q6{1=QACh?tmU(ITCyZ!4$KO>a{CmED*QK*Hz3Y~mHeX%an`6_`CNbO zvjJMCS)mMk&ZO@-mxTAo)BJk#L`qcjI2>Onhn3L0(wgSz(ye72gUc;!PtaW0Sl|)+ zPHLZw!;9DwUxMKkj&sK}KyWtKhJ2&<LV8R|mm0uT1iR_; z_yFc+xL!D|3&C#EpZHWh0oSOf8!ak^?#fE`Z*ftJ(mpTm1H57^kpgS7HX?6(%8}s2 zM#sv9U^{qv303hr8I8_>*?Lk&p`SL@MD;$wIgcuj1Hnm22+1H_ueSe@%2N zyh8?Ae+Be=kZ}cxME@-SN_fSnnO3GrN7yKhSK!~oT$+`Q^Lh^Z`8g588n@kFn*~K? zhIu!R{gGUIg3YGtR?Ct@bY9-i$8EDsGFX{F2wD%S${$h zUYBa(5Aa$-=iU(rJ5qk@9&h7D?=b{5iIUYA_MYfsJR+`PEW)SVgQ`FhgrJBHn(0%s z5Gf1r8eJ;glVDZ5D%xTcq*a!j0p&0;W_yK7S~h!0F&b~$G?zI4N1zd;ierFsQG%zz zx^-EQ+PurScGxvL9oYNip!ZJGL6buGsRj3<^B5plvWt4e-Qxo{H z0{NKa)!Sb(H^`TJ#cH}}1U(jTcFp|{QTUX`lA zeZKDC#}E_1;l!nJ-FtPuO_zugXeFCvM{>0FUB$uT5zgTxAM=Ncu`3r2JGv@FV2Fj% zx{(z+fi6b{#M$mPB%R~us117d*p*ej8ADVj%szjLX(>*m_4y=%laDB8cz^`gSgula zhknU{2#R}^GxB{W;~len5x3hbhE|yszrXU3LBE>vVw##bHre^9uQYacuDe%fYPLq; z!d#2#s8)jJ;%Q@r{hHaPYpQTmLZw4B2L*3}e*oXWP#X?x+8?*ZHfr{LX zicg3}+U$`ldWk-ZxUOqvQxS8C{&+wYcAc@}GDf8aLX2)sr(VPq@l=iniTa>wk+1D% z40Ecdf9LxBZ1eE_Nm%g0FIs;p(SC#@QwQgTr$b*wlqjOhBjbS?;@@7S z8t4XIy+-~$EQ74|TA<_=<@NUMk@ttuKrOg!$kEy0PVjxdPcfps!KUZt{K&m*^7v(l zg3TaKmioFdVaJl%C0Xzm;kQM>r~{`smD4WIVz(LaEyj=5Q6aXn4QH-b;8y*@-Tt== zc!+d9+9&-#YhuZ%lTUamMsKFp9DMe>B==k>JTl+-(~Z~=uFZDdu#b*3PoayC#K?8I zL|y~X4)Hg+dgH&Z`6J$qsFEP=v+UV%VAL+B=b@*gGivn5{e`#nD6q_eN~ycVF3^YM znLS#0E|%HqoQw<0UY^@2Y7t6LoN5Bm{N9wiXp~YrgBM?vbG~3F%zWR7nVTw zuRkARjqP>J(Y)^wVP(p zg5AuTI?sfK)HhFO$e;sxYrRIPv^`9i{ z)Ndez+L85awdj}tX z-p{*UdQiPhHKG%<#hH=AYM-6VN{&0Y3w#~9u(uvlN?DI2vdU3}s3;lnRIXTgMi3IW zX6D@4%QX&0l@Oq_hO4?LO4r*~$XLkLc2g25vsYv+F z=M}*tj%Sc`cHv?6U%JY6w}c12t7ZojzP4ySnFh;*SjnzUN=*MUJ=2>OYchgpTZbQW z9EE=C6(KI;o}%B{N&p5R##t zYS6*hD#CP{qSut46@PX~b<4_R`BAWV<8aq{#A)MMI}wE(@Mdc}H^bWMqrRolkqGpA92g<^_Sl1o3tdr!lj(l z#*qG%dd;_?QwdKVFKR^{6B9n{o0fmvlN!~{m2S_=ZCkDu*9I!pG1!}jg*!fm0(N1) zQ?Tv4DjnE7+S`4|hB$#Sm730NS^a*);xYal^^(zQB&*g2uQ14KPDa7e=iq01RSbAQZ;gAbv|A0bw?Z-|;sWXR zufw!u>X12<58{ICQCvo`Im*nnUk(_RW{iA9KT6;MG`KU)~+t}a&l=I*b?Omp>anAL|=!my&bemjg` zZgF*09?|tf9U>SJ?L{IFN~d0?yDn)#c2t_9wuB$#qHLCkzBUWTI)K5j3%p#P3ltymgaz9aFnZX`)U2!`?xsI{s13+G(v1 z!x7VKpZ*M^=Icd@R!f7`b>Wa)zn#JCppSs8)JZIjc|YoQyi3(gkZMqbGDXMD{-Ylr zOz?OjMe9f;$q4I^P(&{_#GH?w96r*1sMV%L+QA6vOo_01>5_wMH%&SklqS~ate81> zEGgR_AASFh3)Fw;kG;ij@=%#BtuE&^a#=GONncm^@{23G6MJgPJ(~0SPu+HXL~>x3 z2=ruiYj+DrKePXVXx<+a5EZ!OkmIw0|G1yr^bnBC5mmow``-p-TN+va^y!w+oETJF zZ04hY1HR#R0{v3#1L_5-hW95L+1^W1FX;Lycdz_9 zj3{((SbS*sxKsvz4I}G;ui_8F936kZ9VeC%YrC4;kABI$`Gl3s!5CWCiNMmhKLd}BkXl{c}`G1XH;Ce(Xq4=wxfd+NG;GLL}4KhE~ zYM77dVy;h^eO!(PM#NMq6Z396-_;JUW6=l*t|V_Lu%SX&AK1$Aw1?~8E?K(KD7TAX z?GR|)M@;TzHEqaMCO-C@T~}i`5_>JL+7xd7>mY0@@)~XLl4l$HI3x19he)VG-<$_i z{pbUa-|c2=Ae;3vesV~nL(>Zyjevl8FHOLTocgdsC3&!VwuopGnoo9_ssqKM$_8`V z6QRXiN&mU#w`u~^7qS^s&Mu-TQBYNwSXwlRm!}PFzx40cPj+ zY}Gaecqj7(l8%|xx9q*K?Mm4q-?5>J*>U~RR~1!ec*l25e=+9U0fxp5;;Ez2sd}=T zn;RKw5ZYH9J%3obarbFtzIA-P?k(|5k!J7yL8<^2tM8GdoHB|%bSiWv))(Yie9$gs_kDpKC;ZJ51Y>;myW}=Loi$T}hw~mfnqOs> ztekd#y*i_2*xys0ROxtC_2mSu&E!yWGet!@S~64ZfRPI{V8v#?%0I;L&OB{H+%+os zjZwp3R?qt(zx7~W)9lZMzJit)jI=zJtqcKcsy5-S|7!Yg#g3{I#Y2fY#LI>a(P-R7 zyrR27n*m+Y+QYD&3Z+~-Z+@#oM%q*{hE^ulU2)1;x0=x}`Mx!k($)2-`f~gLI%x&f zAQ*^%or$$e8j+wh9Kkybxoq}Jc^E=`Lsr%|XXBAKWh|N17W~d~Mspxbfgi9frC^Ly zxa)PA^@_wJsv?$i*pIi_X{bPXJlmjd2%%FNH&XX)f#Qp)g+t_`z zQe(uBz|Q!zRtiyI1_Ps_eMk6mtLlMH48sC|>dZ-TId6)euM!w3Ano&50~m$d4rdf2 zger@GH`<1JC~I<_G`}P9GeHzKbdYczj*X_HDyeste>6w*<#_;grF)e&Z_OM>nLYmb zETPyv2bB0AG5A03*k~HMc&^poHO? zf=i~=;IwzJ&z41u1DBp16N^rk*Q*oO7x zWY3=lm>lHnqzNbc$`pQIr&d_9TR*0qjV}!hs@AKdPc!sHGK#4VV`n%^&wgh3;56}9 zesg$(rR8H|lLkunS8GjSQFLaGS2Onsx>e>lo?Wb^OYqSz#F>@?`@DvMM(YC70Kq5D zzTGVVYMRQ3%zHaZS4#v|&?YPKej_rz@2G|rkvT+t!7f_j6|LLw;9c5oz&zGJyD2Xw zeZag+%%5-q`05O%y_wbq2BDnW`M|14K*8D-XTDXuA^Oo0C>VaPX=2Xy2j{g?6|Yh(dp>urM*bR(y@}&f=3M@Kbo$C&ILt5;VVf zF_u}?7;9$fzs6}tb6?h||zd{ppj^ZJd#p!vO7ccx}{rBoP5 z$}fmmU`S+0?2NwJBcYi9%XmsuR9s752YqvYv?_X%eh|uA1*qw+6&HhTZj!2>~CtV6l+_BFgf<7zv!kJ=FUjNmd!(HFB4s0g9#P z{PAmzPL0&)V1dSrMq3+1(Pm>YUXg@wZKmBak$F*tsiw^m0l8Jd5sY_@;s`F!)8*@h zs?f(8Sj0xu89mij9T5>KP-I{p%(naGE){FmvYA;YO-kjTb_vCE*E?hw<)KzxNwGBR zt&VSGJMEfPd4O8z%GC+B4=0&VQD|NKtiI{EMF1jlJ2OV=7dj;qnVnnHW{Sv?ZODF< z6QG?%Ynq_}r;^#V+bvjNsdUvHn1yn&X0A)tOjJ8Z&V$&BWwDwhY-t5b3Jbgc89^q+ zrMwOMQ37Gi0k~frrHRQ$7=4Pp^hq!xBuu}UTRjF2o0-cUrS~%K;t-dQ(EJ9`tMCV#50TpKk4k*h#=~ofXA=}Jv+OK~<$akHakFvq6tOdoK zaJKD|D|bAlhpfeGLaIo3;H}YGa*6B7<-Ctyn@U#=)@s#+5zKtCYe#pkOC}!07!kY5UuXmi{cvgN4MV< zh5QZpklKlj?qSNF{qdPW^EGNWVYeAgv<>sz_tNZ;C%WAu#;qrebo<<0fVpNh=}Atkt?x<}aezD<+ARHDd-N2SsU zRfm6S=*7L%N9Wj4AT!eu+6nMk>A?tONPjHlG{1+pkSuRgnbUwBY;x zbxko;a_A`g02{M>V27g)681DdMYEKCt?LgayU@!z9L@9MhLw%9dRiAZ?-zxGTPze zM8c~-%%f81#2*Cu$9`e_X#PQYd%PC$pb|iyNYI=yX^QPxST*d&Id|E(0aIaut~h{}?l>BQ&r!{f6L z>Jl4R$JTR1{7dvB``S1eGH`CIv#vUy+fV8?z- zC@)(Zj;7hNp!BhE!mliJ09EcdN2o()&s|hccbajEd109-+fANRx`pIlTA}kwto55 z-Ff+h^YZ+eX{6`s6Vy~}H6$|N(i5xz|>T(;ta6~oL9~CPyKH3pv z==(fp|Ac&H&}$!<54McG*Y)!e6)oaDV^pJps;N4DngB%MGcixq zMnB7u8Zjq7N}Y0qTm} zf>1JvGTl#?U$f;cGdL>SsLuTug9Dbv-t$+)jOdSJIthBExyLElXn_11g1p=iQ@gk` z@!DMH-Mlq&Hv*7??<=>;a8(}`ChA{054VMTWh#}t5%@q=FCKR(oxjCgSWQ23Vj`1| z=wk8`M|IPGXXKl{Hy5q8Upse+JGmqWR4Lr)a!>{0g{9;(7F6(-cMwW9t^-->yO@z- zHiz`$s+otM29caBRfS>S7s z5Y%ZI35(i{9ze>v?CMxOV|a@Dz0z!BR~~gVk~@Dlnv8mAm08F*c(kFvM50dcgZlxm zeNZpc(E5njKCVvX@(CB7W&*McEV>F{gWmg6wv9{g(W1?BxV`2y{LDF@n5czwfL{3K zRiWke0T{`V{5o}hkncEEIzV9ABGJtGjH1J*R)QJ!YlH9jnww0iPr;?e$WS2voSviG z>)i)Lpm;+}?uEBOfDrY3`bOvmCp3#h{L4Dv;$0O}ho>?r{BAChvW!Wane3K2pQ97+ z4uh29hKuY|@k4IDTqk#OBaA;IF!cX&0X|sT9Iqme%N=5d7K-FVw>N97&enXYT^ii9 zewEJEe9eQsYStY=iGM<;&3r{8plAqR;lyqlFmoX3nK8q5;Hg%N90L$L-j)XGRB2|r zI(|S?b|}-_JhRpac8N)#i-#y&^D@qhI~kFq0|t3g9zH#Z^IdUQ_uG9nTz$Q9fMcQ< z_|76WW1WxJPtwxz;39B(K}k}Fcls+RObIUf^47;rIa(yUU|sfOczct zogcmX=ZNf}l;(D4K!RWXB>Y`EjFF|@6rs*jjzZ)tMbw?QR&Vlk6EMuFtr7Frt?BQq@1c@Rc_lI!gw#kVhnBLI1b@81n8TeKN75SlTLcx z=%IKMyhvgRPVIe;V_8o)kUt;9<#Vt6U{7PY_~@h+dP{!jiOPR~*G{(l!4%)y``IZvxoni&hln0-{AVEVoG&*il^1@h7QunQ?AI~s#+CpCLxHQvb5)SG0l9`u zy__(#Pl7d|vH{IrJ(%~0rYtqG{h3LwRne**aGCx=3Ss`J10*6?%)f+2nDoEc+|x*| zSe3}fP7+aQpZ|pVdzHKt+c|8W_Xd><8q7;y$;{VsTtCZ8v}Ly^$2le{!5eXqVdLvo z`Kdq_&f}l*!Oh0wui{2 zd^ni7Z6lgS3(5iw$L|4?WqrK@Q<~~6R(K!<*Ps#g5$sQ4g;2@gEER~|bx%6w^66PP?KakeAHPuB z!8XP!^a$EXKi9e^g^DjqY0VZ=*VY~(iZ}oJm!`$mrt|nD#Q2$|UK-(3C;1*Z35X57 zgJGiY@0jjJ-VRzo#Sz%}DYmqFT6uBg%^NELZyI_p;H!4DbYVQE6fC$a!Undg1QUHv zc&g6pB^qeUHRf5`O)}rp+dMuxy<q?s<(cg!QVY5eIC#@H{7sav1C?yDg51Nt=ZO8GG zIJP4{Mw`H@t{f61JPdu-DyHrXCh2!Q2914SQ6P>mOHR_YLw?t^r)sRGYB*gQCdq+@ z__X0D;F~Us*90GkisIIN2s>CS7tBX*_9^W-B7_NgZlP-~`E3j!9rYjNc43$?TkJ`W zysgUq4aJ0mCYt=iF1YSKaYj)&0Dpz``wz;+Z{AVGCp5|@@~#iPsUcY^=_}cYD%ohx zonxZw$88ei$;9FWhe>QxTP<`39+UATJzzf0DobME857mDn-?5WK={$@ zTf4Yz!#g(V;{aFEbh2eANE^=)XN4jTn4a!C5{n$iq`aVzisN4N9oIjqwEuJlLDO^W ze5Mzfq-xDOQ{SGagtH;*8wXF6ulRUl%*e7IMG_Q>IRHDQ~PKp(>k$ zYrWSOkXrWSy-rQUH#?eg&8wB5>QF9)A&+86YNQmHhZ$EHDN326iRATE1{!h%ZzK<+ z^ruhOytvl7fj&XLp=`SQhXnAWtFvwPkMQ0(@qlg5J2&wmN*k^@YU}VH^6Ck6&AkVA z=$vnR^mOtUTNd`M|1>F?Y@+<&H27z86gG0=t2xs^HTtTU!9Zwz^TDoz#eYd02$Hik zF<3U9h+reHvaZPdqv*ALK-5>wEAzBl&tqR&_-h99xO4>-GO&L-zs7ARcdVWc3%&)2 zPx_bf{psQetK$j5OPY()VzV&12OOuM_@@N@sIdOQlhQ?NhR0-ZUvID6Hg+MG4r9L2 z4H^Xbt;Ni&QpzhcicVkDplfZJ=*}5mTIT~7SoM#byUiG5n!FAZnGr*>IC62Y zs4f#hw?yyvFQ_mLfvZvKoNqMEHTa?0PyDLP_R##MX>jPEaYEyZgUer)3TDSWAqZw( z6m6{l6hb~XY`43hu-LNPw=m#**elwLAqTU&dW2P2CtDd=j`;VGn2FnPHDtCit@C+D z`zdlH+lJ9%&p7uhIWF?*1>h&{b+F1XVzdeS`L9-hq9X-{BX2d|5BbB43xwle7y3uC zKx+KRae&-yP@i3@H5IU_5mdPP(#hnNfGPVTpyK?VlRC z|CeOj{?{VmXRMUhT814WS6Hq^He^Nq|AZ#L>e((D(h#Vu-6|v4Od4}BcYItJ@qe`($}x% zd+NSx)e>uO>xL|YTOe=yO0{0_7&pQy$efuvM!((;C^_~jO`XxM){&UuF|I`G&vEg0 zia&0MEL60|f_AFB?oHZxIUNi4Hj;|W*6Ibq)CBAWa@%0}ZPP#Dtjfr+dAIO2YnXSS z#fXD!(7ZVelaqaC9h}t-gOeG4FO#WC)LRC()sCmO&HID+e1Dl>Hx)6hbS&`i%M-yo zh+($X1QzV|KcM~hRIT5|hw{dR*evspFXY3{1>AG_WXN)wrfJ`fsvyG{_t)ovbK^X zT!fp#__t!7E}X3kcZ1bjT}P9?N`w|C3`YN@!?;!hz!d?g2qs7#&NeOM?^+XIbUate zP5A1T8AcqQ|JZweHL&-8CA1hwT3{&Oweb}+A||E)ZkqntDpiT($kW}ywV2F0!}zn$ zPj;Hep2k32lj@>pFyZ*L7JtXaurl1p#zzJJnHCd7aQXE9Q$y ziF4EHM`VrRT8W={>`2u2&xN zh#*) zSspFW1_G^i#nuHcldbDIwNS4|qp6t-@NrDPDE-P6g@;*$-gb5Kw;C)6G1XZgA~!E> z0;%-wTNS<61@ajnk6LO1E%iUNnsa9+7YrJ`*s$QdleMr-U?YOn(+nn-=Ujf&w;2`= zFD@<-#<$M0Pdwky^@H#31oQ;TmZ$&efWrR}5y9HJE~Xk@#*pBZzT=Zzp0H~J7Kr_! zyFcFoq@G=#Dke7wn4Q=3gWg=+0Jn)YF=672Qf-7coxg6uAOnB- zX~J24VeWV5GXAQuL*2q8OM`OjQZiqiM!o4_fLf311nZtl$D;feEH#X$S;dffdb=P;a%!y)D6{Ar zhaPY8vqm^W(f28wSphZaT+le3gLkQYu#I@LaKD4>havw+V<4)%oL3G^i3lb|OlC-! zO6#@-I@ssG8PwRxY#75YpZ=EHHBFu1#{!vC1oSHDHMfK2+$M}vc1PBFJN1=1egd7=?*KIo zDTUq<1&6;bTc1hoYR*o&pci4&yiT4Tdn90J3Bmx8#%lx>q#H{5b|#zeuX(l{7uRu3 zV`Sr>=4$FoKR3>T&y<+f43lApg%Go(4iq_kVpcov+^xwO#Q%Z)FHshuAnxv#u?o@|!}+w8RT`1Xk)1gSB`3 zUQ{&JNrI9|IrO~_h~TLRupzh<1nU(u{mJ+Hl(RKG-NwKt*E+fhu$*bV5xQzPve-@jhn&Ix_=!hb%QK=d#C<2TW^{Hk;Xgn>q(#34J&P*#v$j#h?}b;$9v=M_UYS6fc71Qz`5q(h%yMiHM6?C7_2jtZydx!~4*l)9%gy}1bk zP>tUwYYk~XY`>ky!aFHhC3jj{fpAvPhirpnlX{7)_piF4jbFXmUZtme-2z;gkgEQ+3dbi3#Dr%BK` zgY(C!&CA1g>FQu8!_s+Mt&1T|_sFph)FVdqvkkjXtLP6UPupCz(L5#ndsgl=c%IC< zTSxbM5+G^VLd z(@K>m63Z&%B}bwTm<}Rd(lu+B&T&{%5W^6m&#Jt223OSG4WJ6V`&7u6yqHm5qO7%B zi6G3|MH>()v)6-4>DpIoGV=TxzNI)O$i0&O7E|33m~{e_s}z%uSbC+|f9~7AMOq8G zoAXsN_ebU7J2QV|{*2r*b(U%ho$EC=?L#7r>fw5;qg<5S;RhVeX#< z%1v+@Kp~lyjALf1Yh_|@Rj>BBBI$0}s=%9B)3iaKCcJ*@%xF#{9dtADs`%;=4tY^2 z;4?3zH_y#nXR0fmOh?#s-;gh4$jLrT9VD(aB8_QDZX^HTW!qlzjqmyGD~2Whm_ zG6J1hfk}#wVEFo{^`-heXv zdfWTZuBd4U!nPVp`ZiKXBJl1FuZ0C0{`7hMaz0hVTP6-Z_b0T;+Au5Y!(V-QeX0#` zB72!u&0$CvKMqP(Ov3E*Z2Z%>am+YfdJ}&1C|1lh`*E7p+wO*h-!f@Hn=xzAN$hh` zw@t5wJx1T}zw{NJ_DW4Sr!l_TSQq@UxYc7IcAObclL7@$_(7ME7thACZAe(aZox^A=8Vuf=g0#vGecq2YAmr<0GxJ&=MJe zxp=V%r=Ko`qkK4VFHhJ*34=bsYs8ahvB1>kUWBQ+hTUx|MKfWY?BqXA0X2#HtmTi``EQ<@sv3`%z)3Qhc z$okBzU7?glCi^}9hHKG@U9NdFBwH=GZOGGRbJx?R5zgIp6i|FEcK@_FbF-~S1j7eI z-NBhaQ8%8D5evKqj5GwMMBJL3EL-H>IvgIWdJ+cK^Ofr4im3g|{c|~kSTqe2ssS^s zKpJMC_-AqX_4de{T~#o&rSFc^k#h3;W^CAnGYM2#WZp^pW2Ql_MJ}V$4CoEQT_b8= zDohYvYA=|9{|zmV+X^|hm|ggm_2)n!-pbnBYnlnjiBo4$$PBz~!~lDP(j<(PTl_^K z@z%2jy`NhAnZtByl2h>ulv{X@NOKdY8YA_Zxmbs4WzH)IBoPAPA!y$sW)+!^$&C%F zyBKy@0%&cpdq4TT;FFV!FVBj3H8PBAG3HP?5o8YCX$(4yM)EurfA6_?ObCV=f}vz! z=t2`43&~lo90idZMU`>M@M(IVg zu1mM@`WS=rfbu1bgT5;cqDFn;^u5Oq+T6pj2t+va3yJNBc3= z34);qO>FuKC=e0;u$x^wF!ZJgyN)(h*feR`u>uvb-}a2KLHs`zGSwN?Ay=5BE75g; zA?u_6Jv)3L(6$ln7mg2+0+7~;L*fPKk@ac(i*9xm!O#(e?p;l6S!=I9eLuTHgr0Nk zI*TNnx@dx?$29MHhM{DNiQA)Q^QvN3wrA>=+Xl4mLWP}Y_9|eMjXP$`!Kf-SUGpMe!BObmVsd$xshh10k zD&&yFJbrU3bL70~R2-tc{~1Ekoy{(HaiE+QP>xyt%=@Jj-}>eg;FeaOVo4K{X#dXO ze_ANgETu}7AAG-@{*R8=t_?uJZ`go4hg!WMgFt31s>LGp5h3zw#WQuvX--M0PxPZfg^y+AWK{*I26QgpABT^%d-*?hm6!> zwh1EK{WBv?SF9D3^grcJRYUb+rVVou2+jZ?@Uc#bscs3YKv^KlYlj646$9&0O`duH zNT(nMaHCu1^V11A0L1S<2SP-^0p%UtT7+{*BHWZ2sD@pKVcX7wn0a2DPJ?vFY_wkU z^vJm-Qyl^E$4m#zlc58qx=g0JYo)fp)1yD}q|q{U*Gf}*~o zl0E_@DvZ_wY{hE9>NcJdRJ( z&e+cjNKDgEA0)sGx|cjtD6<*#S!W1|x`3$F2X>O4?_yowsLO zSO2wScBBi-V?7gx^Qu^1SvJayE9w6_YHu9= z7a37ETw!8kk|x|}Cp3AAJ9&yUdFpr_E{FsB6lC-Giv-J&Zt}a+tB-0e>q;%Wa42mJ zt^jpAiwP@pE1_KK*xe>B)&G1w5szbHbjX&lM)W(k1xe z@zaIw8wjo}#F`C0L?W4!1$^@->)#TuF%4p@Wh1}47tO{fB@_rB>#Ac3eFV1I7Gk(j_Y_@XNj=BteqO!!;ce& z`AUwG2-tP}5n&rDlmP~yI3keR?B205)yXi`IWw_)Jx`4vlJ*M^>+HQOJC3Uwj$i3; z!+M$O&Y9{Qnd(^USe1Gai=Yz$FU7esC$pnle6qH2EwUZ{1+#-|>iQpWVIqH83hL$|{O$ zNI(X|i^BZea0Kzb_-WrQQ++E7hiCI21;jiCAK`$Ze9&UWUi<@Ejx6ANK2}Wo?r8yn zQxrng4XvYG_&3<$Xq~YQsF9TYvzq zqZvl~LP2x2x8|Izz+4%&84;KSwD6A?SC(*62=}Bz4shDR8>gPv9BMcX7J#du+-{{3 zGI6!`c8&dY=43X{4LF;Q*{`bGPWMhyW~l-=PLGymMq0xN_&KFbrKT(48GtAxUVS>t>=uC$@5yLLNo#?dWP39dqv)jdaA|3_fZE7;( z*z|xGZZ+S+z*oH9Cf#2>Gt-cWUmg6kxer>a0A)rB2r7koB(a!3cR#Y*uP83X9g0od zA{JQKZ_?{*>$@Q@xMFxU{6r7xYD4F})MA)Ck0B|&FrKo@1QD$jRqUOIq90mq1qMUu zJ?CVWs7~d!c)7HeH5{q)*Mp|eIzCh(s;VGQU(t98Y`E5K=M4J(Hyw($WUr?MLjd_R z2}ia5T6IIXYF1m(>h`NPiz2EcyiY2P)G<2&bUt+A!^~@N*S>Z?Avdqo~##pr@e8c6X=>_mS#y{=ED}jhSFdCfkyC&PVo@{Hf&B?CG6Tj#EUDx;jS!eCN&emD` zUiZx+y_Uy&PTR9G*oi!SnZ@8`lPn83{xsH5P9;l@+vWscJx5-vuZy;Q{?_F$OIfJE0{~mZeK|R&Jl<-k(n`!pJ!f!a&T7b9woRDS!NOCGJu1rd+@6cTWzr2 zRcnj>=_TrQ18XIZlBh|d?K`gVs*!gyVp^leGf?xWn6gtLi{?3ahq7Fp^ zELxZ;%i^XslPBnxGMVG-BJUCS2xYZiB=|k;Lif6W|KTWLy$koG>c3l8^jZyYgAp-F z1`UA;%Q5SQ$GoZO={H$8@@RN8G&ndsIJ`Wud8!0aPXsnJM&%=N5J7LySKS|ip=sXM zj*8sb8KDc7wR^p{nnwYjn--ibzdikHl@x6Zn<@o?)TExUCnsr(jw(f_nIxb_7H~oq zfEfX`g5_+MTShot?s}>Wz3~7ebR)mC$mgTXSjBFKT^oKe8c3mO6U2fVi~nsV1Qvt8pyOKQ;{J&rPnyw;mSv*zba+s`@D*on0hpw}cMr|c+_oJh59@Eb#NCP|D zM8Z6==6bfv?0MLqsL3rOdnX4bpVwp|tC)tYvrQH2DzbDrUc>zD%p`SFIC)hndBrz5 zjqhb;={i6Gu_k>#`8OLO|K3(;sS>7_nxZJr<#4X8;;{P#J&)O2r989+cZbSY<6}lM zj11s-GxuZx;zH8d?pTNaK?~iRX3=t?vxueuT);^>e`NnWEq8RgSsU8IeKYPUs~H7! zy$EY#{j+?ZmFrDW#RkVs&Q8dgF|1Hvu%2+<9Klh;yp>6>w@BF6H z3q6;f%qTN9z(5AECgNZ>x*6&)sSBcoc%+X+C#jmsAqw zj{e;z(3Z+*I~NBK5O?D}W`AtL-`p&5mE#pREoN|bCh(|le^EV6w=H4c#?ApRg-la> zM8nkdg5*c|Q4floXdROk|DBG@X7*w;#)X3RxG@*(_R^w9bH3U07jU1lJA}FVl3vBm zdu}*P$yvy7f&FNVUhYF0ku z&%)v4XR%O4ZuFQ5q$!17!E$k$lu<4Ua}qL7;0+&Ly0V3FINyT+#EJ1Z&{!p@bXaj zcYu{cB0lUKD=`z6!sj$nR6?v7GpQ7G*D)XLw1kOzp3Cr#oEHD^M~ImHa(+M>RSs;c zfu?R<1a-;3Pjv8gBlOWy8#J46Jz^hB&1&!(fzXx;O!PlMsm(5b6c)bJ?ANN6-_MFn zKHY$Vh3fc6OC0l+_5$VNuPhvZ*K=~r+wj&iHB}9=3ucWqXJ5a=;={NO$F_3s+#n0=#`km^Imp6uW!8svx5Zl6`k?Z5`N>q+m-}6 z%Ija%z^Nu2fH$XF_JuRczTTvU7iZw?Afx{AXcpXC>#+;AnDH0t1>+}2g4I11E>f2iuk=;C?P-3f!|DJ_+$Dz?%Ma} zIfrBa$xdf^gKfA$x_{TLy(R1t5jI(~t;_elFc>R@Ll75Q&TiCY41KIT{%x|=O32me z+qxv;4cb`LZ!WS1$TT626a49WzNz@$>#;j21z+mNpzDF^>PQjt&tadIBD7`>ECNLKVZX?Ahua63&?7=e%=<|v3Y0i$iaCT-I+HQby^ zMBfjr>$9WhjKD>jLPny98jeST+D$Vj(Q13+G>W?8GTNtFpUV{hn4tK7ckw!&i_oK~ z@tEf=L?OEfT^=a6Y0cYHj=g)s&c(c>K#*!$9@1uH3QEmD{Z4YiLXj@WxG~ZoD83jECb_h08 zVEM%x^$II+RtCATNGLxN2NYDZCi5C}~xqN~8Xa%vkO2g@p>zfcQHa}z{!1{vJp$@|rgz>1}e(bf6 zR}=eD1>&@1xb@b@!PTrPI%J_2qatJ19`6{`g|AR_pnHk(s6A=z)i?5yd;Ot6YRvsG z5{-dNFKRzdY@Um1n*~|HnsnrZrDilQ@klOP+oqOd2cW51rxWUa5>z8hz&i|4#aGWQ zQHVcGYkT=tri4usp#x4?2e-=vRx_II3mS~|7!e!Wg2TU2y%`IhS6_*B6tvNeC6YJOmPC1v# z*XM04o89n(K079@Ww(BfPSw&dHy?YyM)ptmMCO5J0x(Qm|^Z(EX)uEV=KThI9*i?B1+R*gNxjuUo&JWtr zHY+O0L#jBgEO3%MsBahE{$3RD;)qeSvvV05PIcI+z{$X^QsaPHVJMTB_tdjrP|e40 z(u4WC&<1w@o>}_mqWYO9d@R?09|ac)sc3jka}%`fhSAiHu|whTGn`bN&2cB=Y?M&V zk8xx1%b%3m{GooW@b)-;JI96W)%WU3kk+aM%-6UIICgCR6_V zm`H`hgnQB7{Y_qu?L;P7=*;U?CM0zOE+!NVPiuU|HO*ERDWNwXCRQ(5TIV3x?+7&2HP|s%3 z0P)%Kx>o!T5S?GkUiFH$q0{xnYRNhQ|8|-14=+!$7DSykz1<5D>*)LmSxGz}vzkdj z;dtJWW>z7tkKkT67f4=hBzFf11#cFKUfuW39WDot{?KY$Gu$>_gTY?6O4fvrp1iDf z-tEDMV7Rezj+LyCUd&8$Ww)Kpq=f(EPXvk+gfZl<}PjHVKfK&FIF- zY(|()K9OdBRNsjylbrD=owH_8o6HI{o4A44X%#KJ*xzb*okv;X>arx z>qD*mJ+k*v;-MHEj07 zBJ95`gT#3aReoE`5#XDOy7!9Ov;R5Fim8cKHf?O+vrchiXz}@bxl0^o8v&7_xYo&Q zIgHJ_gOj#}j*Y*uDl7C?z;GdpPtLHgcB@MP=7tp8hd|uT5H|@`6+o+^wF}nn!w!l1MfGhh`iVDPq!!gDD;M_3w18*7e5!YV$ zx|E;CdKuJQCHQbF^)b0ZHH*K$eLj6a_DgTYD3q9O%xPj&Evjjphvl zGz-n#5)}|rR;AZ9$}D?hmod&oYEKE&mVef}1uG&;#aDlgXLS-XSV@Moihm{7MO$<5jnp#Xj~p>3R&Q>vZRTm{#iNaBTHL`(M*K zrdG9C0F6f0Yv1<5H=Mn**sFf3K$-6^qrMXhdUL7ZXLxyz2~CDQCrtd(#uZgBnZsTF zK!>=%JZ7(q1ytG7X_i(suQ-VyckiClrQD!}PF8rRvw9&lo?o$R|9J)830?%?+ zJw8^D_*-WJcVq%E$${LWZP**oS>EJ}VaTniTL2%-{7UhK%?@c{o`=wMLZkL_b*Atc zaFDI@nYwYIqG*(!(SB9nzBVB_up(D#mbJ|dud}v}(|U^+LP;I_P>fZdfZWKMP6p38Ct zMJ)8^?o1D$tQA@LI=)(ZHtdEuSoki!V(ztKI69-d!0*Om1`}|Ri8#H$qHk>(X64v? zHFiROkX2d0=i_(N;}9Z3Ia^E71-5I^HShwwsg5t`cP{KU&uIVTR5m0wWagBFMU{7t zCEyi2+p@fPI!IOzRe+rgv#JoeG8pm`dLbCp^vX=gyKV|wEa2HBT zimlDof*107Bg>4rTIU4;q60XoP4B3`TAG_zKqfv6V!37&F-T;AN*mPOjtG%wKdYql zY~L*9Wdzr(3p>0RvZ8MRr*H64(6^eCTeiE0S~;1E4a1pysf7JwaoMJY!Mk^Si>cuh zTiMMAo2{+H46`tvW}~O{$md3V`;n?Ekr8^tBQFWVL{Y*G++kHV^m`XLmJ69n7WHe8 z9g)(#OBN#*F*1rsVe)#qQ2dLm;}20y`denYx*5L67yMcq<(MbD6oy#OmL&LY0(1fK z5$y#r`B(E;wbDhQ!Yq_}ZS8MxPNNib31g$U-d$JCXhY!5zXzRed>loQXXw!xK07E2 zg}|n`B=DU9IH?7UXU*`^H`O${)}{ znH?sSErsXjz%QPGtQ#n! z`!}X_>07==iMTu!R7@h$wMb}^0t%6 zGYu1MXcDV65G^StASEhq{hq{GQKFG2$|_DaJK^BOM*0g z?3o@TLPCD%^EAvC{~~hz`h%X(DtNfSXg6tmL_yRN^y^kIO@}1~uO*Td>gdrAD@f8V z^bx7Eji<1CqkHW(Q9iD-6yh#T#irbt&u-rS!G`+9N&w#o5+}P2Ir^7&wvwOfHi4v} z3Zc=X=yRI3)bA@*1>&iHBH1Yk?Y}g&jn_8oq8t~?O+)DbwiXq?A$}NYDd^5`81fNq zy6ra^uPKde)g3Y&0<%+?$X))SW^LHoruxI{XDKq{aT^$SoaGdSCw$3s`W>we=-TqQ zIyA(#I2avB<9+l~@1Gb^O2i-uY|d`T;@T+HN%bh0aU(%%j19L4SAmEQbZwbk9S|!c zjDiV0VaJ2ozJI?ia`&HaCDNcClD_zjH0#{KrJAY2Mc3>w-CF@+!{X{vsm!xBmZi1^ z2GV*eo579;E;840Tw0H_>oyZ0CvGN;C`(E)QCtSzy|PvHZ$Rr^L7!f0sKi5hVA%@u z-;ty_39%N3h3hfNhezy4O4yD$cgaYm!9r^w9zDwb3~GVx+`#c8HkmdDqL=i>5_u6~ zd@regHE3A?mM?os@>)W463god;cOZComotq7j}Q*s2kQUciD{ZoZcY2*?)Z6P_i?_ zU7wi)S~)%Pk-m_M=*~|qw=3Mz+X}mT%%vrWn(8ygc6@{rOLx_dS zm%~45{#GE}Fv>}pFb)L|#bL-7`8Tw&d)dX213!Q3*2TP@fV(+jbrdi1^1sZC%NR*j z`cpOM@|F#G`9-d&vguqz^oq_Ib{5|`d3Am{rf zP%gXq)>y6T>mqLA%agq{RkIG3vRZ`)VI$(&v*a|p#)9I=&_gB=lZqf~OpL7Uv^F`~ z6xMDokWJa1P%7US3E()dI7wxLTA?}hz7c))$nqxJ+Unz4m{Xe=em}NHx{wyv$!yY# zwrC7+QaA1v56*OSo;#(vEzK6*dMpzGk{E~xfXR9m-0Pr#mu@X)@@n- z?k2aEb!X0tdXEN!^8N z_rlOM*?!Gl(M6fKeBmp>gGcf-8}!OKyi4fj~~I-!(+QoxWj&;d4rcDR*jJO9V0FStwC@ zC~lk5MgA&dcJc;UD8GlD3CIa@=f38W#Jr3UmdRcpCrX3KtsdL@)bFMJA(SWGIO!ep zeSz%?6!j!sRj&wSMp4yzSu*s)RtB3{LThD z!=4;dhl3dV+9eCoOmC=Y3tA_TwhvTJNnjhw_hEQaOlg~nZ$qV(qzD6>mRbQe49N$v zQph>ffa)j1N|gviF3=!|q6E52tSaP6;f>}+Q|__8gXJwsL6vfP?rPY@v>=Ji;Dt6p zwK>5mx8F)csnDYP<47CUhScG2W(uZz)1w5}8)@%3c`E!+8u~n|w3EH8q%ydS81fyG zJdrIIw<(|~etKIcls2>rt;2uICvLk!d@(Bw*$L5Is8-l0s8rOd9>+P1p1vhPu0vt& zLQC5~!^UqJwACc~Z@oBXKBw6o%Znj$q?!pS=Mr<%=__raQp+w%`zCvSV51$;e+iTj zn_{GIg#QL~*oUi$uh=D7nrES0b5Q|{qe(yYs+CdI_o)kuta?&SB7NQ56!p6r+=(WIkWN;6;29*5jhcqDq%JCRi*_Eub8r&iHurmi8j8l5sXQ!rY{5t3;<33_+6Hme1Ck#&@gmV#S zR#HtY6%YDA(=@z_sN+|Tz^;BusDayilroQ%{^{IR@D@vNQKzlKeEJW2W>E{SOfzsK z{Ax(*3ciuOu7BhEM^>>tM_YH=J7$`Sw6a5HQDZh+HFT7!5ZTpw_X;6GnRoAU^g}Msh-Nbs5JxWQvds6OX^OG60flWeub_e#qB6Ql@ z3dFJUlr@K#OkjEwlXoI;RJC*|*vV!1e9yZ15SKpBfmob8aUR+!QH4EvZwJ|6f!qLz zOo)7V?UNu7zoneXLU4 zvC9~41co0D5rPMWMOuN5j1UbGJP-G+NRX2Z0-*@UKxOGA^3y|4Pp^9V+!#!FvSYX7#PUEtQFm_psIN}+Yx#0;AuYDn_d1Zh)loGB#3nL{xfbJMFJB&F zszo<5Jn5W0FYgXLQ~a&iP=V!m<8O_5TGGFRIP3ai)o|j1MpM<0M*_E|hKa>d>@-MI zJ-VTb#y#vbzQiNG-xN(MEc^C%w6PwE{|NW)(&Ue7q9)efWsz~7@X4Rjo-v*S6HXj5 zDc^l*J;Thh^aL2SN*vITct4>*HF4O2>DbvW4Ug0giq=5$9)ypxwXsQ)Ey&=yt6#Mv zh%Qew1EJ5XmwYl5?+UD2P|QI0LRbO+acUHw5M?`=duvPQALZy8CdzPam(&bW8aP3H zy%ta$c{aRN(QeW6EBz;KJg)&XZ8$AZ@&syc?J9 zo~Y#3?mPP&);`j9jk!R2n;u{RxY)2O^9P236ZiFC*5vuEsOtzBCTN`b5BT`7rq`wy z4)r@;GEx&x5N@@_JW}w5JhO>xbvXOe+s}7(OSXsA`jKm%_T+IgZ9S}=t`AF2;uW)5 zF&JE~5A2SS{(xJ!={?@`_GG|9MgA{gg>gf_YhjOn-zlFHh@|7=u<_C%1ET)jN9z40 z`tB%Phi~!$v1N{vjL!%yGH6=};-3}#=Pw6i!}WM#QoTjF_m@g~4q=VdA7ATCyPMKh{8*|+{uLWt*0*p! z)7Ab~eG+L7?Y@pXw|COJb&g>h`_@H=U$ee6C~42~tbff$XJqq04jxq(8%@*yDt4m( zf~WbYIj;@wj#`N7kRkv*ED&K9yD{cBvyg(MVTu3nY+*Dzfd(*ADvJX#yI*z;1|VbwOerdOcp)vnKi zWY7~~$6^<1!JJn7mZjx)v4 zh;os2&uY4r_NaN-8JWL@+Q!;(vw;=Fo-fKJ4TYu>v?>J+4`f60nY7}YqYD0dZ}pK0nXfrKywkiu?>HaO-eq!e|UA z@Oy3H>eb@tV)?+CEKx279E#hoQrlGN-dN2-!idv`a^sd@HSj%)r-(6Bg^F^JL5LsN zjnY$&qez0(z4kaoV~&hYSilM}Ip8a;alkvQGt_2HZ+Gu{9CEi_#Z9YKWtL!9D zd>rT91Tk8P(WVX5m(0e2*I%8XK5Kd`FuUkPrjrW3wV?n5Ri((|??ESE zgLP78jtehpP%KV7umjK4y63>FRbjbxL#BL4J#o+Cw>fMuM>dD#9~Vi+XDPhyQym0z zA|rMS1FqUbbwi|9Pa%~D{<=bvrI$RDYTSTA>?KLgE{YnkQ**@WAYiEOv+T)twVx+^ zqQHX`cgEcL0{qX1^eqwUD6=b+)JBog>w5A0PQPbFXWAMG$DSPu^3^lN4K2277)AI=?xoQOpk64yTLNo}6g#xP-|6^wI=s)jcu66sT9VCr$9lzw+nE{-DS86Vgj z8aispJ%QkmMRW4oqNy`2uiFnkor596QX`(cYQ=-S`@29UF1AF3%f1*|sm1dRuI`tZ zx#Dvb&O$L)G3sn7XO(fXv=+Hb$x&L6BU@W_q&62_l9%oWymGF^zz?U#E#9KP#*4;O zQp+aadJRI(sB*?G46pNywQNdMarDoJ48zh?(g&{m1x0ZPJv&bH5;YFO&d2A89OK~) zYNYFvPzzxR6fCyP7S|5%B++t8R9hF~`w*Cln2Te4jOB7T;E-Ym2=$-1|2+U)S2}WV zBbX%bz?(nXVU}_K2%>~^F#K82kUF|lGk`(VIr9J2^|;zkTZU7|Jxu|B*Xrxfnc9&z zgeb10AmaaXr)WXo$bf8&F1^*EBB%DR84##`tm;kNtm-_8KD3KA8dA)vx#bH-z>$?um6Blq{m)JQji(ttJEn zBQk}9vTY-C?9p4Bl!l^epp#*lzYWZwy~K$8Zxu;svcHGKzszkI$^S#3iGfa(3)nbsI4YL+C1A8qeG|6#gXr+|MAYksRZlYO#qL<( zymITcD4S~cs3223R--nH7qtX+qeON&DmPw=5j_G(~#{ zI53J;U#zlX;zImu9hT2TILba#_zaoSCrRhI?B6x>|G;jW@MCI&DNFRVz1@YoH&Z>X zV8U;z8gucSY2PuHZ~ism`1#w9JO=^>*enUutcdX?WVB7~8uJ^)-i8+DHhQsTR_l|O z?28|<8_)a;a}t=x;w)zum8zO*-mfnvlrwR4$Px;@MfmFtu#on`4cMahxNWQ3G+pPD z*1Ro=4vgrE<;sxpM43g75_tM9myL8WQxk#PN_q?*1%vbEiKB|Fu7KZLqMCGp+{ygT&Ts`*?M2li5?OS_$Q!kF# zfDZPl6RAP|o{}z=dzi_IQ+O2YBC!~M5z9Ry(}wc*MHAZ3^oiNgt9l^mNfIpN5!{_? zww*jMPqdM=eqYD*yWmjOCBA&PP=u9aJGs4D=+5 z&+`Qs48w!K<<%RVJyJn7G49WWmU40F--|kz6NTm%Y_mq*b@ftAh_T>>7HF8R>=CgCjuriHr4=1qEQ5<~ zvP0!@w!e(*0n3KR?bJvPAa{iwOOFXLK=1k25SAZ?%84(#v*@KO)M{#KSGuZ>uAJ+* z=uV|JitmD~o|#sl9oHUyWy|oB{z2yi^F3s{^ch}1fZH5?+$*~Q%_Ec7Xwegy9&kf;tzTS1|h{iRHX4^}CSM;=+QT@H;OksX z1IyZHTim~(O=)77cHWgLUA{R6L4REUU_miN;`Pul41u=i%7TmwGkTz#z&TxM(x;zH z!_vwzRrIQ>cK^aJIk9c@I*DnnV}btU!)b_DWy#>bh8pt-eyg5?xU8xRHu(dk6S?v? ztU|JS@kr8ytF>da`0IJp)Gv1XO}L_k7y=hSyN-ntSb323p{~XXu=+B++33saTsY1B zE7s!5Z&$0=sx-E|5pi|C#$`R`(h%ervrn?k~7zOz-WNN=hJ z=~1VuE@lez=)W=#=c_Ry@KWkIq*gEv*msESRy?GYGN?5(J#b;eG7_421cLm zm|A}|bMAK}uhhT22e{im35~mCMCrK09`~P$MF;EfkkXzi-;JUm)`qqUcO^W-yL7z; zl1Xp8t63(PR=(`(?MFY{%kz&mlHehfzM>S3;!nk})-YrG7ElK3CL!NBC4WN_%jB89 z>wb3+gZ`Kg1286Esh2`zZ_l>SwpPEStOQO%+;%4>;HI@gvf^US?+Lu8TRp)zE`F3?NwTXr0_KLSMA>jfh*RcFUwh9B~H+4W(tB$zbNWLUl4H9SE zV%*kblehNNuA21~9)t)(B!YFr+$@b(>;uqgc@c_6U>ThP?afz_uX!XYj!8EO;V7~4Tgu)?_Hq+)Cs{GDjB(me=rcfwOJ$=>zV3*t?N74 zn^HGtu!S+F90_j(;}!SSD(j@eo{hNyq_#nNIkR+8^wz&POy8(GZEu8&t0OSATK=BY z`C2U_*qcG_60I}B=x6uKc7sjnVc6H7%*2BXH{7?>f&@QG;JT0V8hhgu^1iD45P*$nXoq$+I3%EVMX(S%8@)RKM(Q|#8hMj=s4vwHc;-O zc!Ydejl;8p60J9+H=ut`Catpjf4}51!``$=8i24L4E8U^@LQ=+8A*J1V5JFoYp-}xR@5-3 zpOb02)BTdHMEryjav#Oh*(by8QHS!Luw=O%SKu5sBy z<1soC9m9D|=W~x+7b$E?f%uWdxbdNz^UD;fPjA!a?_D?L{m9_Ei^`%TzCI+8!FgJt zra{Q>OTHkBo=c8tLvS7={NmqZCg4J{AQ)?)lN>bbamnln4?1@ zS6;Pg@8fN4$1QJ^?BRc&=f?1L)QBzzXDx37FGk}s!KKSg70?ww0ICJlYL*F^+wM?YaFZp3|H1#!KhD|6c%! zBvm(~!P{g^$x_u|Y$uEMSX>T#7#rEwNCe$l-%F8OhIm*pY)N&ah>~a8(g%WLIU4z8 zUWi3$*&+M}kbU`|GcAD$*+7KCudJcIv6Z33^3I+d{ykxO0upQlg0U>-8sTgC+)1V@ z`b?|8CBE^b@=;Hu{;6$KDXySOmeMC7{f|zong&t47z7jhnf5z(ms>*6%V9f}vAm>g zilSg_Y#^@r%L^fqdI$b+M`5@Ul*l>i{?rYOUL;un-X){uL?}_YXMel3c!AGW-~=sV zhR`9*@cqh}P3n%ORdZmKSW6SGVBp`(ZDd2vH6n-m2XPGx^Cy**2B_`3GC$=u$t3H( zv4xNrT~QgMkuO6Oe>aDMBU5pW;VSc%!K;&|y{o|j6c59wfkcD$QlG@~6R982T(A?V zs`)gyPUUc!aQDdjqPdF7Wbv4t3pxG)-mOwz7Ji024k&G(zL( zQj@mA@1b>05-8VcVMN3JsmuvIMr{x7xu;Y^PJ4pCCASI{raIZn4wZSue_+%QV-03c zmIZ^c5V7M$ZUO*aaM~{B-u0l(uV;^68SF%EwF@IUF7R*vSqD)WEHBN=iATV7f+1ct z4?HkUhB=Z8rsmGQZ-bj(`z0f<>;|oBL;J~1>_sG?Hdu;d*3tk4U%&l;=J7PCj0!ur zI91@ED0#u8cF(p2a`y#yY3P7Iu<=3XH{fWouVB^FBgK>B5Od4^wQ}g$G2eh5xGE?~;3OQf1&H-;^ z&lcuOF^QM_i@68GleSy>5I_ACy}&^8{g}ObPKl%2-SRIOfz>u}wYDMGkWxRC?k)4v zMCl zitPfG2zX;B$M~2|#1%qt9w#`xvO+%Oyh(mri1MIH0n4BPZ$!@?l1r^jk3AEnu;ZTY zeJm#cgxJIL8S_5aU0TDOZfJfv@I*SiyMO6p8Y1M8#(7pB>a|92@XI{HBD$ZxK^U)& zM8$K!d;eQgAH^#c?$n2x4rS4L31EvM(35r3xgfxZM01TWj&gRhhEWqWDJURggPBP3xI{u zJJV!LSWcpuG+*(ufo+D!@ch#>YG5PWSDT(|xk^lNQuM zmf6>HeImTJ5EY}pbtCOb>!K=udJooO*|FD(0godS-m1w^m%;yu5K}T!xICvyf`q>A ziW(xkPw`*Kc?OgFDBlAXKu#|`32NGJX7>(}Pp{C5y~R@aub2T_ff zBXP=CYXGnWHuL<~5ax00v<}HZ);?#b!#*kED&~`asw=<;1Qn{5TuBS|H6Rw0o^!@?qebAIxkYUDJIfm8enIVCF4uLg3 zI6?qUmoz!dD=~D7!5cBBgDIbE4J?4=D!4&kK|joMNU6wxuKu??q@!0UESg9p*u~Uu zux-8}yG;2q5KFvSLuVE_-SfQ*K}NMAJ36G@udRGI|ys2FKX ze110}aEJVza~#G7|G^#cCFDXZ*y>uBsm3q{3b|o&8TlJVY*a$%Rz+E-#am9`JdC5% z!JLWHD%HB7R-f3X_X8|;9czVXqy5YwQh*BfZ79Ui*9($@sI7 z3@d&}@1{_79R*yOVOx(?a* zAD6anu+i&9n>a}*d~EbP7kFhPn|sN>fGit6n!JXfF3peqR zOR}TaJ(1;KHHALX*}?E&4+oH>{D10eo(m{Xi9Ep`)v($ibz81#@FLuJ41|LBuM+=> zD$wWrG5#cjt~`yG+6pzld5*)YQ7+(X56+7;LGtp9QP3D2{ynkW-U&6bxvv$I@%@zU zxX3>+Xes@aF)yg>M!uNvkmvug0MbZlkI?L}wDYv(jtZkxHnXJ7BXIHqVvq3AZSP;R z=*ckdw78E%0+^>PQYB)rx8@e_*iWn;E|`Mh^xpXF4I{JayLI?{3k$VMVt=_aP{zlD zFHE;qIT8peeq{3_+PeNWG(vT8_^v#1f(3mIt?74^3Q9f0ysH5OBUK(8+xw`R-CdN#gKCeG3k_$;w}+d;yGfua^|Pl|b`kCP}k z-K@J(F@3^ea{O(mRb5zo3gykcQy?>H#U9jggH6TijVAxs{PYqH>vIQ#{i%u0@=BuI z2_ma^m;b09gt`*!kAK~>r1b#y2>Z$=44zJ@j1c~@lu>;!AUEmzpn|T&JQe&z&g!*` z!><`ZO!PYKiQG{>mKnPluhIqTCyi#vq;C8l0M9@$zXrw6tSAvtq2I!G29e`tcn5k# zset}VSh(0RgJu0fH@9X3jw^2sY%?#L(nZNkU!^(+#m_-mji|s+ZzAJApX2;z7CMio zq3PS|oWHU@hGqhON@hiX;vhsWo6wYt(ixMpOTB~Q|6?RaR@@(DTY&Ef##wbJ|{WGVuotjYTY?onB25Zs)tbgI67N}1-wlc@S_|x=MFrP&CvY4=cvKL ze(>2GM~|fvj%rs*CphPgG{HHoE<*8R$PP)1_nmZW@PLEZesmruvHAPbQG;b|h9+YW zJ}a+sWF_Cc%Tv-6$IKL~kx;x2`Ip57`#9Yq408~BTX$M#h0V_TD{CV(8wK$1yqxAp z%R_vkGbT=SdUTsm@fr*@iwpHJx&v4w?{XOU!Nq9>(ENSvu)*4n9ZvVr!znY&k(U#6 z1+Ob0PIl}pbrTBt+k+-BM7Ij%9L$C@(TO~UP2jH_Hdu2$f~Mm!d}0oAB<7=bx{`O# z$itnO8Vbe#qT;Ut!@Qhs8QMuM8RWq;IS$R=2Xh=YSk@n*`G9{e$McNjz8hilj@0CvHY)8=!XMzx z)3*r~|3+1wS73}t!pb6=NkEjFsTbV5EjtZ0?(-&7~ zq4-yP-;fyJ(NVsYI6}fL{xuowpW;Oe95-0jYV450e=wA!O4|GR>RyS&AAFNOt=>Z6 z@sx}FfAAjTTZuN3a~=cmOm<-txZHVvWo^Tz1piduE0W4rNT@-BMkEULth?(`Q7SXG zrwG^LAqltmcfqe<6SyP=25ZAQXi7TZ-^s0FIj1_pSNYQR$yA|+9qKULjglOhkv%|o z#IT=)+gA9okl;hG)@@3G!Lrt3M^!(3eqJZZ&lW#l?b}lzQ-@4OzM2g8A~WKZ8P)}5 ze2d|)CLuQq|F;2~z^_u_udKP)q~Kqi$Y(iAagR`nIzuv*$n+dkpW#+aHVX~v5Mxkh zlaL$5|0e_A_FkD1gEjwMXi@_3qp)aB3Uy=>mcMDCT4a2Ypjr(#BA9DSjp?I=%TdhI zB*#D9b`ksajd$m##9&$PW5*Tz>r0*sy(B4`%cw_oG+_ zZZH1sEBMR2Yg6N|(Dw)l9x7&;IUZmf!BllitRVR!?P@r*eI*4oj5Bn1v-}+s3^D|t z481Z%25T|)9-*m&53D91Ns^8;YEtZxSV=O?dJ@Z3n5>o?%N=EmD{`0RXRH>U$~tTY zQ?)|~zegCs&(d+0BG^x9@ZT~&OO2x_=!q$PUt+PG({vU zldn-{Vz~gtQfFWNfI-SdVVPlQ9_nu}?G7RQ9w9++u?zz?>68a0(w<1xCUf|{`VZ+S zX%!v9`xp)7nK1?T-JA{_?4S0Z!;Ad+$O*!o5l&LJ?Dy0(}WFj-qmL9pBH)lM5q9J%1pG@?5 z7jsi;uvRR@W`|%1NRZ`8D--5CFF`Xee-@ouJ?t(H$6CdQ?GetEiP7xab`T8L83*4X zT%1yag?^7P6vK}&nj60ik1o6pRZqlAl_?rkOCkyJQ}SbWAL*mzJU?s%9l{IXZQ9iC z5W?RhWC*c*nja$HInIh$F(zNFLV3DRCQxgYB1#2`cU$0E-3w0(k@ZzKk!Zq5)xj6nqG!#z}(D@RZ!gU)`Y_P1g z;6X+(Xzc>elX>N&k~LzxK(b7Y-X|1*t|xAYReKld@=ViE+7 z5gcuCm8XHlFu0`$oW!L725ZYAaFPh7 zxqF`T6vykV`c-z=E&AolC{w$_hFHXQOMJHOVO^xZ@R0nJfKK!&?u!-x7%Xc!I7_Dp zB8})2R)}__WmDKK3TD!Cbt)EDYh-8CHNhFC?XZsW-1qh|l<5cHB(6vBS94aOI|71Z z?w-p$_3;UvdkW}nh3yCi%UbXeI89ju zvDW6}$=wOs0=dKI9vw3+I(U=>CDkqpOWz6Fbt0PeLeaoNKjQwu90-GDtw;ZvXZV+Y z%#*x16|^Ptv~d&u+^^;ZAHxH#3d(NUg(4b(WilB0w&;gqH)8lJYddpn1A~pBLU%>v6z@{;jKDI!CIUWBptJZp5Q8=63viue;)LhIg%qMqqK!jDDhRvxS0p&{c+ELwY|^3+rl-woFz%beEzT z`$(l48B9DoYr8BMpYRqAq7hge4Xj#p!}=bK!CHnMaDxmPTuM|Zuk)%}e!a^?&Da@n zH8XhF6A8I35?k_lmn)Zu=jRNBM$lPY17onP&%vn*GfV~QB5Gmvj`CJY_Y53Wi>3Ao z36F?-sYD~NI2u@)=u-(l#PL_w$LJwtDF>Pn*cO*9&lm@(=soy?dqv*Kft8S-8$_x9rbXquJ= z8W4GFK!gMv5wH>DDJq~wL_vY@h*_eMM$Pyb^WTlmiWwcFA~aaPb8CNM@o`txuHEO> zsUw`MK}6#x4ZPk0i{-Io_jNb5SaMKN6YIhROb&xXb{Isor zLtIzC2CCw;LaIk7!cYHnUWYOlD_UO6d!;FuMX4!scvSYhcbzAMRJS+7c` zi|}%QJxn^n+C^@1Ew1cwjwe5)2InQ8o_5B&GWEa<-0$PA9$-ZoGty~XC(2-L{)=$B z5)s?SCrOfdovfI*JdQgts1NA8M2zRVH0?a!lf!nMMD>pZMysTMLs-69l)*eBiF@0{E-Rcd*b5?O&v7pL24bnJGJsE$YM!iY$xanlN62Fv@ z>3;MVn>#LUc}`;Lu-cxb!Z$TtZqBtU=-?ISlDO_ca9S>%#`mT9E9*1ysfYMBJ)5G+ zxl|~fbaU5pJmrxD^*&30@jQ>K6K#w=^N0G)n}S$&*DRjL55yTPYrAyL4k60##7_?$Kp*~y5T-Bsdy+xD;>b>*m$u|HV+;OpyKL>esXEAbh~SpCzDs%p;& zTto|}wG;k&j1|#otc8C78P~(BU(rzlk0t8^q2ou8+A5yMFJ<~G>l5+JF}ARkcA(0- z4L)XJ@742$hsg9EREx9_R0J9|iylr7T!jY{_JMGk@$*Rje&^4G8Z7G{(wR$P99b8! zg!Br%E0%OGaL{ZOjEvfdV-gN$pe z39!NI9dsp~)eB#bAo0$)PQ1T((e}+GYVQ0Gxl{Cr9$^t)$0%C)Ylz+xYp^zo|74xn zfJnj?R%xfUAa-L!LqiA z&qBr=pgq8FDhq(${dFL_Pn3%PH7E-57(`7V$(%U4lhfg_X}p z#8%b@7H2RHFR3NE59{~f8T4IMC-u8SI{tihSHFiQzQ2ltJp=Dyta!Am#WVS(WPfG- zS$--)GI1A7RL}Ao=HC6<8=vB_0y>ZN{|BBybyrV8hXIB>0OR}=Gc`EA8e50=FA({jFg5^{3T_Hcft+6c5Q}!@;mA_f+@3Q@s z^`87(gw+2@n66%E;OlCY_RVLYt)`$s%~k2RSAF=ibfA|X<8<0t_BqHm0{Ommt8jz$ z#wzg?GM0_n{b{fwKW#wwEUwfJ`7Cth2VH%!u(zl)S+n3-C^O+w1ntLdS}}uH`AbGu zy&>FSSs#n%a3AB%ar-!|$~}DsNNdgs?UBz3^I)LWo$l)9Xr)Kv|7;8v8xZJmT9|_j zUU$krGx$`xzp~zvpN`#(bWEb%YHKv%5xblL?UK*`#he$Mb(gs+EK1c?w9m%@6C|LR z_N+rk5`)-#@~K=e-eA4*k$4iDAS(qTG6abxfy4+xrz&) zDUa1i&kYxiaNK?x?E?^Ei{w-Jg?xWyZCojy#zD%^2km!ra;*spTY5)(<(!dN9vC@Q|i{a&2jX68Vs?Uc{u=L~;ktp*4JPsOb;iK7FxXN7i;9BuAb6!r-rS3~{rqyv^^3c!0>wPz;7Bs+DJQbd}9{l;x-2)vN%Ie}H z+n6#>|BlDLk3w!cfXo<_!6J;g@24zmYUtqAevdKAYq#sl(Is|UZDj*vGd14PK(M_i zQZN##y^oTt`}nVIPk-=N$%FreMhYTD?ZLpPw`OK+psY>50WK}#gXUB@@PYRml+(k6 zY58Q5M%*9Zb3lSdD8*j@6koqN+S{Ugk`#(3(6z&y8ov$Xe}Y2pEdZIzSpEtz=3a*> z|BFEN9X3aOLuuMg6^h5PFJw-Iw*u$%?qb-jlTW7SPcVaJZ3CoeA0 zZPI?KP&|rD&F0j1KX3>mWeW2J0Kn!Nn!mDQ0IXJH6yO|CfhWxoV7pKkVks1lpt9GX z^3DSWU=+jd2>_dK;tbY`cL20v4!L(W0wv(MK@yz4OM9w9@ep}C4Jz)l!~;akJ?--V zHs4u+Gg#I#0Iy>h4Y&o=fcV`8iEx6hYfvbDg*U;V(jFl`NQt?jWfOKazs>Vk*2a|p zVvk|cbOFfJtW+rOBlfmQb)A(93;}1lB@AG5)moszvOWeddkvGP&BUKs zm*Y%Q;@x_gP@!-#`b?_oxN4%s<=ikB1JLdgql2HX+kwFZ?_ngTVf`8o# zHCV4L2ar31$<>4dL@lUnFiMc^puS9~a4kGOv#L4iCt?%^Id?b-+ijM=1~pjLR{(b7 zITHn8;%T;X)GSH1Tl7g`g-ekbF|3$-kS_NohTnsPpQC@J`YY?7gmk^ak%KEpRX%K( zC^vU#r&YKS^{s}L@@-@o4si%RMd0%TtiiH20O*b7ObKOW5cMD>WSA@$|De5A;XVvi z8CJ+);|C;a?Z=dsaYr(M+ zaS5Eoj0EUg74ZU#xrXp(Y#|(4&?~IH*+^MP9uz0gWjn0y8gw8{+#SEWm5hu;0cVCg z;|10hw!iY$BFaCgg|&w%(b=QoB-$NMwbE;lkK`hM+l?0a0 zf}{aDBS6|j_i41*Lo9=MWY@{d+{iU%EN+81eoP>ACEZ^!CN+>+So_0FZ8$4Wrd`Ql ztG@=>7$_B(xM|E-gh6#GfoNc@z#FVh%dGm(EUrS8I$xkrhjIc|f(?QpZu-?UUOkAZ;XcgV3%?^|(Z}96Bwn>XaG%W2-boQFLW4| zUzILVuOl|E!5|W8O%n4py&f74(zxcvAc4`P68sfoQiJ~k==4H|Vfp?kClb%2R*VhO z5WXWaSwqFpc#uY5xl;&Aw~8=Wj7bf_M$qxyLly0BWjd_(qgIa%ve4ZrGgq;T+MkdF z5z)X}CBt7aCN=oQB$e1jRf*#=RlDf2Rb+!C6z9pzRP49uO%lsLA}IY#h{0k^Y6v_7 z9boD(EI;*@Ox<=blC3Bkq#!w8Xqwhhw=a-JV7YUM->{awCB$HPUm=b#X-clkp-Ol4 z0in{}Y1f1XA?SW4G)WWKp(+`6!7|fWFU4PZi`F3sCoLq7^i!3hzfY)m7qwbtHb{Wf z>p|Ct{RrwOt=k?%P&$8+7=z_)Krnutq!okM5#kTZgvz)5O=u8+@Nud6nSy<~8bH0Q z7(j5kO^(0v)+|I&-b*^g53ve#r$^?&AS<%b+I6W<-L#K z{2J*PV~1h+{tK}Z9*Ns-LIWAC5wXeHgAEF51eRm0w)k9Sclxq>O~;jDObl!9$1|=Fi}w| zH!mx>4Y%kdPsS$VMm8<*@{ z647@Uq^=NVuo%Ne{Snk3Zev_Azm_gn%UxZ!RciwcPum2iWYYz1U{GKEkro7}a)yku zhK>3sQL=HDs~VRDtGP?xVQ<|HETrWLPDt#A=P8^*F`dsKb-gry=cXvY?z-uuM3 zx)GP`u-tBY>uvy{dZ*}gyaJ94>VmL{p?i{sjIxG}`d_1j;|^HU&x@Ayy~S3w4HOjS zicZFSaA=;RnEn@o)NS(omA9C2YZ7Hi&26r71fGZ%b+;$e3bz5Fd6Tj;aVK{`gMSyr z^dW}kEnFkeU_pkB`d3gVntVx^dP}yhm)gJv0{|7{vh#58G&eSxtic(V7_7c0(O-FM zA!VN>H(6k1&uo{i?4kVAR=y2$T<>yHWM^R`_#4zej-q-rmBH#(kp|0K#bEy-OF!;` z<>UTA+1l=EZ8@P~PNTk3cnX#@fTOdE#r0zbtE*)CEAMRv{Xv%Gj7G`wo+n)1Bk`aW zal>3i@<0_IhL!xLrQrc^?-?j4~9Yu-l;{#ow|!8=T+@Ibo2yL0tc#|?86{YRu{ zUm3Z-CZsvzq~ zutUDmyV?s@(+zV6k17=;T^ITXlMAd1!m<$tt@9TMHdx+9Mi2r$u=0(*Bn%%>AoijB zu$6VgTxnmWC`h?Fwkp=L*nR=w^-anC%3Gbph(b1Od_X>0@2eXX$h}KcSY#C;F-xv?i?0C; z4@UPl5MH;-_E+AgjFr!Rn6(26y_0YXBNsJjzAG)Z`fhl=C_Jbl)k>bCqZEVHpHawP zJb}f+4VL$3$O(rn%yCcHvR~h)LiXKoi%;vH9eLJQ&W_Uu9T z5{Uq9O3Y=pq70<#Q2wI0jU6?-CInmabYxl6VRoQsT}ylO-<)Fc?Zn;+<q0mt0c(9Vs z(O&;TW{mnD&r@Nryf>_)GE2yzSAvsz>VO-!p;(4jf?WwkX*CIdipu-Syh34ig${q^ zZTf`r;YS-VocSA=m&EB=$Wlo%}UZIg++e-g z0K@Fy#&^1MsV$Qpv70o?Lysubex=7>c?;%KqJn!9R8mdXn9Os!szORu%&dT677{6= zOjjm7!~3gh+|v6=3blV)pvYi(UsA%-jQhWN3||;xox19RyZA6@cEB*R2%gPVmPVEM zZ%cnCjq{=c3bk))@>kw+ObhEOPG=tS9oCT3RvQY<5g29?723X1Tsz-iwc<#hpin!1 zkt&1bZKMPyirX-OAL#D;*^Sz&gB$KQQ(%}WjC83>pqgxc)QV`Nk79l*_)?d@@|Lfo zMCLJ0YC8Ed!V7BE6^N8Q1!fEkGxB|sU#2d7_BZ3hcAD3?$IMDzw_KUQ^0rYz6BxuD z`xpEgQIJqqB3xdMO~o?&VWjTp)0aErC-{Nu!Lhy%!|g_G{>odOM2QV=R0C)B+b^SG zR9}^_saS?T{5@E#F>y)->`pJ_HQg~2X7n|%Ja0SZNTZ%dSS9qE;A)#DcR9P-k_B5DPF#L8DD16)gpMHJ0fZ*lu zct3+7cY{WM<*ivriBEDnuSyRH5S{*9l?B5^@~h1*7=9aKIq5pHWv_%?Qx|yNxCXOV zd*K?D2Fu%mIsP|!vNN73Kz8a6>8u$pFDGi2!SL%5jrS={l|vHzRSfvx^g4#!?K=IH zw;0pH@;i9vze_^hxN%Ww*>JgWo7rIal}O!@t2R$W>`EWw5zkr4rnQ0PdGBFj)E(hv zK&u4h=`Yb*Ib6w(WU~&2mm`=qsy9hQEI>HJBfhBx!|oQX{>uB5GxaBfmjdZGBxp~! z-s0i*+gL2a%Md7R)SDrtM&SgpbGKF35U46O4tA}*O)#`V?@ckZ@1 z2*dxiSDlK}qg2F5lW-;Qi7%(N=xt!3USXXA>Q9e|8q%ClTtZxDv30Qwzhtj=wQ0_c z12X2BWC5xF(HdCx3TtN33rvGz5dx%e^RrnjgW0Q>AaP$r7>S?myE*hO)$FfGEvymX zJNLd85fW5Tqq>l|A+uNpvseG?ubM@~v4OWD$3-|#-*h*yNVBkr@7&#>j33dehn!g~ zgW+d;RamJ!B`UK;1Ty&ukbBMxcjXN%R11sv&fR6ms3);b<>kcHrUlJb7|dSD@>l*p zfZUgIUbyR>fdy<~5iiSyJj3#1&z$;_VqGl5G=jzL>XTte$TF#a63M^I;di@se+Ak| z$b9GC_f&=wMF-Uv6_;pDHG82Q$!4#dYs-`o%#l1G`Mn%|t$~GVVG-ZCyGkJ|S2F9Y zuDFtTrdbTl2)B+}7PwnNHg$%HZ%aWh+^vB%-NH)Z#4CfSM#rVpmfcoaoa@WTHk+Xp zvG`ug0Oxw8tm&L2vVWDsZ;~~zrmz%rPgP3Hh=)=xN1j`4nL<-mw^|`O}z`@;hyP6OsO( zKn<+b=B}o(9h4NvYpVVKX79|unm)5Ier#QEX{Xgr>wfI<;AyLl({X8&oUmmhL_!F} zEYt)Um4X;RHf0e(ML`r)ECNMYtOXlTN1QVM-H6f_l_kqJ%X4`?KXJ%!?|t8UpYMC` zdvBJMD07?f!qE!`9oY_6m*$jsulvfh0e zV6?fp*Jnw)EXJ%1B+=#|mDMa8R|0)aLiSKj@riLvt_;SRKdADs7)v<4c2>6k$?;Ax zcI}3&s5=iddTr%KDyu&@2y`-hkgn;JoXZXeBhDQBE{@O@@kXUL;bC?^hIV>6(+l$o+9MI@45JH*{RhYmT{@Tr547O(&2Ncq1&lyTe2A)Q4!d>$nGUi) zoGMMu{kpn&g7M~U<2v)1DU_5O^aawmtKVYmtQ_+WV;a{0w8T4hQB}=lCzAK;gFGIm zN91^@Y7V@8mmjQo6ecn#Hl5&pem4;=$a_^{);RPaHT&5^P4yPZdy!I9m_3#21T{`7 zKEs&vE-B7@4b=($<&}r;WZ%PYlw;u*%&uk`w}968(`0I@x7mYqL_iygPYH@c=|>rL z-shajNQr`suC|Q3_n1|%}JxSrn#>g`-4YgU+DtH)6 ze&XJp7po*Q`#@)QLw&bxqMmyH3hNtQ^G2PV5lOzPlf^0vTw?|Js1OT{&r`*HJO5YV zuaXR1eI3&ZNG-6`U#*~?dY|=BpPMefS1&|Grt(vaKnvn$st_XPx}5BJwQyvYHEq)aYKBpy zMgD?XYF@TM9hC>5N9Cp{ht^I( zQ_w8RX|=E+))F+Bim7E1@YBFB$kgEC1oWaTUV}QN9xCgxWLQ)2 zEXyNCqNQ#v2My^|G>L@H72p%trD&D)6gC|-U|fZ=!}rut3$l4Tk|oPQJDR8_g-uj3 zF%~U-%O7y*scRDC)68Mv^VcOwv&pi$CV={R2KCNh?H1~&g*gm$WX!0(OPK3Yce002 z5S+F+*c~hWadzD7=3Wfqi@+t!@cpQk=z?12gH%zAur3M7milw3ABVpSb6(?&SwS&z z`y}T<$5UP1F^_Q<2E+9VVWz*2T5wke)jDzII;yC}_!#QYbfX@cj>p2>*9gaq1c{sX zSn<2NqPhx_^EJYZ-;7$|o`%)w8OX4P7K=lWH1c+tMwwhWgbeasF9PXY7m?#&xD}V>lAH`bfBo4_5nnPHo1x^yC3=4E>#&$-l$SAYt zv+O;Tyr9qO=dOv2!D4|MV<3eI!WglWx+!Rq_cBQstNV&u0^OR{&Uh7Zwy>|uL6H>% zI!9LzTiiyBUE=hn-drXKW5nKM>Zah?1a^>slZ0d05~H4>iXlsZ`^^TsE1ME(k-Jid z)t|zB5;;{bC2o)G30#YSB?#63plS+%6<;$+7%R?*d^$GH(Yi{d3oQn=d!L8md^7uq zDula2;ttURcjZG%5PrRaswosc13OE=NkY{NjYRL3-N(4480T9r)lgFXMf2#zQtk@n zzVSpVc+DiRNk+jI`=8WIp|O=o!kE!7G6-rfGIA;UO*?3HWKmnCkDCH+?gk~9(u>?F zUBD(mOAsEQVhWLuu)2*xCka(9nX%B2!QiDZW1iY^?Q+#tnx`&%152(HCc`9iw{!yA z1T8_x9;4#BjRMak6gl_#H5I2AzmzAp-Fko7Rb}N3bhYQw_R8b#7V3MDpV@%DAY_lx zFjxiFZB+dN_&{B+6dD%UohWJvL$m9tW?5*fVuvljClgVkPH0oxCge2oB-mmnt)gBE zo$tV`Y(#d#=ZrG_oYuk^7CovOEVbi$xzZ~2smnabd#fmNLFn!Qp75+vxzU2b5vrvy zSp5x{nTL@*U60f`zwC$=?fmjHONmch7w&9diRBq<_@caZgqB~a^@Yf0830@DuU1nn zg~JB4V>N|*ssd7n{FVn5lixotGj$32wmWva2?pFT%h?|sQsNs+J~?xv&%`hb-h<@&yw2FA98(^^A)jTff-Zy54@ z-pVXRI)$WWRhIkm4LACyFEsX@IL0+jxGdCTxjrVV2--Af;Cl6Jphj9=ts2zL*e<iUnnXVWf4*2ePz21?gR~U7#c%4|%&irMZ`QON^A1izV z4-HpL&#lv~o=Ion)d^OtCpc3rf;|j&sb_8t+Jdu1L!^AP7R~0h*#0jddBEHyUT6>! zM>0zUyBEz1Y~%cjw%}{GP$5OimvG1IDE29v7VH7lz2_O@2#H&I@Rnrn(uQrEMz{q( zNPQGBt9GDS-3Z=v>4sz5_fRO>E=1;RcHC*hPI5IY;0Q+I{SUmUc<9 z7gYa#nt_gx*i+yV?O2|qVVh?dZpAlI9Vx(y&*2Pz5&NWN_(VIxYBn7uBeF}O-yTVi(J0cMh+k0`dR^|2eonoT!%V z4~>nCd4$9YXR&O5l6L~!KzHGmd?kkvD#jtaEEIa3PpNQ^s4l5u*drt+*CRHK@b9%E za0?CM8E7YU(J~%MsBS`^eD_QzTw!@j8Tkl_K0_ykyAoX;xP?yRB`i3Ea9NKeRIC4s z?iLGMguBJ`DaJlRqK!xTr<%SU-9%6D7M()~6=f^l4uB8e^;+SMQQgVGb%aC};mxmR z%0Z5z+o%<9(GO4)Daw}Zco!t_Q(2}o(tTrfJ0l<=QM?DQlf=gx8@#eTa&Pb?)f1sb2A1yn9qXu45b| zBpNjI%J&~ucq;+Uo@IqQ>)dCqM;`F-B|cg!`??dNIMRE!zorDEjS~DnWRd_M`#NSJo^yYBzz6>bb$X8muXK;G zD-seMTD%%OqXK`7UM=7;x!6ycg?P^WC4T%O^bKopOVh@wql5&3oHHs6N5&V4#5_;px#MTKR? zyVBVn33;c_SDttkX5kl*uK=&e;R*L8WgXy(XfMaF#1r4BFikTw$PP)!+cVIp!znWF z<7?IH1bpzE;l8Bj-1i~w)#u>XVp)R@-!v|s#3JM^Nmugu%4F8yi;e052HTxE!p z_M=ua0WCFq5KFScE}$eQlC?Of$?9OkBqVT7srh_ml5YsmtG*8L(Z9$1v-E61Tp8CS zm}rxpgjM;3J(G|?8S|>K21l&~!7d;^`Yp>Cf0mwID|rknTnWpe#zsw69@{1%f#B2g z`N}x%NKg#&0M@E6nSMgSpCRkAMnYYd+VnW7JD;7Ckj1&^*5eB8oe~tQf_zgx#OxCi zVm2bKj_w=@l{ug&VVUgvY@UQHOwC z)9h@Zgv^gU$;Nzz#wg^&U&G`RDmFkakVz56*^;2hP)&C~dnh6EQC+Ob4HAyY*wTf3 z_#ZO&gp94r5m$(};)49KUyY8Nw4XxWMR z7E~*vN;{Rgt2x`xo=V6|YKxT_fHPNya7~!+#_u!ngqTlbAs0%fkW20cv?VOl=3`qW z(pf;y z%|$csgq{yD*UC>qY_?im!ZPP3*j3Mtkm zeF^KRD~}D9XvU{*cTmdx&Qr8tY8SPdX(t>U#w^!lDL?)9s@o};5-+KUO_pfIlH%4^ z^KL00uFF7QiT}u~6Bd^J33I*FB?>9na<4wOHGQS*vqUGg6$%U9eMyLViJ*Uee#WR1 zCf07pTrs~%G2CX23Cpwq z9I2c;N|a$wa%ime%=1zNoCH#r%#|Hl)#YO=Al?F44r`u*yQutdSyM zHR$addsi^$gpV&*f!1xFl)63PS82Q^oA(nEH9Tz7S>=rnr6>qGVU%~|gqcI2m0Kd_ zXS70{uePTBr$jbhqJf;pPNn&3M2dt(r$Hs)9Xa7;_dd{t;}K)OS`(J>W?0yKiFB;_ z4N43Aten4Du7OIhZ#OeecsYRjXUl)Y6tAyBsR5hfPWE3Sn|`&`UDqK-#EYO3to(=x zC)|7jx^`@r#FTIPX{{b?va8sFiCmhq)Ry+GE-@-jw1aA}lldm>#C!p|c>Jft6mY#> z8|LjfL@Yi}g4)8qC+CQz5A|2?*cj%U@Dq(%!l&ijx>7W%)`*QGm8ac_KeEi(_GIUK}wFJim>qy%r=q1e$*vo>lIYUPvbRPa#jtSGLgbV zm*!%Q&k!W#4I8QqYnW^zg%42IP(z-eQoeXpbHZ|Zd~D1_0>1APG*@!M-y~@XyU}}) zxrUpB?@WnZP%$5KYW8Jg^K`K}6Liv39jeRN*(yj(`z=%%c5Gs<;U?j`b4`*rcj~rg zA1iT|>RO+r_$ABa`ufyuV4MJ`b28FAV>bcsj+nr5jMiHAdLB*0kq`ZLLO_KCX zfz{zFW*Tl124}~=Us6Tae52f;%_GiiAfV)SYp>qSW=VRM!k(q$1|c^IgGJ>-Ni{t( ztlgtc-5^^v!DFCDed%5~A}B<#zPRMoyZ^)_uvYT2#{7I(5)x5asq6ivi+ zVr~#}lQ4)J7v>bEX(~(zBmO ztSYu}62Y5;j8`u{H|NXJwF7vb*?uM&ZW0Ea9$_=U``vVHMl8a3g+TIvEMe{EaJAqD zVFYgyZp2+z4}_U_m7l)-zlhb$R!$-?Ub&94I$!J`lnaw~6jzIltC?dWmuTQB|4~?x z7xvM)8LKuqQJ!1XR#MVy2PxZe!MCBD8X?L?1X5xym@&FS|q_Y#a*rokS7#DYyugcT) z9bA zUECXw^&h};e7>9cCGy#|3V4a7iSzV39Edf8p`=7MdJ+!mQ?9W7rjuMMPUF7<%du(~ z(+dLYkZV3gT*)^N(aC4vPCLbBPeM&sl9#nNgGPBbSzSif<7;LY2v%$XUStV_;)>q) z9ld-ewlgDa_#~8^OmndAX7YQUIF&n*C-ZMv!R&&;+U>}nt>sNjs((N?e?3RHacTnz z88v5k6!LX$){B$5963a9U(4iz!e5{d>BxJric8{;;jhD~4J1U=axTMcwvzU zY!7n_49h-4UTHl7PeDK78}w|7Q|#>iWNERCm9Wxg(LOFu>3Zm+7#kQ{fY=lT{cXc4 zulk!Z>FTqUZb z7FnvJS00{hpNsAj0>!=!Ey)^Y7A)37FSkj729W+Moqf*FSS4dtW&sj(2C{hcYEJH@ z3sf6=K!Z8L!~zELth5`~SPNs6G=zQ<4PbCU|33@M>cRVBVKK3z8iN^%u29oLU z^N^6$&tO1;L6eLB?9NB>phU$-uzw+1$Fu?n^gwrGh6^M*K~*C?eqMSec}*dCM-nG{ zSV{BZ7x_y`K{vE09N~@$^gwrGZq-Zl0^Xam5Dr%_BLaDQ&U<*b`a-WTc@jmpV^2C; zzKvN0lRemOFeLoFv%@4rN4?T%Z^RVDY$IL{#YV%9M%+7!}R+_@TcZ6HjuzLmGOubvj|s&-k8ve z9jxP{nNpD1iR}uuYMHLk^)nrRF%q(JIpLiwPA#W0EKYWTQ1NZpx*TFgfoAt!?Dgkv zmgx&t9>fadtvj`l`GG7%VG<{{2Y|;SQ~vYdKaFxi1N^Lp<=885NNS5c#)DXaoyMwX ziXd}S#FJNnZ3K)9T>yE0Y+;tKWkNycFt|AscL_Cz<|}mmKybL47$wMTdO7ndFdC%} zm+R^SSLQwD6MVh`|Az5j_RjUI$t#WGMFqT#R;}Zp)Vc;0M@QSKV{5|V8bWx9xeyWq z!6bqr(xF@i1wk33wjxoirV{D6;-HQZ6)dxGs(;>qGpnmzV=KAxp8f3K!BFeL001BW zNklYLGh&t=cL99hn>YnEPqvU^-c|)9Qmp*=_`~{=NeYs302z-*Scq5L%I>mG)4Pdd@ zEMG8M5QE`_{S1E%iypt4gYAPWikBw;6J`?(maDE3w_!!%>tTAp;u-l{GxLRPPF?Qd z?_lxto`>y(tE$ g_(Nd0P~3#S$N^OgMscfkd_nJ=S`r45`#kb89dm#vQP|FsS-? z1#f7;p3Hsq5Kom2p~K5D&LqB0TVLp&3<6v@H=TJDP%0p zyaUn6xvLbgK+B~1^QwQ`!8C%%&Q;2{<`ZaJIZ{V+NFifcVoW9oMD0vhDNuI-xj8DH zD_@|({mdem>{eerzJ<1y6DR2psc@!)_hYG^uACRy$Egs&K3aQS{R(}?B!bGv>UXCd zT0Uy~=@6-AEN>rUilWmsL;Vfx;M6c|`9dc4Zi-Y6VmHZE^-HubmpKHNPt_m8DgoD!);N74^(F~exLK&y*cDHBq|U|j z;9sBWH_57POd-f@2Qbe$Y!wMVqf?}VnvgHd=%Rm)dONr=m=+rAu{-4jz^!PznL#*) zrE^M$z%9pBO0!7MW?@h}!33jc+N^HwiKj^xHSk{X0?6XWOduS?(!Xz_pU1!RkbaRa z?tUAqVvx}zRik4!*`Mj6_b=e>@*O}D=M7i_Zo?{6zfVmA;9?SPq+_IyOF?@V^Nhae zbh$axo<`iw;0-ei&@P2LnLl_NmJ;(d@b`9GxpR_M+TA=_s27@iW=>tDl}amm&zx%q zDAO{g4+(4rXw`-mctyEO-$*Yd0gJbm@n(tl1-qO99vDnB0r^d z6T5|>%U>|;WPL^UawFS0BjXZB;CrVH;rS#!K`4i12*UE^HGE+?P5;P{E4j6k&HkrUPDDDztK1NT#R^+IfRRrtwEz?mG5brYLvf ze_i;6v@th zVZ<`s#C((r;h5dSUBRpnKQAF)c_3=FoOweWdBqT|`%1!?^3kv8C)r{+q{aG}l#&@| zx0>U;x-DDuOZc>`nt-TPaUS!AJT`7%!cvAI8!aV!T1C7A~n+@ zGW#=#Vr|&Sv>}mgt03CfEh1qxP0&@ciz(7!jrtj$-r<3r(@swfyCu8a6S0%+$9VF7 z)i!1gnS73+Hb2O?%*bb=v1Fancu0%!h~eA!Z=%+Y2-mH$Po>Mie5DSbF=UX?Lx%Pj8QK>@hlmP`$okiEW`P`beN^Z7VL1z+%xQp z`kZba6I^2A12Vd;;t58*c*Ce{4uI&+b0G<<%1MV~%wn_>N=d(vCDaO#i)nbnsB{j3 zNYB43gt*=DUiyqq#Pi{U>#x0&zy}TeokOp$cpfrZ>4Y<*2IecJ;0>eF$$1~7mHVY6 ztgx9*qbJITgJ!$0>nPMhX{Xm^aR;hdT|LnlX1-F3_j8yqq_esRWerQrQ*syDX*PP? zHeASAihE$+n`9L)XE}98%?ktbm0A?7X1*Z%SAewhb1@04jkk{K7E^paXj#3TYF*Ce z=<;b6cVw8mfqG?piup=03U@MHkoVr(grY%m5|+VQNz2iD(h9gc?7mp1o}1DU^}3wq z;4oLLbdHd_MUl=A8jYKnEyx0gP&)dCoP^cMTSpb4wD;-66X(^rSZlLBTBo@+Hh0ze zWa4QruT@ioTb*Krt?Us>(GD_MkT>KNqxAH%Dmfo|E-qpzm$e$YJvYX*m-oLuk>y#f zaLcUs*{>Ihuy@{-Dvgj|1-HM?Nh?>FXZ^B`kxl zj`jnyx@EEr-wXuD-H*)IE%w_ktM7t$v}>M$&IPVH=IMKL&~M>i*WUc+z{1~0y%&5| z*KNDyiaF#S4+d@y+e{2pFqm8w%vb8c0e1p9=x%gNN?6BuoRAP;9?uApGygM~x-Da- zAV1|JnAUzJDPeIDixA-DD@j_`hx563h>3#yj9puBKKg1UsZyJpK12v2o+(L6R*N%J z$^mzRJLqm42}{x?!?cZ7LG;GQKQ!bGb1s}fohADJ^!oa(JCV2U8W%m?{E3+?BmDOHum2cQX2m}JYcLDTfj?q{;Cr`6D>`sVs$Qy27 zSZ^-{s^Er=Ob_JU0KJ(r|5<1iC|hMN4!aYg(ptN`;r4l6mIIZLFXWKLu_hl$x-@~p z#bI|s6hh!|`#i6ah8gnLGC7dN@n(Kp=#BE`v%^*lWf5R!zB z5*9(V|3s}w5i7IS(7*`MFLjzrJWI?tKGr=uv9&Yf_?EFW>z3c zkXMZLJE;3ks-hXrJ*J}(q91}$v0~H(cJih;k6D2vL+)OzUxLJ^pMTsZ9Hyxeq7NSW z$gxUSl9YAzE4Pq4ybn4%GIGkuyKVC3z!o~vTQ2^)3$Hq zDw|=Zk={ngQsbEvEJ7OCwK0X;m=Z|x96-B9siRD=y4{b{-UwMr&I+DWFjP3fs#$V? z8G)q2Iy8Z6tP(76Ro|FsafB=tCQY*Z^!z5gY3q5I4gm~nctvtl;S^^Z@iDRi$P1VEl*+kh^tQAGWk3TM z*6_McrL&yvM3hPgBjV zXHZxc`7~4Wle}d;LQene z$+AuP)K?X(qXYta3HW)8lQ;g#Zr{I%o&Z|fQ6?`+E_5lM{A^8O4`mS0gU81+oNe-! zyoFs~Nk;%}mAor2P8zO~|7^#HIPDH-&hd~3IGb%i;6#|cCG-Q(n!IsXcDs9!3~006 zVYWMJLW0y@>2$2K@SHDiuW7)24#MsJLaB6K_h1F)c*qY{&0^cb0tnGJweZYHWpC$s9~5?7Z2SkTQ@i4k+M zom}{AW<%lu#SzF&v+B1FJ~whv;_@z`3xIy!k{C1mO!%vs$QcSGki9^to;>o*xhoRa z_k9LnK}XA0ON<)#H2LuVnnJY{Ng&Ha!r-eHhdKii7kJkWdI0EY%N~hw;|P%vf7R$? z@+go6PyZ?M$MfF@of21g{T4a^=&NL}$mHndN{i=C`J5C>ATuuSB)LQK?}K*x-css6 z^d@oO=&a;v^5To*6LE&S1DU)7AL=G=y!d_avB))Mz$lEcy+CC6d`E`-O}E!Y(FD?L zuc9Z&885V-6uHO+2dVuq!ir*%0TlR*+(?TBWZYg|BVYXHX|u>xE?!6FhcVX5{DR~R zk{w@ipB4*Ph$~Ke^|BA$GP~%t)O{G`u+U`5y*ad40PR)Q{6dd!R#5d}oFhW><U84WOR4rSUg~{B` ze;^+ybG+UD`wi53 z3)Qqt5c%_JOp0A|$6_ix@~c8_O0By`_MG29oJ$I!5LbMFsGr|ouFGBaqttig+Y-6) z<&2O&-{3w|8=#8eeqLt3Ny066-B(fFk$;B-r&jM}QYcd!pfct%q&Sfol6yqNeuUZ% zGx&qx?0S;RpHob2xK8GpPxk7n{we^J>iR1;;pB23Y)@-Dj zgAU7Jn&8 z!UhAPcR|s1Dml#QV1eum?5iTZF03tbi((C{xx%->bcntjhyDttwn=!0^@tptmL8^$ z!b+Uc82=5XHJ#zM?2S;ci7F2BT30SR{+QR0rqlihlx-=liN{MHr<4@CFJ zWZU$e^VLzxVLr9qJ49#tW~7f_aV(~G!wMFQzm|@%?wP0$j#18GE*EF&iOdXQ_^k8| z;rM{c4QtpbK0S}0Bj;wKE7V6#hgmfEh~JD{6F=I{v6H$DIxN$CCj2j1H^b9dab{z| z1f0=nPF`i^iTr!qE2!GAj-&GPwD&TJH#2RKDat$Y>z~ZL%2bU{{B9Yu$Bt>QOVzgS?FN?DDuLQOz_e|Jx5yPUHkez@o_R#B@# zhh8y+sh$x*C9iH*YfcFE3zkSmtad&R0maNRWdTH9|I{-leR0xwEr zXPA2iwe?AZDx0TpEwvbQSeEAHV2H*V6Y*L)3)ta zo+oQ-{;{wp+)00-_=my%82{;NuIGv}8>o0Wbr@2uQ>Vjn{)-bLdVDO5FojfAuBp%+ zB0zgJKdSTny?g~#7;+sbP^TW8WMG3Xnx?({S*V;qlv$!WJ+q9dvx^GWQG+4brXqEs z*%PWFee0s??%!|GbEsqdi@Su9KB^g=PUO;ljWwtcfgg(2BR2G>h#!rM&iAzxiI z@&mhFFO!cH+Db(SslSkJpGqB8ZG;@I>xrx=_vuJ}2b>J`RI|O#G`a-^y zYgDQck0wdux}MPO2{9u}B1fk$R?q&{^(F9EDs8AWE2+Iu!G^s`ed2gRCfC_W!ppFC zQO-nzjqGckeW=vGBHK1nd7*~V-AYx9hy4Cz$k##!k%};!3^Ar%f2W6(+Eu$tsk=}` z$sVi8df_x{!NeaCUUfFg1c3l@feqJpCHGVF2lki#WFh#`j%LSndBvLfo} zL4;8$UCIG<>aeccu};7(%()I1Z8r`Rg!!!@8{#kwm+3Guh)m~=ks}g zy$)v!3m0uHu53QG1$ljyIHxM;TS${~R@kpOFR_w;@V%2+q^j2JvJEk#o!3_hm77l6 zLZDBj)d?@LlCO_NmP&PW-sEeYyuM1fGbvOpMA|3qcfIu+5?%ode!HiM6^(k-^^REw zc`g;;m-hOqI*p!%*cFyR+)J!3LSCUmSys~$OB)sJlshdx&a*3{P2B4%!>?#r$d$iS z+^G{QIj`LQh|lI~VU42{D3qn@}|*1c)lEN9=7q+`}L-Oe+ota_`w zSGU{t(65lLyi{K040C--6&r?@&R*VSCGx%1gv;)~#FM6i*R~#cPv6HUXjh=oCfD0uL3@t-wbgc2FUo{%M-F8mD z$BS`s%)v!L6}f#);8R$cN3#L}(mwtC_D_5>9i*~tl-GZJ*2?;5D_Wm@|C#|;>T=F5 zaT~lKlU@bhI=EM28$ETC{;G3%$ZB>?uvCgwOB9>GAp*F6(`x%N#1DD6;*tG5LhGSjL0Bh>?q4DmR3jaNnWl_y2ZED0)P3ch_S7FJ1a0Y>`_bOn->UmHRknL+t5_-6u@$Eo3 zc?D8Ww+ug`7BuYKps(9za`kF_@33aV(`k12hd95kW#b;HDO$kzb|8$hy;8G*$?p1i zrS*f~@oMZp!;>xAdGuN)hyOnI%HhA=#?Mdt&fCS_cxAjO5T4MHqXAF9p&fL!*7Ewg zEq0S@aiUI@n}CbXF}uU>8yw|Fr6cp##Rh0D<3)i8Qa%+M5Y?`W6of8a^3H#K=kd31 zoSxpNEeah!HnfcNdYo^*ef;0A=e=G0Omt~sN^W|lQJz3#hj)n0h#PiZC+Oe3i?^r$ zWwqFE-JiWXGtt_ZkS(2>#*T@ZyR-Li*)3N8^zDoH`2VhZQb%6}?D!?k2}C2iMDCwq z*MCP($kWp{*f%uoe*Kf0?|2LDmN+ECj`LmU@S_DX-yznVh3We zPY8hB!I&Ip{1p&`%tFC&!9F2?7|cJHoRiYm#8QSJJi(g48jU__@5(w9JN zQqG7D4db8qN(q37Mr}sXQF$PRwgh4(cw9rkh@b8N5T1KUbW9p{(Uic4$SM&X9n~Jb zPY584@n^C#vg9N^34EC1QrYQIH^4k203o!?{q7*+8Gx-Ss+64{)mI#~)Chph>aACV z$0OqzfUVemM0kW$_x_qD0kF|fzw~S@WIO|~CF!}+Q^aup0%ZbVE#adX0?ww>kH8iQ zzf4#i80~(JLIJR9)M6C>hbPwufjE$UnQ&Q$wVqM|u)_bP_(0X))gyAu+4+3$+Wx{1m=6lo&AX&T3ND@}>-cBb1 z@xx`pfL5kr0dm!McaVZy9|Yo#%Y-XavF2$RKqmJL3CQ(9AQ7@N$d+ZEA1E3?o<1k( zw`^NBT?oYAi9@7I;19T|1=nCTJc|XUR6~=3jztlQTKNyyXhT30{2z&j^ph>5@c;7XWshrL#hYR zySck$-Mi!MS@a)}SR8eKf1%Jz{Q!E#)j^K814)!uK-RodXW~L3pj$7wI>_;MAgL6S(t9I<8^?+pA!&LY8S{=-6 z0Cc6c`%9AT|1y}~4kS@gC8@J^W&n6ceC*zG2dA4MSQAWd|hPNoJ0&^I)2C0<>+;Lz1mkl26kC zN?_*b2A;1dC_uZs%oSaa>7syAGLMiz>p90MDL|Y0ra1Pn9@9ku@pAlBw3)^8~+Kts!` zff{maU)dEHy5%*eC=v;&YZ)n;qf!6`%s?X{6C6HKvyo7odI@SzZOPpW|16 zIxrC{*b?jaEU^H!FRxy(yb5ysis@H?YA_Ki=n{*wSO90Qw0Hc9=~sZ74r1*lm4cqd zVlEcI@=9CBuQF*gKuuE87$Osl!P!TV0qQfzV20q4b%5hn0J`e|d;kCw>q$gGR0pv% zl2&zK(h5bZYF&~+s1STKofG9*AR|zfR7XcNp->ANb-bnw20mUw4q`@i4{)G zl$Xi_l4YE4;)IvWbOt~>@)_$Mo`s#O5v+6N)SklOLi^}M%*4eOj7|` zRDPWN;=DVci1C3Y@+Fc(r|Bs`quYd^kYLfAcdw@nfwx|5YbxW%BC>7zg-qum~|A_f^J zX(B+6iVDfMSTviTP@q6)3w+KwHibW z!k17Ka2Tf3PGtgO*n~h5!e(Pifb5`1&6qB=L`7pD7KUQ@2m~jB3Q`%UV;6L$sZ;;E z>a^6>LM6L*KkmKH^CQDgnSIYWbKY~$yUja=@Yuoj)DAIXGO8*nWg&>HtzOQVq&Kgg zmrCKs4vZRXpQMe;WFUw#FXv2t;62r?jRpTHlh`FPOj3=vaUklf#LA(K)qX%ug?~Dh zyeB41mgQFv2UcQfV}a&XG1V@Wc_0qfRhV_x#)8Q^nEb6ski*w9tJldp5EF|QhTFNCpUT(Iq-E=$f@Q_93S{4|cah ztj$^>4CbS^WuH7u6dl}~cE0m5<2m^S;?2T_JT;`UzA7YoSA*|6+j*J4PHS!7YUzXWA8jQ9+H5MT=-eKcaFxGC7OMoAjR%pvRA#kK+%xMkEg4wbN@MzQLiIKrM+VX|`O*y-N z^|*5yoSK<(2=G|Xc{(S^dDpR)`?5G?T3xk_ZF5G0v%=Fj!2dO~Mx+e3#%i~M6xCJa z)p;5R_$l6h4t^f%_cA)=;}vsPL7OpE<^VLYN-~di^@zMqIk-J)?n?U#(8P*VA1fof zQ(FCcSK3#ACRX$e*+EL_jCY)N2DPsMO{{3@Ok`h_>M6FvH~ZS0KJ6<&6D!L0{H1lb zj8E~rl)bpexzoM^%7&d-1+%LwX$dJsabRz1rxRBo3ueg^KrW_xov?7W^%{Do@I&qC z9nM<8SltffYRaOuf@lE^B(f(I0TgQNs@YI`LEBee9t85RrlLw9Eu_XT-`S@YAZX_& zK5KNk3fh8Rxk`Qj^0I7$SX%hYLfab%&Um|v!9v@#MQ#A{wQg>;a9U_h!#xKT2IOyl zcVDOTRA|+!*T@V&05;c(sD-ySfe+3bii zfn1C{IQzL1R1C}OE9C?rFiYo)t3_&L^>$>oD;JpT)Rop%ku07g9{_=R%G%N5O=P8# z_Z1C1nFBouuizAomvMmLEu1I17STt|w>+rBPuSgk;j*(*L{^Ie1u@&&(W2UwZolbe zXdYvGraisODJiD4i(~q#Yx=~ zksm06*&791MHY&yxLEL%s1Fo}VfT{yDlu_e$q}Q0_Pu{Q?N@KO9f*g`i^biN`c10E z!uMEwEjT>j*IrV!hTDPSve~`lcBVVJEhCMr7c(tZF_hel^@iJlVp}+GoA6t5yMEXF z;DBNza+??)To|)Nv<%qX4wS@}4FYgkXiK$N`5qOA$M+`g`AwIFXKii=N~E%WxgcCF z_k~xkweC}%gxkK>YgcyqEtiSqbJvOSK*=nv6Nk&JmGzQ3C6p6a+hLhtyFbvlohQ6@|zudC2(dsLp)Sj2f+D6&eUa_xYVs>}I|$&OFtk;c8$-1fPioU_5gl+($dgrB zf9yN;_6dbe>797}RNo&P{UXcwcF?zjfO|qFIsKmM$R1MTl*+N2EeW&iWq&)kL@Wo~ z6Ox0ryO%y4w3W2DD;NepZNA&)x94^cAUBokrwP&FXl4y{b@YrMR{9iS+NyoHSKBHa zrnwyi%9i&D!{q(mi=*#a=1`~w4DXKK>Ghsqcx(9s!>>NMG?5um9_3>sGjZvY(>wf{!e_<$DPlKJ z_NG@<3)msm*gM?bli9CUn&k3@@0(WXA-|uHs$RWH+y+9y%7&0nqYR|aw!C-J;;f&v z`{mZFe@=IrJPft@bHr>QG-huSwxiI`N;N0D`@OdFzxHK%+7sy^l~wp{nk8NXVN$t% zhR_`mJ1>87;aqmmfYx^o4rb4txqjIQdsJA>0EExX)m6fGr0g0>C))RR_ivA7$10m_ zPW9Rr8ZA}x7K+qB2+c8y70p8H^p)XD=d!Oy|Jj`v4rLykyEJ^|O{+qqIefKQlm;(1K%XgYngYq+oD+{Ak~P97+O=XiF%dh*756X!bm zhP#fQZnASdw!>F8Ujfmu=oulM=bvwAdZYKs^*e7}8%=)upgS|zf4-m>iu=#^4}RGF z;M?TrwYTnEzta18lgmH8Q@ce>2BKohthK^AkJ8vQ^wIJ3YpHJ%iRR{y+y9=N=;>+g z?!J}DWXAjZZ}0n;V?WeQ#~%LM?f(Ap@BZ7Z?(Wu}o{8kS_K%w{Bog1GUP~XpJk-?a zZ_A@>oa)&@AWAGA1xn6hQ6PF|RxB6ZfzmPC4n)(^8c(+YrBb(46b2${>taD3D23W( zA}|nPvo{I!K(X1|4n$q$db{0$qFV3^d)tBNTT}0YLZE1-Rjd+sfmrZCAy6dMD;J8n zKx`~oStalTg;rJL(?K9!=6InHD6sjP#abYCw*E}`2MTBL7I7AcC67P@g|fkB1|YVk z%(4~>D1fydbp~Rsa_UB@00`E`^&WKwlvoR-10Xmn>XlajHje@UvR4$~q3Ls#SU@1< z)pQXR;NL8F2l8fZJHU@ESy?ST0Lm)>B^FRF<<&f|;s7YIfB<=P5I~6qD6asDTw+y8 z7l88WAMD-fR@+z-0N}BNjdyuBwu~1r*e0wA1Wxn*?={K%=$<|&3lJ|_zV8(zRn@sw zstd4PjYx?FD6asNSinKbtMQG93Gik&4@xZHcjeVXL$m~VmyvOI;MdJTuo zr_G{>2(UG0m!G5-$h-FROf&@8s#13?y+EE_UtWlW09#k652P5#t4+5c3Igm#JeFo4 zkA`*e4`8Py)~j3t`SLoB#Xf)?yP4TN3OQ1VTsa7^51nRN(t&(9TAYY^0DCgGwE^;= zZS57nUfJ3JnP)Ep!2T8LLkS47YhW(}z+o(-V_68Y=-7{g00%T$xCk0DXX3{}fCDq{ z4jI#KRz)^|gDcfsp#zz*2~4&FBt+adj0IU3y=u7<2OvodV}a2t0Jg6B*p{Fm#iLhK zOGN>as8q8V3sP!e^a>!kmTrQE^r`f1y#h$K&eYllNR`vDBXR*Go=zd?4Fa%z%cvr6 zLGm4sd*T&9igdzL$qV!b0oblmttEkh-XH*5*06mPl4%m%h)@8jH4oNO86?e>ouU9~ z7xxXkLxQ+(5Fi_@#)8CXhbLkZKt_~qSFbV~9NO!uRuYc@vSeg$0~}U)))0vRvUiMC zYdOY(L$Q?sz%dr!@Ctypx^RpI`#-!o6MF!%uCXY~c(5<0UmRWm>CjELroB_zAVz7}0VHeiZst5y+UrQ73ux;g8 zEVcmT+*!9};vKf;xOHo;9f1FQpLoBL7GWE%n&#R8_}g+}$2?=(MQvP> zA>re#!LEJn0Q^Ab(qDz}A#1Hc0DkVXRw2Asd$ANd0QjXsFFKMj;jJe9dP&>>;P;GU z!5as!hQVCK0N|~v!BFyq-wa+&J7NU@@6%{r%b@TxpTdzS0l-JZPi=V=el*tpS$qKC z!wRwA3gO?%k+F6F{I#6J z)L7PIkyppVODh=wP-DS1tE;N79{@ELsICA|V}a@l05#TlBKwkUle=!ww+_I5UDTtp z986Xn`DYM-11ZG|cj=Hpr&0aF_YJ_|6yoqoJ|;`f7d^Y$0XV!yb08~|4cCj<7Y#sC zjGkA=k~8Ucym}t_mH|kXV$IMyX&!11tZD}!kxB-#Naxtq%uqW3iPo47UnOi(WE~p2 z0w4uC!QGLxO)46LcN&8Lq(>CaV*XfW{mEpAE8wDVp&U%Yaayd!U zj%ssXCjhB-GhJ1rbP{uPwVK}eDgnsGK~`wjJBgUOa&!eiri_BVJ)|7+hryPqD*&>n zu$&HEsKWsq4?-6>1CU|W+ZSW+?A7_pZPk|tK<4Qdvd6yQ(iaCnUKEzov2E|{)TGta z7X%=8O3P`>0ta?BbY)9B0C`ocFE-}h*=}*Q`BE?XwgAYvc`qC&ve=I6S)zE6zk2F(f1rHx0(*F0ALq7wZ+gDhy3kfSkJl*2Uh^FL#2k<_dNY7 z*uRYJVE}-=nD-v~r?~8f<7*@E`~O9-ry&Rc**0I^K1PGG%4ZLU zR*$#Kxi<~~@^qY4o2s*RGikN%hk-*Y0LZV-eGonj>~z@9=7qsS7~H!>5CHg}i%~BK z`vbolen{oIHJjFS0|9^^DV*E~&1iM*V#Bu;R_Cjz8Qh=vIS>GNgYOesi@p)9pA1=D zx1#S;RwXYA0Pud*W&LXyt=2Zef8W5q{#I9gt>09=7XZLE6dS#uIU8@9^#K8ZeVUKr+SkX$Lu=E{#8iBxy=grx z9>0F8s^*?90B~@{QCtrmzr5TH*X>D~4yx9xyO%GIK|LO60RjLCcGkJMuLsZJ)5CbR zIWH&Z_QT`y`DQhKcnY7tl~gyK3(pDwNU3?J@wrzEo*%=fm;QJ)xH>QIp{H0WpI;4D zDexn}_YWLTkiGP+sDy?X7x6J|1#GhsHCm**E16%`N=5El~@)6vn< z=70mF3zXqN8>j@RP#mZMsEuD<-k8}$&WuTzn@2=iMORXYb@cSlQ7{Td!9W23V)}xx T0#~DP00000NkvXXu0mjfG+~vo literal 0 HcmV?d00001 diff --git a/addons/phantom_camera/examples/textures/3D/target.png.import b/addons/phantom_camera/examples/textures/3D/target.png.import new file mode 100644 index 0000000..6de0861 --- /dev/null +++ b/addons/phantom_camera/examples/textures/3D/target.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c3mskbmvnpwux" +path.s3tc="res://.godot/imported/target.png-878c5e8d057c8a9a4c2322d4ab88e9ef.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://addons/phantom_camera/examples/textures/3D/target.png" +dest_files=["res://.godot/imported/target.png-878c5e8d057c8a9a4c2322d4ab88e9ef.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/addons/phantom_camera/fonts/Nunito-Black.ttf.import b/addons/phantom_camera/fonts/Nunito-Black.ttf.import index ac96a49..8e68c5f 100644 --- a/addons/phantom_camera/fonts/Nunito-Black.ttf.import +++ b/addons/phantom_camera/fonts/Nunito-Black.ttf.import @@ -23,6 +23,7 @@ allow_system_fallback=true force_autohinter=false hinting=1 subpixel_positioning=1 +keep_rounding_remainders=true oversampling=0.0 Fallbacks=null fallbacks=[] diff --git a/addons/phantom_camera/fonts/Nunito-Regular.ttf.import b/addons/phantom_camera/fonts/Nunito-Regular.ttf.import index 393153f..11c0c62 100644 --- a/addons/phantom_camera/fonts/Nunito-Regular.ttf.import +++ b/addons/phantom_camera/fonts/Nunito-Regular.ttf.import @@ -23,6 +23,7 @@ allow_system_fallback=true force_autohinter=false hinting=1 subpixel_positioning=1 +keep_rounding_remainders=true oversampling=0.0 Fallbacks=null fallbacks=[] diff --git a/addons/phantom_camera/gizmos/custom_gizmo.gd b/addons/phantom_camera/gizmos/custom_gizmo.gd index f094f7b..08d7275 100644 --- a/addons/phantom_camera/gizmos/custom_gizmo.gd +++ b/addons/phantom_camera/gizmos/custom_gizmo.gd @@ -39,7 +39,7 @@ func _init() -> void: func _draw_frustum() -> PackedVector3Array: var lines = PackedVector3Array() - + var dis: float = 0.25 var width: float = dis * 1.25 var len: float = dis * 1.5 @@ -48,38 +48,36 @@ func _draw_frustum() -> PackedVector3Array: # lines.push_back(Vector3(0, 0, 0)) # lines.push_back(Vector3(0, 0, -len)) - # Trapezoid lines.push_back(Vector3(0, 0, 0)) lines.push_back(Vector3(-width, dis, -len)) - + lines.push_back(Vector3(0, 0, 0)) lines.push_back(Vector3(width, dis, -len)) - + lines.push_back(Vector3(0, 0, 0)) lines.push_back(Vector3(-width, -dis, -len)) - + lines.push_back(Vector3(0, 0, 0)) lines.push_back(Vector3(width, -dis, -len)) - - + # Square ## Left lines.push_back(Vector3(-width, dis, -len)) lines.push_back(Vector3(-width, -dis, -len)) - + ## Bottom lines.push_back(Vector3(-width, -dis, -len)) lines.push_back(Vector3(width, -dis, -len)) - + ## Right lines.push_back(Vector3(width, -dis, -len)) lines.push_back(Vector3(width, dis, -len)) - + ## Top lines.push_back(Vector3(width, dis, -len)) lines.push_back(Vector3(-width, dis, -len)) - + return lines @@ -88,6 +86,6 @@ func _redraw(gizmo: EditorNode3DGizmo): var icon: Material = get_material(_gizmo_name, gizmo) gizmo.add_unscaled_billboard(icon, _gizmo_scale) - + var material = get_material("main", gizmo) gizmo.add_lines(_draw_frustum(), material) diff --git a/addons/phantom_camera/gizmos/custom_gizmo.gd.uid b/addons/phantom_camera/gizmos/custom_gizmo.gd.uid new file mode 100644 index 0000000..6362d1f --- /dev/null +++ b/addons/phantom_camera/gizmos/custom_gizmo.gd.uid @@ -0,0 +1 @@ +uid://cl0ecseb1s6ur diff --git a/addons/phantom_camera/gizmos/phantom_camera_gizmo_plugin_3d.gd b/addons/phantom_camera/gizmos/phantom_camera_gizmo_plugin_3d.gd index bef8180..c992320 100644 --- a/addons/phantom_camera/gizmos/phantom_camera_gizmo_plugin_3d.gd +++ b/addons/phantom_camera/gizmos/phantom_camera_gizmo_plugin_3d.gd @@ -8,4 +8,5 @@ func _init() -> void: set_gizmo_name("PhantomCamera") set_gizmo_spatial_script(_spatial_script) set_gizmo_icon(_icon) + super() diff --git a/addons/phantom_camera/gizmos/phantom_camera_gizmo_plugin_3d.gd.uid b/addons/phantom_camera/gizmos/phantom_camera_gizmo_plugin_3d.gd.uid new file mode 100644 index 0000000..523e477 --- /dev/null +++ b/addons/phantom_camera/gizmos/phantom_camera_gizmo_plugin_3d.gd.uid @@ -0,0 +1 @@ +uid://cwxlqgwnno141 diff --git a/addons/phantom_camera/gizmos/phantom_camera_noise_emitter_gizmo_plugin_3d.gd b/addons/phantom_camera/gizmos/phantom_camera_noise_emitter_gizmo_plugin_3d.gd new file mode 100644 index 0000000..3dd4d3e --- /dev/null +++ b/addons/phantom_camera/gizmos/phantom_camera_noise_emitter_gizmo_plugin_3d.gd @@ -0,0 +1,29 @@ +extends EditorNode3DGizmoPlugin + +var _spatial_script: Script = preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_3d.gd") +var _gizmo_icon: Texture2D = preload("res://addons/phantom_camera/icons/phantom_camera_noise_emitter_gizmo.svg") + +var _gizmo_name: StringName = "PhantomCameraNoiseEmitter" + +func _init() -> void: + create_material("main", Color8(252, 127, 127, 255)) + create_handle_material("handles") + create_icon_material(_gizmo_name, _gizmo_icon, false, Color.WHITE) + + +func _has_gizmo(node: Node3D): + return node.get_script() == _spatial_script + + +func _get_gizmo_name() -> String: + return _gizmo_name + + +func _redraw(gizmo: EditorNode3DGizmo): + gizmo.clear() + + var icon: Material = get_material(_gizmo_name, gizmo) + gizmo.add_unscaled_billboard(icon, 0.035) + + #var material = get_material("main", gizmo) + #gizmo.add_lines(_draw_frustum(), material) diff --git a/addons/phantom_camera/gizmos/phantom_camera_noise_emitter_gizmo_plugin_3d.gd.uid b/addons/phantom_camera/gizmos/phantom_camera_noise_emitter_gizmo_plugin_3d.gd.uid new file mode 100644 index 0000000..4d1c56e --- /dev/null +++ b/addons/phantom_camera/gizmos/phantom_camera_noise_emitter_gizmo_plugin_3d.gd.uid @@ -0,0 +1 @@ +uid://cdj6uju71x3d3 diff --git a/addons/phantom_camera/icons/phantom_camera_2d.svg.import b/addons/phantom_camera/icons/phantom_camera_2d.svg.import index b10d490..724069f 100644 --- a/addons/phantom_camera/icons/phantom_camera_2d.svg.import +++ b/addons/phantom_camera/icons/phantom_camera_2d.svg.import @@ -2,10 +2,9 @@ importer="texture" type="CompressedTexture2D" -uid="uid://cmcvv0edbbpv4" +uid="uid://dchkkx4v3ikpw" path="res://.godot/imported/phantom_camera_2d.svg-e5483cbc858fc5f95f7210b1649dff0d.ctex" metadata={ -"has_editor_variant": true, "vram_texture": false } @@ -35,4 +34,4 @@ process/size_limit=0 detect_3d/compress_to=1 svg/scale=1.0 editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=true +editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/icons/phantom_camera_3d.svg.import b/addons/phantom_camera/icons/phantom_camera_3d.svg.import index 6542a24..eedbd2f 100644 --- a/addons/phantom_camera/icons/phantom_camera_3d.svg.import +++ b/addons/phantom_camera/icons/phantom_camera_3d.svg.import @@ -2,10 +2,9 @@ importer="texture" type="CompressedTexture2D" -uid="uid://bf8bxgxx71qki" +uid="uid://c71drpb8o4prn" path="res://.godot/imported/phantom_camera_3d.svg-41ed612e834470377fb56eebffa083fe.ctex" metadata={ -"has_editor_variant": true, "vram_texture": false } @@ -35,4 +34,4 @@ process/size_limit=0 detect_3d/compress_to=1 svg/scale=1.0 editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=true +editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/icons/phantom_camera_camera_3d_resource.svg.import b/addons/phantom_camera/icons/phantom_camera_camera_3d_resource.svg.import index d880530..4b0e8bc 100644 --- a/addons/phantom_camera/icons/phantom_camera_camera_3d_resource.svg.import +++ b/addons/phantom_camera/icons/phantom_camera_camera_3d_resource.svg.import @@ -2,7 +2,7 @@ importer="texture" type="CompressedTexture2D" -uid="uid://dkpwb4k1bkbvn" +uid="uid://dnaykbu6ue5lo" path="res://.godot/imported/phantom_camera_camera_3d_resource.svg-f8bf8d1a5b7442fd6933bfbed999d57d.ctex" metadata={ "vram_texture": false diff --git a/addons/phantom_camera/icons/phantom_camera_noise_emitter_2d.svg b/addons/phantom_camera/icons/phantom_camera_noise_emitter_2d.svg new file mode 100644 index 0000000..f6fbad3 --- /dev/null +++ b/addons/phantom_camera/icons/phantom_camera_noise_emitter_2d.svg @@ -0,0 +1,4 @@ + + + + diff --git a/addons/gloot/images/icon_ctrl_inventory_stacked.svg.import b/addons/phantom_camera/icons/phantom_camera_noise_emitter_2d.svg.import similarity index 65% rename from addons/gloot/images/icon_ctrl_inventory_stacked.svg.import rename to addons/phantom_camera/icons/phantom_camera_noise_emitter_2d.svg.import index e222e86..c24e060 100644 --- a/addons/gloot/images/icon_ctrl_inventory_stacked.svg.import +++ b/addons/phantom_camera/icons/phantom_camera_noise_emitter_2d.svg.import @@ -2,16 +2,16 @@ importer="texture" type="CompressedTexture2D" -uid="uid://t7dislu7ps55" -path="res://.godot/imported/icon_ctrl_inventory_stacked.svg-dae2677f1073d9d3b7050efd77843e49.ctex" +uid="uid://b2r7mhd780y8d" +path="res://.godot/imported/phantom_camera_noise_emitter_2d.svg-1b3d37fe36964dc86a6ea6681d0772bb.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://addons/gloot/images/icon_ctrl_inventory_stacked.svg" -dest_files=["res://.godot/imported/icon_ctrl_inventory_stacked.svg-dae2677f1073d9d3b7050efd77843e49.ctex"] +source_file="res://addons/phantom_camera/icons/phantom_camera_noise_emitter_2d.svg" +dest_files=["res://.godot/imported/phantom_camera_noise_emitter_2d.svg-1b3d37fe36964dc86a6ea6681d0772bb.ctex"] [params] diff --git a/addons/phantom_camera/icons/phantom_camera_noise_emitter_3d.svg b/addons/phantom_camera/icons/phantom_camera_noise_emitter_3d.svg new file mode 100644 index 0000000..c567f6a --- /dev/null +++ b/addons/phantom_camera/icons/phantom_camera_noise_emitter_3d.svg @@ -0,0 +1,4 @@ + + + + diff --git a/addons/phantom_camera/icons/phantom_camera_noise_emitter_3d.svg.import b/addons/phantom_camera/icons/phantom_camera_noise_emitter_3d.svg.import new file mode 100644 index 0000000..de23002 --- /dev/null +++ b/addons/phantom_camera/icons/phantom_camera_noise_emitter_3d.svg.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cby76y7m6xn4f" +path.s3tc="res://.godot/imported/phantom_camera_noise_emitter_3d.svg-9b90fe54aa618f65d52ac94515d41ea4.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://addons/phantom_camera/icons/phantom_camera_noise_emitter_3d.svg" +dest_files=["res://.godot/imported/phantom_camera_noise_emitter_3d.svg-9b90fe54aa618f65d52ac94515d41ea4.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/icons/phantom_camera_noise_emitter_gizmo.svg b/addons/phantom_camera/icons/phantom_camera_noise_emitter_gizmo.svg new file mode 100644 index 0000000..9b9bcb2 --- /dev/null +++ b/addons/phantom_camera/icons/phantom_camera_noise_emitter_gizmo.svg @@ -0,0 +1,4 @@ + + + + diff --git a/addons/phantom_camera/icons/phantom_camera_noise_emitter_gizmo.svg.import b/addons/phantom_camera/icons/phantom_camera_noise_emitter_gizmo.svg.import new file mode 100644 index 0000000..4dd736b --- /dev/null +++ b/addons/phantom_camera/icons/phantom_camera_noise_emitter_gizmo.svg.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dw4iy855s0atm" +path.s3tc="res://.godot/imported/phantom_camera_noise_emitter_gizmo.svg-9a593802655a8d5038c7f55deab3882d.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://addons/phantom_camera/icons/phantom_camera_noise_emitter_gizmo.svg" +dest_files=["res://.godot/imported/phantom_camera_noise_emitter_gizmo.svg-9a593802655a8d5038c7f55deab3882d.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/icons/phantom_camera_noise_resource.svg b/addons/phantom_camera/icons/phantom_camera_noise_resource.svg new file mode 100644 index 0000000..d3c6deb --- /dev/null +++ b/addons/phantom_camera/icons/phantom_camera_noise_resource.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/addons/gloot/images/icon_inventory_grid_stacked.svg.import b/addons/phantom_camera/icons/phantom_camera_noise_resource.svg.import similarity index 66% rename from addons/gloot/images/icon_inventory_grid_stacked.svg.import rename to addons/phantom_camera/icons/phantom_camera_noise_resource.svg.import index 3c371fe..8cefc36 100644 --- a/addons/gloot/images/icon_inventory_grid_stacked.svg.import +++ b/addons/phantom_camera/icons/phantom_camera_noise_resource.svg.import @@ -2,16 +2,16 @@ importer="texture" type="CompressedTexture2D" -uid="uid://bo38cy4myqvpu" -path="res://.godot/imported/icon_inventory_grid_stacked.svg-33302053cec4b39ebb5b7a7b1bea5293.ctex" +uid="uid://fudwitkewe70" +path="res://.godot/imported/phantom_camera_noise_resource.svg-a81ed223714edd2c0d9cfa00be0c3f58.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://addons/gloot/images/icon_inventory_grid_stacked.svg" -dest_files=["res://.godot/imported/icon_inventory_grid_stacked.svg-33302053cec4b39ebb5b7a7b1bea5293.ctex"] +source_file="res://addons/phantom_camera/icons/phantom_camera_noise_resource.svg" +dest_files=["res://.godot/imported/phantom_camera_noise_resource.svg-a81ed223714edd2c0d9cfa00be0c3f58.ctex"] [params] diff --git a/addons/phantom_camera/inspector/phantom_camera_inspector_plugin.gd.uid b/addons/phantom_camera/inspector/phantom_camera_inspector_plugin.gd.uid new file mode 100644 index 0000000..d69b9a0 --- /dev/null +++ b/addons/phantom_camera/inspector/phantom_camera_inspector_plugin.gd.uid @@ -0,0 +1 @@ +uid://5jmqowgdbq3x diff --git a/addons/phantom_camera/panel/editor.gd.uid b/addons/phantom_camera/panel/editor.gd.uid new file mode 100644 index 0000000..75b97cf --- /dev/null +++ b/addons/phantom_camera/panel/editor.gd.uid @@ -0,0 +1 @@ +uid://cjcpn5ujqpnir diff --git a/addons/phantom_camera/panel/viewfinder/viewfinder_panel.tscn b/addons/phantom_camera/panel/viewfinder/viewfinder_panel.tscn index 5d26888..c4769e6 100644 --- a/addons/phantom_camera/panel/viewfinder/viewfinder_panel.tscn +++ b/addons/phantom_camera/panel/viewfinder/viewfinder_panel.tscn @@ -45,7 +45,9 @@ corner_radius_bottom_left = 10 [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_obaj6"] -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_fsxik"] +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_4b76l"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_yh38y"] content_margin_left = 10.0 content_margin_top = 10.0 content_margin_right = 10.0 @@ -55,47 +57,47 @@ border_width_left = 4 border_width_top = 4 border_width_right = 4 border_width_bottom = 4 -border_color = Color(0.227451, 0.72549, 0.603922, 1) +border_color = Color(0.552941, 0.647059, 0.952941, 1) corner_radius_top_left = 10 corner_radius_top_right = 10 corner_radius_bottom_right = 10 corner_radius_bottom_left = 10 -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_yh38y"] +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_gci88"] content_margin_left = 10.0 content_margin_top = 10.0 content_margin_right = 10.0 content_margin_bottom = 10.0 -bg_color = Color(0.129412, 0.407843, 0.337255, 1) -border_width_left = 4 -border_width_top = 4 -border_width_right = 4 -border_width_bottom = 4 -border_color = Color(0.552941, 0.647059, 0.952941, 1) +bg_color = Color(0.180392, 0.576471, 0.482353, 1) corner_radius_top_left = 10 corner_radius_top_right = 10 corner_radius_bottom_right = 10 corner_radius_bottom_left = 10 -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_gci88"] +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_fsxik"] content_margin_left = 10.0 content_margin_top = 10.0 content_margin_right = 10.0 content_margin_bottom = 10.0 -bg_color = Color(0.180392, 0.576471, 0.482353, 1) +bg_color = Color(0.129412, 0.407843, 0.337255, 1) +border_width_left = 4 +border_width_top = 4 +border_width_right = 4 +border_width_bottom = 4 +border_color = Color(0.227451, 0.72549, 0.603922, 1) corner_radius_top_left = 10 corner_radius_top_right = 10 corner_radius_bottom_right = 10 corner_radius_bottom_left = 10 -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_4b76l"] - [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_g5wua"] [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_x4bx8"] -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_agqdu"] -bg_color = Color(0.72549, 0.227451, 0.34902, 1) +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_840sd"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ja3vm"] +bg_color = Color(0.53, 0.1643, 0.255725, 1) border_width_left = 2 border_width_top = 2 border_width_right = 2 @@ -106,8 +108,8 @@ corner_radius_top_right = 10 corner_radius_bottom_right = 10 corner_radius_bottom_left = 10 -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ja3vm"] -bg_color = Color(0.53, 0.1643, 0.255725, 1) +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_mk273"] +bg_color = Color(0.43, 0.1333, 0.207475, 1) border_width_left = 2 border_width_top = 2 border_width_right = 2 @@ -118,8 +120,8 @@ corner_radius_top_right = 10 corner_radius_bottom_right = 10 corner_radius_bottom_left = 10 -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_mk273"] -bg_color = Color(0.43, 0.1333, 0.207475, 1) +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_agqdu"] +bg_color = Color(0.72549, 0.227451, 0.34902, 1) border_width_left = 2 border_width_top = 2 border_width_right = 2 @@ -130,8 +132,6 @@ corner_radius_top_right = 10 corner_radius_bottom_right = 10 corner_radius_bottom_left = 10 -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_840sd"] - [node name="ViewfinderPanel" type="Control"] clip_contents = true custom_minimum_size = Vector2(0, 300) @@ -154,6 +154,7 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +mouse_filter = 2 metadata/_edit_lock_ = true [node name="SubViewportContainer" type="SubViewportContainer" parent="FramedViewfinder"] @@ -164,11 +165,13 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +mouse_filter = 2 stretch = true [node name="SubViewport" type="SubViewport" parent="FramedViewfinder/SubViewportContainer"] unique_name_in_owner = true handle_input_locally = false +canvas_item_default_texture_filter = 0 gui_disable_input = true size = Vector2i(1152, 648) size_2d_override_stretch = true @@ -187,27 +190,32 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +mouse_filter = 2 theme_override_constants/separation = 0 [node name="DeadZoneLeftHBoxContainer" type="VBoxContainer" parent="FramedViewfinder/DeadZoneHBoxContainer"] clip_contents = true layout_mode = 2 size_flags_horizontal = 3 +mouse_filter = 2 theme_override_constants/separation = 0 [node name="DeadZoneLeftTopPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneLeftHBoxContainer"] layout_mode = 2 size_flags_vertical = 3 +mouse_filter = 2 theme_override_styles/panel = ExtResource("2_uabt4") [node name="DeadZoneLeftCenterPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneLeftHBoxContainer"] unique_name_in_owner = true layout_mode = 2 +mouse_filter = 2 theme_override_styles/panel = ExtResource("2_uabt4") [node name="DeadZoneLeftBottomPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneLeftHBoxContainer"] layout_mode = 2 size_flags_vertical = 3 +mouse_filter = 2 theme_override_styles/panel = ExtResource("2_uabt4") [node name="DeadZoneCenterHBoxContainer" type="VBoxContainer" parent="FramedViewfinder/DeadZoneHBoxContainer"] @@ -215,43 +223,51 @@ unique_name_in_owner = true clip_contents = true layout_mode = 2 size_flags_horizontal = 4 +mouse_filter = 2 theme_override_constants/separation = 0 [node name="DeadZoneCenterTopPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneCenterHBoxContainer"] layout_mode = 2 size_flags_vertical = 3 +mouse_filter = 2 theme_override_styles/panel = ExtResource("2_uabt4") [node name="DeadZoneCenterCenterPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneCenterHBoxContainer"] unique_name_in_owner = true layout_mode = 2 size_flags_vertical = 4 +mouse_filter = 2 theme_override_styles/panel = SubResource("StyleBoxFlat_fle8t") [node name="DeadZoneCenterBottomPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneCenterHBoxContainer"] layout_mode = 2 size_flags_vertical = 3 +mouse_filter = 2 theme_override_styles/panel = ExtResource("2_uabt4") [node name="DeadZoneRightHBoxContainer" type="VBoxContainer" parent="FramedViewfinder/DeadZoneHBoxContainer"] clip_contents = true layout_mode = 2 size_flags_horizontal = 3 +mouse_filter = 2 theme_override_constants/separation = 0 [node name="DeadZoneRightTopPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneRightHBoxContainer"] layout_mode = 2 size_flags_vertical = 3 +mouse_filter = 2 theme_override_styles/panel = ExtResource("2_uabt4") [node name="DeadZoneRightCenterPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneRightHBoxContainer"] unique_name_in_owner = true layout_mode = 2 +mouse_filter = 2 theme_override_styles/panel = ExtResource("2_uabt4") [node name="DeadZoneRightBottomPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneRightHBoxContainer"] layout_mode = 2 size_flags_vertical = 3 +mouse_filter = 2 theme_override_styles/panel = ExtResource("2_uabt4") [node name="AspectRatioContainer" type="AspectRatioContainer" parent="FramedViewfinder"] @@ -263,10 +279,12 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +mouse_filter = 2 ratio = 1.77778 [node name="CameraViewportPanel" type="Panel" parent="FramedViewfinder/AspectRatioContainer"] layout_mode = 2 +mouse_filter = 2 theme_override_styles/panel = SubResource("StyleBoxFlat_xmo1t") [node name="TargetPoint" type="Panel" parent="FramedViewfinder/AspectRatioContainer/CameraViewportPanel"] @@ -283,6 +301,7 @@ offset_right = 3.0 offset_bottom = 3.0 grow_horizontal = 2 grow_vertical = 2 +mouse_filter = 2 theme_override_styles/panel = SubResource("StyleBoxFlat_q7vs4") [node name="NoSupportMsg" type="Label" parent="."] @@ -369,10 +388,10 @@ focus_mode = 0 theme_override_colors/font_color = Color(1, 1, 1, 1) theme_override_fonts/font = ExtResource("3_li3i3") theme_override_font_sizes/font_size = 24 -theme_override_styles/normal = SubResource("StyleBoxFlat_fsxik") +theme_override_styles/focus = SubResource("StyleBoxEmpty_4b76l") theme_override_styles/hover = SubResource("StyleBoxFlat_yh38y") theme_override_styles/pressed = SubResource("StyleBoxFlat_gci88") -theme_override_styles/focus = SubResource("StyleBoxEmpty_4b76l") +theme_override_styles/normal = SubResource("StyleBoxFlat_fsxik") [node name="AddNodeTypeText" type="RichTextLabel" parent="EmptyStateControl/VBoxContainer/AddNodeButton"] unique_name_in_owner = true @@ -405,10 +424,10 @@ offset_top = 5.0 offset_right = 165.0 offset_bottom = 57.0 mouse_default_cursor_shape = 2 -theme_override_styles/normal = SubResource("StyleBoxFlat_agqdu") +theme_override_styles/focus = SubResource("StyleBoxEmpty_840sd") theme_override_styles/hover = SubResource("StyleBoxFlat_ja3vm") theme_override_styles/pressed = SubResource("StyleBoxFlat_mk273") -theme_override_styles/focus = SubResource("StyleBoxEmpty_840sd") +theme_override_styles/normal = SubResource("StyleBoxFlat_agqdu") [node name="PriorityOverrideIcon" type="TextureRect" parent="PriorityOverrideButton"] layout_mode = 1 diff --git a/addons/phantom_camera/plugin.cfg b/addons/phantom_camera/plugin.cfg index dd90728..af3255b 100644 --- a/addons/phantom_camera/plugin.cfg +++ b/addons/phantom_camera/plugin.cfg @@ -3,5 +3,5 @@ name="Phantom Camera" description="Control the movement and dynamically tween 2D & 3D cameras positions. Built for Godot 4. Inspired by Cinemachine." author="Marcus Skov" -version="0.7.2.1" +version="0.8.2.3" script="plugin.gd" diff --git a/addons/phantom_camera/plugin.gd b/addons/phantom_camera/plugin.gd index e4759de..deb6eef 100644 --- a/addons/phantom_camera/plugin.gd +++ b/addons/phantom_camera/plugin.gd @@ -6,13 +6,13 @@ extends EditorPlugin const PCAM_HOST: String = "PhantomCameraHost" const PCAM_2D: String = "PhantomCamera2D" const PCAM_3D: String = "PhantomCamera3D" +const PCAM_NOISE_EMITTER_2D: String = "PhantomCameraNoiseEmitter2D" +const PCAM_NOISE_EMITTER_3D: String = "PhantomCameraNoiseEmitter3D" -const Pcam3DPlugin = preload("res://addons/phantom_camera/gizmos/phantom_camera_gizmo_plugin_3d.gd") - -const EditorPanel = preload("res://addons/phantom_camera/panel/editor.tscn") - -const updater_constants := preload("res://addons/phantom_camera/scripts/panel/updater/updater_constants.gd") - +const PCam3DPlugin: Script = preload("res://addons/phantom_camera/gizmos/phantom_camera_gizmo_plugin_3d.gd") +const PCam3DNoiseEmitterPlugin: Script = preload("res://addons/phantom_camera/gizmos/phantom_camera_noise_emitter_gizmo_plugin_3d.gd") +const EditorPanel: PackedScene = preload("res://addons/phantom_camera/panel/editor.tscn") +const updater_constants: Script = preload("res://addons/phantom_camera/scripts/panel/updater/updater_constants.gd") const PHANTOM_CAMERA_MANAGER: StringName = "PhantomCameraManager" #endregion @@ -20,7 +20,8 @@ const PHANTOM_CAMERA_MANAGER: StringName = "PhantomCameraManager" #region Variables -var pcam_3D_gizmo_plugin = Pcam3DPlugin.new() +var pcam_3d_gizmo_plugin = PCam3DPlugin.new() +var pcam_3d_noise_emitter_gizmo_plugin = PCam3DNoiseEmitterPlugin.new() var editor_panel_instance: Control var panel_button: Button @@ -32,16 +33,19 @@ var panel_button: Button #region Private Functions func _enter_tree() -> void: - add_autoload_singleton(PHANTOM_CAMERA_MANAGER, "res://addons/phantom_camera/scripts/managers/phantom_camera_manager.gd") + if not get_tree().root.get_node_or_null(String(PHANTOM_CAMERA_MANAGER)): + add_autoload_singleton(PHANTOM_CAMERA_MANAGER, "res://addons/phantom_camera/scripts/managers/phantom_camera_manager.gd") # Phantom Camera Nodes add_custom_type(PCAM_2D, "Node2D", preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd"), preload("res://addons/phantom_camera/icons/phantom_camera_2d.svg")) add_custom_type(PCAM_3D, "Node3D", preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd"), preload("res://addons/phantom_camera/icons/phantom_camera_2d.svg")) add_custom_type(PCAM_HOST, "Node", preload("res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd"), preload("res://addons/phantom_camera/icons/phantom_camera_2d.svg")) - + add_custom_type(PCAM_NOISE_EMITTER_2D, "Node2D", preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_2d.gd"), preload("res://addons/phantom_camera/icons/phantom_camera_noise_emitter_2d.svg")) + add_custom_type(PCAM_NOISE_EMITTER_3D, "Node3D", preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_3d.gd"), preload("res://addons/phantom_camera/icons/phantom_camera_noise_emitter_3d.svg")) # Phantom Camera 3D Gizmo - add_node_3d_gizmo_plugin(pcam_3D_gizmo_plugin) + add_node_3d_gizmo_plugin(pcam_3d_gizmo_plugin) + add_node_3d_gizmo_plugin(pcam_3d_noise_emitter_gizmo_plugin) # TODO - Should be disabled unless in editor # Viewfinder @@ -82,25 +86,24 @@ func _btn_toggled(toggled_on: bool): func _exit_tree() -> void: - remove_custom_type(PCAM_2D) - remove_custom_type(PCAM_3D) - remove_custom_type(PCAM_HOST) - - remove_node_3d_gizmo_plugin(pcam_3D_gizmo_plugin) + panel_button.toggled.disconnect(_btn_toggled) + scene_changed.disconnect(editor_panel_instance.viewfinder.scene_changed) + scene_changed.disconnect(_scene_changed) remove_control_from_bottom_panel(editor_panel_instance) editor_panel_instance.queue_free() -# if framed_viewfinder_panel_instance: - scene_changed.disconnect(_scene_changed) - remove_autoload_singleton(PHANTOM_CAMERA_MANAGER) + remove_node_3d_gizmo_plugin(pcam_3d_gizmo_plugin) + remove_node_3d_gizmo_plugin(pcam_3d_noise_emitter_gizmo_plugin) - panel_button.toggled.disconnect(_btn_toggled) - scene_changed.disconnect(editor_panel_instance.viewfinder.scene_changed) - scene_changed.disconnect(_scene_changed) + remove_custom_type(PCAM_2D) + remove_custom_type(PCAM_3D) + remove_custom_type(PCAM_HOST) + remove_custom_type(PCAM_NOISE_EMITTER_2D) + remove_custom_type(PCAM_NOISE_EMITTER_3D) -#func _has_main_screen(): -# return true; + if get_tree().root.get_node_or_null(String(PHANTOM_CAMERA_MANAGER)): + remove_autoload_singleton(PHANTOM_CAMERA_MANAGER) func _make_visible(visible): diff --git a/addons/phantom_camera/plugin.gd.uid b/addons/phantom_camera/plugin.gd.uid new file mode 100644 index 0000000..e5a2550 --- /dev/null +++ b/addons/phantom_camera/plugin.gd.uid @@ -0,0 +1 @@ +uid://cmn6d5bco4fh4 diff --git a/addons/phantom_camera/scripts/managers/phantom_camera_manager.gd b/addons/phantom_camera/scripts/managers/phantom_camera_manager.gd index 8a53e05..a7ed80f 100644 --- a/addons/phantom_camera/scripts/managers/phantom_camera_manager.gd +++ b/addons/phantom_camera/scripts/managers/phantom_camera_manager.gd @@ -3,6 +3,11 @@ extends Node const PHANTOM_CAMERA_CONSTS = preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd") + +signal noise_2d_emitted(noise_output: Transform2D, emitter_layer: int) +signal noise_3d_emitted(noise_output: Transform3D, emitter_layer: int) + + var phantom_camera_hosts: Array[PhantomCameraHost]: get: return _phantom_camera_host_list @@ -13,10 +18,10 @@ var phantom_camera_2ds: Array[PhantomCamera2D]: return _phantom_camera_2d_list var _phantom_camera_2d_list: Array[PhantomCamera2D] -var phantom_camera_3ds: Array: ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed. +var phantom_camera_3ds: Array[Node]: ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed. get: return _phantom_camera_3d_list -var _phantom_camera_3d_list: Array ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed. +var _phantom_camera_3d_list: Array[Node] ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed. func _enter_tree(): @@ -39,10 +44,8 @@ func pcam_host_removed(caller: Node) -> void: func pcam_added(caller, host_slot: int = 0) -> void: if is_instance_of(caller, PhantomCamera2D): _phantom_camera_2d_list.append(caller) - #print("Added PCam2D to PCamManager") elif caller.is_class("PhantomCamera3D"): ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed. _phantom_camera_3d_list.append(caller) - #print("Added PCam3D to PCamManager") if not _phantom_camera_host_list.is_empty(): _phantom_camera_host_list[host_slot].pcam_added_to_scene(caller) diff --git a/addons/phantom_camera/scripts/managers/phantom_camera_manager.gd.uid b/addons/phantom_camera/scripts/managers/phantom_camera_manager.gd.uid new file mode 100644 index 0000000..5127ed0 --- /dev/null +++ b/addons/phantom_camera/scripts/managers/phantom_camera_manager.gd.uid @@ -0,0 +1 @@ +uid://bkupm4nr1ijkq diff --git a/addons/phantom_camera/scripts/panel/updater/download_update_panel.gd.uid b/addons/phantom_camera/scripts/panel/updater/download_update_panel.gd.uid new file mode 100644 index 0000000..911f6f4 --- /dev/null +++ b/addons/phantom_camera/scripts/panel/updater/download_update_panel.gd.uid @@ -0,0 +1 @@ +uid://bugf1s8cx3jjv diff --git a/addons/phantom_camera/scripts/panel/updater/update_button.gd b/addons/phantom_camera/scripts/panel/updater/update_button.gd index 965e394..f3a67c5 100644 --- a/addons/phantom_camera/scripts/panel/updater/update_button.gd +++ b/addons/phantom_camera/scripts/panel/updater/update_button.gd @@ -160,6 +160,10 @@ func _on_timer_timeout() -> void: # Convert a version number to an actually comparable number func version_to_number(version: String) -> int: + var regex = RegEx.new() + regex.compile("[a-zA-Z]+") + if regex.search(str(version)): return 0 + var bits = version.split(".") var version_bit: int var multiplier: int = 10000 diff --git a/addons/phantom_camera/scripts/panel/updater/update_button.gd.uid b/addons/phantom_camera/scripts/panel/updater/update_button.gd.uid new file mode 100644 index 0000000..0e31ed6 --- /dev/null +++ b/addons/phantom_camera/scripts/panel/updater/update_button.gd.uid @@ -0,0 +1 @@ +uid://daratdxrl2scr diff --git a/addons/phantom_camera/scripts/panel/updater/updater_constants.gd.uid b/addons/phantom_camera/scripts/panel/updater/updater_constants.gd.uid new file mode 100644 index 0000000..082954a --- /dev/null +++ b/addons/phantom_camera/scripts/panel/updater/updater_constants.gd.uid @@ -0,0 +1 @@ +uid://c20k2jx7tvwt7 diff --git a/addons/phantom_camera/scripts/panel/viewfinder/viewfinder.gd b/addons/phantom_camera/scripts/panel/viewfinder/viewfinder.gd index c183876..045d41d 100644 --- a/addons/phantom_camera/scripts/panel/viewfinder/viewfinder.gd +++ b/addons/phantom_camera/scripts/panel/viewfinder/viewfinder.gd @@ -162,6 +162,10 @@ func _settings_changed() -> void: var ratio: float = viewport_width / viewport_height aspect_ratio_container.set_ratio(ratio) camera_viewport_panel.size.x = viewport_width / (viewport_height / sub_viewport.size.y) + + ## Applies Project Settings to Viewport + sub_viewport.canvas_item_default_texture_filter = ProjectSettings.get_setting("rendering/textures/canvas_textures/default_texture_filter") + # TODO - Add resizer for Framed Viewfinder @@ -194,11 +198,11 @@ func visibility_check() -> void: _check_camera(root, camera_2d, true) elif root is Node3D: var camera_3d: Camera3D - if has_camera: camera_3d = phantom_camera_host.camera_3d - else: - camera_3d = root.get_viewport().get_camera_3d() + elif root.get_viewport() != null: + if root.get_viewport().get_camera_3d() != null: + camera_3d = root.get_viewport().get_camera_3d() _is_2d = false is_scene = true @@ -215,12 +219,23 @@ func visibility_check() -> void: func _get_camera_2d() -> Camera2D: - var camerasGroupName = "__cameras_%d" % EditorInterface.get_edited_scene_root().get_viewport().get_viewport_rid().get_id() + var edited_scene_root = EditorInterface.get_edited_scene_root() + + if edited_scene_root == null: return null + + var viewport = edited_scene_root.get_viewport() + if viewport == null: return null + + var viewport_rid = viewport.get_viewport_rid() + if viewport_rid == null: return null + + var camerasGroupName = "__cameras_%d" % viewport_rid.get_id() var cameras = get_tree().get_nodes_in_group(camerasGroupName) for camera in cameras: if camera is Camera2D and camera.is_current: return camera + return null diff --git a/addons/phantom_camera/scripts/panel/viewfinder/viewfinder.gd.uid b/addons/phantom_camera/scripts/panel/viewfinder/viewfinder.gd.uid new file mode 100644 index 0000000..9853b83 --- /dev/null +++ b/addons/phantom_camera/scripts/panel/viewfinder/viewfinder.gd.uid @@ -0,0 +1 @@ +uid://o4atxn3g6ivl diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd index 85081b0..dc60930 100644 --- a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd +++ b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd @@ -16,11 +16,11 @@ const _constants := preload("res://addons/phantom_camera/scripts/phantom_camera/ #endregion - #region Signals ## Emitted when the [param PhantomCamera2D] becomes active. signal became_active + ## Emitted when the [param PhantomCamera2D] becomes inactive. signal became_inactive @@ -31,23 +31,34 @@ signal follow_target_changed ## [b]Note:[/b] Only applicable in [param Framed] [enum FollowMode]. signal dead_zone_changed +## Emitted when a target touches the edge of the dead zone in [param Framed] [enum FollowMode]. +signal dead_zone_reached(side: Vector2) + ## Emitted when the [param Camera2D] starts to tween to another [param PhantomCamera2D]. signal tween_started + ## Emitted when the [param Camera2D] is to tweening towards another [param PhantomCamera2D]. signal is_tweening + ## Emitted when the tween is interrupted due to another [param PhantomCamera2D] ## becoming active. The argument is the [param PhantomCamera2D] that interrupted ## the tween. signal tween_interrupted(pcam_2d: PhantomCamera2D) + ## Emitted when the [param Camera2D] completes its tween to the ## [param PhantomCamera2D]. signal tween_completed +## Emitted when Noise should be applied to the Camera2D. +signal noise_emitted(noise_output: Transform2D) + +signal physics_target_changed + #endregion #region Enums -## Determines the positional logic for a given [param PCamPhantomCamera2D] +## Determines the positional logic for a given [param PhantomCamera2D] ## [br][br] ## The different modes have different functionalities and purposes, so choosing ## the correct one depends on what each [param PhantomCamera2D] is meant to do. @@ -70,16 +81,16 @@ enum InactiveUpdateMode { # EXPONENTIALLY, } -#endregion - -#region Variables +enum FollowLockAxis { + NONE = 0, + X = 1, + Y = 2, + XY = 3, +} -var _is_active: bool = false +#endregion -## The [PhantomCameraHost] that owns this [param PhantomCamera2D]. -var pcam_host_owner: PhantomCameraHost = null: - set = set_pcam_host_owner, - get = get_pcam_host_owner +#region Exported Properties ## To quickly preview a [param PhantomCamera2D] without adjusting its ## [member priority], this property allows the selected PCam to ignore the @@ -120,7 +131,23 @@ var pcam_host_owner: PhantomCameraHost = null: set(value): follow_mode = value - if value == FollowMode.FRAMED: + if follow_mode == FollowMode.NONE: + _should_follow = false + top_level = false + _is_parents_physics() + notify_property_list_changed() + return + + match follow_mode: + FollowMode.PATH: + if is_instance_valid(follow_path): + _should_follow_checker() + FollowMode.GROUP: + _follow_targets_size_check() + _: + _should_follow_checker() + + if follow_mode == FollowMode.FRAMED: if _follow_framed_initial_set and follow_target: _follow_framed_initial_set = false dead_zone_changed.connect(_on_dead_zone_changed) @@ -128,32 +155,22 @@ var pcam_host_owner: PhantomCameraHost = null: if dead_zone_changed.is_connected(_on_dead_zone_changed): dead_zone_changed.disconnect(_on_dead_zone_changed) - if follow_mode == FollowMode.NONE: - _should_follow = false - elif follow_mode == FollowMode.GROUP and follow_targets or follow_target: - _should_follow = true + top_level = true notify_property_list_changed() get: return follow_mode - ## Determines which target should be followed. ## The [param Camera2D] will follow the position of the Follow Target ## based on the [member follow_mode] type and its parameters. @export var follow_target: Node2D = null: set = set_follow_target, get = get_follow_target -var _should_follow: bool = false -var _follow_framed_offset: Vector2 = Vector2.ZERO -var _follow_target_physics_based: bool = false -var _physics_interpolation_enabled = false # NOTE - Enable for Godot 4.3 and when PhysicsInterpolationMode bug is resolved ### Defines the targets that the [param PhantomCamera2D] should be following. @export var follow_targets: Array[Node2D] = []: set = set_follow_targets, get = get_follow_targets -var _has_multiple_follow_targets: bool = false - ## Determines the [Path2D] the [param PhantomCamera2D] ## should be bound to. @@ -162,7 +179,6 @@ var _has_multiple_follow_targets: bool = false @export var follow_path: Path2D = null: set = set_follow_path, get = get_follow_path -var _has_follow_path: bool = false ## Applies a zoom level to the [param PhantomCamera2D], which effectively ## overrides the [param zoom] property of the [param Camera2D] node. @@ -201,11 +217,10 @@ var _has_follow_path: bool = false @export var tween_resource: PhantomCameraTween = PhantomCameraTween.new(): set = set_tween_resource, get = get_tween_resource -var _has_tweened: bool = false -## If enabled, the moment a [param PhantomCamera3D] is instantiated into +## If enabled, the moment a [param PhantomCamera2D] is instantiated into ## a scene, and has the highest priority, it will perform its tween transition. -## This is most obvious if a [param PhantomCamera3D] has a long duration and +## This is most obvious if a [param PhantomCamera2D] has a long duration and ## is attached to a playable character that can be moved the moment a scene ## is loaded. Disabling the [param tween_on_load] property will ## disable this behaviour and skip the tweening entirely when instantiated. @@ -239,7 +254,16 @@ var _has_tweened: bool = false @export var follow_damping_value: Vector2 = Vector2(0.1, 0.1): set = set_follow_damping_value, get = get_follow_damping_value -var _velocity_ref: Vector2 = Vector2.ZERO # Stores and applies the velocity of the movement + + +## Prevents the [param PhantomCamera2D] from moving in a designated axis. +## This can be enabled or disabled at runtime or from the editor directly. +@export var follow_axis_lock: FollowLockAxis = FollowLockAxis.NONE: + set = set_lock_axis, + get = get_lock_axis +var _follow_axis_is_locked: bool = false +var _follow_axis_lock_value: Vector2 = Vector2.ZERO + @export_subgroup("Follow Group") ## Enables the [param PhantomCamera2D] to dynamically zoom in and out based on @@ -305,11 +329,6 @@ var _velocity_ref: Vector2 = Vector2.ZERO # Stores and applies the velocity of t ## [param dead zones] will never be visible in build exports. @export var show_viewfinder_in_play: bool = false -## Defines the position of the [member follow_target] within the viewport.[br] -## This is only used for when [member follow_mode] is set to [param Framed]. -var viewport_position: Vector2 -var _follow_framed_initial_set: bool = false - @export_group("Limit") ## Shows the [param Camera2D]'s built-in limit border.[br] @@ -322,10 +341,6 @@ var _follow_framed_initial_set: bool = false get: return _draw_limits -static var _draw_limits: bool - -var _limit_sides: Vector4i -var _limit_sides_default: Vector4i = Vector4i(-10000000, -10000000, 10000000, 10000000) ## Defines the left side of the [param Camera2D] limit. ## The camera will not be able to move past this point. @export var limit_left: int = -10000000: @@ -347,22 +362,22 @@ var _limit_sides_default: Vector4i = Vector4i(-10000000, -10000000, 10000000, 10 set = set_limit_bottom, get = get_limit_bottom -## Allows for setting either a [TileMap] or [CollisionShape2D] node to +## Allows for setting either a [TileMap], [TileMapLayer] or [CollisionShape2D] node to ## automatically apply a limit size instead of manually adjusting the Left, ## Top, Right and Left properties.[br][br] -## [b]TileMap[/b][br] -## The Limit will update after the [TileSet] of the [TileMap] has changed.[br] +## [b]TileMap / TileMapLayer[/b][br] +## The Limit will update after the [TileSet] of the [TileMap] / [TileMapLayer] has changed.[br] ## [b]Note:[/b] The limit size will only update after closing the TileMap editor ## bottom panel. ## [br][br] ## [b]CollisionShape2D[/b][br] ## The limit will update in realtime as the Shape2D changes its size. ## Note: For performance reasons, resizing the [Shape2D] during runtime will not change the Limits sides. -@export_node_path("TileMap", "CollisionShape2D") var limit_target = NodePath(""): +@export_node_path("TileMap", "Node2D", "CollisionShape2D") var limit_target: NodePath = NodePath(""): set = set_limit_target, get = get_limit_target -var _limit_node: Node2D -## Applies an offset to the [TileMap] Limit or [Shape2D] Limit. + +## Applies an offset to the [TileMap]/[TileMapLayer] Limit or [Shape2D] Limit. ## The values goes from [param Left], [param Top], [param Right] ## and [param Bottom]. @export var limit_margin: Vector4i: @@ -371,13 +386,94 @@ var _limit_node: Node2D #@export var limit_smoothed: bool = false: # TODO - Needs proper support #set = set_limit_smoothing, #get = get_limit_smoothing + +@export_group("Noise") +## Applies a noise, or shake, to a [Camera2D].[br] +## Once set, the noise will run continuously after the tween to the [PhantomCamera2D] is complete. +@export var noise: PhantomCameraNoise2D: + set = set_noise, + get = get_noise + +## If true, will trigger the noise while in the editor.[br] +## Useful in cases where you want to temporarily disable the noise in the editor without removing +## the resource.[br][br] +## [b]Note:[/b] This property has no effect on runtime behaviour. +@export var _preview_noise: bool = true: + set(value): + _preview_noise = value + if not value: + _transform_noise = Transform2D() + +## Enable a corresponding layer for a [member PhantomCameraNoiseEmitter2D.noise_emitter_layer] +## to make this [PhantomCamera2D] be affect by it. +@export_flags_2d_render var noise_emitter_layer: int: + set = set_noise_emitter_layer, + get = get_noise_emitter_layer + +#region Private Variables + +var _is_active: bool = false + +## The [PhantomCameraHost] that owns this [param PhantomCamera2D]. +var pcam_host_owner: PhantomCameraHost = null: + set = set_pcam_host_owner, + get = get_pcam_host_owner + +var _should_follow: bool = false +var _follow_framed_offset: Vector2 = Vector2.ZERO +var _follow_target_physics_based: bool = false +var _physics_interpolation_enabled: bool = false # NOTE - Enable for Godot 4.3 and when PhysicsInterpolationMode bug is resolved + +var _has_multiple_follow_targets: bool = false +var _follow_targets_single_target_index: int = 0 +var _follow_targets: Array[Node2D] + +var _follow_velocity_ref: Vector2 = Vector2.ZERO # Stores and applies the velocity of the movement + +var _has_follow_path: bool = false + +var _tween_skip: bool = false + +## Defines the position of the [member follow_target] within the viewport.[br] +## This is only used for when [member follow_mode] is set to [param Framed]. +var _follow_framed_initial_set: bool = false + +static var _draw_limits: bool + +var _limit_sides: Vector4i +var _limit_sides_default: Vector4i = Vector4i(-10000000, -10000000, 10000000, 10000000) + +var _limit_node: Node2D + var _limit_inactive_pcam: bool -#endregion +var _transform_output: Transform2D +var _transform_noise: Transform2D + +var _has_noise_resource: bool = false # NOTE - Temp solution until Godot has better plugin autoload recognition out-of-the-box. var _phantom_camera_manager: Node +#endregion + +#region Public Variables + +var tween_duration: float: + set = set_tween_duration, + get = get_tween_duration +var tween_transition: PhantomCameraTween.TransitionType: + set = set_tween_transition, + get = get_tween_transition +var tween_ease: PhantomCameraTween.EaseType: + set = set_tween_ease, + get = get_tween_ease + +var viewport_position: Vector2 + +#endregion + +#region Property Validator func _validate_property(property: Dictionary) -> void: ################ @@ -396,8 +492,6 @@ func _validate_property(property: Dictionary) -> void: #################### ## Follow Parameters #################### - - if follow_mode == FollowMode.NONE: match property.name: "follow_offset", \ @@ -422,12 +516,12 @@ func _validate_property(property: Dictionary) -> void: "auto_zoom": property.usage = PROPERTY_USAGE_NO_EDITOR - if not auto_zoom: - match property.name: - "auto_zoom_min", \ - "auto_zoom_max", \ - "auto_zoom_margin": - property.usage = PROPERTY_USAGE_NO_EDITOR + if not auto_zoom or follow_mode != FollowMode.GROUP: + match property.name: + "auto_zoom_min", \ + "auto_zoom_max", \ + "auto_zoom_margin": + property.usage = PROPERTY_USAGE_NO_EDITOR ################ ## Follow Framed @@ -442,7 +536,7 @@ func _validate_property(property: Dictionary) -> void: ####### ## Zoom ####### - if property.name == "zoom" and auto_zoom: + if property.name == "zoom" and follow_mode == FollowMode.GROUP and auto_zoom: property.usage = PROPERTY_USAGE_NO_EDITOR ######## @@ -465,11 +559,18 @@ func _validate_property(property: Dictionary) -> void: if property.name == "frame_preview" and _is_active: property.usage |= PROPERTY_USAGE_READ_ONLY - notify_property_list_changed() - #region Private Functions func _enter_tree() -> void: + _should_follow_checker() + if follow_mode == FollowMode.GROUP: + _follow_targets_size_check() + elif follow_mode == FollowMode.NONE: + _is_parents_physics() + + if not visibility_changed.is_connected(_check_visibility): + visibility_changed.connect(_check_visibility) + _phantom_camera_manager = get_tree().root.get_node(_constants.PCAM_MANAGER_NODE_NAME) _phantom_camera_manager.pcam_added(self) update_limit_all_sides() @@ -479,137 +580,185 @@ func _enter_tree() -> void: func _exit_tree() -> void: - _phantom_camera_manager.pcam_removed(self) + if is_instance_valid(_phantom_camera_manager): + _phantom_camera_manager.pcam_removed(self) if _has_valid_pcam_owner(): get_pcam_host_owner().pcam_removed_from_scene(self) + if not follow_mode == FollowMode.GROUP: + follow_targets = [] + + +func _ready() -> void: + _transform_output = global_transform + _phantom_camera_manager.noise_2d_emitted.connect(_noise_emitted) + + if not Engine.is_editor_hint(): + _preview_noise = true + + if follow_mode == FollowMode.GROUP: + _follow_targets_size_check() + func _process(delta: float) -> void: - if _follow_target_physics_based: return - _process_logic(delta) + if _follow_target_physics_based or _is_active: return + process_logic(delta) -func _physics_process(delta: float): - if not _follow_target_physics_based: return - _process_logic(delta) +func _physics_process(delta: float) -> void: + if not _follow_target_physics_based or _is_active: return + process_logic(delta) -func _process_logic(delta: float) -> void: - if not _is_active: +func process_logic(delta: float) -> void: + if _is_active: + if _has_noise_resource and _preview_noise: + _transform_noise = noise.get_noise_transform(delta) + if _transform_noise.get_rotation() != 0: + push_warning(pcam_host_owner.camera_2d.name, " has ignore_rotation enabled.") + else: match inactive_update_mode: InactiveUpdateMode.NEVER: return InactiveUpdateMode.ALWAYS: # Only triggers if limit isn't default if _limit_inactive_pcam: global_position = _set_limit_clamp_position(global_position) -# InactiveUpdateMode.EXPONENTIALLY: -# TODO - Trigger positional updates less frequently as more Pcams gets added + # InactiveUpdateMode.EXPONENTIALLY: + # TODO - Trigger positional updates less frequently as more PCams gets added + _limit_checker() +# if not Engine.is_editor_hint(): print(_should_follow) if _should_follow: _follow(delta) + else: + _transform_output = global_transform + + if _follow_axis_is_locked: + match follow_axis_lock: + FollowLockAxis.X: + _transform_output.origin.x = _follow_axis_lock_value.x + FollowLockAxis.Y: + _transform_output.origin.y = _follow_axis_lock_value.y + FollowLockAxis.XY: + _transform_output.origin.x = _follow_axis_lock_value.x + _transform_output.origin.y = _follow_axis_lock_value.y func _limit_checker() -> void: ## TODO - Needs to see if this can be triggerd only from CollisionShape2D Transform changes - if Engine.is_editor_hint(): - if draw_limits: - update_limit_all_sides() + if not Engine.is_editor_hint(): return + if draw_limits: + update_limit_all_sides() func _follow(delta: float) -> void: var follow_position: Vector2 - match follow_mode: FollowMode.GLUED: - if follow_target: - follow_position = follow_target.global_position + follow_position = follow_target.global_position + FollowMode.SIMPLE: - if follow_target: - follow_position = _target_position_with_offset() + follow_position = _target_position_with_offset() + FollowMode.GROUP: - if follow_targets.size() == 1: - follow_position = follow_targets[0].global_position - elif _has_multiple_follow_targets and follow_targets.size() > 1: - var rect: Rect2 = Rect2(follow_targets[0].global_position, Vector2.ZERO) - for node in follow_targets: - rect = rect.expand(node.global_position) - if auto_zoom: - rect = rect.grow_individual( - auto_zoom_margin.x, - auto_zoom_margin.y, - auto_zoom_margin.z, - auto_zoom_margin.w - ) -# else: -# rect = rect.grow_individual(-80, 0, 0, 0) + if _has_multiple_follow_targets: + var rect: Rect2 = Rect2(_follow_targets[0].global_position, Vector2.ZERO) + for target in _follow_targets: + rect = rect.expand(target.global_position) if auto_zoom: + rect = rect.grow_individual( + auto_zoom_margin.x, + auto_zoom_margin.y, + auto_zoom_margin.z, + auto_zoom_margin.w + ) + var screen_size: Vector2 = get_viewport_rect().size if rect.size.x > rect.size.y * screen_size.aspect(): zoom = clamp(screen_size.x / rect.size.x, auto_zoom_min, auto_zoom_max) * Vector2.ONE else: zoom = clamp(screen_size.y / rect.size.y, auto_zoom_min, auto_zoom_max) * Vector2.ONE follow_position = rect.get_center() + else: + follow_position = follow_targets[_follow_targets_single_target_index].global_position + FollowMode.PATH: - if follow_target and follow_path: - var path_position: Vector2 = follow_path.global_position + var path_position: Vector2 = follow_path.global_position - follow_position = \ - follow_path.curve.get_closest_point( - _target_position_with_offset() - path_position - ) + path_position + follow_position = \ + follow_path.curve.get_closest_point( + _target_position_with_offset() - path_position + ) + path_position FollowMode.FRAMED: - if follow_target: - if not Engine.is_editor_hint(): - viewport_position = (get_follow_target().get_global_transform_with_canvas().get_origin() + follow_offset) / get_viewport_rect().size - - if _get_framed_side_offset() != Vector2.ZERO: - var glo_pos: Vector2 - var target_position: Vector2 = _target_position_with_offset() + _follow_framed_offset - - if dead_zone_width == 0 || dead_zone_height == 0: - if dead_zone_width == 0 && dead_zone_height != 0: - follow_position = _target_position_with_offset() - elif dead_zone_width != 0 && dead_zone_height == 0: - glo_pos = _target_position_with_offset() - glo_pos.x += target_position.x - global_position.x - follow_position = glo_pos - else: - follow_position = _target_position_with_offset() + if not Engine.is_editor_hint(): + viewport_position = (get_follow_target().get_global_transform_with_canvas().get_origin() + follow_offset) / get_viewport_rect().size + var framed_side_offset: Vector2 = _get_framed_side_offset() + + if framed_side_offset != Vector2.ZERO: + var glo_pos: Vector2 + var target_position: Vector2 = _target_position_with_offset() + _follow_framed_offset + + if dead_zone_width == 0 || dead_zone_height == 0: + if dead_zone_width == 0 && dead_zone_height != 0: + follow_position = _target_position_with_offset() + elif dead_zone_width != 0 && dead_zone_height == 0: + glo_pos = _target_position_with_offset() + glo_pos.x += target_position.x - global_position.x + follow_position = glo_pos else: - follow_position = target_position + follow_position = _target_position_with_offset() + + # If a horizontal dead zone is reached + if framed_side_offset.x != 0 and framed_side_offset.y == 0: + follow_position.y = _transform_output.origin.y + follow_position.x = target_position.x + _follow_framed_offset.y = global_position.y - _target_position_with_offset().y + dead_zone_reached.emit(Vector2(framed_side_offset.x, 0)) + # If a vertical dead zone is reached + elif framed_side_offset.x == 0 and framed_side_offset.y != 0: + follow_position.x = _transform_output.origin.x + follow_position.y = target_position.y + _follow_framed_offset.x = global_position.x - _target_position_with_offset().x + dead_zone_reached.emit(Vector2(0, framed_side_offset.y)) + # If a deadzone corner is reached else: - _follow_framed_offset = global_position - _target_position_with_offset() - return + follow_position = target_position + dead_zone_reached.emit(Vector2(framed_side_offset.x, framed_side_offset.y)) else: - follow_position = _target_position_with_offset() + _follow_framed_offset = _transform_output.origin - _target_position_with_offset() + return + else: + follow_position = _target_position_with_offset() _interpolate_position(follow_position, delta) -func _set_velocity(index: int, value: float): - _velocity_ref[index] = value +func _set_follow_velocity(index: int, value: float): + _follow_velocity_ref[index] = value func _interpolate_position(target_position: Vector2, delta: float) -> void: - if _limit_inactive_pcam and not _has_tweened: + if _limit_inactive_pcam and not _tween_skip: target_position = _set_limit_clamp_position(target_position) + global_position = target_position if follow_damping: - for index in 2: - global_position[index] = \ - _smooth_damp( - target_position[index], - global_position[index], - index, - _velocity_ref[index], - _set_velocity, - follow_damping_value[index], - delta - ) + var output_position: Vector2 + for i in 2: + output_position[i] = _smooth_damp( + global_position[i], + _transform_output.origin[i], + i, + _follow_velocity_ref[i], + _set_follow_velocity, + follow_damping_value[i], + delta + ) + _transform_output = Transform2D(global_rotation, output_position) else: - global_position = target_position + _transform_output = Transform2D(global_rotation, target_position) func _smooth_damp(target_axis: float, self_axis: float, index: int, current_velocity: float, set_velocity: Callable, damping_time: float, delta: float) -> float: @@ -643,7 +792,7 @@ func _set_limit_clamp_position(value: Vector2) -> Vector2: return value -func _draw(): +func _draw() -> void: if not Engine.is_editor_hint(): return if frame_preview and not _is_active: @@ -718,6 +867,109 @@ func _set_camera_2d_limit(side: int, limit: int) -> void: if not _is_active: return get_pcam_host_owner().camera_2d.set_limit(side, limit) + +func _check_visibility() -> void: + if not is_instance_valid(pcam_host_owner): return + pcam_host_owner.refresh_pcam_list_priorty() + + +func _follow_target_tree_exiting(target: Node) -> void: + if target == follow_target: + _should_follow = false + if _follow_targets.has(target): + _follow_targets.erase(target) + + +func _should_follow_checker() -> void: + if follow_mode == FollowMode.NONE: + _should_follow = false + return + + if not follow_mode == FollowMode.GROUP: + if is_instance_valid(follow_target): + _should_follow = true + else: + _should_follow = false + + +func _follow_targets_size_check() -> void: + var targets_size: int = 0 + _follow_target_physics_based = false + _follow_targets = [] + for i in follow_targets.size(): + if follow_targets[i] == null: continue + if follow_targets[i].is_inside_tree(): + _follow_targets.append(follow_targets[i]) + targets_size += 1 + _follow_targets_single_target_index = i + _check_physics_body(follow_targets[i]) + if not follow_targets[i].tree_exiting.is_connected(_follow_target_tree_exiting): + follow_targets[i].tree_exiting.connect(_follow_target_tree_exiting.bind(follow_targets[i])) + + match targets_size: + 0: + _should_follow = false + _has_multiple_follow_targets = false + 1: + _should_follow = true + _has_multiple_follow_targets = false + _: + _should_follow = true + _has_multiple_follow_targets = true + + +func _noise_emitted(emitter_noise_output: Transform2D, emitter_layer: int) -> void: + if noise_emitter_layer & emitter_layer != 0: + noise_emitted.emit(emitter_noise_output) + + if not pcam_host_owner.camera_2d.ignore_rotation: return + if emitter_noise_output.get_rotation() != 0: + push_warning(pcam_host_owner.camera_2d.name, " has ignore_rotation enabled.") + + +func _set_layer(current_layers: int, layer_number: int, value: bool) -> int: + var mask: int = current_layers + + # From https://github.com/godotengine/godot/blob/51991e20143a39e9ef0107163eaf283ca0a761ea/scene/3d/camera_3d.cpp#L638 + if layer_number < 1 or layer_number > 20: + printerr("Render layer must be between 1 and 20.") + else: + if value: + mask |= 1 << (layer_number - 1) + else: + mask &= ~(1 << (layer_number - 1)) + + return mask + + +func _check_physics_body(target: Node2D) -> void: + if target is PhysicsBody2D: + ## NOTE - Feature Toggle + if Engine.get_version_info().major == 4 and \ + Engine.get_version_info().minor < 3: + if ProjectSettings.get_setting("phantom_camera/tips/show_jitter_tips"): + print_rich("Following a [b]PhysicsBody2D[/b] node will likely result in jitter - on lower physics ticks in particular.") + print_rich("If possible, will recommend upgrading to Godot 4.3, as it has built-in support for 2D Physics Interpolation, which will mitigate this issue.") + print_rich("Otherwise, try following the guide on the [url=https://phantom-camera.dev/support/faq#i-m-seeing-jitter-what-can-i-do]documentation site[/url] for better results.") + print_rich("This tip can be disabled from within [code]Project Settings / Phantom Camera / Tips / Show Jitter Tips[/code]") + return + ## NOTE - Only supported in Godot 4.3 or above + elif not ProjectSettings.get_setting("physics/common/physics_interpolation") and ProjectSettings.get_setting("phantom_camera/tips/show_jitter_tips"): + printerr("Physics Interpolation is disabled in the Project Settings, recommend enabling it to smooth out physics-based camera movement") + print_rich("This tip can be disabled from within [code]Project Settings / Phantom Camera / Tips / Show Jitter Tips[/code]") + _follow_target_physics_based = true + else: + _is_parents_physics(target) + physics_target_changed.emit() + + +func _is_parents_physics(target: Node = self) -> void: + var current_node: Node = target + while current_node: + current_node = current_node.get_parent() + if not current_node is PhysicsBody2D: continue + _follow_target_physics_based = true + #endregion @@ -733,8 +985,11 @@ func update_limit_all_sides() -> void: _limit_sides.y = limit_top _limit_sides.z = limit_right _limit_sides.w = limit_bottom - elif _limit_node is TileMap: - var tile_map: TileMap = _limit_node as TileMap + elif _limit_node is TileMap or _limit_node.is_class("TileMapLayer"): + var tile_map := _limit_node + + if not tile_map.tile_set: return # TODO: This should be removed once https://github.com/godotengine/godot/issues/96898 is resolved + var tile_map_size: Vector2 = Vector2(tile_map.get_used_rect().size) * Vector2(tile_map.tile_set.tile_size) * tile_map.get_scale() var tile_map_position: Vector2 = tile_map.global_position + Vector2(tile_map.get_used_rect().position) * Vector2(tile_map.tile_set.tile_size) * tile_map.get_scale() @@ -753,7 +1008,7 @@ func update_limit_all_sides() -> void: # Bottom _limit_sides.w = roundi(limit_rect.position.y + limit_rect.size.y) elif _limit_node is CollisionShape2D: - var collision_shape_2d = _limit_node as CollisionShape2D + var collision_shape_2d: CollisionShape2D = _limit_node as CollisionShape2D if not collision_shape_2d.get_shape(): return @@ -800,14 +1055,29 @@ func reset_limit() -> void: ## Assigns the value of the [param has_tweened] property. ## [b][color=yellow]Important:[/color][/b] This value can only be changed ## from the [PhantomCameraHost] script. -func set_has_tweened(caller: Node, value: bool) -> void: +func set_tween_skip(caller: Node, value: bool) -> void: if is_instance_of(caller, PhantomCameraHost): - _has_tweened = value + _tween_skip = value else: printerr("Can only be called PhantomCameraHost class") ## Returns the current [param has_tweened] value. -func get_has_tweened() -> bool: - return _has_tweened +func get_tween_skip() -> bool: + return _tween_skip + +## Returns the [Transform3D] value based on the [member follow_mode] / [member look_at_mode] target value. +func get_transform_output() -> Transform2D: + return _transform_output + + +## Returns the noise [Transform3D] value. +func get_noise_transform() -> Transform2D: + return _transform_noise + + +## Emits a noise based on a custom [Transform2D] value.[br] +## Use this function if you wish to make use of external noise patterns from, for example, other addons. +func emit_noise(value: Transform2D) -> void: + noise_emitted.emit(value) #endregion @@ -904,6 +1174,8 @@ func get_tween_ease() -> int: func set_is_active(node, value) -> void: if node is PhantomCameraHost: _is_active = value + if value: + _should_follow_checker() else: printerr("PCams can only be set from the PhantomCameraHost") @@ -932,12 +1204,21 @@ func get_follow_mode() -> int: ## Assigns a new [Node2D] as the [member follow_target]. func set_follow_target(value: Node2D) -> void: + if follow_mode == FollowMode.NONE or follow_mode == FollowMode.GROUP: return if follow_target == value: return follow_target = value _follow_target_physics_based = false if is_instance_valid(value): - _should_follow = true + if follow_mode == FollowMode.PATH: + if is_instance_valid(follow_path): + _should_follow = true + else: + _should_follow = false + else: + _should_follow = true _check_physics_body(value) + if not follow_target.tree_exiting.is_connected(_follow_target_tree_exiting): + follow_target.tree_exiting.connect(_follow_target_tree_exiting.bind(follow_target)) else: _should_follow = false follow_target_changed.emit() @@ -959,6 +1240,10 @@ func get_follow_target() -> Node2D: ## Assigns a new [Path2D] to the [member follow_path]. func set_follow_path(value: Path2D) -> void: follow_path = value + if is_instance_valid(follow_path): + _should_follow_checker() + else: + _should_follow = false ## Erases the current [Path2D] from the [member follow_path] property. func erase_follow_path() -> void: @@ -971,37 +1256,20 @@ func get_follow_path() -> Path2D: ## Assigns a new [param follow_targets] array value. func set_follow_targets(value: Array[Node2D]) -> void: + if follow_mode != FollowMode.GROUP: return if follow_targets == value: return - follow_targets = value - - if follow_targets.is_empty(): - _should_follow = false - _has_multiple_follow_targets = false - return - - _follow_target_physics_based = false - var valid_instances: int = 0 - for target in follow_targets: - if is_instance_valid(target): - _should_follow = true - valid_instances += 1 - - _check_physics_body(target) - - if valid_instances > 1: - _has_multiple_follow_targets = true + _follow_targets_size_check() ## Appends a single [Node2D] to [member follow_targets]. func append_follow_targets(value: Node2D) -> void: if not is_instance_valid(value): - printerr(value, " is not a valid Node2D instance.") + printerr(value, " is not a valid Node2D instance") return + if not follow_targets.has(value): follow_targets.append(value) - _should_follow = true - _has_multiple_follow_targets = true - _check_physics_body(value) + _follow_targets_size_check() else: printerr(value, " is already part of Follow Group") @@ -1011,47 +1279,20 @@ func append_follow_targets_array(value: Array[Node2D]) -> void: if not is_instance_valid(target): continue if not follow_targets.has(target): follow_targets.append(target) - _should_follow = true - _check_physics_body(target) - if follow_targets.size() > 1: - _has_multiple_follow_targets = true + _follow_targets_size_check() else: printerr(value, " is already part of Follow Group") ## Removes a [Node2D] from [member follow_targets] array. func erase_follow_targets(value: Node2D) -> void: follow_targets.erase(value) - _follow_target_physics_based = false - for target in follow_targets: - _check_physics_body(target) - if follow_targets.size() < 2: - _has_multiple_follow_targets = false - if follow_targets.size() < 1: - _should_follow = false + _follow_targets_size_check() ## Gets all [Node2D] from [member follow_targets] array. func get_follow_targets() -> Array[Node2D]: return follow_targets -func _check_physics_body(target: Node2D) -> void: - if target is PhysicsBody2D: - ## NOTE - Feature Toggle - if Engine.get_version_info().major == 4 and \ - Engine.get_version_info().minor < 3: - if ProjectSettings.get_setting("phantom_camera/tips/show_jitter_tips"): - print_rich("Following a [b]PhysicsBody2D[/b] node will likely result in jitter - on lower physics ticks in particular.") - print_rich("Once Godot 4.3 is released, will strongly recommend upgrading to that as it has built-in support for 2D Physics Interpolation.") - print_rich("Until then, try following the guide on the [url=https://phantom-camera.dev/support/faq#i-m-seeing-jitter-what-can-i-do]documentation site[/url] for better results.") - print_rich("This tip can be disabled from within [code]Project Settings / Phantom Camera / Tips / Show Jitter Tips[/code]") - return - ## NOTE - Only supported in Godot 4.3 or above - elif not ProjectSettings.get_setting("physics/common/physics_interpolation") and ProjectSettings.get_setting("phantom_camera/tips/show_jitter_tips"): - printerr("Physics Interpolation is disabled in the Project Settings, recommend enabling it to smooth out physics-based camera movement") - print_rich("This tip can be disabled from within [code]Project Settings / Phantom Camera / Tips / Show Jitter Tips[/code]") - _follow_target_physics_based = true - - ## Assigns a new Vector2 for the Follow Target Offset property. func set_follow_offset(value: Vector2) -> void: follow_offset = value @@ -1083,6 +1324,30 @@ func get_follow_damping_value() -> Vector2: return follow_damping_value +func set_lock_axis(value: FollowLockAxis) -> void: + follow_axis_lock = value + + # Wait for the node to be ready before setting lock + if not is_node_ready(): await ready + + # Prevent axis lock from working in the editor + if value != FollowLockAxis.NONE and not Engine.is_editor_hint(): + _follow_axis_is_locked = true + match value: + FollowLockAxis.X: + _follow_axis_lock_value.x = _transform_output.origin.x + FollowLockAxis.Y: + _follow_axis_lock_value.y = _transform_output.origin.y + FollowLockAxis.XY: + _follow_axis_lock_value.x = _transform_output.origin.x + _follow_axis_lock_value.y = _transform_output.origin.y + else: + _follow_axis_is_locked = false + +func get_lock_axis() -> FollowLockAxis: + return follow_axis_lock + + ## Enables or disables [member snap_to_pixel]. func set_snap_to_pixel(value: bool) -> void: snap_to_pixel = value @@ -1092,12 +1357,6 @@ func get_snap_to_pixel() -> bool: return snap_to_pixel -## Returns true if the [param PhantomCamera2D] has more than one member in the -## [follow_targets] array. -func get_has_multiple_follow_targets() -> bool: - return _has_multiple_follow_targets - - ## Enables or disables Auto zoom when using Group Follow. func set_auto_zoom(value: bool) -> void: auto_zoom = value @@ -1218,11 +1477,12 @@ func set_limit_target(value: NodePath) -> void: var prev_limit_node: Node2D = _limit_node var new_limit_node: Node2D = get_node(value) - if prev_limit_node is TileMap: - if prev_limit_node.changed.is_connected(_on_tile_map_changed): - prev_limit_node.changed.disconnect(_on_tile_map_changed) + if prev_limit_node: + if prev_limit_node is TileMap or prev_limit_node.is_class("TileMapLayer"): + if prev_limit_node.changed.is_connected(_on_tile_map_changed): + prev_limit_node.changed.disconnect(_on_tile_map_changed) - if new_limit_node is TileMap: + if new_limit_node is TileMap or new_limit_node.is_class("TileMapLayer"): if not new_limit_node.changed.is_connected(_on_tile_map_changed): new_limit_node.changed.connect(_on_tile_map_changed) elif new_limit_node is CollisionShape2D: @@ -1231,15 +1491,15 @@ func set_limit_target(value: NodePath) -> void: if col_shape.shape == null: printerr("No Shape2D in: ", col_shape.name) reset_limit() - limit_target = null + limit_target = "" return else: - printerr("Limit Target is not a TileMap or CollisionShape2D node") + printerr("Limit Target is not a TileMap, TileMapLayer or CollisionShape2D node") return elif value == NodePath(""): reset_limit() - limit_target = null + limit_target = "" else: printerr("Limit Target cannot be found") return @@ -1276,6 +1536,34 @@ func get_limit_margin() -> Vector4i: #return limit_smoothed +## Sets a [PhantomCameraNoise2D] resource. +func set_noise(value: PhantomCameraNoise2D) -> void: + noise = value + if value != null: + _has_noise_resource = true + noise.set_trauma(1) + else: + _has_noise_resource = false + _transform_noise = Transform2D() + +## Returns the [PhantomCameraNoise2D] resource. +func get_noise() -> PhantomCameraNoise2D: + return noise + + +## Sets the [member noise_emitter_layer] value. +func set_noise_emitter_layer(value: int) -> void: + noise_emitter_layer = value + +## Enables or disables a given layer of the [member noise_emitter_layer] value. +func set_noise_emitter_layer_value(value: int, enabled: bool) -> void: + noise_emitter_layer = _set_layer(noise_emitter_layer, value, enabled) + +## Returns the [member noise_emitter_layer] +func get_noise_emitter_layer() -> int: + return noise_emitter_layer + + ## Sets [member inactive_update_mode] property. func set_inactive_update_mode(value: int) -> void: inactive_update_mode = value @@ -1285,11 +1573,6 @@ func get_inactive_update_mode() -> int: return inactive_update_mode -func set_follow_target_physics_based(value: bool, caller: Node) -> void: - if is_instance_of(caller, PhantomCameraHost): - _follow_target_physics_based = value - else: - printerr("set_follow_target_physics_based() is for internal use only.") func get_follow_target_physics_based() -> bool: return _follow_target_physics_based diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd.uid b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd.uid new file mode 100644 index 0000000..6da6031 --- /dev/null +++ b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd.uid @@ -0,0 +1 @@ +uid://k62o6vxt4go4 diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd index 2342157..c244681 100644 --- a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd +++ b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd @@ -5,7 +5,7 @@ extends Node3D ## Controls a scene's [Camera3D] and applies logic to it. ## -## The scene's [param Camera3D] will follow the position of the +## The scene's [Camera3D] will follow the position of the ## [param PhantomCamera3D] with the highest priority. ## Each instance can have different positional and rotational logic applied ## to them. @@ -21,6 +21,7 @@ const _constants = preload("res://addons/phantom_camera/scripts/phantom_camera/p ## Emitted when the [param PhantomCamera3D] becomes active. signal became_active + ## Emitted when the [param PhantomCamera3D] becomes inactive. signal became_inactive @@ -34,20 +35,31 @@ signal look_at_target_changed ## [b]Note:[/b] Only applicable in [param Framed] [member FollowMode]. signal dead_zone_changed +## Emitted when a target touches the edge of the dead zone in [param Framed] [enum FollowMode]. +signal dead_zone_reached + ## Emitted when the [param Camera3D] starts to tween to another ## [param PhantomCamera3D]. signal tween_started + ## Emitted when the [param Camera3D] is to tweening towards another ## [param PhantomCamera3D]. signal is_tweening + ## Emitted when the tween is interrupted due to another [param PhantomCamera3D] ## becoming active. The argument is the [param PhantomCamera3D] that ## interrupted the tween. signal tween_interrupted(pcam_3d: PhantomCamera3D) + ## Emitted when the [param Camera3D] completes its tween to the ## [param PhantomCamera3D]. signal tween_completed +## Emitted when Noise should be applied to the [param Camera3D]. +signal noise_emitted(noise_output: Transform3D) + +signal physics_target_changed + #endregion @@ -88,17 +100,21 @@ enum InactiveUpdateMode { # EXPONENTIALLY, } -#endregion - +enum FollowLockAxis { + NONE = 0, + X = 1, + Y = 2, + Z = 3, + XY = 4, + XZ = 5, + YZ = 6, + XYZ = 7, +} -#region Variables +#endregion -## The [PhantomCameraHost] that owns this [param PhantomCamera2D]. -var pcam_host_owner: PhantomCameraHost = null: - set = set_pcam_host_owner, - get = get_pcam_host_owner -var _is_active: bool = false +#region Exported Properties ## To quickly preview a [param PhantomCamera3D] without adjusting its ## [member Priority], this property allows the selected [param PhantomCamera3D] @@ -140,7 +156,23 @@ var _is_active: bool = false set(value): follow_mode = value - if value == FollowMode.FRAMED: + if follow_mode == FollowMode.NONE: + _should_follow = false + top_level = false + _is_parents_physics() + notify_property_list_changed() + return + + match follow_mode: + FollowMode.PATH: + if is_instance_valid(follow_path): + _should_follow_checker() + FollowMode.GROUP: + _follow_targets_size_check() + _: + _should_follow_checker() + + if follow_mode == FollowMode.FRAMED: if _follow_framed_initial_set and follow_target: _follow_framed_initial_set = false dead_zone_changed.connect(_on_dead_zone_changed) @@ -148,32 +180,26 @@ var _is_active: bool = false if dead_zone_changed.is_connected(_on_dead_zone_changed): dead_zone_changed.disconnect(_on_dead_zone_changed) - if follow_mode == FollowMode.NONE: - _should_follow = false - elif follow_mode == FollowMode.GROUP and follow_targets or follow_target: - _should_follow = true + if follow_mode == FollowMode.THIRD_PERSON: + top_level = false + else: + top_level = true notify_property_list_changed() get: return follow_mode - ## Determines which target should be followed. ## The [param Camera3D] will follow the position of the Follow Target based on ## the [member follow_mode] type and its parameters. @export var follow_target: Node3D = null: set = set_follow_target, get = get_follow_target -var _should_follow: bool = false -var _follow_target_physics_based: bool = false -var _physics_interpolation_enabled = false ## TOOD - Should be anbled once toggling physics_interpolation_mode ON, when previously OFF, works in 3D ## Defines the targets that the [param PhantomCamera3D] should be following. @export var follow_targets: Array[Node3D] = []: set = set_follow_targets, get = get_follow_targets -var _has_multiple_follow_targets: bool = false - ## Determines the [Path3D] node the [param PhantomCamera3D] ## should be bound to. @@ -183,7 +209,6 @@ var _has_multiple_follow_targets: bool = false set = set_follow_path, get = get_follow_path - ## Determines the rotational logic for a given [param PhantomCamera3D]. ## The different modes has different functionalities and purposes, ## so choosing the correct mode depends on what each @@ -191,19 +216,20 @@ var _has_multiple_follow_targets: bool = false @export var look_at_mode: LookAtMode = LookAtMode.NONE: set(value): look_at_mode = value - if look_at_target is Node3D: - _should_look_at = true if look_at_mode == LookAtMode.NONE: _should_look_at = false - elif look_at_mode == LookAtMode.GROUP and look_at_targets or look_at_target: - _should_look_at = true + notify_property_list_changed() + return + if not look_at_mode == LookAtMode.GROUP: + if look_at_target is Node3D: + _should_look_at = true + else: # If Look At Group + _look_at_targets_size_check() notify_property_list_changed() get: return look_at_mode -var _should_look_at: bool = false -var _multiple_look_at_targets: bool = false ## Determines which target should be looked at. ## The [param PhantomCamera3D] will update its rotational value as the @@ -217,7 +243,6 @@ var _multiple_look_at_targets: bool = false @export var look_at_targets: Array[Node3D] = []: set = set_look_at_targets, get = get_look_at_targets -var _valid_look_at_targets: Array[Node3D] = [] ## Defines how [param ]PhantomCamera3Ds] transition between one another. ## Changing the tween values for a given [param PhantomCamera3D] @@ -229,7 +254,6 @@ var _valid_look_at_targets: Array[Node3D] = [] @export var tween_resource: PhantomCameraTween = PhantomCameraTween.new(): set = set_tween_resource, get = get_tween_resource -var _has_tweened: bool = false ## If enabled, the moment a [param PhantomCamera3D] is instantiated into ## a scene, and has the highest priority, it will perform its tween transition. @@ -252,10 +276,20 @@ var _has_tweened: bool = false ## A resource type that allows for overriding the [param Camera3D] node's ## properties. -@export var camera_3d_resource: Camera3DResource = Camera3DResource.new(): +@export var camera_3d_resource: Camera3DResource: # = Camera3DResource.new(): set = set_camera_3d_resource, get = get_camera_3d_resource +## Overrides the [member Camera3D.attribuets] resource property. +@export var attributes: CameraAttributes = null: + set = set_attributes, + get = get_attributes + +## Overrides the [member Camera3D.environment] resource property. +@export var environment: Environment = null: + set = set_environment, + get = get_environment + @export_group("Follow Parameters") ## Offsets the [member follow_target] position. @export var follow_offset: Vector3 = Vector3.ZERO: @@ -276,7 +310,16 @@ var _has_tweened: bool = false @export var follow_damping_value: Vector3 = Vector3(0.1, 0.1, 0.1): set = set_follow_damping_value, get = get_follow_damping_value -var _follow_velocity_ref: Vector3 = Vector3.ZERO # Stores and applies the velocity of the movement + + +## Prevents the [param PhantomCamera2D] from moving in a designated axis. +## This can be enabled or disabled at runtime or from the editor directly. +@export var follow_axis_lock: FollowLockAxis = FollowLockAxis.NONE: + set = set_follow_axis_lock, + get = get_follow_axis_lock +var _follow_axis_is_locked: bool = false +var _follow_axis_lock_value: Vector3 = Vector3.ZERO + ## Sets a distance offset from the centre of the target's position. ## The distance is applied to the [param PhantomCamera3D]'s local z axis. @@ -352,12 +395,8 @@ var _follow_velocity_ref: Vector3 = Vector3.ZERO # Stores and applies the veloci ## Defines the position of the [member follow_target] within the viewport.[br] ## This is only used for when [member follow_mode] is set to [param Framed]. -var viewport_position: Vector2 -var _follow_framed_initial_set: bool = false -var _follow_framed_offset: Vector3 @export_subgroup("Spring Arm") -var _follow_spring_arm: SpringArm3D ## Defines the [member SpringArm3D.spring_length]. @export var spring_length: float = 1: @@ -393,7 +432,7 @@ var _follow_spring_arm: SpringArm3D set = set_look_at_damping, get = get_look_at_damping -## Defines the Rotational damping amount. The ideal range is typicall somewhere between 0-1.[br][br] +## Defines the Rotational damping amount. The ideal range is typically somewhere between 0-1.[br][br] ## The damping amount can be specified in the individual axis.[br][br] ## [b]Lower value[/b] = faster / sharper camera rotation.[br] ## [b]Higher value[/b] = slower / heavier camera rotation. @@ -401,13 +440,123 @@ var _follow_spring_arm: SpringArm3D set = set_look_at_damping_value, get = get_look_at_damping_value -var _current_rotation: Vector3 + +@export_group("Noise") +## Applies a noise, or shake, to a [Camera3D].[br] +## Once set, the noise will run continuously after the tween to the [PhantomCamera3D] instance is complete. +@export var noise: PhantomCameraNoise3D: + set = set_noise, + get = get_noise + +## If true, will trigger the noise while in the editor.[br] +## Useful in cases where you want to temporarily disalbe the noise in the editor without removing +## the resource.[br][br] +## [b]Note:[/b] This property has no effect on runtime behaviour. +@export var _preview_noise: bool = true: + set(value): + _preview_noise = value + if not value: + _transform_noise = Transform3D() + +## Enable a corresponding layer for a [member PhantomCameraNoiseEmitter3D.noise_emitter_layer] +## to make this [PhantomCamera3D] be affect by it. +@export_flags_3d_render var noise_emitter_layer: int: + set = set_noise_emitter_layer, + get = get_noise_emitter_layer #endregion +#region Private Variables + +var _is_active: bool = false + +var _is_third_person_follow: bool = false + +var _should_follow: bool = false +var _follow_target_physics_based: bool = false +var _physics_interpolation_enabled: bool = false ## TOOD - Should be enbled once toggling physics_interpolation_mode ON, when previously OFF, works in 3D + +var _has_multiple_follow_targets: bool = false +var _follow_targets_single_target_index: int = 0 +var _follow_targets: Array[Node3D] + +var _should_look_at: bool = false +var _look_at_target_physics_based: bool = false + +var _has_multiple_look_at_targets: bool = false +var _look_at_targets_single_target_index: int = 0 + +var _tween_skip: bool = false + +var _follow_velocity_ref: Vector3 = Vector3.ZERO # Stores and applies the velocity of the movement + +var _follow_framed_initial_set: bool = false +var _follow_framed_offset: Vector3 + +var _follow_spring_arm: SpringArm3D +var _has_follow_spring_arm: bool = false + +var _current_rotation: Vector3 + +var _has_noise_resource: bool = false + +var _transform_output: Transform3D +var _transform_noise: Transform3D + # NOTE - Temp solution until Godot has better plugin autoload recognition out-of-the-box. var _phantom_camera_manager: Node +#endregion + +#region Public Variables + +## The [PhantomCameraHost] that owns this [param PhantomCamera2D]. +var pcam_host_owner: PhantomCameraHost = null: + set = set_pcam_host_owner, + get = get_pcam_host_owner + +var tween_duration: float: + set = set_tween_duration, + get = get_tween_duration +var tween_transition: PhantomCameraTween.TransitionType: + set = set_tween_transition, + get = get_tween_transition +var tween_ease: PhantomCameraTween.EaseType: + set = set_tween_ease, + get = get_tween_ease + +var cull_mask: int: + set = set_cull_mask, + get = get_cull_mask +var h_offset: float: + set = set_h_offset, + get = get_h_offset +var v_offset: float: + set = set_v_offset, + get = get_v_offset +var projection: Camera3DResource.ProjectionType: + set = set_projection, + get = get_projection +var fov: float: + set = set_fov, + get = get_fov +var size: float: + set = set_size, + get = get_size +var frustum_offset: Vector2: + set = set_frustum_offset, + get = get_frustum_offset +var far: float: + set = set_far, + get = get_far +var near: float: + set = set_near, + get = get_near + +var viewport_position: Vector2 + +#endregion + #region Property Validator @@ -427,7 +576,6 @@ func _validate_property(property: Dictionary) -> void: #################### ## Follow Parameters #################### - if follow_mode == FollowMode.NONE: match property.name: "follow_offset", \ @@ -443,6 +591,10 @@ func _validate_property(property: Dictionary) -> void: if property.name == "follow_damping_value" and not follow_damping: property.usage = PROPERTY_USAGE_NO_EDITOR + if property.name == "follow_offset": + if follow_mode == FollowMode.PATH: + property.usage = PROPERTY_USAGE_NO_EDITOR + if property.name == "follow_distance": if not follow_mode == FollowMode.FRAMED: if not follow_mode == FollowMode.GROUP or \ @@ -460,7 +612,7 @@ func _validate_property(property: Dictionary) -> void: not follow_mode == FollowMode.GROUP: property.usage = PROPERTY_USAGE_NO_EDITOR - if not auto_follow_distance: + if not auto_follow_distance or not follow_mode == FollowMode.GROUP: match property.name: "auto_follow_distance_min", \ "auto_follow_distance_max", \ @@ -516,7 +668,6 @@ func _validate_property(property: Dictionary) -> void: not look_at_damping: property.usage = PROPERTY_USAGE_NO_EDITOR - notify_property_list_changed() #endregion #region Private Functions @@ -529,6 +680,14 @@ func _enter_tree() -> void: if not _phantom_camera_manager.get_phantom_camera_hosts().is_empty(): set_pcam_host_owner(_phantom_camera_manager.get_phantom_camera_hosts()[0]) + if not visibility_changed.is_connected(_check_visibility): + visibility_changed.connect(_check_visibility) + + _should_follow_checker() + if follow_mode == FollowMode.GROUP: + _follow_targets_size_check() + elif follow_mode == FollowMode.NONE: + _is_parents_physics() #if not get_parent() is SpringArm3D: #if look_at_target: #_look_at_target_node = look_at_target @@ -542,195 +701,262 @@ func _enter_tree() -> void: func _exit_tree() -> void: - _phantom_camera_manager.pcam_removed(self) + if is_instance_valid(_phantom_camera_manager): + _phantom_camera_manager.pcam_removed(self) if _has_valid_pcam_owner(): get_pcam_host_owner().pcam_removed_from_scene(self) + if not follow_mode == FollowMode.GROUP: + follow_targets = [] func _ready(): - if follow_mode == FollowMode.THIRD_PERSON: - if not Engine.is_editor_hint(): - if not is_instance_valid(_follow_spring_arm): - _follow_spring_arm = SpringArm3D.new() - _follow_spring_arm.top_level = true - _follow_spring_arm.rotation = global_rotation - _follow_spring_arm.position = _get_target_position_offset() if is_instance_valid(follow_target) else global_position - _follow_spring_arm.spring_length = spring_length - _follow_spring_arm.collision_mask = collision_mask - _follow_spring_arm.shape = shape - _follow_spring_arm.margin = margin - get_parent().add_child.call_deferred(_follow_spring_arm) - reparent.call_deferred(_follow_spring_arm) - if follow_mode == FollowMode.FRAMED: - if not Engine.is_editor_hint(): - _follow_framed_offset = global_position - _get_target_position_offset() - _current_rotation = global_rotation + match follow_mode: + FollowMode.THIRD_PERSON: + _is_third_person_follow = true + if not Engine.is_editor_hint(): + if not is_instance_valid(_follow_spring_arm): + _follow_spring_arm = SpringArm3D.new() + _follow_spring_arm.top_level = true + _follow_spring_arm.rotation = global_rotation + _follow_spring_arm.spring_length = spring_length + _follow_spring_arm.collision_mask = collision_mask + if shape: + _follow_spring_arm.shape = shape + else: + _follow_spring_arm.shape = _get_camera_shape() + _follow_spring_arm.margin = margin + _follow_spring_arm.add_excluded_object(follow_target) + get_parent().add_child.call_deferred(_follow_spring_arm) + reparent.call_deferred(_follow_spring_arm) + + # Waits for the SpringArm3D to be ready and then apply rotation + # Resolves an issue most prominent in Godot 4.4 + await _follow_spring_arm.ready + _follow_spring_arm.position = _get_target_position_offset() if is_instance_valid(follow_target) else global_position + _follow_spring_arm.global_rotation = global_rotation + _has_follow_spring_arm = true + FollowMode.FRAMED: + if not Engine.is_editor_hint(): + _follow_framed_offset = global_position - _get_target_position_offset() + _current_rotation = global_rotation + FollowMode.GROUP: + _follow_targets_size_check() + + if not Engine.is_editor_hint(): + _preview_noise = true + + ## NOTE - Only here to set position for Framed View on startup. + ## Should be removed once https://github.com/ramokz/phantom-camera/issues/161 is complete + _transform_output = global_transform + + _phantom_camera_manager.noise_3d_emitted.connect(_noise_emitted) func _process(delta: float) -> void: - if not _follow_target_physics_based: - _process_logic(delta) + if _follow_target_physics_based or _is_active: return + process_logic(delta) -func _physics_process(delta: float): - if _follow_target_physics_based: - _process_logic(delta) +func _physics_process(delta: float) -> void: + if not _follow_target_physics_based or _is_active: return + process_logic(delta) -func _process_logic(delta: float) -> void: - if not _is_active: +func process_logic(delta: float) -> void: + if _is_active: + if _has_noise_resource and _preview_noise: + _transform_noise = noise.get_noise_transform(delta) + else: match inactive_update_mode: - InactiveUpdateMode.NEVER: return + InactiveUpdateMode.NEVER: return # InactiveUpdateMode.EXPONENTIALLY: - # TODO - Trigger positional updates less frequently as more Pcams gets added + # TODO - Trigger positional updates less frequently as more PCams gets added + if _should_follow: _follow(delta) + else: + _transform_output.origin = global_transform.origin + if _should_look_at: - _look_at() # TODO - Delta needs to be applied, pending Godot's 3D Physics Interpolation to be implemented + _look_at(delta) + else: + _transform_output.basis = global_basis + + if _follow_axis_is_locked: + match follow_axis_lock: + FollowLockAxis.X: + _transform_output.origin.x = _follow_axis_lock_value.x + FollowLockAxis.Y: + _transform_output.origin.y = _follow_axis_lock_value.y + FollowLockAxis.Z: + _transform_output.origin.z = _follow_axis_lock_value.z + FollowLockAxis.XY: + _transform_output.origin.x = _follow_axis_lock_value.x + _transform_output.origin.y = _follow_axis_lock_value.y + FollowLockAxis.XZ: + _transform_output.origin.x = _follow_axis_lock_value.x + _transform_output.origin.z = _follow_axis_lock_value.z + FollowLockAxis.YZ: + _transform_output.origin.y = _follow_axis_lock_value.y + _transform_output.origin.z = _follow_axis_lock_value.z + FollowLockAxis.XYZ: + _transform_output.origin.x = _follow_axis_lock_value.x + _transform_output.origin.y = _follow_axis_lock_value.y + _transform_output.origin.z = _follow_axis_lock_value.z func _follow(delta: float) -> void: var follow_position: Vector3 - var follow_target_node: Node3D = self + var follow_target_node: Node3D = self # TODO - Think this can be removed match follow_mode: FollowMode.GLUED: - if follow_target: - follow_position = follow_target.global_position + follow_position = follow_target.global_position + FollowMode.SIMPLE: - if follow_target: - follow_position = _get_target_position_offset() + follow_position = _get_target_position_offset() + FollowMode.GROUP: - if follow_targets: - if follow_targets.size() == 1: - follow_position = \ - follow_targets[0].global_position + \ - follow_offset + \ - get_transform().basis.z * \ - Vector3(follow_distance, follow_distance, follow_distance) - - elif follow_targets.size() > 1: - var bounds: AABB = AABB(follow_targets[0].global_position, Vector3.ZERO) - for node in follow_targets: - if is_instance_valid(node): - bounds = bounds.expand(node.global_position) - - var distance: float - if auto_follow_distance: - distance = lerp(auto_follow_distance_min, auto_follow_distance_max, bounds.get_longest_axis_size() / auto_follow_distance_divisor) - distance = clamp(distance, auto_follow_distance_min, auto_follow_distance_max) - else: - distance = follow_distance + if _has_multiple_follow_targets: + var bounds: AABB = AABB(_follow_targets[0].global_position, Vector3.ZERO) + for target in _follow_targets: + bounds = bounds.expand(target.global_position) + var distance: float + if auto_follow_distance: + distance = lerpf(auto_follow_distance_min, auto_follow_distance_max, bounds.get_longest_axis_size() / auto_follow_distance_divisor) + distance = clampf(distance, auto_follow_distance_min, auto_follow_distance_max) + else: + distance = follow_distance - follow_position = \ - bounds.get_center() + \ - follow_offset + \ - get_transform().basis.z * \ - Vector3(distance, distance, distance) - FollowMode.PATH: - if follow_target and follow_path: - var path_position: Vector3 = follow_path.global_position follow_position = \ - follow_path.curve.get_closest_point( - follow_target.global_position - path_position - ) + path_position + bounds.get_center() + \ + follow_offset + \ + get_transform().basis.z * \ + Vector3(distance, distance, distance) + else: + follow_position = \ + follow_targets[_follow_targets_single_target_index].global_position + \ + follow_offset + \ + get_transform().basis.z * \ + Vector3(follow_distance, follow_distance, follow_distance) + + FollowMode.PATH: + var path_position: Vector3 = follow_path.global_position + follow_position = \ + follow_path.curve.get_closest_point( + follow_target.global_position - path_position + ) + path_position + FollowMode.FRAMED: - if follow_target: - if not Engine.is_editor_hint(): - if not _is_active || get_pcam_host_owner().get_trigger_pcam_tween(): - follow_position = _get_position_offset_distance() - _interpolate_position(follow_position, delta) - return - - viewport_position = get_viewport().get_camera_3d().unproject_position(_get_target_position_offset()) - var visible_rect_size: Vector2 = get_viewport().get_viewport().size - viewport_position = viewport_position / visible_rect_size - _current_rotation = global_rotation + if not Engine.is_editor_hint(): + if not _is_active || get_pcam_host_owner().get_trigger_pcam_tween(): + follow_position = _get_position_offset_distance() + _interpolate_position(follow_position, delta) + return + + viewport_position = get_viewport().get_camera_3d().unproject_position(_get_target_position_offset()) + var visible_rect_size: Vector2 = get_viewport().get_visible_rect().size + viewport_position = viewport_position / visible_rect_size + _current_rotation = global_rotation - if _current_rotation != global_rotation: - follow_position = _get_position_offset_distance() - - if _get_framed_side_offset() != Vector2.ZERO: - var target_position: Vector3 = _get_target_position_offset() + _follow_framed_offset - var glo_pos: Vector3 - - if dead_zone_width == 0 || dead_zone_height == 0: - if dead_zone_width == 0 && dead_zone_height != 0: - glo_pos = _get_position_offset_distance() - glo_pos.z = target_position.z - follow_position = glo_pos - elif dead_zone_width != 0 && dead_zone_height == 0: - glo_pos = _get_position_offset_distance() - glo_pos.x = target_position.x - follow_position = glo_pos - else: - follow_position = _get_position_offset_distance() + if _current_rotation != global_rotation: + follow_position = _get_position_offset_distance() + + if _get_framed_side_offset() != Vector2.ZERO: + var target_position: Vector3 = _get_target_position_offset() + _follow_framed_offset + var glo_pos: Vector3 + + if dead_zone_width == 0 || dead_zone_height == 0: + if dead_zone_width == 0 && dead_zone_height != 0: + glo_pos = _get_position_offset_distance() + glo_pos.z = target_position.z + follow_position = glo_pos + elif dead_zone_width != 0 && dead_zone_height == 0: + glo_pos = _get_position_offset_distance() + glo_pos.x = target_position.x + follow_position = glo_pos else: - if _current_rotation != global_rotation: - var opposite: float = sin(-global_rotation.x) * follow_distance + _get_target_position_offset().y - glo_pos.y = _get_target_position_offset().y + opposite - glo_pos.z = sqrt(pow(follow_distance, 2) - pow(opposite, 2)) + _get_target_position_offset().z - glo_pos.x = global_position.x - - follow_position = glo_pos - _current_rotation = global_rotation - else: - follow_position = target_position + follow_position = _get_position_offset_distance() else: - _follow_framed_offset = global_position - _get_target_position_offset() - _current_rotation = global_rotation - return + if _current_rotation != global_rotation: + var opposite: float = sin(-global_rotation.x) * follow_distance + _get_target_position_offset().y + glo_pos.y = _get_target_position_offset().y + opposite + glo_pos.z = sqrt(pow(follow_distance, 2) - pow(opposite, 2)) + _get_target_position_offset().z + glo_pos.x = global_position.x + + follow_position = glo_pos + _current_rotation = global_rotation + else: + dead_zone_reached.emit() + follow_position = target_position else: - follow_position = _get_position_offset_distance() - var unprojected_position: Vector2 = _get_raw_unprojected_position() - var viewport_width: float = get_viewport().size.x - var viewport_height: float = get_viewport().size.y - var camera_aspect: Camera3D.KeepAspect = get_viewport().get_camera_3d().keep_aspect - var visible_rect_size: Vector2 = get_viewport().get_viewport().size - - unprojected_position = unprojected_position - visible_rect_size / 2 - if camera_aspect == Camera3D.KeepAspect.KEEP_HEIGHT: -# Landscape View - var aspect_ratio_scale: float = viewport_width / viewport_height - unprojected_position.x = (unprojected_position.x / aspect_ratio_scale + 1) / 2 - unprojected_position.y = (unprojected_position.y + 1) / 2 - else: -# Portrait View - var aspect_ratio_scale: float = viewport_height / viewport_width - unprojected_position.x = (unprojected_position.x + 1) / 2 - unprojected_position.y = (unprojected_position.y / aspect_ratio_scale + 1) / 2 + _follow_framed_offset = global_position - _get_target_position_offset() + _current_rotation = global_rotation + return + else: + follow_position = _get_position_offset_distance() + var unprojected_position: Vector2 = _get_raw_unprojected_position() + var viewport_width: float = get_viewport().size.x + var viewport_height: float = get_viewport().size.y + var camera_aspect: Camera3D.KeepAspect = get_viewport().get_camera_3d().keep_aspect + var visible_rect_size: Vector2 = get_viewport().get_visible_rect().size + + unprojected_position = unprojected_position - visible_rect_size / 2 + if camera_aspect == Camera3D.KeepAspect.KEEP_HEIGHT: + # Landscape View + var aspect_ratio_scale: float = viewport_width / viewport_height + unprojected_position.x = (unprojected_position.x / aspect_ratio_scale + 1) / 2 + unprojected_position.y = (unprojected_position.y + 1) / 2 + else: + # Portrait View + var aspect_ratio_scale: float = viewport_height / viewport_width + unprojected_position.x = (unprojected_position.x + 1) / 2 + unprojected_position.y = (unprojected_position.y / aspect_ratio_scale + 1) / 2 + + viewport_position = unprojected_position - viewport_position = unprojected_position FollowMode.THIRD_PERSON: - if follow_target: - if not Engine.is_editor_hint(): - if is_instance_valid(follow_target) and is_instance_valid(_follow_spring_arm): - follow_position = _get_target_position_offset() - follow_target_node = _follow_spring_arm - else: - follow_position = _get_position_offset_distance() + if not Engine.is_editor_hint(): + if not _has_follow_spring_arm: return + follow_position = _get_target_position_offset() + follow_target_node = _follow_spring_arm + else: + follow_position = _get_position_offset_distance() _interpolate_position(follow_position, delta, follow_target_node) -func _look_at() -> void: +func _look_at(delta: float) -> void: match look_at_mode: LookAtMode.MIMIC: - global_rotation = look_at_target.global_rotation + _interpolate_rotation( + global_position - look_at_target.basis.z, + delta + ) + LookAtMode.SIMPLE: - _interpolate_rotation(look_at_target.global_position) + _interpolate_rotation( + look_at_target.global_position, + delta + ) + LookAtMode.GROUP: - if not _multiple_look_at_targets: - if look_at_targets.size() == 0: return - _interpolate_rotation(look_at_targets[0].global_position) + if not _has_multiple_look_at_targets: + _interpolate_rotation( + look_at_targets[_look_at_targets_single_target_index].global_position, + delta + ) else: var bounds: AABB = AABB(look_at_targets[0].global_position, Vector3.ZERO) for node in look_at_targets: bounds = bounds.expand(node.global_position) - _interpolate_rotation(bounds.get_center()) + _interpolate_rotation( + bounds.get_center(), + delta + ) func _get_target_position_offset() -> Vector3: @@ -739,35 +965,54 @@ func _get_target_position_offset() -> Vector3: func _get_position_offset_distance() -> Vector3: return _get_target_position_offset() + \ - get_transform().basis.z * Vector3(follow_distance, follow_distance, follow_distance) + transform.basis.z * Vector3(follow_distance, follow_distance, follow_distance) func _set_follow_velocity(index: int, value: float) -> void: _follow_velocity_ref[index] = value + + func _interpolate_position(target_position: Vector3, delta: float, camera_target: Node3D = self) -> void: if follow_damping: - for index in 3: - camera_target.global_position[index] = _smooth_damp( - target_position[index], - camera_target.global_position[index], - index, - _follow_velocity_ref[index], - _set_follow_velocity, - follow_damping_value[index] - ) + if not _is_third_person_follow: + global_position = target_position + for i in 3: + _transform_output.origin[i] = _smooth_damp( + global_position[i], + _transform_output.origin[i], + i, + _follow_velocity_ref[i], + _set_follow_velocity, + follow_damping_value[i], + delta + ) + else: + for i in 3: + if _is_third_person_follow: + camera_target.global_position[i] = _smooth_damp( + target_position[i], + camera_target.global_position[i], + i, + _follow_velocity_ref[i], + _set_follow_velocity, + follow_damping_value[i], + delta + ) + _transform_output.origin = global_position + _transform_output.basis = global_basis else: camera_target.global_position = target_position + _transform_output.origin = global_position -func _interpolate_rotation(target_trans: Vector3) -> void: +func _interpolate_rotation(target_trans: Vector3, delta: float) -> void: var direction: Vector3 = (target_trans - global_position + look_at_offset).normalized() var target_basis: Basis = Basis().looking_at(direction) var target_quat: Quaternion = target_basis.get_rotation_quaternion().normalized() if look_at_damping: var current_quat: Quaternion = quaternion.normalized() - var damping_time: float = max(0.0001, look_at_damping_value) - var t: float = min(1.0, get_process_delta_time() / damping_time) + var t: float = min(1.0, delta / damping_time) var dot: float = current_quat.dot(target_quat) @@ -787,16 +1032,18 @@ func _interpolate_rotation(target_trans: Vector3) -> void: var ratio_a: float = cos(theta) - dot * sin_theta / sin_theta_total var ratio_b: float = sin_theta / sin_theta_total + var output: Quaternion = current_quat * ratio_a + target_quat * ratio_b - quaternion = current_quat * ratio_a + target_quat * ratio_b + _transform_output.basis = Basis(output) + quaternion = output else: + _transform_output.basis = Basis(target_quat) quaternion = target_quat -func _smooth_damp(target_axis: float, self_axis: float, index: int, current_velocity: float, set_velocity: Callable, damping_time: float, rot: bool = false) -> float: +func _smooth_damp(target_axis: float, self_axis: float, index: int, current_velocity: float, set_velocity: Callable, damping_time: float, delta: float) -> float: damping_time = maxf(0.0001, damping_time) var omega: float = 2 / damping_time - var delta: float = get_process_delta_time() var x: float = omega * delta var exponential: float = 1 / (1 + x + 0.48 * x * x + 0.235 * x * x * x) var diff: float = self_axis - target_axis @@ -847,6 +1094,7 @@ func _get_framed_side_offset() -> Vector2: return frame_out_bounds + func _set_layer(current_layers: int, layer_number: int, value: bool) -> int: var mask: int = current_layers @@ -861,13 +1109,143 @@ func _set_layer(current_layers: int, layer_number: int, value: bool) -> int: return mask + func _has_valid_pcam_owner() -> bool: if not is_instance_valid(get_pcam_host_owner()): return false if not is_instance_valid(get_pcam_host_owner().camera_3d): return false return true + +func _check_visibility() -> void: + if not is_instance_valid(pcam_host_owner): return + pcam_host_owner.refresh_pcam_list_priorty() + + +func _follow_target_tree_exiting(target: Node) -> void: + if target == follow_target: + _should_follow = false + if _follow_targets.has(target): + _follow_targets.erase(target) + + +func _should_follow_checker() -> void: + if follow_mode == FollowMode.NONE: + _should_follow = false + return + + if not follow_mode == FollowMode.GROUP: + if is_instance_valid(follow_target): + _should_follow = true + else: + _should_follow = false + + +func _follow_targets_size_check() -> void: + var targets_size: int = 0 + _follow_target_physics_based = false + _follow_targets = [] + for i in follow_targets.size(): + if follow_targets[i] == null: continue + if follow_targets[i].is_inside_tree(): + _follow_targets.append(follow_targets[i]) + targets_size += 1 + _follow_targets_single_target_index = i + _check_physics_body(follow_targets[i]) + if not follow_targets[i].tree_exiting.is_connected(_follow_target_tree_exiting): + follow_targets[i].tree_exiting.connect(_follow_target_tree_exiting.bind(follow_targets[i])) + + match targets_size: + 0: + _should_follow = false + _has_multiple_follow_targets = false + 1: + _should_follow = true + _has_multiple_follow_targets = false + _: + _should_follow = true + _has_multiple_follow_targets = true + + +func _get_camera_shape() -> Shape3D: + if not _has_valid_pcam_owner(): return + + var pyramid_shape_data = PhysicsServer3D.shape_get_data( + get_pcam_host_owner().camera_3d.get_pyramid_shape_rid() + ) + + var shape = ConvexPolygonShape3D.new() + shape.points = pyramid_shape_data + + return shape + + +func _look_at_target_tree_exiting(target: Node) -> void: + if target == look_at_target: + _should_look_at = false + if look_at_targets.has(target): + erase_look_at_targets(target) + + +func _look_at_targets_size_check() -> void: + var targets_size: int = 0 + _look_at_target_physics_based = false + + for i in look_at_targets.size(): + if is_instance_valid(look_at_targets[i]): + targets_size += 1 + _look_at_targets_single_target_index = i + _check_physics_body(look_at_targets[i]) + if not look_at_targets[i].tree_exiting.is_connected(_look_at_target_tree_exiting): + look_at_targets[i].tree_exiting.connect(_look_at_target_tree_exiting.bind(look_at_targets[i])) + + match targets_size: + 0: + _should_look_at = false + _has_multiple_look_at_targets = false + 1: + _should_look_at = true + _has_multiple_look_at_targets = false + _: + _should_look_at = true + _has_multiple_look_at_targets = true + + +func _noise_emitted(emitter_noise_output: Transform3D, emitter_layer: int) -> void: + if noise_emitter_layer & emitter_layer != 0: + noise_emitted.emit(emitter_noise_output) + + +func _check_physics_body(target: Node3D) -> void: + if target is PhysicsBody3D: + ## NOTE - Feature Toggle + if Engine.get_version_info().major == 4 and \ + Engine.get_version_info().minor < 4: + if ProjectSettings.get_setting("phantom_camera/tips/show_jitter_tips"): + print_rich("Following or Looking at a [b]PhysicsBody3D[/b] node will likely result in jitter - on lower physics ticks in particular.") + print_rich("If possible, will recommend upgrading to Godot 4.4, as it has built-in support for 3D Physics Interpolation, which will mitigate this issue.") + print_rich("Until then, try following the guide on the [url=https://phantom-camera.dev/support/faq#i-m-seeing-jitter-what-can-i-do]documentation site[/url] for better results.") + print_rich("This tip can be disabled from within [code]Project Settings / Phantom Camera / Tips / Show Jitter Tips[/code]") + return + ## NOTE - Only supported in Godot 4.4 or above + elif not ProjectSettings.get_setting("physics/common/physics_interpolation"): + printerr("Physics Interpolation is disabled in the Project Settings, recommend enabling it to smooth out physics-based camera movement") + print_rich("This tip can be disabled from within [code]Project Settings / Phantom Camera / Tips / Show Jitter Tips[/code]") + _follow_target_physics_based = true + else: + _is_parents_physics(target) + physics_target_changed.emit() + + +func _is_parents_physics(target: Node = self) -> void: + var current_node: Node = target + while current_node: + current_node = current_node.get_parent() + if not current_node is PhysicsBody3D: continue + _follow_target_physics_based = true + #endregion + # TBD #func get_unprojected_position() -> Vector2: #var unprojected_position: Vector2 = _get_raw_unprojected_position() @@ -891,19 +1269,34 @@ func _has_valid_pcam_owner() -> bool: #return unprojected_position +## Returns the [Transform3D] value based on the [member follow_mode] / [member look_at_mode] target value. +func get_transform_output() -> Transform3D: + return _transform_output + + +## Returns the noise [Transform3D] value. +func get_noise_transform() -> Transform3D: + return _transform_noise + + +## Emits a noise based on a custom [Transform3D] value.[br] +## Use this function if you wish to make use of external noise patterns from, for example, other addons. +func emit_noise(value: Transform3D) -> void: + noise_emitted.emit(value) + #region Setter & Getter Functions ## Assigns the value of the [param has_tweened] property.[br] ## [b][color=yellow]Important:[/color][/b] This value can only be changed ## from the [PhantomCameraHost] script. -func set_has_tweened(caller: Node, value: bool) -> void: +func set_tween_skip(caller: Node, value: bool) -> void: if is_instance_of(caller, PhantomCameraHost): - _has_tweened = value + _tween_skip = value else: printerr("Can only be called PhantomCameraHost class") ## Returns the current [param has_tweened] value. -func get_has_tweened() -> bool: - return _has_tweened +func get_tween_skip() -> bool: + return _tween_skip ## Assigns the [param PhantomCamera3D] to a new [PhantomCameraHost].[br] @@ -980,6 +1373,8 @@ func get_tween_ease() -> int: func set_is_active(node: Node, value: bool) -> void: if node is PhantomCameraHost: _is_active = value + if value: + _should_follow_checker() else: printerr("PCams can only be set from the PhantomCameraHost") ## Gets current active state of the [param PhantomCamera3D]. @@ -1006,24 +1401,29 @@ func get_follow_mode() -> int: ## Assigns a new [Node3D] as the [member follow_target]. func set_follow_target(value: Node3D) -> void: + if follow_mode == FollowMode.NONE or follow_mode == FollowMode.GROUP: return if follow_target == value: return follow_target = value - _follow_target_physics_based = false if is_instance_valid(value): - _should_follow = true + if follow_mode == FollowMode.PATH: + if is_instance_valid(follow_path): + _should_follow = true + else: + _should_follow = false + else: + _should_follow = true _check_physics_body(value) + if not follow_target.tree_exiting.is_connected(_follow_target_tree_exiting): + follow_target.tree_exiting.connect(_follow_target_tree_exiting.bind(follow_target)) else: - _should_follow = false + if not follow_mode == FollowMode.GROUP: + _should_follow = false follow_target_changed.emit() notify_property_list_changed() ## Removes the current [Node3D] [member follow_target]. func erase_follow_target() -> void: - if follow_target == null: return - _follow_target_physics_based = false - _should_follow = false follow_target = null - follow_target_changed.emit() ## Gets the current Node3D target. func get_follow_target() -> Node3D: return follow_target @@ -1032,9 +1432,15 @@ func get_follow_target() -> Node3D: ## Assigns a new [Path3D] to the [member follow_path] property. func set_follow_path(value: Path3D) -> void: follow_path = value + if is_instance_valid(follow_path): + _should_follow_checker() + else: + _should_follow = false + ## Erases the current [Path3D] from [member follow_path] property. func erase_follow_path() -> void: follow_path = null + ## Gets the current [Path3D] from the [member follow_path] property. func get_follow_path() -> Path3D: return follow_path @@ -1042,88 +1448,44 @@ func get_follow_path() -> Path3D: ## Assigns a new [param follow_targets] array value. func set_follow_targets(value: Array[Node3D]) -> void: + if not follow_mode == FollowMode.GROUP: return if follow_targets == value: return - follow_targets = value + _follow_targets_size_check() - if follow_targets.is_empty(): - _should_follow = false - _has_multiple_follow_targets = false - _follow_target_physics_based = false - return - - var valid_instances: int - _follow_target_physics_based = false - for target in follow_targets: - if is_instance_valid(target): - _should_follow = true - valid_instances += 1 - - _check_physics_body(target) - if valid_instances > 1: - _has_multiple_follow_targets = true ## Adds a single [Node3D] to [member follow_targets] array. func append_follow_targets(value: Node3D) -> void: if not is_instance_valid(value): - printerr(value, " is not a valid instance") + printerr(value, " is not a valid Node3D instance") return if not follow_targets.has(value): follow_targets.append(value) - _should_follow = true - _has_multiple_follow_targets = true - _check_physics_body(value) + _follow_targets_size_check() else: printerr(value, " is already part of Follow Group") + ## Adds an Array of type [Node3D] to [member follow_targets] array. func append_follow_targets_array(value: Array[Node3D]) -> void: for target in value: if not is_instance_valid(target): continue if not follow_targets.has(target): follow_targets.append(target) - _should_follow = true - _check_physics_body(target) - if follow_targets.size() > 1: - _has_multiple_follow_targets = true + _follow_targets_size_check() else: printerr(value, " is already part of Follow Group") + ## Removes [Node3D] from [member follow_targets]. func erase_follow_targets(value: Node3D) -> void: follow_targets.erase(value) - _follow_target_physics_based = false - for target in follow_targets: - _check_physics_body(target) + _follow_targets_size_check() + - if follow_targets.size() < 2: - _has_multiple_follow_targets = false - if follow_targets.size() < 1: - _should_follow = false ## Gets all [Node3D] from [follow_targets]. func get_follow_targets() -> Array[Node3D]: return follow_targets -## Returns true if the [param PhantomCamera3D] has more than one member in the -## [member follow_targets] array. -func get_has_multiple_follow_targets() -> bool: - return _has_multiple_follow_targets - -func _check_physics_body(target: Node3D) -> void: - if target is PhysicsBody3D: - ## NOTE - Feature Toggle - #if Engine.get_version_info().major == 4 and \ - #Engine.get_version_info().minor < XX: - if ProjectSettings.get_setting("phantom_camera/tips/show_jitter_tips"): - print_rich("Following or Looking at a [b]PhysicsBody3D[/b] node will likely result in jitter - on lower physics ticks in particular.") - print_rich("Will have proper support once 3D Physics Interpolation becomes part of the core Godot engine.") - print_rich("Until then, try following the guide on the [url=https://phantom-camera.dev/support/faq#i-m-seeing-jitter-what-can-i-do]documentation site[/url] for better results.") - print_rich("This tip can be disabled from within [code]Project Settings / Phantom Camera / Tips / Show Jitter Tips[/code]") - return - ## TODO - Enable once Godot supports 3D Physics Interpolation - #elif not ProjectSettings.get_setting("physics/common/physics_interpolation"): - #printerr("Physics Interpolation is disabled in the Project Settings, recommend enabling it to smooth out physics-based camera movement") - #_follow_target_physics_based = true - ## Assigns a new [param Vector3] for the [param follow_offset] property. func set_follow_offset(value: Vector3) -> void: @@ -1272,7 +1634,10 @@ func get_collision_mask() -> int: func set_shape(value: Shape3D) -> void: shape = value if is_instance_valid(_follow_spring_arm): - _follow_spring_arm.shape = shape + if shape: + _follow_spring_arm.shape = shape + else: + _follow_spring_arm.shape = _get_camera_shape() ## Gets [param ThirdPerson] [member SpringArm3D.shape] value. func get_shape() -> Shape3D: @@ -1294,86 +1659,81 @@ func get_margin() -> float: ## Gets the current [member look_at_mode]. Value is based on [enum LookAtMode] ## enum.[br] -## Note: To set a new [member look_at_mode], a separate [param PhantomCamera3D] should -## be used. +## Note: To set a new [member look_at_mode], a separate [param PhantomCamera3D] should be used. func get_look_at_mode() -> int: return look_at_mode ## Assigns new [Node3D] as [member look_at_target]. func set_look_at_target(value: Node3D) -> void: + if look_at_mode == LookAtMode.NONE: return + if look_at_target == value: return look_at_target = value - _check_physics_body(value) - #_look_at_target_node = get_node_or_null(value) - look_at_target_changed - if is_instance_valid(look_at_target): - _should_look_at = true - else: + if not look_at_mode == LookAtMode.GROUP: + if is_instance_valid(look_at_target): + _should_look_at = true + _check_physics_body(value) + if not look_at_target.tree_exiting.is_connected(_look_at_target_tree_exiting): + look_at_target.tree_exiting.connect(_look_at_target_tree_exiting.bind(look_at_target)) + else: + _should_look_at = false + elif look_at_targets.size() == 0: _should_look_at = false + + look_at_target_changed.emit() notify_property_list_changed() ## Gets current [Node3D] from [member look_at_target] property. -func get_look_at_target(): +func get_look_at_target() -> Node3D: return look_at_target ## Sets an array of type [Node3D] to [member set_look_at_targets]. func set_look_at_targets(value: Array[Node3D]) -> void: + if not look_at_mode == LookAtMode.GROUP: return if look_at_targets == value: return look_at_targets = value - if look_at_mode != LookAtMode.GROUP: return - - if look_at_targets.is_empty(): - _should_look_at = false - _multiple_look_at_targets = false - else: - var valid_instances: int = 0 - for target in look_at_targets: - if is_instance_valid(target): - valid_instances += 1 - _should_look_at = true - _valid_look_at_targets.append(target) - _check_physics_body(target) - - if valid_instances > 1: - _multiple_look_at_targets = true - elif valid_instances == 0: - _should_look_at = false - _multiple_look_at_targets = false + _look_at_targets_size_check() notify_property_list_changed() ## Appends a [Node3D] to [member look_at_targets] array. func append_look_at_target(value: Node3D) -> void: + if not is_instance_valid(value): + printerr(value, "is an invalid Node3D instance") + return + if not look_at_targets.has(value): look_at_targets.append(value) - _valid_look_at_targets.append(value) - _check_physics_body(value) - if look_at_targets.size() > 1: - _multiple_look_at_targets = true + _look_at_targets_size_check() else: printerr(value, " is already part of Look At Group") + ## Appends an array of type [Node3D] to [member look_at_targets] array. -func append_look_at_targets_array(value: Array[NodePath]) -> void: +func append_look_at_targets_array(value: Array[Node3D]) -> void: for val in value: - if not look_at_targets.has(get_node(val)): - var node: Node3D = get_node(val) - look_at_targets.append(node) - _valid_look_at_targets.append(node) - _check_physics_body(node) - if look_at_targets.size() > 1: - _multiple_look_at_targets = true + if not is_instance_valid(val): continue + if not look_at_targets.has(val): + look_at_targets.append(val) + _look_at_targets_size_check() else: printerr(val, " is already part of Look At Group") ## Removes [Node3D] from [member look_at_targets] array. +func erase_look_at_targets(value: Node3D) -> void: + if look_at_targets.has(value): + look_at_targets.erase(value) + _look_at_targets_size_check() + else: + printerr(value, " is not part of Look At Group") + + +## Removes [Node3D] from [member look_at_targets] array. [br] +## @deprecated: Use [member erase_look_at_targets] instead. func erase_look_at_targets_member(value: Node3D) -> void: - look_at_targets.erase(value) - _valid_look_at_targets.erase(value) - _check_physics_body(value) - if look_at_targets.size() < 1: - _multiple_look_at_targets = false + printerr("erase_look_at_targets_member is deprecated, use erase_look_at_targets instead") + erase_look_at_targets(value) ## Gets all the [Node3D] instances in [member look_at_targets]. func get_look_at_targets() -> Array[Node3D]: @@ -1408,6 +1768,69 @@ func get_look_at_damping_value() -> float: return look_at_damping_value +func set_follow_axis_lock(value: FollowLockAxis) -> void: + follow_axis_lock = value + + # Wait for the node to be ready before setting lock + if not is_node_ready(): await ready + + # Prevent axis lock from working in the editor + if value != FollowLockAxis.NONE and not Engine.is_editor_hint(): + _follow_axis_is_locked = true + match value: + FollowLockAxis.X: + _follow_axis_lock_value.x = _transform_output.origin.x + FollowLockAxis.Y: + _follow_axis_lock_value.y = _transform_output.origin.y + FollowLockAxis.Z: + _follow_axis_lock_value.z = _transform_output.origin.z + FollowLockAxis.XY: + _follow_axis_lock_value.x = _transform_output.origin.x + _follow_axis_lock_value.y = _transform_output.origin.y + FollowLockAxis.XZ: + _follow_axis_lock_value.x = _transform_output.origin.x + _follow_axis_lock_value.z = _transform_output.origin.z + FollowLockAxis.YZ: + _follow_axis_lock_value.y = _transform_output.origin.y + _follow_axis_lock_value.z = _transform_output.origin.z + FollowLockAxis.XYZ: + _follow_axis_lock_value.x = _transform_output.origin.x + _follow_axis_lock_value.y = _transform_output.origin.y + _follow_axis_lock_value.z = _transform_output.origin.z + else: + _follow_axis_is_locked = false + +func get_follow_axis_lock() -> FollowLockAxis: + return follow_axis_lock + + +## Sets a [PhantomCameraNoise3D] resource +func set_noise(value: PhantomCameraNoise3D) -> void: + noise = value + if value != null: + _has_noise_resource = true + noise.set_trauma(1) + else: + _has_noise_resource = false + _transform_noise = Transform3D() + +func get_noise() -> PhantomCameraNoise3D: + return noise + + +## Sets the [member noise_emitter_layer] value. +func set_noise_emitter_layer(value: int) -> void: + noise_emitter_layer = value + +## Enables or disables a given layer of the [member noise_emitter_layer] value. +func set_noise_emitter_layer_value(value: int, enabled: bool) -> void: + noise_emitter_layer = _set_layer(noise_emitter_layer, value, enabled) + +## Returns the [member noise_emitter_layer] +func get_noise_emitter_layer() -> int: + return noise_emitter_layer + + ## Sets [member inactive_update_mode] property. func set_inactive_update_mode(value: int) -> void: inactive_update_mode = value @@ -1446,6 +1869,24 @@ func get_cull_mask() -> int: return camera_3d_resource.cull_mask +## Assigns a new [Environment] resource to the [Camera3DResource]. +func set_environment(value: Environment): + environment = value + +## Gets the [Camera3D.environment] value assigned to the [Camera3DResource]. +func get_environment() -> Environment: + return environment + + +## Assigns a new [CameraAttributes] resource to the [Camera3DResource]. +func set_attributes(value: CameraAttributes): + attributes = value + +## Gets the [Camera3D.attributes] value assigned to the [Camera3DResource]. +func get_attributes() -> CameraAttributes: + return attributes + + ## Assigns a new [member Camera3D.h_offset] value.[br] ## [b]Note:[/b] This will override and make the [param Camera3DResource] unique to ## this [param PhantomCamera3D]. @@ -1542,12 +1983,6 @@ func get_far() -> float: return camera_3d_resource.far -func set_follow_target_physics_based(value: bool, caller: Node) -> void: - if is_instance_of(caller, PhantomCameraHost): - _follow_target_physics_based = value - else: - printerr("set_follow_target_physics_based is for internal use only.") - func get_follow_target_physics_based() -> bool: return _follow_target_physics_based diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd.uid b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd.uid new file mode 100644 index 0000000..7f71a40 --- /dev/null +++ b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd.uid @@ -0,0 +1 @@ +uid://dx2xjqphsq8th diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd.uid b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd.uid new file mode 100644 index 0000000..52f2d43 --- /dev/null +++ b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd.uid @@ -0,0 +1 @@ +uid://dr0hukwkwxmdi diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_2d.gd b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_2d.gd new file mode 100644 index 0000000..df2a70a --- /dev/null +++ b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_2d.gd @@ -0,0 +1,264 @@ +@tool +@icon("res://addons/phantom_camera/icons/phantom_camera_noise_emitter_2d.svg") +class_name PhantomCameraNoiseEmitter2D +extends Node2D + +## Emits positional and rotational noise to active [PhantomCamera2D]s and its corresponding [Camera2D]. +## +## Is a node meant to apply positional and rotational noise, also referred to as shake, to the [Camera2D]. +## It is designed for use cases such as when hitting or when being hit, earthquakes or to add a +## bit of slight movement to the camera to make it feel less static. +## The emitter can affect multiple [PhantomCamera2D] in a given scene based on which [member noise_emitter_layer] +## are enabled by calling its [method emit] function. At least one corresponding layer has to be +## set on the [PhantomCamera2D] and the emitter node. + +const _constants = preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd") + +#region Exported Proerpties + +## The [PhantomCameraNoise2D] resource that defines the noise pattern. +@export var noise: PhantomCameraNoise2D = null: + set = set_noise, + get = get_noise + +## If true, previews the noise in the editor - can be seen in the viewfinder. +@export var preview: bool = false: + set(value): + preview = value + _play = value + get: + return preview + +## If true, repeats the noise indefinitely once started. Otherwise, it will only be triggered once. [br] +@export var continuous: bool = false: + set = set_continuous, + get = get_continuous + +## Determines how long the noise should take to reach full [member intensity] once started.[br] +## The value is set in [b]seconds[/b]. +@export_exp_easing("positive_only", "suffix: s") var growth_time: float = 0: + set = set_growth_time, + get = get_growth_time + +## Sets the duration for the camera noise if [member continuous] is set to [b]false[/b].[br][br] +## The value is set in [b]seconds[/b]. +@export_range(0, 10, 0.001, "or_greater", "suffix: s") var duration: float = 1.0: + set = set_duration, + get = get_duration + +## Determines how long the noise should take to come to a full stop.[br] +## The value is set in [b]seconds[/b]. +@export_exp_easing("attenuation", "positive_only", "suffix: s") var decay_time: float = 0: + set = set_decay_time, + get = get_decay_time + +## Enabled layers will affect [PhantomCamera2D] nodes with at least one corresponding layer enabled.[br] +## Enabling multiple corresponding layers on the same [PhantomCamera2D] causes no additional effect. +@export_flags_2d_render var noise_emitter_layer: int = 1: + set = set_noise_emitter_layer, + get = get_noise_emitter_layer + +#endregion + + +#region Private Variables + +var _play: bool = false: + set(value): + _play = value + if value: + _elasped_play_time = 0 + _decay_countdown = 0 + _play = true + _should_grow = true + _start_duration_countdown = false + _should_decay = false + else: + _should_decay = true + if noise.randomize_noise_seed: + noise.noise_seed = randi() & 1000 + else: + noise.reset_noise_time() + get: + return _play + +var _start_duration_countdown: bool = false + +var _decay_countdown: float = 0 + +var _should_grow: bool = false + +var _should_decay: bool = false + +var _elasped_play_time: float = 0 + +var _noise_output: Transform2D = Transform2D() + +# NOTE - Temp solution until Godot has better plugin autoload recognition out-of-the-box. +var _phantom_camera_manager: Node + +#endregion + +#region Private Functions + +func _get_configuration_warnings() -> PackedStringArray: + if noise == null: + return ["Noise resource is required in order to trigger emitter."] + else: + return [] + + +func _validate_property(property) -> void: + if property.name == "duration" and continuous: + property.usage = PROPERTY_USAGE_NO_EDITOR + + +func _enter_tree() -> void: + _phantom_camera_manager = get_tree().root.get_node(_constants.PCAM_MANAGER_NODE_NAME) + + +func _process(delta: float) -> void: + if not _play and not _should_decay: return + if noise == null: + printerr("Noise resource missing in ", name) + _play = false + return + + _elasped_play_time += delta + + if _should_grow: + noise.set_trauma(minf(_elasped_play_time / growth_time, 1)) + if _elasped_play_time >= growth_time: + _should_grow = false + _start_duration_countdown = true + noise.set_trauma(1) + else: + noise.set_trauma(1) + + if not continuous: + if _start_duration_countdown: + if _elasped_play_time >= duration + growth_time: + _should_decay = true + _start_duration_countdown = false + + if _should_decay: + _decay_countdown += delta + noise.set_trauma(maxf(1 - (_decay_countdown / decay_time), 0)) + if _decay_countdown >= decay_time: + noise.set_trauma(0) + _play = false + preview = false + _should_decay = false + _elasped_play_time = 0 + _decay_countdown = 0 + + _noise_output = noise.get_noise_transform(delta) + _phantom_camera_manager.noise_2d_emitted.emit(_noise_output, noise_emitter_layer) + + +func _set_layer(current_layers: int, layer_number: int, value: bool) -> int: + var mask: int = current_layers + + # From https://github.com/godotengine/godot/blob/51991e20143a39e9ef0107163eaf283ca0a761ea/scene/3d/camera_3d.cpp#L638 + if layer_number < 1 or layer_number > 20: + printerr("Layer must be between 1 and 20.") + else: + if value: + mask |= 1 << (layer_number - 1) + else: + mask &= ~(1 << (layer_number - 1)) + + return mask + +#endregion + + +#region Public Functions + +## Emits noise to the [PhantomCamera2D]s that has at least one matching layers. +func emit() -> void: + if _play: _play = false + _play = true + +## Returns the state for the emitter. If true, the emitter is currently emitting. +func is_emitting() -> bool: + return _play + +## Stops the emitter from emitting noise. +func stop(should_decay: bool = true) -> void: + if should_decay: + _should_decay = true + else: + _play = false + +## Toggles the emitter on and off. +func toggle() -> void: + _play = !_play + +#endregion + + +#region Setter & Getter Functions + +## Sets the [member noise] resource. +func set_noise(value: PhantomCameraNoise2D) -> void: + noise = value + update_configuration_warnings() + +## Returns the [member noise] resource. +func get_noise() -> PhantomCameraNoise2D: + return noise + + +## Sets the [member continous] value. +func set_continuous(value: bool) -> void: + continuous = value + notify_property_list_changed() + +## Gets the [member continous] value. +func get_continuous() -> bool: + return continuous + + +## Sets the [member growth_time] value. +func set_growth_time(value: float) -> void: + growth_time = value + +## Returns the [member growth_time] value. +func get_growth_time() -> float: + return growth_time + + +## Sets the [member duration] value. +func set_duration(value: float) -> void: + duration = value + if duration == 0: + duration = 0.001 + +## Returns the [member duration] value. +func get_duration() -> float: + return duration + + +## Sets the [member decay_time] value. +func set_decay_time(value: float) -> void: + decay_time = value + +## Returns the [member decay_time] value. +func get_decay_time() -> float: + return decay_time + + +## Sets the [member noise_emitter_layer] value. +func set_noise_emitter_layer(value: int) -> void: + noise_emitter_layer = value + +## Enables or disables a given layer of the [member noise_emitter_layer] value. +func set_noise_emitter_value(value: int, enabled: bool) -> void: + noise_emitter_layer = _set_layer(noise_emitter_layer, value, enabled) + +## Returns the [member noise_emitter_layer] value. +func get_noise_emitter_layer() -> int: + return noise_emitter_layer + +#endregion \ No newline at end of file diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_2d.gd.uid b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_2d.gd.uid new file mode 100644 index 0000000..541fe0d --- /dev/null +++ b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_2d.gd.uid @@ -0,0 +1 @@ +uid://bw365gklqyl3d diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_3d.gd b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_3d.gd new file mode 100644 index 0000000..8e009ed --- /dev/null +++ b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_3d.gd @@ -0,0 +1,266 @@ +@tool +@icon("res://addons/phantom_camera/icons/phantom_camera_noise_emitter_3d.svg") +class_name PhantomCameraNoiseEmitter3D +extends Node3D + +## Emits positional and rotational noise to active [PhantomCamera3D]s and its corresponding [Camera3D]. +## +## Is a node meant to apply positional and rotational noise, also referred to as shake, to the [Camera3D]. +## It is designed for use cases such as when hitting or when being hit, earthquakes or to add a +## bit of slight movement to the camera to make it feel less static. +## The emitter can affect multiple [PhantomCamera3D] in a given scene based on which [member noise_emitter_layer] +## are enabled by calling its [method emit] function. At least one corresponding layer has to be +## set on the [PhantomCamera3D] and the emitter node. + +const _constants = preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd") + +#region Exported Properties + +## The [PhantomCameraNoise3D] resource that defines the noise pattern. +@export var noise: PhantomCameraNoise3D = null: + set = set_noise, + get = get_noise + +## If true, previews the noise in the Viewfinder. +@export var preview: bool = false: + set(value): + preview = value + _play = value + get: + return preview + +## If true, repeats the noise indefinitely once started.Otherwise, it will only be triggered once. [br] +## [b]Note:[/b] This will always be enabled if the resource is assigned the the [PhantomCamera3D]'s +## [member PhantomCamera3D.noise] property. +@export var continuous: bool = false: + set = set_continuous, + get = get_continuous + +## Determines how long the noise should take to reach full [member intensity] once started.[br] +## The value is set in [b]seconds[/b]. +@export_exp_easing("positive_only", "suffix: s") var growth_time: float = 0: + set = set_growth_time, + get = get_growth_time + +## Sets the duration for the camera noise if [member loop] is set to false.[br] +## If the duration is [param 0] then [member continous] becomes enabled.[br] +## The value is set in [b]seconds[/b]. +@export_range(0, 10, 0.001, "or_greater", "suffix: s") var duration: float = 1.0: + set = set_duration, + get = get_duration + +## Determines how long the noise should take to come to a full stop.[br] +## The value is set in [b]seconds[/b]. +@export_exp_easing("attenuation", "positive_only", "suffix: s") var decay_time: float = 0: + set = set_decay_time, + get = get_decay_time + +## Enabled layers will affect [PhantomCamera3D] nodes with at least one corresponding layer enabled.[br] +## Enabling multiple corresponding layers on the same [PhantomCamera3D] causes no additional effect. +@export_flags_3d_render var noise_emitter_layer: int = 1: + set = set_noise_emitter_layer, + get = get_noise_emitter_layer + +#endregion + +#region Private Variables + +var _play: bool = false: + set(value): + _play = value + if value: + _elasped_play_time = 0 + _decay_countdown = 0 + _play = true + _should_grow = true + _start_duration_countdown = false + _should_decay = false + else: + _should_decay = true + if noise.randomize_noise_seed: + noise.noise_seed = randi() & 1000 + else: + noise.reset_noise_time() + get: + return _play + +var _start_duration_countdown: bool = false + +var _decay_countdown: float = 0 + +var _should_grow: bool = false + +var _should_decay: bool = false + +var _elasped_play_time: float = 0 + +var _noise_output: Transform3D = Transform3D() + +# NOTE - Temp solution until Godot has better plugin autoload recognition out-of-the-box. +var _phantom_camera_manager: Node + +#endregion + +#region Private Functions + +func _get_configuration_warnings() -> PackedStringArray: + if noise == null: + return ["Noise resource is required in order to trigger emitter."] + else: + return [] + + +func _validate_property(property) -> void: + if property.name == "duration" and continuous: + property.usage = PROPERTY_USAGE_NO_EDITOR + + +func _enter_tree() -> void: + _phantom_camera_manager = get_tree().root.get_node(_constants.PCAM_MANAGER_NODE_NAME) + + +func _process(delta: float) -> void: + if not _play and not _should_decay: return + if noise == null: + printerr("Noise resource missing in ", name) + _play = false + return + + _elasped_play_time += delta + + if _should_grow: + noise.set_trauma(minf(_elasped_play_time / growth_time, 1)) + if _elasped_play_time >= growth_time: + _should_grow = false + _start_duration_countdown = true + noise.set_trauma(1) + + if not continuous: + if _start_duration_countdown: + if _elasped_play_time >= duration + growth_time: + _should_decay = true + _start_duration_countdown = false + + if _should_decay: + _decay_countdown += delta + noise.set_trauma(maxf(1 - (_decay_countdown / decay_time), 0)) + if _decay_countdown >= decay_time: + noise.set_trauma(0) + _play = false + preview = false + _should_decay = false + _elasped_play_time = 0 + _decay_countdown = 0 + + _noise_output = noise.get_noise_transform(delta) + _phantom_camera_manager.noise_3d_emitted.emit(_noise_output, noise_emitter_layer) + + +func _set_layer(current_layers: int, layer_number: int, value: bool) -> int: + var mask: int = current_layers + + # From https://github.com/godotengine/godot/blob/51991e20143a39e9ef0107163eaf283ca0a761ea/scene/3d/camera_3d.cpp#L638 + if layer_number < 1 or layer_number > 20: + printerr("Layer must be between 1 and 20.") + else: + if value: + mask |= 1 << (layer_number - 1) + else: + mask &= ~(1 << (layer_number - 1)) + + return mask + +#endregion + +#region Public Functions + +## Emits noise to the [PhantomCamera3D]s that has at least one matching layers. +func emit() -> void: + if _play: _play = false + _play = true + + +## Returns the state for the emitter. If true, the emitter is currently emitting. +func is_emitting() -> bool: + return _play + + +## Stops the emitter from emitting noise. +func stop(should_decay: bool = true) -> void: + if should_decay: + _should_decay = true + else: + _play = false + + +## Toggles the emitter on and off.[br] +func toggle() -> void: + _play = !_play + +#endregion + +#region Setter & Getter Functions + +## Sets the [member noise] resource. +func set_noise(value: PhantomCameraNoise3D) -> void: + noise = value + update_configuration_warnings() + +## Returns the [member noise] resource. +func get_noise() -> PhantomCameraNoise3D: + return noise + + +## Sets the [member continous] value. +func set_continuous(value: bool) -> void: + continuous = value + notify_property_list_changed() + +## Gets the [member continous] value. +func get_continuous() -> bool: + return continuous + + +## Sets the [member growth_time] value. +func set_growth_time(value: float) -> void: + growth_time = value + +## Returns the [member growth_time] value. +func get_growth_time() -> float: + return growth_time + + +## Sets the [member duration] value. +func set_duration(value: float) -> void: + duration = value + if duration == 0: + duration = 0.001 + +## Returns the [member duration] value. +func get_duration() -> float: + return duration + + +## Sets the [member decay_time] value. +func set_decay_time(value: float) -> void: + decay_time = value + +## Returns the [member decay_time] value. +func get_decay_time() -> float: + return decay_time + + +## Sets the [member noise_emitter_layer] value. +func set_noise_emitter_layer(value: int) -> void: + noise_emitter_layer = value + +## Enables or disables a given layer of the [member noise_emitter_layer] value. +func set_noise_emitter_value(value: int, enabled: bool) -> void: + noise_emitter_layer = _set_layer(noise_emitter_layer, value, enabled) + +## Returns the [member noise_emitter_layer] value. +func get_noise_emitter_layer() -> int: + return noise_emitter_layer + + #endregion + diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_3d.gd.uid b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_3d.gd.uid new file mode 100644 index 0000000..4368d26 --- /dev/null +++ b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_3d.gd.uid @@ -0,0 +1 @@ +uid://0qmywjw0komx diff --git a/addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd b/addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd index 77e8f29..809b156 100644 --- a/addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd +++ b/addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd @@ -15,6 +15,14 @@ const _constants := preload("res://addons/phantom_camera/scripts/phantom_camera/ #endregion +#region + +## TBD - For when Godot 4.3 becomes the minimum version +#@export var interpolation_mode: InterpolationMode = InterpolationMode.AUTO: + #set = set_interpolation_mode, + #get = get_interpolation_mode + +#endregion #region Signals @@ -24,30 +32,22 @@ signal update_editor_viewfinder #endregion - #region Variables enum InterpolationMode { - AUTO = 0, - IDLE = 1, + AUTO = 0, + IDLE = 1, PHYSICS = 2, } -## TBD - For when Godot 4.3 becomes the minimum version -#@export var interpolation_mode: InterpolationMode = InterpolationMode.AUTO: - #set = set_interpolation_mode, - #get = get_interpolation_mode - +#endregion -## For 2D scenes, is the [Camera2D] instance the [param PhantomCameraHost] controls. -var camera_2d: Camera2D = null -## For 3D scenes, is the [Camera3D] instance the [param PhantomCameraHost] controls. -var camera_3d = null ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed. +#region Private Variables var _pcam_list: Array[Node] = [] var _active_pcam_2d: PhantomCamera2D = null -var _active_pcam_3d = null ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed. +var _active_pcam_3d: Node = null ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed. var _active_pcam_priority: int = -1 var _active_pcam_missing: bool = true var _active_pcam_has_damping: bool = false @@ -59,19 +59,92 @@ var _prev_active_pcam_3d_transform: Transform3D = Transform3D() var _trigger_pcam_tween: bool = false var _tween_elapsed_time: float = 0 var _tween_duration: float = 0 +var _tween_is_instant: bool = false var _multiple_pcam_hosts: bool = false var _is_child_of_camera: bool = false var _is_2D: bool = false - var _viewfinder_node: Control = null var _viewfinder_needed_check: bool = true var _camera_zoom: Vector2 = Vector2.ONE #region Camera3DResource + +var _prev_cam_attributes: CameraAttributes = null +var _cam_attribute_type: int = 0 # 0 = CameraAttributesPractical, 1 = CameraAttributesPhysical +var _cam_attribute_changed: bool = false +var _cam_attribute_assigned: bool = false + +#region CameraAttributes +var _prev_cam_auto_exposure_scale: float = 0.4 +var _cam_auto_exposure_scale_changed: bool = false + +var _prev_cam_auto_exposure_speed: float = 0.5 +var _cam_auto_exposure_speed_changed: bool = false + +var _prev_cam_exposure_multiplier: float = 1.0 +var _cam_exposure_multiplier_changed: bool = false + +var _prev_cam_exposure_sensitivity: float = 100.0 +var _cam_exposure_sensitivity_changed: bool = false + +#region CameraAttributesPractical +var _prev_cam_exposure_min_sensitivity: float = 0.0 +var _cam_exposure_min_sensitivity_changed: bool = false + +var _prev_cam_exposure_max_sensitivity: float = 800.0 +var _cam_exposure_max_sensitivity_changed: bool = false + +var _prev_cam_dof_blur_amount: float = 0.1 +var _cam_dof_blur_amount_changed: bool = false + +var _cam_dof_blur_far_distance_default: float = 10 +var _prev_cam_dof_blur_far_distance: float = _cam_dof_blur_far_distance_default +var _cam_dof_blur_far_distance_changed: bool = false + +var _cam_dof_blur_far_transition_default: float = 5 +var _prev_cam_dof_blur_far_transition: float = _cam_dof_blur_far_transition_default +var _cam_dof_blur_far_transition_changed: bool = false + +var _cam_dof_blur_near_distance_default: float = 2 +var _prev_cam_dof_blur_near_distance: float = _cam_dof_blur_near_distance_default +var _cam_dof_blur_near_distance_changed: bool = false + +var _cam_dof_blur_near_transition_default: float = 1 +var _prev_cam_dof_blur_near_transition: float = _cam_dof_blur_near_transition_default +var _cam_dof_blur_near_transition_changed: bool = false +#endregion + +#region CameraAttributesPhysical +var _prev_cam_exposure_min_exposure_value: float = 10.0 +var _cam_exposure_min_exposure_value_changed: bool = false + +var _prev_cam_exposure_max_exposure_value: float = -8.0 +var _cam_exposure_max_exposure_value_changed: bool = false + +var _prev_cam_exposure_aperture: float = 16.0 +var _cam_exposure_aperture_changed: bool = false + +var _prev_cam_exposure_shutter_speed: float = 100.0 +var _cam_exposure_shutter_speed_changed: bool = false + +var _prev_cam_frustum_far: float = 4000.0 +var _cam_frustum_far_changed: bool = false + +var _prev_cam_frustum_focal_length: float = 35.0 +var _cam_frustum_focal_length_changed: bool = false + +var _prev_cam_frustum_near: float = 0.05 +var _cam_frustum_near_changed: bool = false + +var _prev_cam_frustum_focus_distance: float = 10.0 +var _cam_frustum_focus_distance_changed: bool = false + +#endregion + var _prev_cam_h_offset: float = 0 var _cam_h_offset_changed: bool = false @@ -92,16 +165,30 @@ var _cam_near_changed: bool = false var _prev_cam_far: float = 4000 var _cam_far_changed: bool = false + #endregion var _active_pcam_2d_glob_transform: Transform2D = Transform2D() var _active_pcam_3d_glob_transform: Transform3D = Transform3D() +var _has_noise_emitted: bool = false +var _noise_emitted_output_2d: Transform2D = Transform2D() +var _noise_emitted_output_3d: Transform3D = Transform3D() + #endregion # NOTE - Temp solution until Godot has better plugin autoload recognition out-of-the-box. var _phantom_camera_manager: Node +#region Public Variables + +## For 2D scenes, is the [Camera2D] instance the [param PhantomCameraHost] controls. +var camera_2d: Camera2D = null +## For 3D scenes, is the [Camera3D] instance the [param PhantomCameraHost] controls. +var camera_3d: Node = null ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed. + +#endregion + #region Private Functions ## TBD - For when Godot 4.3 becomes a minimum version @@ -111,7 +198,7 @@ var _phantom_camera_manager: Node func _get_configuration_warnings() -> PackedStringArray: - var parent = get_parent() + var parent: Node = get_parent() if _is_2D: if not parent is Camera2D: @@ -128,7 +215,7 @@ func _get_configuration_warnings() -> PackedStringArray: func _enter_tree() -> void: _phantom_camera_manager = get_tree().root.get_node(_constants.PCAM_MANAGER_NODE_NAME) - var parent = get_parent() + var parent: Node = get_parent() if parent is Camera2D or parent.is_class("Camera3D"): ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed. _is_child_of_camera = true @@ -168,16 +255,22 @@ func _enter_tree() -> void: func _exit_tree() -> void: - _phantom_camera_manager.pcam_host_removed(self) - _check_camera_host_amount() + if is_instance_valid(_phantom_camera_manager): + _phantom_camera_manager.pcam_host_removed(self) + _check_camera_host_amount() func _ready() -> void: - if not is_instance_valid(_active_pcam_2d) or is_instance_valid(_active_pcam_3d): return + process_priority = 300 + process_physics_priority = 300 + if _is_2D: - _active_pcam_2d_glob_transform = _active_pcam_2d.get_global_transform() + camera_2d.offset = Vector2.ZERO + if not is_instance_valid(_active_pcam_2d): return + _active_pcam_2d_glob_transform = _active_pcam_2d.get_transform_output() else: - _active_pcam_3d_glob_transform = _active_pcam_3d.get_global_transform() + if not is_instance_valid(_active_pcam_3d): return + _active_pcam_3d_glob_transform = _active_pcam_3d.get_transform_output() func _check_camera_host_amount() -> void: @@ -188,19 +281,82 @@ func _check_camera_host_amount() -> void: func _assign_new_active_pcam(pcam: Node) -> void: + # Only checks if the scene tree is still present. + # Prevents a few errors and checks from happening if the scene is exited. + if not is_inside_tree(): return var no_previous_pcam: bool - if is_instance_valid(_active_pcam_2d) or is_instance_valid(_active_pcam_3d): if _is_2D: - _prev_active_pcam_2d_transform = camera_2d.get_global_transform() + _prev_active_pcam_2d_transform = camera_2d.global_transform _active_pcam_2d.queue_redraw() _active_pcam_2d.set_is_active(self, false) _active_pcam_2d.became_inactive.emit() + if _active_pcam_2d.physics_target_changed.is_connected(_check_pcam_physics): + _active_pcam_2d.physics_target_changed.disconnect(_check_pcam_physics) + + if _active_pcam_2d.noise_emitted.is_connected(_noise_emitted_2d): + _active_pcam_2d.noise_emitted.disconnect(_noise_emitted_2d) + if _trigger_pcam_tween: _active_pcam_2d.tween_interrupted.emit(pcam) else: - _prev_active_pcam_3d_transform = camera_3d.get_global_transform() + _prev_active_pcam_3d_transform = camera_3d.global_transform + _active_pcam_3d.set_is_active(self, false) + _active_pcam_3d.became_inactive.emit() + + if _active_pcam_3d.physics_target_changed.is_connected(_check_pcam_physics): + _active_pcam_3d.physics_target_changed.disconnect(_check_pcam_physics) + + if _active_pcam_3d.noise_emitted.is_connected(_noise_emitted_3d): + _active_pcam_3d.noise_emitted.disconnect(_noise_emitted_3d) + + if _trigger_pcam_tween: + _active_pcam_3d.tween_interrupted.emit(pcam) + + if camera_3d.attributes != null: + var _attributes: CameraAttributes = camera_3d.attributes + + _prev_cam_exposure_multiplier = _attributes.exposure_multiplier + _prev_cam_auto_exposure_scale = _attributes.auto_exposure_scale + _prev_cam_auto_exposure_speed = _attributes.auto_exposure_speed + + if camera_3d.attributes is CameraAttributesPractical: + _attributes = _attributes as CameraAttributesPractical + + _prev_cam_dof_blur_amount = _attributes.dof_blur_amount + + if _attributes.dof_blur_far_enabled: + _prev_cam_dof_blur_far_distance = _attributes.dof_blur_far_distance + _prev_cam_dof_blur_far_transition = _attributes.dof_blur_far_transition + else: + _prev_cam_dof_blur_far_distance = _cam_dof_blur_far_distance_default + _prev_cam_dof_blur_far_transition = _cam_dof_blur_far_transition_default + + if _attributes.dof_blur_near_enabled: + _prev_cam_dof_blur_near_distance = _attributes.dof_blur_near_distance + _prev_cam_dof_blur_near_transition = _attributes.dof_blur_near_transition + else: + _prev_cam_dof_blur_near_distance = _cam_dof_blur_near_distance_default + _prev_cam_dof_blur_near_transition = _cam_dof_blur_near_transition_default + + if _attributes.auto_exposure_enabled: + _prev_cam_exposure_max_sensitivity = _attributes.auto_exposure_max_sensitivity + _prev_cam_exposure_min_sensitivity = _attributes.auto_exposure_min_sensitivity + + elif camera_3d.attributes is CameraAttributesPhysical: + _attributes = _attributes as CameraAttributesPhysical + + _prev_cam_frustum_focus_distance = _attributes.frustum_focus_distance + _prev_cam_frustum_focal_length = _attributes.frustum_focal_length + _prev_cam_frustum_far = _attributes.frustum_far + _prev_cam_frustum_near = _attributes.frustum_near + _prev_cam_exposure_aperture = _attributes.exposure_aperture + _prev_cam_exposure_shutter_speed = _attributes.exposure_shutter_speed + + if _attributes.auto_exposure_enabled: + _prev_cam_exposure_min_exposure_value = _attributes.auto_exposure_min_exposure_value + _prev_cam_exposure_max_exposure_value = _attributes.auto_exposure_max_exposure_value _prev_cam_h_offset = camera_3d.h_offset _prev_cam_v_offset = camera_3d.v_offset @@ -210,11 +366,6 @@ func _assign_new_active_pcam(pcam: Node) -> void: _prev_cam_near = camera_3d.near _prev_cam_far = camera_3d.far - _active_pcam_3d.set_is_active(self, false) - _active_pcam_3d.became_inactive.emit() - - if _trigger_pcam_tween: - _active_pcam_3d.tween_interrupted.emit(pcam) else: no_previous_pcam = true @@ -223,201 +374,328 @@ func _assign_new_active_pcam(pcam: Node) -> void: _active_pcam_2d = pcam _active_pcam_priority = _active_pcam_2d.priority _active_pcam_has_damping = _active_pcam_2d.follow_damping - _tween_duration = _active_pcam_2d.get_tween_duration() + _tween_duration = _active_pcam_2d.tween_duration + + if not _active_pcam_2d.physics_target_changed.is_connected(_check_pcam_physics): + _active_pcam_2d.physics_target_changed.connect(_check_pcam_physics) + + if not _active_pcam_2d.noise_emitted.is_connected(_noise_emitted_2d): + _active_pcam_2d.noise_emitted.connect(_noise_emitted_2d) else: _active_pcam_3d = pcam _active_pcam_priority = _active_pcam_3d.priority _active_pcam_has_damping = _active_pcam_3d.follow_damping - _tween_duration = _active_pcam_3d.get_tween_duration() + _tween_duration = _active_pcam_3d.tween_duration + + if not _active_pcam_3d.physics_target_changed.is_connected(_check_pcam_physics): + _active_pcam_3d.physics_target_changed.connect(_check_pcam_physics) + + if not _active_pcam_3d.noise_emitted.is_connected(_noise_emitted_3d): + _active_pcam_3d.noise_emitted.connect(_noise_emitted_3d) - # Checks if the Camera3DResource has changed from previous Active PCam3D - if _active_pcam_3d.get_camera_3d_resource(): - if _prev_cam_h_offset != _active_pcam_3d.get_h_offset(): + # Checks if the Camera3DResource has changed from the previous active PCam3D + if _active_pcam_3d.camera_3d_resource: + if _prev_cam_h_offset != _active_pcam_3d.h_offset: _cam_h_offset_changed = true - if _prev_cam_v_offset != _active_pcam_3d.get_v_offset(): + if _prev_cam_v_offset != _active_pcam_3d.v_offset: _cam_v_offset_changed = true - if _prev_cam_fov != _active_pcam_3d.get_fov(): + if _prev_cam_fov != _active_pcam_3d.fov: _cam_fov_changed = true - if _prev_cam_size != _active_pcam_3d.get_size(): + if _prev_cam_size != _active_pcam_3d.size: _cam_size_changed = true - if _prev_cam_frustum_offset != _active_pcam_3d.get_frustum_offset(): + if _prev_cam_frustum_offset != _active_pcam_3d.frustum_offset: _cam_frustum_offset_changed = true - if _prev_cam_near != _active_pcam_3d.get_near(): + if _prev_cam_near != _active_pcam_3d.near: _cam_near_changed = true - if _prev_cam_far != _active_pcam_3d.get_far(): + if _prev_cam_far != _active_pcam_3d.far: _cam_far_changed = true + if _active_pcam_3d.attributes == null: + _cam_attribute_changed = false + else: + if _prev_cam_attributes != _active_pcam_3d.attributes: + _prev_cam_attributes = _active_pcam_3d.attributes + _cam_attribute_changed = true + var _attributes: CameraAttributes = _active_pcam_3d.attributes + + if _prev_cam_auto_exposure_scale != _attributes.auto_exposure_scale: + _cam_auto_exposure_scale_changed = true + if _prev_cam_auto_exposure_speed != _attributes.auto_exposure_speed: + _cam_auto_exposure_speed_changed = true + if _prev_cam_exposure_multiplier != _attributes.exposure_multiplier: + _cam_exposure_multiplier_changed = true + if _prev_cam_exposure_sensitivity != _attributes.exposure_sensitivity: + _cam_exposure_sensitivity_changed = true + + if _attributes is CameraAttributesPractical: + _cam_attribute_type = 0 + + if camera_3d.attributes == null: + camera_3d.attributes = CameraAttributesPractical.new() + camera_3d.attributes = _active_pcam_3d.attributes.duplicate() + _cam_attribute_assigned = true + + if _prev_cam_exposure_min_sensitivity != _attributes.auto_exposure_min_sensitivity: + _cam_exposure_min_sensitivity_changed = true + if _prev_cam_exposure_max_sensitivity != _attributes.auto_exposure_max_sensitivity: + _cam_exposure_max_sensitivity_changed = true + + if _prev_cam_dof_blur_amount != _attributes.dof_blur_amount: + _cam_dof_blur_amount_changed = true + + if _prev_cam_dof_blur_far_distance != _attributes.dof_blur_far_distance: + _cam_dof_blur_far_distance_changed = true + camera_3d.attributes.dof_blur_far_enabled = true + if _prev_cam_dof_blur_far_transition != _attributes.dof_blur_far_transition: + _cam_dof_blur_far_transition_changed = true + camera_3d.attributes.dof_blur_far_enabled = true + + if _prev_cam_dof_blur_near_distance != _attributes.dof_blur_near_distance: + _cam_dof_blur_near_distance_changed = true + camera_3d.attributes.dof_blur_near_enabled = true + if _prev_cam_dof_blur_near_transition != _attributes.dof_blur_near_transition: + _cam_dof_blur_near_transition_changed = true + camera_3d.attributes.dof_blur_near_enabled = true + elif _attributes is CameraAttributesPhysical: + _cam_attribute_type = 1 + + if camera_3d.attributes == null: + camera_3d.attributes = CameraAttributesPhysical.new() + camera_3d.attributes = _active_pcam_3d.attributes.duplicate() + + if _prev_cam_exposure_min_exposure_value != _attributes.auto_exposure_min_exposure_value: + _cam_exposure_min_exposure_value_changed = true + if _prev_cam_exposure_max_exposure_value != _attributes.auto_exposure_max_exposure_value: + _cam_exposure_max_exposure_value_changed = true + + if _prev_cam_exposure_aperture != _attributes.exposure_aperture: + _cam_exposure_aperture_changed = true + if _prev_cam_exposure_shutter_speed != _attributes.exposure_shutter_speed: + _cam_exposure_shutter_speed_changed = true + + if _prev_cam_frustum_far != _attributes.frustum_far: + _cam_frustum_far_changed = true + + if _prev_cam_frustum_focal_length != _attributes.frustum_focal_length: + _cam_frustum_focal_length_changed = true + + if _prev_cam_frustum_focus_distance != _attributes.frustum_focus_distance: + _cam_frustum_focus_distance_changed = true + + if _prev_cam_frustum_near != _attributes.frustum_near: + _cam_frustum_near_changed = true + if _is_2D: if _active_pcam_2d.show_viewfinder_in_play: _viewfinder_needed_check = true _active_pcam_2d.set_is_active(self, true) _active_pcam_2d.became_active.emit() - _camera_zoom = camera_2d.get_zoom() - ## TODO - Needs 3D variant once Godot supports physics_interpolation for 3D scenes. - var _physics_based: bool + _camera_zoom = camera_2d.zoom + else: + if _active_pcam_3d.show_viewfinder_in_play: + _viewfinder_needed_check = true + + _active_pcam_3d.set_is_active(self, true) + _active_pcam_3d.became_active.emit() + if _active_pcam_3d.camera_3d_resource: + camera_3d.cull_mask = _active_pcam_3d.cull_mask + camera_3d.projection = _active_pcam_3d.projection + + if no_previous_pcam: + if _is_2D: + _prev_active_pcam_2d_transform = _active_pcam_2d.get_transform_output() + else: + _prev_active_pcam_3d_transform = _active_pcam_3d.get_transform_output() + + if pcam.get_tween_skip(): + _tween_elapsed_time = pcam.tween_duration + else: + _tween_elapsed_time = 0 + + if pcam.tween_duration == 0: + if Engine.get_version_info().major == 4 and \ + Engine.get_version_info().minor >= 3: + _tween_is_instant = true - ## NOTE - Only supported in Godot 4.3 or above + _check_pcam_physics() + + _trigger_pcam_tween = true + + +func _check_pcam_physics() -> void: + if _is_2D: + ## NOTE - Only supported in Godot 4.3 or later if Engine.get_version_info().major == 4 and \ Engine.get_version_info().minor >= 3: - ## TBD - For when Godot 4.3 becomes the minimum version - #if interpolation_mode == InterpolationMode.IDLE: - #_physics_based = false - #elif interpolation_mode == InterpolationMode.PHYSICS: - #_physics_based = true - #else: - #_physics_based = _active_pcam.follow_target_physics_based - - # TBD - REMOVE this line once Godot 4.3 becomes the minimum version - _physics_based = _active_pcam_2d.get_follow_target_physics_based() - - if _physics_based: + if _active_pcam_2d.get_follow_target_physics_based(): _follow_target_physics_based = true - _active_pcam_2d.set_follow_target_physics_based(true, self) ## TODO - Temporary solution to support Godot 4.2 ## Remove line below and uncomment the following once Godot 4.3 is min verison. camera_2d.call("reset_physics_interpolation") camera_2d.set("physics_interpolation_mode", 1) #camera_2d.reset_physics_interpolation() #camera_2d.physics_interpolation_mode = Node.PHYSICS_INTERPOLATION_MODE_ON + if ProjectSettings.get_setting("physics/common/physics_interpolation"): + camera_2d.process_callback = Camera2D.CAMERA2D_PROCESS_PHYSICS # Prevents a warning + else: + camera_2d.process_callback = Camera2D.CAMERA2D_PROCESS_IDLE else: _follow_target_physics_based = false - _active_pcam_2d.set_follow_target_physics_based(false, self) ## TODO - Temporary solution to support Godot 4.2 ## Remove line below and uncomment the following once Godot 4.3 is min verison. - camera_2d.set("physics_interpolation_mode", 2) - #camera_2d.physics_interpolation_mode = Node.PHYSICS_INTERPOLATION_MODE_OFF - else: - _follow_target_physics_based = false - if _active_pcam_3d.show_viewfinder_in_play: - _viewfinder_needed_check = true - - _active_pcam_3d.set_is_active(self, true) - _active_pcam_3d.became_active.emit() - if _active_pcam_3d.get_camera_3d_resource(): - camera_3d.cull_mask = _active_pcam_3d.get_cull_mask() - camera_3d.projection = _active_pcam_3d.get_projection() - - if no_previous_pcam: - if _is_2D: - _prev_active_pcam_2d_transform = _active_pcam_2d.get_global_transform() - else: - _prev_active_pcam_3d_transform = _active_pcam_3d.get_global_transform() - - _tween_elapsed_time = 0 - if not pcam.get_has_tweened(): - _trigger_pcam_tween = true + camera_2d.set("physics_interpolation_mode", 0) + #camera_2d.physics_interpolation_mode = Node.PHYSICS_INTERPOLATION_MODE_INHERIT + if get_tree().physics_interpolation: + camera_2d.process_callback = Camera2D.CAMERA2D_PROCESS_PHYSICS # Prevents a warning + else: + camera_2d.process_callback = Camera2D.CAMERA2D_PROCESS_IDLE else: - _trigger_pcam_tween = false + ## NOTE - Only supported in Godot 4.4 or later + if Engine.get_version_info().major == 4 and \ + Engine.get_version_info().minor >= 4: + if get_tree().physics_interpolation or _active_pcam_3d.get_follow_target_physics_based(): + #if get_tree().physics_interpolation or _active_pcam_3d.get_follow_target_physics_based(): + _follow_target_physics_based = true + ## TODO - Temporary solution to support Godot 4.2 + ## Remove line below and uncomment the following once Godot 4.3 is min verison. + camera_3d.call("reset_physics_interpolation") + camera_3d.set("physics_interpolation_mode", 1) + #camera_3d.reset_physics_interpolation() + #camera_3d.physics_interpolation_mode = Node.PHYSICS_INTERPOLATION_MODE_ON + else: + _follow_target_physics_based = false + ## TODO - Temporary solution to support Godot 4.2 + ## Remove line below and uncomment the following once Godot 4.3 is min verison. + camera_3d.set("physics_interpolation_mode", 0) func _find_pcam_with_highest_priority() -> void: for pcam in _pcam_list: + if not pcam.visible: continue # Prevents hidden PCams from becoming active if pcam.get_priority() > _active_pcam_priority: _assign_new_active_pcam(pcam) + pcam.set_tween_skip(self, false) + _active_pcam_missing = false - pcam.set_has_tweened(self, false) - _active_pcam_missing = false +## TODO - For 0.8 release +#func _find_pcam_with_highest_priority() -> void: + #var highest_priority_pcam: Node + #for pcam in _pcam_list: + #if not pcam.visible: continue # Prevents hidden PCams from becoming active + #if pcam.priority > _active_pcam_priority: + #_active_pcam_priority = pcam.priority + #highest_priority_pcam = pcam + #pcam.set_has_tweened(self, false) +# + #_active_pcam_missing = false +# + #if is_instance_valid(highest_priority_pcam): + #_assign_new_active_pcam(highest_priority_pcam) + #else: + #_active_pcam_missing = true -func _process(delta: float): - if _follow_target_physics_based or _active_pcam_missing: return +func _process(delta: float) -> void: + if _active_pcam_missing: return + if not _follow_target_physics_based: _tween_follow_checker(delta) + + if not _has_noise_emitted: return if _is_2D: - _active_pcam_2d_glob_transform = _active_pcam_2d.get_global_transform() + camera_2d.offset += _noise_emitted_output_2d.origin + camera_2d.rotation += _noise_emitted_output_2d.get_rotation() # + _noise_emitted_output_2d.get_rotation() else: - _active_pcam_3d_glob_transform = _active_pcam_3d.get_global_transform() + camera_3d.global_transform *= _noise_emitted_output_3d + _has_noise_emitted = false - if _trigger_pcam_tween: - _pcam_tween(delta) - else: - _pcam_follow(delta) +func _physics_process(delta: float) -> void: + if _active_pcam_missing or not _follow_target_physics_based: return + _tween_follow_checker(delta) -func _physics_process(delta: float): - if not _follow_target_physics_based or _active_pcam_missing: return +func _tween_follow_checker(delta: float) -> void: if _is_2D: - _active_pcam_2d_glob_transform = _active_pcam_2d.get_global_transform() + _active_pcam_2d.process_logic(delta) + _active_pcam_2d_glob_transform = _active_pcam_2d.get_transform_output() + else: + _active_pcam_3d.process_logic(delta) + _active_pcam_3d_glob_transform = _active_pcam_3d.get_transform_output() + + if not _trigger_pcam_tween: + # Rechecks physics target if PCam transitioned with an isntant tween + if _tween_is_instant: + _check_pcam_physics() + _tween_is_instant = false + _pcam_follow(delta) else: - _active_pcam_3d_glob_transform = _active_pcam_3d.get_global_transform() - - if _trigger_pcam_tween: _pcam_tween(delta) + + if _is_2D: + camera_2d.offset = Vector2.ZERO + camera_2d.offset = _active_pcam_2d.get_noise_transform().origin # + _noise_emitted_output_2d.origin + camera_2d.rotation += _active_pcam_2d.get_noise_transform().get_rotation() # + _noise_emitted_output_2d.get_rotation() else: - _pcam_follow(delta) + camera_3d.global_transform *= _active_pcam_3d.get_noise_transform() -func _pcam_follow(delta: float) -> void: +func _pcam_follow(_delta: float) -> void: if _is_2D: if not is_instance_valid(_active_pcam_2d): return else: if not is_instance_valid(_active_pcam_3d): return if _active_pcam_missing or not _is_child_of_camera: return - # When following - _pcam_set_position(delta) - if _viewfinder_needed_check: - _show_viewfinder_in_play() - _viewfinder_needed_check = false - - # TODO - Should be able to find a more efficient way using signals - if Engine.is_editor_hint(): - if not _is_2D: - if _active_pcam_3d.get_camera_3d_resource(): - camera_3d.cull_mask = _active_pcam_3d.get_cull_mask() - camera_3d.h_offset = _active_pcam_3d.get_h_offset() - camera_3d.v_offset = _active_pcam_3d.get_v_offset() - camera_3d.projection = _active_pcam_3d.get_projection() - camera_3d.fov = _active_pcam_3d.get_fov() - camera_3d.size = _active_pcam_3d.get_size() - camera_3d.frustum_offset = _active_pcam_3d.get_frustum_offset() - camera_3d.near = _active_pcam_3d.get_near() - camera_3d.far = _active_pcam_3d.get_far() - - -func _pcam_set_position(delta: float) -> void: if _is_2D: if _active_pcam_2d.snap_to_pixel: var snap_to_pixel_glob_transform: Transform2D = _active_pcam_2d_glob_transform snap_to_pixel_glob_transform.origin = snap_to_pixel_glob_transform.origin.round() camera_2d.global_transform = snap_to_pixel_glob_transform else: - camera_2d.global_transform =_active_pcam_2d_glob_transform + camera_2d.global_transform = _active_pcam_2d_glob_transform camera_2d.zoom = _active_pcam_2d.zoom else: camera_3d.global_transform = _active_pcam_3d_glob_transform + if _viewfinder_needed_check: + _show_viewfinder_in_play() + _viewfinder_needed_check = false -func _pcam_tween(delta: float) -> void: - if _tween_elapsed_time < _tween_duration: - _pcam_tween_properties(delta) - else: # First frame when tweening completes - _tween_elapsed_time = 0 - _trigger_pcam_tween = false - #_show_viewfinder_in_play() # NOTE - Likely not needed - _pcam_follow(delta) + # TODO - Should be able to find a more efficient way using signals + if Engine.is_editor_hint(): + if not _is_2D: + if _active_pcam_3d.camera_3d_resource != null: + camera_3d.cull_mask = _active_pcam_3d.cull_mask + camera_3d.h_offset = _active_pcam_3d.h_offset + camera_3d.v_offset = _active_pcam_3d.v_offset + camera_3d.projection = _active_pcam_3d.projection + camera_3d.fov = _active_pcam_3d.fov + camera_3d.size = _active_pcam_3d.size + camera_3d.frustum_offset = _active_pcam_3d.frustum_offset + camera_3d.near = _active_pcam_3d.near + camera_3d.far = _active_pcam_3d.far + + if _active_pcam_3d.attributes != null: + camera_3d.attributes = _active_pcam_3d.attributes.duplicate() + + if _active_pcam_3d.environment != null: + camera_3d.environment = _active_pcam_3d.environment.duplicate() + + +func _noise_emitted_2d(noise_output: Transform2D) -> void: + _noise_emitted_output_2d = noise_output + _has_noise_emitted = true - if _is_2D: - _active_pcam_2d.update_limit_all_sides() - _active_pcam_2d.tween_completed.emit() - if Engine.is_editor_hint(): - _active_pcam_2d.queue_redraw() - else: - _cam_h_offset_changed = false - _cam_v_offset_changed = false - _cam_fov_changed = false - _cam_size_changed = false - _cam_frustum_offset_changed = false - _cam_near_changed = false - _cam_far_changed = false - _active_pcam_3d.tween_completed.emit() +func _noise_emitted_3d(noise_output: Transform3D) -> void: + _noise_emitted_output_3d = noise_output + _has_noise_emitted = true -func _pcam_tween_properties(delta: float) -> void: +func _pcam_tween(delta: float) -> void: # Run at the first tween frame if _tween_elapsed_time == 0: if _is_2D: @@ -426,6 +704,13 @@ func _pcam_tween_properties(delta: float) -> void: else: _active_pcam_3d.tween_started.emit() + # Forcefully disables physics interpolation when tweens are instant + if _tween_is_instant: + if _is_2D: + camera_2d.set("physics_interpolation_mode", 2) + else: + camera_3d.set("physics_interpolation_mode", 2) + _tween_elapsed_time = min(_tween_duration, _tween_elapsed_time + delta) if _is_2D: @@ -433,9 +718,9 @@ func _pcam_tween_properties(delta: float) -> void: var interpolation_destination: Vector2 = _tween_interpolate_value( _prev_active_pcam_2d_transform.origin, _active_pcam_2d_glob_transform.origin, - _active_pcam_2d.get_tween_duration(), - _active_pcam_2d.get_tween_transition(), - _active_pcam_2d.get_tween_ease() + _active_pcam_2d.tween_duration, + _active_pcam_2d.tween_transition, + _active_pcam_2d.tween_ease ) if _active_pcam_2d.snap_to_pixel: @@ -446,25 +731,25 @@ func _pcam_tween_properties(delta: float) -> void: camera_2d.rotation = _tween_interpolate_value( _prev_active_pcam_2d_transform.get_rotation(), _active_pcam_2d_glob_transform.get_rotation(), - _active_pcam_2d.get_tween_duration(), - _active_pcam_2d.get_tween_transition(), - _active_pcam_2d.get_tween_ease() + _active_pcam_2d.tween_duration, + _active_pcam_2d.tween_transition, + _active_pcam_2d.tween_ease ) camera_2d.zoom = _tween_interpolate_value( _camera_zoom, _active_pcam_2d.zoom, - _active_pcam_2d.get_tween_duration(), - _active_pcam_2d.get_tween_transition(), - _active_pcam_2d.get_tween_ease() + _active_pcam_2d.tween_duration, + _active_pcam_2d.tween_transition, + _active_pcam_2d.tween_ease ) else: _active_pcam_3d.is_tweening.emit() camera_3d.global_position = _tween_interpolate_value( _prev_active_pcam_3d_transform.origin, _active_pcam_3d_glob_transform.origin, - _active_pcam_3d.get_tween_duration(), - _active_pcam_3d.get_tween_transition(), - _active_pcam_3d.get_tween_ease() + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease ) var prev_active_pcam_3d_quat: Quaternion = Quaternion(_prev_active_pcam_3d_transform.basis.orthonormalized()) @@ -473,81 +758,268 @@ func _pcam_tween_properties(delta: float) -> void: prev_active_pcam_3d_quat, \ prev_active_pcam_3d_quat.inverse() * Quaternion(_active_pcam_3d_glob_transform.basis.orthonormalized()), _tween_elapsed_time, \ - _active_pcam_3d.get_tween_duration(), \ - _active_pcam_3d.get_tween_transition(), - _active_pcam_3d.get_tween_ease() + _active_pcam_3d.tween_duration, \ + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease ) + if _cam_attribute_changed: + if _active_pcam_3d.attributes.auto_exposure_enabled: + if _cam_auto_exposure_scale_changed: + camera_3d.attributes.auto_exposure_scale = \ + _tween_interpolate_value( + _prev_cam_auto_exposure_scale, + _active_pcam_3d.attributes.auto_exposure_scale, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + if _cam_auto_exposure_speed_changed: + camera_3d.attributes.auto_exposure_speed = \ + _tween_interpolate_value( + _prev_cam_auto_exposure_scale, + _active_pcam_3d.attributes.auto_exposure_scale, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + + if _cam_attribute_type == 0: # CameraAttributePractical + if _active_pcam_3d.attributes.auto_exposure_enabled: + if _cam_exposure_min_sensitivity_changed: + camera_3d.attributes.auto_exposure_min_sensitivity = \ + _tween_interpolate_value( + _prev_cam_exposure_min_sensitivity, + _active_pcam_3d.attributes.auto_exposure_min_sensitivity, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + if _cam_exposure_max_sensitivity_changed: + camera_3d.attributes.auto_exposure_max_sensitivity = \ + _tween_interpolate_value( + _prev_cam_exposure_max_sensitivity, + _active_pcam_3d.attributes.auto_exposure_max_sensitivity, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + if _cam_dof_blur_amount_changed: + camera_3d.attributes.dof_blur_amount = \ + _tween_interpolate_value( + _prev_cam_dof_blur_amount, + _active_pcam_3d.attributes.dof_blur_amount, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + if _cam_dof_blur_far_distance_changed: + camera_3d.attributes.dof_blur_far_distance = \ + _tween_interpolate_value( + _prev_cam_dof_blur_far_distance, + _active_pcam_3d.attributes.dof_blur_far_distance, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + if _cam_dof_blur_far_transition_changed: + camera_3d.attributes.dof_blur_far_transition = \ + _tween_interpolate_value( + _prev_cam_dof_blur_far_transition, + _active_pcam_3d.attributes.dof_blur_far_transition, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + if _cam_dof_blur_near_distance_changed: + camera_3d.attributes.dof_blur_near_distance = \ + _tween_interpolate_value( + _prev_cam_dof_blur_near_distance, + _active_pcam_3d.attributes.dof_blur_near_distance, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + if _cam_dof_blur_near_transition_changed: + camera_3d.attributes.dof_blur_near_transition = \ + _tween_interpolate_value( + _prev_cam_dof_blur_near_transition, + _active_pcam_3d.attributes.dof_blur_near_transition, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + elif _cam_attribute_type == 1: # CameraAttributePhysical + if _cam_dof_blur_near_transition_changed: + camera_3d.attributes.auto_exposure_max_exposure_value = \ + _tween_interpolate_value( + _prev_cam_exposure_max_exposure_value, + _active_pcam_3d.attributes.auto_exposure_max_exposure_value, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + if _cam_exposure_min_exposure_value_changed: + camera_3d.attributes.auto_exposure_min_exposure_value = \ + _tween_interpolate_value( + _prev_cam_exposure_min_exposure_value, + _active_pcam_3d.attributes.auto_exposure_min_exposure_value, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + if _cam_exposure_aperture_changed: + camera_3d.attributes.exposure_aperture = \ + _tween_interpolate_value( + _prev_cam_exposure_aperture, + _active_pcam_3d.attributes.exposure_aperture, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + if _cam_exposure_shutter_speed_changed: + camera_3d.attributes.exposure_shutter_speed = \ + _tween_interpolate_value( + _prev_cam_exposure_shutter_speed, + _active_pcam_3d.attributes.exposure_shutter_speed, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + if _cam_frustum_far_changed: + camera_3d.attributes.frustum_far = \ + _tween_interpolate_value( + _prev_cam_frustum_far, + _active_pcam_3d.attributes.frustum_far, + _active_pcam_3d.tween_duration(), + _active_pcam_3d.tween_transition(), + _active_pcam_3d.tween_ease + ) + if _cam_frustum_near_changed: + camera_3d.attributes.frustum_near = \ + _tween_interpolate_value( + _prev_cam_frustum_far, + _active_pcam_3d.attributes.frustum_near, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + if _cam_frustum_focal_length_changed: + camera_3d.attributes.frustum_focal_length = \ + _tween_interpolate_value( + _prev_cam_frustum_focal_length, + _active_pcam_3d.attributes.frustum_focal_length, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + if _cam_frustum_focus_distance_changed: + camera_3d.attributes.frustum_focus_distance = \ + _tween_interpolate_value( + _prev_cam_frustum_focus_distance, + _active_pcam_3d.attributes.frustum_focus_distance, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + + if _cam_h_offset_changed: + camera_3d.h_offset = \ + _tween_interpolate_value( + _prev_cam_h_offset, + _active_pcam_3d.h_offset, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + + if _cam_v_offset_changed: + camera_3d.v_offset = \ + _tween_interpolate_value( + _prev_cam_v_offset, + _active_pcam_3d.v_offset, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease + ) + if _cam_fov_changed: camera_3d.fov = \ _tween_interpolate_value( _prev_cam_fov, - _active_pcam_3d.get_fov(), - _active_pcam_3d.get_tween_duration(), - _active_pcam_3d.get_tween_transition(), - _active_pcam_3d.get_tween_ease() + _active_pcam_3d.fov, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease ) if _cam_size_changed: camera_3d.size = \ _tween_interpolate_value( _prev_cam_size, - _active_pcam_3d.get_size(), - _active_pcam_3d.get_tween_duration(), - _active_pcam_3d.get_tween_transition(), - _active_pcam_3d.get_tween_ease() + _active_pcam_3d.size, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease ) if _cam_frustum_offset_changed: camera_3d.frustum_offset = \ _tween_interpolate_value( _prev_cam_frustum_offset, - _active_pcam_3d.get_frustum_offset(), - _active_pcam_3d.get_tween_duration(), - _active_pcam_3d.get_tween_transition(), - _active_pcam_3d.get_tween_ease() + _active_pcam_3d.frustum_offset, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease ) - if _cam_h_offset_changed: - camera_3d.h_offset = \ - _tween_interpolate_value( - _prev_cam_h_offset, - _active_pcam_3d.get_h_offset(), - _active_pcam_3d.get_tween_duration(), - _active_pcam_3d.get_tween_transition(), - _active_pcam_3d.get_tween_ease() - ) - - if _cam_v_offset_changed: - camera_3d.v_offset = \ - _tween_interpolate_value( - _prev_cam_v_offset, - _active_pcam_3d.get_v_offset(), - _active_pcam_3d.get_tween_duration(), - _active_pcam_3d.get_tween_transition(), - _active_pcam_3d.get_tween_ease() - ) if _cam_near_changed: camera_3d.near = \ _tween_interpolate_value( _prev_cam_near, - _active_pcam_3d.get_near(), - _active_pcam_3d.get_tween_duration(), - _active_pcam_3d.get_tween_transition(), - _active_pcam_3d.get_tween_ease() + _active_pcam_3d.near, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease ) if _cam_far_changed: camera_3d.far = \ _tween_interpolate_value( _prev_cam_far, - _active_pcam_3d.get_far(), - _active_pcam_3d.get_tween_duration(), - _active_pcam_3d.get_tween_transition(), - _active_pcam_3d.get_tween_ease() + _active_pcam_3d.far, + _active_pcam_3d.tween_duration, + _active_pcam_3d.tween_transition, + _active_pcam_3d.tween_ease ) + if _tween_elapsed_time < _tween_duration: return + _trigger_pcam_tween = false + _tween_elapsed_time = 0 + if _is_2D: + _active_pcam_2d.update_limit_all_sides() + _active_pcam_2d.tween_completed.emit() + if Engine.is_editor_hint(): + _active_pcam_2d.queue_redraw() + else: + if _active_pcam_3d.attributes != null: + if _cam_attribute_type == 0: + if not _active_pcam_3d.attributes.dof_blur_far_enabled: + camera_3d.attributes.dof_blur_far_enabled = false + if not _active_pcam_3d.attributes.dof_blur_near_enabled: + camera_3d.attributes.dof_blur_near_enabled = false + _cam_h_offset_changed = false + _cam_v_offset_changed = false + _cam_fov_changed = false + _cam_size_changed = false + _cam_frustum_offset_changed = false + _cam_near_changed = false + _cam_far_changed = false + _cam_attribute_changed = false + + _active_pcam_3d.tween_completed.emit() + func _tween_interpolate_value(from: Variant, to: Variant, duration: float, transition_type: int, ease_type: int) -> Variant: return Tween.interpolate_value( @@ -559,11 +1031,6 @@ func _tween_interpolate_value(from: Variant, to: Variant, duration: float, trans ease_type, ) -#endregion - - -#region Public Functions - func _show_viewfinder_in_play() -> void: # Don't show the viewfinder in the actual editor or project builds if Engine.is_editor_hint() or !OS.has_feature("editor"): return @@ -591,6 +1058,9 @@ func _show_viewfinder_in_play() -> void: _viewfinder_node.visible = true _viewfinder_node.update_dead_zone() +#endregion + +#region Public Functions ## Called when a [param PhantomCamera] is added to the scene.[br] ## [b]Note:[/b] This can only be called internally from a @@ -600,7 +1070,8 @@ func pcam_added_to_scene(pcam) -> void: if not _pcam_list.has(pcam): _pcam_list.append(pcam) if not pcam.tween_on_load: - pcam.set_has_tweened(self, true) # Skips its tween if it has the highest priority on load + pcam.set_tween_skip(self, true) # Skips its tween if it has the highest priority on load + if not pcam.is_node_ready(): await pcam.ready _find_pcam_with_highest_priority() else: printerr("This function should only be called from PhantomCamera scripts") @@ -637,7 +1108,7 @@ func pcam_priority_updated(pcam: Node) -> void: if not is_instance_valid(pcam): return - var current_pcam_priority: int = pcam.get_priority() + var current_pcam_priority: int = pcam.priority if current_pcam_priority >= _active_pcam_priority: if _is_2D: @@ -693,6 +1164,14 @@ func get_active_pcam() -> Node: func get_trigger_pcam_tween() -> bool: return _trigger_pcam_tween + +## Refreshes the [param PhantomCamera] list and checks for the highest priority. [br] +## [b]Note:[/b] This should [b]not[/b] be necessary to call manually. +func refresh_pcam_list_priorty() -> void: + _active_pcam_priority = -1 + _find_pcam_with_highest_priority() + + #func set_interpolation_mode(value: int) -> void: #interpolation_mode = value #func get_interpolation_mode() -> int: diff --git a/addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd.uid b/addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd.uid new file mode 100644 index 0000000..2fb1b15 --- /dev/null +++ b/addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd.uid @@ -0,0 +1 @@ +uid://cnchgl1rj5wu3 diff --git a/addons/phantom_camera/scripts/resources/camera_3d_resource.gd.uid b/addons/phantom_camera/scripts/resources/camera_3d_resource.gd.uid new file mode 100644 index 0000000..e53a0fb --- /dev/null +++ b/addons/phantom_camera/scripts/resources/camera_3d_resource.gd.uid @@ -0,0 +1 @@ +uid://dd2v4dcpaj47b diff --git a/addons/phantom_camera/scripts/resources/phantom_camera_noise_2d.gd b/addons/phantom_camera/scripts/resources/phantom_camera_noise_2d.gd new file mode 100644 index 0000000..cc87dba --- /dev/null +++ b/addons/phantom_camera/scripts/resources/phantom_camera_noise_2d.gd @@ -0,0 +1,228 @@ +@tool +@icon("res://addons/phantom_camera/icons/phantom_camera_noise_resource.svg") +class_name PhantomCameraNoise2D +extends Resource + +## A resource type used to apply noise, or shake, to [Camera2D]s that have a [PhantomCameraHost] as a child. +## +## Is a resource type that defines, calculates and outputs the noise values to a [Camera2D] through active +## [PhantomCamera3D].[br] +## It can be applied to either [PhantomCameraNoiseEmitter2D] or a [PhantomCamera2D] noise property directly + +#region Exported Properties + +## Defines the size of the noise pattern.[br] +## Higher values will increase the range the noise can reach. +@export_range(0, 1000, 0.001, "or_greater") var amplitude: float = 10: + set = set_amplitude, + get = get_amplitude + +## Sets the density of the noise pattern.[br] +## Higher values will result in more erratic noise. +@export_range(0, 10, 0.001, "or_greater") var frequency: float = 0.5: + set = set_frequency, + get = get_frequency + +## If true, randomizes the noise pattern every time the noise is run.[br] +## If disabled, [member seed] can be used to define a fixed noise pattern. +@export var randomize_noise_seed: bool = true: + set = set_randomize_noise_seed, + get = get_randomize_noise_seed + +## Sets a predetermined seed noise value.[br] +## Useful if wanting to achieve a persistent noise pattern every time the noise is emitted. +@export var noise_seed: int = 0: + set = set_noise_seed, + get = get_noise_seed + +## Enables noise changes to the [member Camera2D.offset] position. +@export var positional_noise: bool = true: + set = set_positional_noise, + get = get_positional_noise + +## Enables noise changes to the [Camera2D]'s rotation. +@export var rotational_noise: bool = false: + set = set_rotational_noise, + get = get_rotational_noise + +@export_group("Positional Multiplier") +## Multiplies positional noise amount in the X-axis.[br] +## Set the value to [param 0] to disable noise in the axis. +@export_range(0, 1, 0.001, "or_greater") var positional_multiplier_x: float = 1: + set = set_positional_multiplier_x, + get = get_positional_multiplier_x + +## Multiplies positional noise amount in the Y-axis.[br] +## Set the value to [param 0] to disable noise in the axis. +@export_range(0, 1, 0.001, "or_greater") var positional_multiplier_y: float = 1: + set = set_positional_multiplier_y, + get = get_positional_multiplier_y + +@export_group("Rotational Multiplier") +## Multiplies rotational noise amount. +@export_range(0, 1, 0.001, "or_greater") var rotational_multiplier: float = 1: + set = set_rotational_multiplier, + get = get_rotational_multiplier + +#endregion + +#region Private Variables + +var _noise_algorithm: FastNoiseLite = FastNoiseLite.new() + +var _noise_positional_multiplier: Vector2 = Vector2( + positional_multiplier_x, + positional_multiplier_y +) + +var _trauma: float = 0.0: + set(value): + _trauma = value + +var _noise_time: float = 0.0 + +#endregion + +#region Private Functions + +func _init(): + _noise_algorithm.noise_type = FastNoiseLite.TYPE_PERLIN + if randomize_noise_seed: _noise_algorithm.seed = randi() + _noise_algorithm.frequency = frequency + + +func _validate_property(property: Dictionary) -> void: + if randomize_noise_seed and property.name == "noise_seed": + property.usage = PROPERTY_USAGE_NO_EDITOR + + if not rotational_noise and property.name == "rotational_multiplier": + property.usage = PROPERTY_USAGE_NO_EDITOR + + if not positional_noise: + match property.name: + "positional_multiplier_x", \ + "positional_multiplier_y": + property.usage = PROPERTY_USAGE_NO_EDITOR + + +func _get_noise_from_seed(noise_seed: int) -> float: + return _noise_algorithm.get_noise_2d(noise_seed, _noise_time) * amplitude + + +func set_trauma(value: float) -> void: + _trauma = value + +#endregion + +#region Public Functions + +func get_noise_transform(delta: float) -> Transform2D: + var output_position: Vector2 = Vector2.ZERO + var output_rotation: float = 0.0 + _noise_time += delta + _trauma = maxf(_trauma, 0.0) + + if positional_noise: + for i in 2: + output_position[i] = _noise_positional_multiplier[i] * pow(_trauma, 2) * _get_noise_from_seed(i + noise_seed) + if rotational_noise: + output_rotation = rotational_multiplier / 100 * pow(_trauma, 2) * _get_noise_from_seed(noise_seed) + + return Transform2D(output_rotation, output_position) + + +func reset_noise_time() -> void: + _noise_time = 0 + +#endregion + +#region Setters & Getters + +## Sets the [member amplitude] value. +func set_amplitude(value: float) -> void: + amplitude =value + +## Returns the [member amplitude] value. +func get_amplitude() -> float: + return amplitude + + +## Sets the [member frequency] value. +func set_frequency(value: float) -> void: + frequency = value + _noise_algorithm.frequency = value + +## Returns the [member frequency] value. +func get_frequency() -> float: + return frequency + + +## Sets the [member randomize_seed] value. +func set_randomize_noise_seed(value: int) -> void: + randomize_noise_seed = value + if value: _noise_algorithm.seed = randi() + notify_property_list_changed() + +## Returns the [member randomize_seed] value. +func get_randomize_noise_seed() -> int: + return randomize_noise_seed + + +## Sets the [member randomize_seed] value. +func set_noise_seed(value: int) -> void: + noise_seed = value + +## Returns the [member seed] value. +func get_noise_seed() -> int: + return noise_seed + + +## Sets the [member positional_noise] value. +func set_positional_noise(value: bool) -> void: + positional_noise = value + notify_property_list_changed() + +## Returns the [member positional_noise] value. +func get_positional_noise() -> bool: + return positional_noise + + +## Sets the [member rotational_noise] value. +func set_rotational_noise(value: bool) -> void: + rotational_noise = value + notify_property_list_changed() + +## Returns the [member rotational_noise] value. +func get_rotational_noise() -> bool: + return rotational_noise + + +## Sets the [member positional_multiplier_x] value. +func set_positional_multiplier_x(value: float) -> void: + positional_multiplier_x = value + _noise_positional_multiplier.x = value + +## Returns the [member positional_multiplier_x] value. +func get_positional_multiplier_x() -> float: + return positional_multiplier_x + + +## Sets the [member positional_multiplier_y] value. +func set_positional_multiplier_y(value: float) -> void: + positional_multiplier_y = value + _noise_positional_multiplier.y = value + +## Returns the [member positional_multiplier_y] value. +func get_positional_multiplier_y() -> float: + return positional_multiplier_y + + +## Sets the [member rotational_multiplier] value. +func set_rotational_multiplier(value: float) -> void: + rotational_multiplier = value + +## Returns the [member rotational_multiplier] value. +func get_rotational_multiplier() -> float: + return rotational_multiplier + +#endregion diff --git a/addons/phantom_camera/scripts/resources/phantom_camera_noise_2d.gd.uid b/addons/phantom_camera/scripts/resources/phantom_camera_noise_2d.gd.uid new file mode 100644 index 0000000..444ab23 --- /dev/null +++ b/addons/phantom_camera/scripts/resources/phantom_camera_noise_2d.gd.uid @@ -0,0 +1 @@ +uid://cuqo27utt645a diff --git a/addons/phantom_camera/scripts/resources/phantom_camera_noise_3d.gd b/addons/phantom_camera/scripts/resources/phantom_camera_noise_3d.gd new file mode 100644 index 0000000..6cf840f --- /dev/null +++ b/addons/phantom_camera/scripts/resources/phantom_camera_noise_3d.gd @@ -0,0 +1,301 @@ +@tool +@icon("res://addons/phantom_camera/icons/phantom_camera_noise_resource.svg") +class_name PhantomCameraNoise3D +extends Resource + +## A resource type used to apply noise, or shake, to [Camera3D]s that have a [PhantomCameraHost] as a child. +## +## Is a resource type that defines, calculates and outputs the noise values to a [Camera3D] through active +## [PhantomCamera3D].[br] +## It can be applied to either [PhantomCameraNoiseEmitter3D] or a [PhantomCamera3D] noise property directly + +#region Exported Properties + +## Defines the size of the noise pattern.[br] +## Higher values will increase the range the noise can reach. +@export_range(0, 100, 0.001, "or_greater") var amplitude: float = 10: + set = set_amplitude, + get = get_amplitude + +## Sets the density of the noise pattern.[br] +## Higher values will result in more erratic noise. +@export_range(0, 10, 0.001, "or_greater") var frequency: float = 0.2: + set = set_frequency, + get = get_frequency + +## If true, randomizes the noise pattern every time the noise is run.[br] +## If disabled, [member seed] can be used to define a fixed noise pattern. +@export var randomize_noise_seed: bool = true: + set = set_randomize_noise_seed, + get = get_randomize_noise_seed + +## Sets a predetermined seed noise value.[br] +## Useful if wanting to achieve a persistent noise pattern every time the noise is emitted. +@export var noise_seed: int = 0: + set = set_noise_seed, + get = get_noise_seed + +## Enables noise changes to the [Camera3D]'s rotation. +@export var rotational_noise: bool = true: + set = set_rotational_noise, + get = get_rotational_noise + +## Enables noise changes to the camera's position.[br][br] +## [b]Important[/b][br]This can cause geometry clipping if the camera gets too close while this is active. +@export var positional_noise: bool = false: + set = set_positional_noise, + get = get_positional_noise + +@export_group("Rotational Multiplier") +## Multiplies rotational noise amount in the X-axis.[br] +## Set the value to [param 0] to disable noise in the axis. +@export_range(0, 1, 0.001, "or_greater") var rotational_multiplier_x: float = 1: + set = set_rotational_multiplier_x, + get = get_rotational_multiplier_x + +## Multiplies rotational noise amount in the Y-axis.[br] +## Set the value to [param 0] to disable noise in the axis. +@export_range(0, 1, 0.001, "or_greater") var rotational_multiplier_y: float = 1: + set = set_rotational_multiplier_y, + get = get_rotational_multiplier_y + +## Multiplies rotational noise amount in the Z-axis.[br] +## Set the value to [param 0] to disable noise in the axis. +@export_range(0, 1, 0.001, "or_greater") var rotational_multiplier_z: float = 1: + set = set_rotational_multiplier_z, + get = get_rotational_multiplier_z + +@export_group("Positional Multiplier") +## Multiplies positional noise amount in the X-axis.[br] +## Set the value to [param 0] to disable noise in the axis.[br] +## [b]Note:[/b] Rotational Offset is recommended to avoid potential camera clipping with the environment. +@export_range(0, 1, 0.001, "or_greater") var positional_multiplier_x: float = 1: + set = set_positional_multiplier_x, + get = get_positional_multiplier_x + +## Multiplies positional noise amount in the Y-axis.[br] +## Set the value to [param 0] to disable noise in the axis.[br] +## [b]Note:[/b] Rotational Offset is recommended to avoid potential camera clipping with the environment. +@export_range(0, 1, 0.001, "or_greater") var positional_multiplier_y: float = 1: + set = set_positional_multiplier_y, + get = get_positional_multiplier_y + +## Multiplies positional noise amount in the Z-axis.[br] +## Set the value to [param 0] to disable noise in the axis.[br] +## [b]Note:[/b] Rotational Offset is recommended to avoid potential camera clipping with the environment. +@export_range(0, 1, 0.001, "or_greater") var positional_multiplier_z: float = 1: + set = set_positional_multiplier_z, + get = get_positional_multiplier_z + +#endregion + +#region Private Variables + +var _noise_algorithm: FastNoiseLite = FastNoiseLite.new() + +var _noise_rotational_multiplier: Vector3 = Vector3( + rotational_multiplier_x, + rotational_multiplier_y, + rotational_multiplier_z, +) + +var _noise_positional_multiplier: Vector3 = Vector3( + positional_multiplier_x, + positional_multiplier_y, + positional_multiplier_z, +) + +var _trauma: float = 0.0: + set(value): + _trauma = value + if _trauma == 0.0: + _noise_time = 0.0 + +var _noise_time: float = 0.0 + +#endregion + +#region Private Functions + +func _init(): + _noise_algorithm.noise_type = FastNoiseLite.TYPE_PERLIN + + if randomize_noise_seed: _noise_algorithm.seed = randi() + _noise_algorithm.frequency = frequency + + +func _validate_property(property: Dictionary) -> void: + if randomize_noise_seed and property.name == "noise_seed": + property.usage = PROPERTY_USAGE_NO_EDITOR + + if not rotational_noise: + match property.name: + "rotational_multiplier_x", \ + "rotational_multiplier_y", \ + "rotational_multiplier_z": + property.usage = PROPERTY_USAGE_NO_EDITOR + + if not positional_noise: + match property.name: + "positional_multiplier_x", \ + "positional_multiplier_y", \ + "positional_multiplier_z": + property.usage = PROPERTY_USAGE_NO_EDITOR + + +func _get_noise_from_seed(noise_seed: int) -> float: + return _noise_algorithm.get_noise_2d(noise_seed, _noise_time) * amplitude + + +func set_trauma(value: float) -> void: + _trauma = value + +#endregion + +#region Public Functions + +func get_noise_transform(delta: float) -> Transform3D: + var output_rotation: Vector3 = Vector3.ZERO + var output_position: Vector3 = Vector3.ZERO + _noise_time += delta + _trauma = maxf(_trauma, 0.0) + + for i in 3: + if rotational_noise: + output_rotation[i] = deg_to_rad( + _noise_rotational_multiplier[i] * pow(_trauma, 2) * _get_noise_from_seed(i + noise_seed) + ) + + if positional_noise: + output_position[i] += _noise_positional_multiplier[i] / 10 * \ + pow(_trauma, 2) * _get_noise_from_seed(i + noise_seed) + + return Transform3D(Quaternion.from_euler(output_rotation), output_position) + + +func reset_noise_time() -> void: + _noise_time = 0 + +#endregion + +#region Setters & Getters + +## Sets the [member amplitude] value. +func set_amplitude(value: float) -> void: + amplitude =value + +## Returns the [member amplitude] value. +func get_amplitude() -> float: + return amplitude + + +## Sets the [member frequency] value. +func set_frequency(value: float) -> void: + frequency = value + _noise_algorithm.frequency = value + +## Returns the [member frequency] value. +func get_frequency() -> float: + return frequency + + +## Sets the [member randomize_seed] value. +func set_randomize_noise_seed(value: int) -> void: + randomize_noise_seed = value + if value: _noise_algorithm.seed = randi() + notify_property_list_changed() + +## Returns the [member randomize_seed] value. +func get_randomize_noise_seed() -> int: + return randomize_noise_seed + + +## Sets the [member randomize_seed] value. +func set_noise_seed(value: int) -> void: + noise_seed = value + +## Returns the [member seed] value. +func get_noise_seed() -> int: + return noise_seed + + +## Sets the [member positional_noise] value. +func set_positional_noise(value: bool) -> void: + positional_noise = value + notify_property_list_changed() + +## Returns the [member positional_noise] value. +func get_positional_noise() -> bool: + return positional_noise + + +## Sets the [member rotational_noise] value. +func set_rotational_noise(value: bool) -> void: + rotational_noise = value + notify_property_list_changed() + +## Returns the [member rotational_noise] value. +func get_rotational_noise() -> bool: + return rotational_noise + + +## Sets the [member positional_multiplier_x] value. +func set_positional_multiplier_x(value: float) -> void: + positional_multiplier_x = value + _noise_positional_multiplier.x = value + +## Returns the [member positional_multiplier_x] value. +func get_positional_multiplier_x() -> float: + return positional_multiplier_x + + +## Sets the [member positional_multiplier_y] value. +func set_positional_multiplier_y(value: float) -> void: + positional_multiplier_y = value + _noise_positional_multiplier.y = value + +## Returns the [member positional_multiplier_y] value. +func get_positional_multiplier_y() -> float: + return positional_multiplier_y + + +## Sets the [member positional_multiplier_z] value. +func set_positional_multiplier_z(value: float) -> void: + positional_multiplier_z = value + _noise_positional_multiplier.z = value + +## Returns the [member positional_multiplier_z] value. +func get_positional_multiplier_z() -> float: + return positional_multiplier_z + + +## Sets the [member rotational_multiplier_x] value. +func set_rotational_multiplier_x(value: float) -> void: + rotational_multiplier_x = value + _noise_rotational_multiplier.x = value + +## Returns the [member rotational_multiplier_x] value. +func get_rotational_multiplier_x() -> float: + return rotational_multiplier_x + + +## Sets the [member rotational_multiplier_y] value. +func set_rotational_multiplier_y(value: float) -> void: + rotational_multiplier_y = value + _noise_rotational_multiplier.y = value + +## Returns the [member rotational_multiplier_y] value. +func get_rotational_multiplier_y() -> float: + return rotational_multiplier_y + + +## Sets the [member rotational_multiplier_z] value. +func set_rotational_multiplier_z(value: float) -> void: + rotational_multiplier_z = value + _noise_rotational_multiplier.z = value + +## Returns the [member rotational_multiplier_z] value. +func get_rotational_multiplier_z() -> float: + return rotational_multiplier_z + + #endregion diff --git a/addons/phantom_camera/scripts/resources/phantom_camera_noise_3d.gd.uid b/addons/phantom_camera/scripts/resources/phantom_camera_noise_3d.gd.uid new file mode 100644 index 0000000..30654b8 --- /dev/null +++ b/addons/phantom_camera/scripts/resources/phantom_camera_noise_3d.gd.uid @@ -0,0 +1 @@ +uid://b2bewtm8tt7ne diff --git a/addons/phantom_camera/scripts/resources/tween_resource.gd.uid b/addons/phantom_camera/scripts/resources/tween_resource.gd.uid new file mode 100644 index 0000000..694bce7 --- /dev/null +++ b/addons/phantom_camera/scripts/resources/tween_resource.gd.uid @@ -0,0 +1 @@ +uid://p5nds274fd3w diff --git a/addons/save_system/plugin_save_system.gd.uid b/addons/save_system/plugin_save_system.gd.uid new file mode 100644 index 0000000..bbd354b --- /dev/null +++ b/addons/save_system/plugin_save_system.gd.uid @@ -0,0 +1 @@ +uid://dwek6054ld8kx diff --git a/addons/save_system/save_system.gd.uid b/addons/save_system/save_system.gd.uid new file mode 100644 index 0000000..484c0f4 --- /dev/null +++ b/addons/save_system/save_system.gd.uid @@ -0,0 +1 @@ +uid://cha22mm6xirll diff --git a/addons/save_system/save_system_test/save_system_test.gd.uid b/addons/save_system/save_system_test/save_system_test.gd.uid new file mode 100644 index 0000000..92c0aea --- /dev/null +++ b/addons/save_system/save_system_test/save_system_test.gd.uid @@ -0,0 +1 @@ +uid://m1ru50i8xl3l diff --git a/addons/save_system/save_system_test/save_system_test_resource.gd.uid b/addons/save_system/save_system_test/save_system_test_resource.gd.uid new file mode 100644 index 0000000..2777c48 --- /dev/null +++ b/addons/save_system/save_system_test/save_system_test_resource.gd.uid @@ -0,0 +1 @@ +uid://c3fdpim6xnpfx diff --git a/addons/save_system/save_system_test/save_system_test_subresource.gd.uid b/addons/save_system/save_system_test/save_system_test_subresource.gd.uid new file mode 100644 index 0000000..c58eee3 --- /dev/null +++ b/addons/save_system/save_system_test/save_system_test_subresource.gd.uid @@ -0,0 +1 @@ +uid://wugxwqk5h3yb diff --git a/addons/scene_manager/Dissolve2d.gdshader.uid b/addons/scene_manager/Dissolve2d.gdshader.uid new file mode 100644 index 0000000..32e6076 --- /dev/null +++ b/addons/scene_manager/Dissolve2d.gdshader.uid @@ -0,0 +1 @@ +uid://3a2kr7wshlbh diff --git a/addons/scene_manager/LICENSE b/addons/scene_manager/LICENSE deleted file mode 100644 index 9665923..0000000 --- a/addons/scene_manager/LICENSE +++ /dev/null @@ -1,9 +0,0 @@ -The MIT License (MIT) - -Copyright © 2021 GlassBrick - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/addons/scene_manager/NodeFlagsInspectorPlugin.gd b/addons/scene_manager/NodeFlagsInspectorPlugin.gd index b848eb2..3313a1f 100644 --- a/addons/scene_manager/NodeFlagsInspectorPlugin.gd +++ b/addons/scene_manager/NodeFlagsInspectorPlugin.gd @@ -4,7 +4,7 @@ var SingletonCheckProperty = load('res://addons/scene_manager/SingletonCheckProp var SingletonNameProperty = load('res://addons/scene_manager/SingletonNameProperty.gd') -func _can_handle(object: Variant): +func _can_handle(object: Object) -> bool: return object is Node diff --git a/addons/scene_manager/NodeFlagsInspectorPlugin.gd.uid b/addons/scene_manager/NodeFlagsInspectorPlugin.gd.uid new file mode 100644 index 0000000..2b09fa1 --- /dev/null +++ b/addons/scene_manager/NodeFlagsInspectorPlugin.gd.uid @@ -0,0 +1 @@ +uid://bhpt3n7somycn diff --git a/addons/scene_manager/README.md b/addons/scene_manager/README.md deleted file mode 100644 index b99e74d..0000000 --- a/addons/scene_manager/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Godot Scene Manager - -![Logo](/logo.png) - -Plugin for managing transitions and Node references between scenes. Expect more features to be added in the future! - -![Demonstration of Shader Fades](/scene_manager_demo.gif) - ---- - -All the README info has been moved to the new wiki! - -- [Wiki](https://github.com/glass-brick/Scene-Manager/wiki) - - [Getting Started](https://github.com/glass-brick/Scene-Manager/wiki/Getting-started) - - [Features](https://github.com/glass-brick/Scene-Manager/wiki/Features) - - [API docs]() diff --git a/addons/scene_manager/SceneManager.gd b/addons/scene_manager/SceneManager.gd index df09009..34dc551 100644 --- a/addons/scene_manager/SceneManager.gd +++ b/addons/scene_manager/SceneManager.gd @@ -98,7 +98,7 @@ func _process(_delta: float) -> void: _previous_scene = _tree.current_scene func change_scene(path: Variant, setted_options: Dictionary = {}) -> void: - assert(path == null or path is String, 'Path must be a string') + assert(path == null or path is String or path is PackedScene, 'Path must be a string or a PackedScene') var options = _get_final_options(setted_options) if not options["skip_fade_out"]: await fade_out(setted_options) @@ -120,13 +120,13 @@ func _reload_scene() -> void: _current_scene = _tree.current_scene func fade_in_place(setted_options: Dictionary = {}) -> void: - setted_options["no_scene_change"] = true + setted_options["skip_scene_change"] = true await change_scene(null, setted_options) -func _replace_scene(path: String, options: Dictionary) -> void: +func _replace_scene(path: Variant, options: Dictionary) -> void: _current_scene.queue_free() scene_unloaded.emit() - var following_scene: PackedScene = ResourceLoader.load(path, "PackedScene", 0) + var following_scene: PackedScene = _load_scene_resource(path) _current_scene = following_scene.instantiate() _current_scene.tree_entered.connect(options["on_tree_enter"].bind(_current_scene)) _current_scene.ready.connect(options["on_ready"].bind(_current_scene)) @@ -134,6 +134,11 @@ func _replace_scene(path: String, options: Dictionary) -> void: _root.add_child(_current_scene) _tree.set_current_scene(_current_scene) +func _load_scene_resource(path: Variant) -> Resource: + if path is PackedScene: + return path + return ResourceLoader.load(path, "PackedScene", 0) + func fade_out(setted_options: Dictionary= {}) -> void: var options = _get_final_options(setted_options) is_transitioning = true diff --git a/addons/scene_manager/SceneManager.gd.uid b/addons/scene_manager/SceneManager.gd.uid new file mode 100644 index 0000000..323e747 --- /dev/null +++ b/addons/scene_manager/SceneManager.gd.uid @@ -0,0 +1 @@ +uid://duwg1qpxqtora diff --git a/addons/scene_manager/SceneManager.tscn b/addons/scene_manager/SceneManager.tscn index 9a96c7b..acb0168 100644 --- a/addons/scene_manager/SceneManager.tscn +++ b/addons/scene_manager/SceneManager.tscn @@ -1,27 +1,35 @@ -[gd_scene load_steps=5 format=3 uid="uid://j20v4cg7v8m1"] +[gd_scene load_steps=6 format=3 uid="uid://j20v4cg7v8m1"] -[ext_resource type="Script" path="res://addons/scene_manager/SceneManager.gd" id="1_22br8"] -[ext_resource type="Shader" path="res://addons/scene_manager/Dissolve2d.gdshader" id="2_853wq"] +[ext_resource type="Script" uid="uid://duwg1qpxqtora" path="res://addons/scene_manager/SceneManager.gd" id="1_22br8"] +[ext_resource type="Shader" uid="uid://3a2kr7wshlbh" path="res://addons/scene_manager/Dissolve2d.gdshader" id="2_853wq"] [ext_resource type="Animation" uid="uid://dxr1r78uxitcq" path="res://addons/scene_manager/ShaderFade.tres" id="5_anecj"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_0imdi"] -shader = ExtResource( "2_853wq" ) +shader = ExtResource("2_853wq") shader_parameter/dissolve_amount = 0.0 shader_parameter/fade_color = Color(0, 0, 0, 1) -shader_parameter/fade = null -shader_parameter/inverted = null +shader_parameter/fade = false +shader_parameter/inverted = false + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_bdiyj"] +_data = { +&"ShaderFade": ExtResource("5_anecj") +} [node name="SceneManager" type="Node2D"] -script = ExtResource( "1_22br8" ) +script = ExtResource("1_22br8") [node name="CanvasLayer" type="CanvasLayer" parent="."] layer = 3 [node name="ColorRect" type="ColorRect" parent="CanvasLayer"] -material = SubResource( "ShaderMaterial_0imdi" ) +material = SubResource("ShaderMaterial_0imdi") +anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 mouse_filter = 2 [node name="AnimationPlayer" type="AnimationPlayer" parent="."] -anims/ShaderFade = ExtResource( "5_anecj" ) +libraries = { +&"": SubResource("AnimationLibrary_bdiyj") +} diff --git a/addons/scene_manager/SceneManagerConstants.gd.uid b/addons/scene_manager/SceneManagerConstants.gd.uid new file mode 100644 index 0000000..6861a78 --- /dev/null +++ b/addons/scene_manager/SceneManagerConstants.gd.uid @@ -0,0 +1 @@ +uid://bc22b8bkcvwui diff --git a/addons/scene_manager/SceneManagerPlugin.gd.uid b/addons/scene_manager/SceneManagerPlugin.gd.uid new file mode 100644 index 0000000..bac37f3 --- /dev/null +++ b/addons/scene_manager/SceneManagerPlugin.gd.uid @@ -0,0 +1 @@ +uid://bh0jt2lnuuumc diff --git a/addons/scene_manager/SingletonCheckProperty.gd.uid b/addons/scene_manager/SingletonCheckProperty.gd.uid new file mode 100644 index 0000000..590b870 --- /dev/null +++ b/addons/scene_manager/SingletonCheckProperty.gd.uid @@ -0,0 +1 @@ +uid://2tcteb2i71wj diff --git a/addons/scene_manager/SingletonNameProperty.gd.uid b/addons/scene_manager/SingletonNameProperty.gd.uid new file mode 100644 index 0000000..5dae170 --- /dev/null +++ b/addons/scene_manager/SingletonNameProperty.gd.uid @@ -0,0 +1 @@ +uid://bp0or4a1m7exs diff --git a/addons/scene_manager/plugin.cfg b/addons/scene_manager/plugin.cfg index 28388cc..87afdc2 100644 --- a/addons/scene_manager/plugin.cfg +++ b/addons/scene_manager/plugin.cfg @@ -3,5 +3,5 @@ name="Scene Manager" description="Scene Manager" author="GlassBrick" -version="1.0.1" +version="1.1.1" script="SceneManagerPlugin.gd" diff --git a/addons/script-ide/Popup.gd.uid b/addons/script-ide/Popup.gd.uid new file mode 100644 index 0000000..e443dae --- /dev/null +++ b/addons/script-ide/Popup.gd.uid @@ -0,0 +1 @@ +uid://bc5lev5pxek3p diff --git a/addons/script-ide/plugin.gd.uid b/addons/script-ide/plugin.gd.uid new file mode 100644 index 0000000..4c954c3 --- /dev/null +++ b/addons/script-ide/plugin.gd.uid @@ -0,0 +1 @@ +uid://bt8kmdymyokoe diff --git a/assets/resources/save_resource.gd.uid b/assets/resources/save_resource.gd.uid new file mode 100644 index 0000000..93b1375 --- /dev/null +++ b/assets/resources/save_resource.gd.uid @@ -0,0 +1 @@ +uid://lqen07q05vbw diff --git a/assets/resources/save_resource.tres b/assets/resources/save_resource.tres index 0e4e2d0..f1f9b0c 100644 --- a/assets/resources/save_resource.tres +++ b/assets/resources/save_resource.tres @@ -1,6 +1,6 @@ [gd_resource type="Resource" script_class="SaveResource" load_steps=2 format=3 uid="uid://ci0v1u7i67vvu"] -[ext_resource type="Script" path="res://assets/resources/save_resource.gd" id="1_ohq41"] +[ext_resource type="Script" uid="uid://lqen07q05vbw" path="res://assets/resources/save_resource.gd" id="1_ohq41"] [resource] script = ExtResource("1_ohq41") diff --git a/i18n/en.po b/i18n/en.po new file mode 100644 index 0000000..e69de29 diff --git a/i18n/es_ES.po b/i18n/es_ES.po new file mode 100644 index 0000000..e69de29 diff --git a/i18n/es_MX.po b/i18n/es_MX.po new file mode 100644 index 0000000..e69de29 diff --git a/objects/item_protoset.json b/objects/item_protoset.json new file mode 100644 index 0000000..02f2db4 --- /dev/null +++ b/objects/item_protoset.json @@ -0,0 +1,21 @@ +{ + "deck_of_cards": { + "stack_size": 52, + "max_stack_size": 52 + }, + + "base_item": { + "description": "An example item used as a base to create other items.", + "_comment": "Stack Based Inventory", + "stack_size": 10, + "weight": 1.0, + }, + + "grid_item": { + "description": "An example item used as a base to create other items.", + "image": "res://assets/textures/book.png", + "_comment": "Grid Based Inventory", + "width": 2, + "height": 2, + }, +} diff --git a/objects/item_protoset.tres b/objects/item_protoset.tres new file mode 100644 index 0000000..2c2fe28 --- /dev/null +++ b/objects/item_protoset.tres @@ -0,0 +1,3 @@ +[gd_resource type="Resource" format=3 uid="uid://djhhxwo6oave4"] + +[resource] diff --git a/project.godot b/project.godot index dcc77e3..3e41063 100644 --- a/project.godot +++ b/project.godot @@ -11,22 +11,27 @@ config_version=5 [application] config/name="RPG template" -run/main_scene="res://scenes/main_level.tscn" -config/features=PackedStringArray("4.3", "Forward Plus") +run/main_scene="res://scenes/level/main_level.tscn" +config/features=PackedStringArray("4.4", "Forward Plus") config/icon="res://icon.svg" [autoload] Constants="*res://scripts/constants.gd" SaveSystem="*res://addons/save_system/save_system.gd" -SceneManager="*res://addons/scene_manager/SceneManager.tscn" PhantomCameraManager="*res://addons/phantom_camera/scripts/managers/phantom_camera_manager.gd" +SceneManager="*res://addons/scene_manager/SceneManager.tscn" +Events="*res://scripts/events.gd" Globals="*res://scripts/globals.gd" [editor_plugins] enabled=PackedStringArray("res://addons/gloot/plugin.cfg", "res://addons/label_font_auto_sizer/plugin.cfg", "res://addons/phantom_camera/plugin.cfg", "res://addons/save_system/plugin.cfg", "res://addons/scene_manager/plugin.cfg", "res://addons/script-ide/plugin.cfg") +[gloot] + +inspector_control_height=200 + [input] ui_left={ @@ -74,6 +79,10 @@ ui_inventory={ ] } +[internationalization] + +locale/translations=PackedStringArray("res://i18n/en.po", "res://i18n/es_ES.po", "res://i18n/es_MX.po") + [rendering] textures/canvas_textures/default_texture_filter=0 diff --git a/scenes/components/item_protoset.json b/scenes/components/item_protoset.json deleted file mode 100644 index 41b2bff..0000000 --- a/scenes/components/item_protoset.json +++ /dev/null @@ -1,15 +0,0 @@ -[ - { - "id": "base_item", - "name": "Base Item", - "description": "An example item used as a base to create other items.", - - "_comment": "Stack Based Inventory", - "stack_size": 10, - "weight": 1.0, - - "_comment": "Grid Based Inventory", - "width": 2, - "height": 2, - } -] diff --git a/scenes/components/item_protoset.tres b/scenes/components/item_protoset.tres deleted file mode 100644 index 5011df7..0000000 --- a/scenes/components/item_protoset.tres +++ /dev/null @@ -1,18 +0,0 @@ -[gd_resource type="Resource" script_class="ItemProtoset" load_steps=2 format=3 uid="uid://djhhxwo6oave4"] - -[ext_resource type="Script" path="res://addons/gloot/core/item_protoset.gd" id="1_gt6d6"] - -[resource] -script = ExtResource("1_gt6d6") -json_data = "[ - { - \"_comment\": \"Grid Based Inventory\", - \"description\": \"An example item used as a base to create other items.\", - \"height\": 2, - \"id\": \"base_item\", - \"name\": \"Base Item\", - \"stack_size\": 10, - \"weight\": 1, - \"width\": 2 - } -]" diff --git a/scenes/elements/door_scene_manager.tscn b/scenes/elements/door_scene_manager.tscn index 929c15d..8075e34 100644 --- a/scenes/elements/door_scene_manager.tscn +++ b/scenes/elements/door_scene_manager.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=3 format=3 uid="uid://da1uex028xkv1"] -[ext_resource type="Script" path="res://scripts/door_scene_manager.gd" id="1_ph76m"] +[ext_resource type="Script" uid="uid://b5wo0m62qrv44" path="res://scripts/door_scene_manager.gd" id="1_ph76m"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_sglud"] size = Vector2(14, 20) diff --git a/scenes/elements/player.tscn b/scenes/elements/player.tscn index c83d6c0..d0c164f 100644 --- a/scenes/elements/player.tscn +++ b/scenes/elements/player.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=4 format=3 uid="uid://k76535tjepm3"] -[ext_resource type="Script" path="res://scripts/player.gd" id="1_1webx"] +[ext_resource type="Script" uid="uid://dx15rxub22ius" path="res://scripts/player.gd" id="1_1webx"] [ext_resource type="SpriteFrames" uid="uid://dum0mxk5oajvu" path="res://assets/animations/player_animation.tres" id="1_qf5ok"] [sub_resource type="CapsuleShape2D" id="CapsuleShape2D_geqid"] diff --git a/scenes/house_template.tscn b/scenes/level/house_template.tscn similarity index 99% rename from scenes/house_template.tscn rename to scenes/level/house_template.tscn index 099334c..aebf67b 100644 --- a/scenes/house_template.tscn +++ b/scenes/level/house_template.tscn @@ -1,13 +1,13 @@ [gd_scene load_steps=8 format=4 uid="uid://bk4h1frr4r8tq"] -[ext_resource type="Script" path="res://scripts/house_template.gd" id="1_1vs50"] -[ext_resource type="Texture2D" uid="uid://d4j4ulftsvn5c" path="res://assets/textures/Inner.png" id="1_w2ggh"] -[ext_resource type="PackedScene" uid="uid://d11oo2pxcah1g" path="res://scenes/interfaces/pause_menu.tscn" id="1_yi287"] -[ext_resource type="PackedScene" uid="uid://k76535tjepm3" path="res://scenes/elements/player.tscn" id="2_07rl6"] -[ext_resource type="PackedScene" uid="uid://da1uex028xkv1" path="res://scenes/elements/door_scene_manager.tscn" id="3_3eu8f"] +[ext_resource type="Script" uid="uid://bv1k68dotk1b0" path="res://scripts/house_template.gd" id="1_877m4"] +[ext_resource type="Texture2D" uid="uid://d4j4ulftsvn5c" path="res://assets/textures/Inner.png" id="2_wq277"] +[ext_resource type="PackedScene" uid="uid://k76535tjepm3" path="res://scenes/elements/player.tscn" id="3_3sswl"] +[ext_resource type="PackedScene" uid="uid://da1uex028xkv1" path="res://scenes/elements/door_scene_manager.tscn" id="4_3t3gn"] +[ext_resource type="PackedScene" uid="uid://d11oo2pxcah1g" path="res://scenes/menu/pause_menu.tscn" id="5_gl2jq"] [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_q4fiy"] -texture = ExtResource("1_w2ggh") +texture = ExtResource("2_wq277") 0:0/0 = 0 1:0/0 = 0 1:0/0/z_index = -1 @@ -466,17 +466,17 @@ navigation_layer_0/layers = 1 sources/0 = SubResource("TileSetAtlasSource_q4fiy") [node name="HouseTemplate" type="Node2D"] -script = ExtResource("1_1vs50") +script = ExtResource("1_877m4") [node name="TileMapLayer" type="TileMapLayer" parent="."] rotation = -0.000322629 tile_map_data = PackedByteArray("AAAIAAIAAAACAAEAAAAIAAMAAAACAAEAAAAIAAQAAAACAAEAAAAIAAUAAAACAAEAAAAIAAYAAAACAAEAAAAIAAcAAAACAAEAAAAIAAgAAAACAAEAAAAIAAkAAAACAAEAAAAJAAoAAAACAAEAAAAJAAsAAAACAAEAAAAJAAwAAAACAAEAAAAKAA0AAAACAAEAAAALAA4AAAACAAEAAAAMAA8AAAACAAEAAAANAA8AAAACAAEAAAANABAAAAACAAEAAAAOABAAAAACAAEAAAAPABAAAAACAAEAAAAQABAAAAACAAEAAAARABAAAAACAAEAAAASABAAAAACAAEAAAATABAAAAACAAEAAAAUABAAAAACAAEAAAAVABAAAAACAAEAAAAWABAAAAACAAEAAAAWAA8AAAACAAEAAAAWAAwAAAACAAEAAAAWAAsAAAACAAEAAAAVAAoAAAACAAEAAAAUAAoAAAACAAEAAAATAAkAAAACAAEAAAASAAkAAAACAAEAAAARAAgAAAACAAEAAAAQAAgAAAACAAEAAAAPAAgAAAACAAEAAAAOAAgAAAACAAEAAAANAAcAAAACAAEAAAAMAAcAAAACAAEAAAALAAcAAAACAAEAAAAKAAcAAAACAAEAAAAJAAcAAAACAAEAAAAHAAkAAAACAAEAAAAHAAoAAAACAAEAAAAHAAsAAAACAAEAAAAHAAwAAAACAAEAAAAHAA0AAAACAAEAAAAHAA4AAAACAAEAAAAHAA8AAAACAAEAAAAIABAAAAACAAEAAAAJABAAAAACAAEAAAAKABEAAAACAAEAAAALABIAAAACAAEAAAAMABMAAAACAAEAAAANABMAAAACAAEAAAAOABMAAAACAAEAAAAPABMAAAACAAEAAAAQABQAAAACAAEAAAARABQAAAACAAEAAAASABQAAAACAAEAAAATABQAAAACAAEAAAAUABQAAAACAAEAAAAVABQAAAACAAEAAAAWABQAAAACAAEAAAAVAAwAAAACAAEAAAAUAA0AAAACAAEAAAAUAA4AAAACAAEAAAATAA8AAAACAAEAAAATABEAAAACAAEAAAATABIAAAACAAEAAAAUABMAAAACAAEAAAAWABUAAAACAAEAAAAAAAAAAAACAAEAAAAAAAEAAAACAAEAAAAAAAIAAAACAAEAAAAAAAMAAAACAAEAAAAAAAQAAAACAAEAAAAAAAUAAAACAAEAAAAAAAYAAAACAAEAAAAAAAcAAAACAAEAAAAAAAgAAAACAAEAAAAAAAkAAAACAAEAAAAAAAoAAAACAAEAAAAAAAsAAAACAAEAAAAAAAwAAAACAAEAAAAAAA0AAAACAAEAAAAAAA4AAAACAAEAAAAAAA8AAAACAAEAAAAAABAAAAACAAEAAAAAABEAAAACAAEAAAAAABIAAAACAAEAAAAAABMAAAACAAEAAAAAABQAAAACAAEAAAAAABUAAAACAAEAAAAAABYAAAACAAEAAAAAABcAAAACAAEAAAAAABgAAAACAAEAAAAAABkAAAACAAEAAAAAABoAAAACAAEAAAAAABsAAAACAAEAAAAAABwAAAACAAEAAAAAAB0AAAACAAEAAAAAAB4AAAACAAEAAAAAAB8AAAACAAEAAAAAACAAAAACAAEAAAAAACEAAAACAAEAAAAAACIAAAACAAEAAAAAACMAAAACAAEAAAAAACQAAAACAAEAAAAAACUAAAACAAEAAAAAACYAAAACAAEAAAAAACcAAAACAAEAAAAAACgAAAACAAEAAAABAAAAAAACAAEAAAABAAEAAAACAAEAAAABAAIAAAACAAEAAAABAAMAAAACAAEAAAABAAQAAAACAAEAAAABAAUAAAACAAEAAAABAAYAAAACAAEAAAABAAcAAAACAAEAAAABAAgAAAACAAEAAAABAAkAAAACAAEAAAABAAoAAAACAAEAAAABAAsAAAACAAEAAAABAAwAAAACAAEAAAABAA0AAAACAAEAAAABAA4AAAACAAEAAAABAA8AAAACAAEAAAABABAAAAACAAEAAAABABEAAAACAAEAAAABABIAAAACAAEAAAABABMAAAACAAEAAAABABQAAAACAAEAAAABABUAAAACAAEAAAABABYAAAACAAEAAAABABcAAAACAAEAAAABABgAAAACAAEAAAABABkAAAACAAEAAAABABoAAAACAAEAAAABABsAAAACAAEAAAABABwAAAACAAEAAAABAB0AAAACAAEAAAABAB4AAAACAAEAAAABAB8AAAACAAEAAAABACAAAAACAAEAAAABACEAAAACAAEAAAABACIAAAACAAEAAAABACMAAAACAAEAAAABACQAAAACAAEAAAABACUAAAACAAEAAAABACYAAAACAAEAAAABACcAAAACAAEAAAABACgAAAACAAEAAAACAAAAAAACAAEAAAACAAEAAAACAAEAAAACAAIAAAACAAEAAAACAAMAAAACAAEAAAACAAQAAAACAAEAAAACAAUAAAACAAEAAAACAAYAAAACAAEAAAACAAcAAAACAAEAAAACAAgAAAACAAEAAAACAAkAAAACAAEAAAACAAoAAAACAAEAAAACAAsAAAACAAEAAAACAAwAAAACAAEAAAACAA0AAAACAAEAAAACAA4AAAACAAEAAAACAA8AAAACAAEAAAACABAAAAACAAEAAAACABEAAAACAAEAAAACABIAAAACAAEAAAACABMAAAACAAEAAAACABQAAAACAAEAAAACABUAAAACAAEAAAACABYAAAACAAEAAAACABcAAAACAAEAAAACABgAAAACAAEAAAACABkAAAACAAEAAAACABoAAAACAAEAAAACABsAAAACAAEAAAACABwAAAACAAEAAAACAB0AAAACAAEAAAACAB4AAAACAAEAAAACAB8AAAACAAEAAAACACAAAAACAAEAAAACACEAAAACAAEAAAACACIAAAACAAEAAAACACMAAAACAAEAAAACACQAAAACAAEAAAACACUAAAACAAEAAAACACYAAAACAAEAAAACACcAAAACAAEAAAACACgAAAACAAEAAAADAAAAAAACAAEAAAADAAEAAAACAAEAAAADAAIAAAACAAEAAAADAAMAAAACAAEAAAADAAQAAAACAAEAAAADAAUAAAACAAEAAAADAAYAAAACAAEAAAADAAcAAAACAAEAAAADAAgAAAACAAEAAAADAAkAAAACAAEAAAADAAoAAAACAAEAAAADAAsAAAACAAEAAAADAAwAAAACAAEAAAADAA0AAAACAAEAAAADAA4AAAACAAEAAAADAA8AAAACAAEAAAADABAAAAACAAEAAAADABEAAAACAAEAAAADABIAAAACAAEAAAADABMAAAACAAEAAAADABQAAAACAAEAAAADABUAAAACAAEAAAADABYAAAACAAEAAAADABcAAAACAAEAAAADABgAAAACAAEAAAADABkAAAACAAEAAAADABoAAAACAAEAAAADABsAAAACAAEAAAADABwAAAACAAEAAAADAB0AAAACAAEAAAADAB4AAAACAAEAAAADAB8AAAACAAEAAAADACAAAAACAAEAAAADACEAAAACAAEAAAADACIAAAACAAEAAAADACMAAAACAAEAAAADACQAAAACAAEAAAADACUAAAACAAEAAAADACYAAAACAAEAAAADACcAAAACAAEAAAADACgAAAACAAEAAAAEAAAAAAACAAEAAAAEAAEAAAACAAEAAAAEAAIAAAACAAEAAAAEAAMAAAACAAEAAAAEAAQAAAACAAEAAAAEAAUAAAACAAEAAAAEAAYAAAACAAEAAAAEAAcAAAACAAEAAAAEAAgAAAACAAEAAAAEAAkAAAACAAEAAAAEAAoAAAACAAEAAAAEAAsAAAACAAEAAAAEAAwAAAACAAEAAAAEAA0AAAACAAEAAAAEAA4AAAACAAEAAAAEAA8AAAACAAEAAAAEABAAAAACAAEAAAAEABEAAAACAAEAAAAEABIAAAACAAEAAAAEABMAAAACAAEAAAAEABQAAAACAAEAAAAEABUAAAACAAEAAAAEABYAAAACAAEAAAAEABcAAAACAAEAAAAEABgAAAACAAEAAAAEABkAAAACAAEAAAAEABoAAAACAAEAAAAEABsAAAACAAEAAAAEABwAAAACAAEAAAAEAB0AAAACAAEAAAAEAB4AAAACAAEAAAAEAB8AAAACAAEAAAAEACAAAAACAAEAAAAEACEAAAACAAEAAAAEACIAAAACAAEAAAAEACMAAAACAAEAAAAEACQAAAACAAEAAAAEACUAAAACAAEAAAAEACYAAAACAAEAAAAEACcAAAACAAEAAAAEACgAAAACAAEAAAAFAAAAAAACAAEAAAAFAAEAAAACAAEAAAAFAAIAAAACAAEAAAAFAAMAAAACAAEAAAAFAAQAAAACAAEAAAAFAAUAAAACAAEAAAAFAAYAAAACAAEAAAAFAAcAAAACAAEAAAAFAAgAAAACAAEAAAAFAAkAAAACAAEAAAAFAAoAAAACAAEAAAAFAAsAAAACAAEAAAAFAAwAAAACAAEAAAAFAA0AAAACAAEAAAAFAA4AAAACAAEAAAAFAA8AAAACAAEAAAAFABAAAAACAAEAAAAFABEAAAACAAEAAAAFABIAAAACAAEAAAAFABMAAAACAAEAAAAFABQAAAACAAEAAAAFABUAAAACAAEAAAAFABYAAAACAAEAAAAFABcAAAACAAEAAAAFABgAAAACAAEAAAAFABkAAAACAAEAAAAFABoAAAACAAEAAAAFABsAAAACAAEAAAAFABwAAAACAAEAAAAFAB0AAAACAAEAAAAFAB4AAAACAAEAAAAFAB8AAAACAAEAAAAFACAAAAACAAEAAAAFACEAAAACAAEAAAAFACIAAAACAAEAAAAFACMAAAACAAEAAAAFACQAAAACAAEAAAAFACUAAAACAAEAAAAFACYAAAACAAEAAAAFACcAAAACAAEAAAAFACgAAAACAAEAAAAGAAAAAAACAAEAAAAGAAEAAAACAAEAAAAGAAIAAAACAAEAAAAGAAMAAAACAAEAAAAGAAQAAAACAAEAAAAGAAUAAAACAAEAAAAGAAYAAAACAAEAAAAGAAcAAAACAAEAAAAGAAgAAAACAAEAAAAGAAkAAAACAAEAAAAGAAoAAAACAAEAAAAGAAsAAAACAAEAAAAGAAwAAAACAAEAAAAGAA0AAAACAAEAAAAGAA4AAAACAAEAAAAGAA8AAAACAAEAAAAGABAAAAACAAEAAAAGABEAAAACAAEAAAAGABIAAAACAAEAAAAGABMAAAACAAEAAAAGABQAAAACAAEAAAAGABUAAAACAAEAAAAGABYAAAACAAEAAAAGABcAAAACAAEAAAAGABgAAAACAAEAAAAGABkAAAACAAEAAAAGABoAAAACAAEAAAAGABsAAAACAAEAAAAGABwAAAACAAEAAAAGAB0AAAACAAEAAAAGAB4AAAACAAEAAAAGAB8AAAACAAEAAAAGACAAAAACAAEAAAAGACEAAAACAAEAAAAGACIAAAACAAEAAAAGACMAAAACAAEAAAAGACQAAAACAAEAAAAGACUAAAACAAEAAAAGACYAAAACAAEAAAAGACcAAAACAAEAAAAGACgAAAACAAEAAAAHAAAAAAACAAEAAAAHAAEAAAACAAEAAAAHAAIAAAACAAEAAAAHAAMAAAACAAEAAAAHAAQAAAACAAEAAAAHAAUAAAACAAEAAAAHAAYAAAACAAEAAAAHAAcAAAACAAEAAAAHAAgAAAACAAEAAAAHABAAAAACAAEAAAAHABEAAAACAAEAAAAHABIAAAACAAEAAAAHABMAAAACAAEAAAAHABQAAAACAAEAAAAHABUAAAACAAEAAAAHABYAAAACAAEAAAAHABcAAAACAAEAAAAHABgAAAACAAEAAAAHABkAAAACAAEAAAAHABoAAAACAAEAAAAHABsAAAACAAEAAAAHABwAAAACAAEAAAAHAB0AAAACAAEAAAAHAB4AAAACAAEAAAAHAB8AAAACAAEAAAAHACAAAAACAAEAAAAHACEAAAACAAEAAAAHACIAAAACAAEAAAAHACMAAAACAAEAAAAHACQAAAACAAEAAAAHACUAAAACAAEAAAAHACYAAAACAAEAAAAHACcAAAACAAEAAAAHACgAAAACAAEAAAAIAAAAAAACAAEAAAAIAAEAAAACAAEAAAAIAAoAAAACAAEAAAAIAAsAAAACAAEAAAAIAAwAAAACAAEAAAAIAA0AAAACAAEAAAAIAA4AAAACAAEAAAAIAA8AAAACAAEAAAAIABEAAAACAAEAAAAIABIAAAACAAEAAAAIABMAAAACAAEAAAAIABQAAAACAAEAAAAIABUAAAACAAEAAAAIABYAAAACAAEAAAAIABcAAAACAAEAAAAIABgAAAACAAEAAAAIABkAAAACAAEAAAAIABoAAAACAAEAAAAIABsAAAACAAEAAAAIABwAAAACAAEAAAAIAB0AAAACAAEAAAAIAB4AAAACAAEAAAAIAB8AAAACAAEAAAAIACAAAAACAAEAAAAIACEAAAACAAEAAAAIACIAAAACAAEAAAAIACMAAAACAAEAAAAIACQAAAACAAEAAAAIACUAAAACAAEAAAAIACYAAAACAAEAAAAIACcAAAACAAEAAAAIACgAAAACAAEAAAAJAAAAAAACAAEAAAAJAAEAAAACAAEAAAAJAAIAAAACAAEAAAAJAAMAAAACAAEAAAAJAAQAAAACAAEAAAAJAAUAAAACAAEAAAAJAAYAAAACAAEAAAAJAAgAAAACAAEAAAAJAAkAAAACAAEAAAAJAA0AAAACAAEAAAAJAA4AAAACAAEAAAAJAA8AAAACAAEAAAAJABEAAAACAAEAAAAJABIAAAACAAEAAAAJABMAAAACAAEAAAAJABQAAAACAAEAAAAJABUAAAACAAEAAAAJABYAAAACAAEAAAAJABcAAAACAAEAAAAJABgAAAACAAEAAAAJABkAAAACAAEAAAAJABoAAAACAAEAAAAJABsAAAACAAEAAAAJABwAAAACAAEAAAAJAB0AAAACAAEAAAAJAB4AAAACAAEAAAAJAB8AAAACAAEAAAAJACAAAAACAAEAAAAJACEAAAACAAEAAAAJACIAAAACAAEAAAAJACMAAAACAAEAAAAJACQAAAACAAEAAAAJACUAAAACAAEAAAAJACYAAAACAAEAAAAJACcAAAACAAEAAAAJACgAAAACAAEAAAAKAAAAAAACAAEAAAAKAAEAAAACAAEAAAAKAAIAAAACAAEAAAAKAAMAAAACAAEAAAAKAAQAAAACAAEAAAAKAAUAAAACAAEAAAAKAAYAAAACAAEAAAAKAAgAAAACAAEAAAAKAAkAAAACAAEAAAAKAAoAAAACAAEAAAAKAAsAAAACAAEAAAAKAAwAAAACAAEAAAAKAA4AAAACAAEAAAAKAA8AAAACAAEAAAAKABAAAAACAAEAAAAKABIAAAACAAEAAAAKABMAAAACAAEAAAAKABQAAAACAAEAAAAKABUAAAACAAEAAAAKABYAAAACAAEAAAAKABcAAAACAAEAAAAKABgAAAACAAEAAAAKABkAAAACAAEAAAAKABoAAAACAAEAAAAKABsAAAACAAEAAAAKABwAAAACAAEAAAAKAB0AAAACAAEAAAAKAB4AAAACAAEAAAAKAB8AAAACAAEAAAAKACAAAAACAAEAAAAKACEAAAACAAEAAAAKACIAAAACAAEAAAAKACMAAAACAAEAAAAKACQAAAACAAEAAAAKACUAAAACAAEAAAAKACYAAAACAAEAAAAKACcAAAACAAEAAAAKACgAAAACAAEAAAALAAAAAAACAAEAAAALAAEAAAACAAEAAAALAAIAAAACAAEAAAALAAMAAAACAAEAAAALAAQAAAACAAEAAAALAAUAAAACAAEAAAALAAYAAAACAAEAAAALAAgAAAACAAEAAAALAAkAAAACAAEAAAALAAoAAAACAAEAAAALAAsAAAACAAEAAAALAAwAAAACAAEAAAALAA0AAAACAAEAAAALAA8AAAACAAEAAAALABAAAAACAAEAAAALABEAAAACAAEAAAALABMAAAACAAEAAAALABQAAAACAAEAAAALABUAAAACAAEAAAALABYAAAACAAEAAAALABcAAAACAAEAAAALABgAAAACAAEAAAALABkAAAACAAEAAAALABoAAAACAAEAAAALABsAAAACAAEAAAALABwAAAACAAEAAAALAB0AAAACAAEAAAALAB4AAAACAAEAAAALAB8AAAACAAEAAAALACAAAAACAAEAAAALACEAAAACAAEAAAALACIAAAACAAEAAAALACMAAAACAAEAAAALACQAAAACAAEAAAALACUAAAACAAEAAAALACYAAAACAAEAAAALACcAAAACAAEAAAALACgAAAACAAEAAAAMAAAAAAACAAEAAAAMAAEAAAACAAEAAAAMAAIAAAACAAEAAAAMAAMAAAACAAEAAAAMAAQAAAACAAEAAAAMAAUAAAACAAEAAAAMAAYAAAACAAEAAAAMAAgAAAACAAEAAAAMAAkAAAACAAEAAAAMAAoAAAACAAEAAAAMAAsAAAACAAEAAAAMAAwAAAACAAEAAAAMAA0AAAACAAEAAAAMAA4AAAACAAEAAAAMABAAAAACAAEAAAAMABEAAAACAAEAAAAMABIAAAACAAEAAAAMABQAAAACAAEAAAAMABUAAAACAAEAAAAMABYAAAACAAEAAAAMABcAAAACAAEAAAAMABgAAAACAAEAAAAMABkAAAACAAEAAAAMABoAAAACAAEAAAAMABsAAAACAAEAAAAMABwAAAACAAEAAAAMAB0AAAACAAEAAAAMAB4AAAACAAEAAAAMAB8AAAACAAEAAAAMACAAAAACAAEAAAAMACEAAAACAAEAAAAMACIAAAACAAEAAAAMACMAAAACAAEAAAAMACQAAAACAAEAAAAMACUAAAACAAEAAAAMACYAAAACAAEAAAAMACcAAAACAAEAAAAMACgAAAACAAEAAAANAAAAAAACAAEAAAANAAEAAAACAAEAAAANAAIAAAACAAEAAAANAAMAAAACAAEAAAANAAQAAAACAAEAAAANAAUAAAACAAEAAAANAAYAAAACAAEAAAANAAgAAAACAAEAAAANAAkAAAACAAEAAAANAAoAAAACAAEAAAANAAsAAAACAAEAAAANAAwAAAACAAEAAAANAA0AAAACAAEAAAANAA4AAAACAAEAAAANABEAAAACAAEAAAANABIAAAACAAEAAAANABQAAAACAAEAAAANABUAAAACAAEAAAANABYAAAACAAEAAAANABcAAAACAAEAAAANABgAAAACAAEAAAANABkAAAACAAEAAAANABoAAAACAAEAAAANABsAAAACAAEAAAANABwAAAACAAEAAAANAB0AAAACAAEAAAANAB4AAAACAAEAAAANAB8AAAACAAEAAAANACAAAAACAAEAAAANACEAAAACAAEAAAANACIAAAACAAEAAAANACMAAAACAAEAAAANACQAAAACAAEAAAANACUAAAACAAEAAAANACYAAAACAAEAAAANACcAAAACAAEAAAANACgAAAACAAEAAAAOAAAAAAACAAEAAAAOAAEAAAACAAEAAAAOAAIAAAACAAEAAAAOAAMAAAACAAEAAAAOAAQAAAACAAEAAAAOAAUAAAACAAEAAAAOAAYAAAACAAEAAAAOAAcAAAACAAEAAAAOAAkAAAACAAEAAAAOAAoAAAACAAEAAAAOAAsAAAACAAEAAAAOAAwAAAACAAEAAAAOAA0AAAACAAEAAAAOAA4AAAACAAEAAAAOAA8AAAACAAEAAAAOABEAAAACAAEAAAAOABIAAAACAAEAAAAOABQAAAACAAEAAAAOABUAAAACAAEAAAAOABYAAAACAAEAAAAOABcAAAACAAEAAAAOABgAAAACAAEAAAAOABkAAAACAAEAAAAOABoAAAACAAEAAAAOABsAAAACAAEAAAAOABwAAAACAAEAAAAOAB0AAAACAAEAAAAOAB4AAAACAAEAAAAOAB8AAAACAAEAAAAOACAAAAACAAEAAAAOACEAAAACAAEAAAAOACIAAAACAAEAAAAOACMAAAACAAEAAAAOACQAAAACAAEAAAAOACUAAAACAAEAAAAOACYAAAACAAEAAAAOACcAAAACAAEAAAAOACgAAAACAAEAAAAPAAAAAAACAAEAAAAPAAEAAAACAAEAAAAPAAIAAAACAAEAAAAPAAMAAAACAAEAAAAPAAQAAAACAAEAAAAPAAUAAAACAAEAAAAPAAYAAAACAAEAAAAPAAcAAAACAAEAAAAPAAkAAAACAAEAAAAPAAoAAAACAAEAAAAPAAsAAAACAAEAAAAPAAwAAAACAAEAAAAPAA0AAAACAAEAAAAPAA4AAAACAAEAAAAPAA8AAAACAAEAAAAPABEAAAACAAEAAAAPABIAAAACAAEAAAAPABQAAAACAAEAAAAPABUAAAACAAEAAAAPABYAAAACAAEAAAAPABcAAAACAAEAAAAPABgAAAACAAEAAAAPABkAAAACAAEAAAAPABoAAAACAAEAAAAPABsAAAACAAEAAAAPABwAAAACAAEAAAAPAB0AAAACAAEAAAAPAB4AAAACAAEAAAAPAB8AAAACAAEAAAAPACAAAAACAAEAAAAPACEAAAACAAEAAAAPACIAAAACAAEAAAAPACMAAAACAAEAAAAPACQAAAACAAEAAAAPACUAAAACAAEAAAAPACYAAAACAAEAAAAPACcAAAACAAEAAAAPACgAAAACAAEAAAAQAAAAAAACAAEAAAAQAAEAAAACAAEAAAAQAAIAAAACAAEAAAAQAAMAAAACAAEAAAAQAAQAAAACAAEAAAAQAAUAAAACAAEAAAAQAAYAAAACAAEAAAAQAAcAAAACAAEAAAAQAAkAAAACAAEAAAAQAAoAAAACAAEAAAAQAAsAAAACAAEAAAAQAAwAAAACAAEAAAAQAA0AAAACAAEAAAAQAA4AAAACAAEAAAAQAA8AAAACAAEAAAAQABEAAAACAAEAAAAQABIAAAACAAEAAAAQABMAAAACAAEAAAAQABUAAAACAAEAAAAQABYAAAACAAEAAAAQABcAAAACAAEAAAAQABgAAAACAAEAAAAQABkAAAACAAEAAAAQABoAAAACAAEAAAAQABsAAAACAAEAAAAQABwAAAACAAEAAAAQAB0AAAACAAEAAAAQAB4AAAACAAEAAAAQAB8AAAACAAEAAAAQACAAAAACAAEAAAAQACEAAAACAAEAAAAQACIAAAACAAEAAAAQACMAAAACAAEAAAAQACQAAAACAAEAAAAQACUAAAACAAEAAAAQACYAAAACAAEAAAAQACcAAAACAAEAAAAQACgAAAACAAEAAAARAAAAAAACAAEAAAARAAEAAAACAAEAAAARAAIAAAACAAEAAAARAAMAAAACAAEAAAARAAQAAAACAAEAAAARAAUAAAACAAEAAAARAAYAAAACAAEAAAARAAcAAAACAAEAAAARAAkAAAACAAEAAAARAAoAAAACAAEAAAARAAsAAAACAAEAAAARAAwAAAACAAEAAAARAA0AAAACAAEAAAARAA4AAAACAAEAAAARAA8AAAACAAEAAAARABEAAAACAAEAAAARABIAAAACAAEAAAARABMAAAACAAEAAAARABUAAAACAAEAAAARABYAAAACAAEAAAARABcAAAACAAEAAAARABgAAAACAAEAAAARABkAAAACAAEAAAARABoAAAACAAEAAAARABsAAAACAAEAAAARABwAAAACAAEAAAARAB0AAAACAAEAAAARAB4AAAACAAEAAAARAB8AAAACAAEAAAARACAAAAACAAEAAAARACEAAAACAAEAAAARACIAAAACAAEAAAARACMAAAACAAEAAAARACQAAAACAAEAAAARACUAAAACAAEAAAARACYAAAACAAEAAAARACcAAAACAAEAAAARACgAAAACAAEAAAASAAAAAAACAAEAAAASAAEAAAACAAEAAAASAAIAAAACAAEAAAASAAMAAAACAAEAAAASAAQAAAACAAEAAAASAAUAAAACAAEAAAASAAYAAAACAAEAAAASAAcAAAACAAEAAAASAAgAAAACAAEAAAASAAoAAAACAAEAAAASAAsAAAACAAEAAAASAAwAAAACAAEAAAASAA0AAAACAAEAAAASAA4AAAACAAEAAAASAA8AAAACAAEAAAASABEAAAACAAEAAAASABIAAAACAAEAAAASABMAAAACAAEAAAASABUAAAACAAEAAAASABYAAAACAAEAAAASABcAAAACAAEAAAASABgAAAACAAEAAAASABkAAAACAAEAAAASABoAAAACAAEAAAASABsAAAACAAEAAAASABwAAAACAAEAAAASAB0AAAACAAEAAAASAB4AAAACAAEAAAASAB8AAAACAAEAAAASACAAAAACAAEAAAASACEAAAACAAEAAAASACIAAAACAAEAAAASACMAAAACAAEAAAASACQAAAACAAEAAAASACUAAAACAAEAAAASACYAAAACAAEAAAASACcAAAACAAEAAAASACgAAAACAAEAAAATAAAAAAACAAEAAAATAAEAAAACAAEAAAATAAIAAAACAAEAAAATAAMAAAACAAEAAAATAAQAAAACAAEAAAATAAUAAAACAAEAAAATAAYAAAACAAEAAAATAAcAAAACAAEAAAATAAgAAAACAAEAAAATAAoAAAACAAEAAAATAAsAAAACAAEAAAATAAwAAAACAAEAAAATAA0AAAACAAEAAAATAA4AAAACAAEAAAATABMAAAACAAEAAAATABUAAAACAAEAAAATABYAAAACAAEAAAATABcAAAACAAEAAAATABgAAAACAAEAAAATABkAAAACAAEAAAATABoAAAACAAEAAAATABsAAAACAAEAAAATABwAAAACAAEAAAATAB0AAAACAAEAAAATAB4AAAACAAEAAAATAB8AAAACAAEAAAATACAAAAACAAEAAAATACEAAAACAAEAAAATACIAAAACAAEAAAATACMAAAACAAEAAAATACQAAAACAAEAAAATACUAAAACAAEAAAATACYAAAACAAEAAAATACcAAAACAAEAAAATACgAAAACAAEAAAAUAAAAAAACAAEAAAAUAAEAAAACAAEAAAAUAAIAAAACAAEAAAAUAAMAAAACAAEAAAAUAAQAAAACAAEAAAAUAAUAAAACAAEAAAAUAAYAAAACAAEAAAAUAAcAAAACAAEAAAAUAAgAAAACAAEAAAAUAAkAAAACAAEAAAAUAAsAAAACAAEAAAAUAAwAAAACAAEAAAAUAA8AAAACAAEAAAAUABEAAAACAAEAAAAUABIAAAACAAEAAAAUABUAAAACAAEAAAAUABYAAAACAAEAAAAUABcAAAACAAEAAAAUABgAAAACAAEAAAAUABkAAAACAAEAAAAUABoAAAACAAEAAAAUABsAAAACAAEAAAAUABwAAAACAAEAAAAUAB0AAAACAAEAAAAUAB4AAAACAAEAAAAUAB8AAAACAAEAAAAUACAAAAACAAEAAAAUACEAAAACAAEAAAAUACIAAAACAAEAAAAUACMAAAACAAEAAAAUACQAAAACAAEAAAAUACUAAAACAAEAAAAUACYAAAACAAEAAAAUACcAAAACAAEAAAAUACgAAAACAAEAAAAVAAAAAAACAAEAAAAVAAEAAAACAAEAAAAVAAIAAAACAAEAAAAVAAMAAAACAAEAAAAVAAQAAAACAAEAAAAVAAUAAAACAAEAAAAVAAYAAAACAAEAAAAVAAcAAAACAAEAAAAVAAgAAAACAAEAAAAVAAkAAAACAAEAAAAVAAsAAAACAAEAAAAVAA0AAAACAAEAAAAVAA4AAAACAAEAAAAVAA8AAAACAAEAAAAVABEAAAACAAEAAAAVABIAAAACAAEAAAAVABMAAAACAAEAAAAVABUAAAACAAEAAAAVABYAAAACAAEAAAAVABcAAAACAAEAAAAVABgAAAACAAEAAAAVABkAAAACAAEAAAAVABoAAAACAAEAAAAVABsAAAACAAEAAAAVABwAAAACAAEAAAAVAB0AAAACAAEAAAAVAB4AAAACAAEAAAAVAB8AAAACAAEAAAAVACAAAAACAAEAAAAVACEAAAACAAEAAAAVACIAAAACAAEAAAAVACMAAAACAAEAAAAVACQAAAACAAEAAAAVACUAAAACAAEAAAAVACYAAAACAAEAAAAVACcAAAACAAEAAAAVACgAAAACAAEAAAAWAAAAAAACAAEAAAAWAAEAAAACAAEAAAAWAAIAAAACAAEAAAAWAAMAAAACAAEAAAAWAAQAAAACAAEAAAAWAAUAAAACAAEAAAAWAAYAAAACAAEAAAAWAAcAAAACAAEAAAAWAAgAAAACAAEAAAAWAAkAAAACAAEAAAAWAAoAAAACAAEAAAAWAA0AAAACAAEAAAAWAA4AAAACAAEAAAAWABEAAAACAAEAAAAWABIAAAACAAEAAAAWABMAAAACAAEAAAAWABYAAAACAAEAAAAWABcAAAACAAEAAAAWABgAAAACAAEAAAAWABkAAAACAAEAAAAWABoAAAACAAEAAAAWABsAAAACAAEAAAAWABwAAAACAAEAAAAWAB0AAAACAAEAAAAWAB4AAAACAAEAAAAWAB8AAAACAAEAAAAWACAAAAACAAEAAAAWACEAAAACAAEAAAAWACIAAAACAAEAAAAWACMAAAACAAEAAAAWACQAAAACAAEAAAAWACUAAAACAAEAAAAWACYAAAACAAEAAAAWACcAAAACAAEAAAAWACgAAAACAAEAAAAXAAAAAAACAAEAAAAXAAEAAAACAAEAAAAXAAIAAAACAAEAAAAXAAMAAAACAAEAAAAXAAQAAAACAAEAAAAXAAUAAAACAAEAAAAXABkAAAACAAEAAAAXABoAAAACAAEAAAAXABsAAAACAAEAAAAXABwAAAACAAEAAAAXAB0AAAACAAEAAAAXAB4AAAACAAEAAAAXAB8AAAACAAEAAAAXACAAAAACAAEAAAAXACEAAAACAAEAAAAXACIAAAACAAEAAAAXACMAAAACAAEAAAAXACQAAAACAAEAAAAXACUAAAACAAEAAAAXACYAAAACAAEAAAAXACcAAAACAAEAAAAXACgAAAACAAEAAAAYAAAAAAACAAEAAAAYAAEAAAACAAEAAAAYAAIAAAACAAEAAAAYAAMAAAACAAEAAAAYAAQAAAACAAEAAAAYAAUAAAACAAEAAAAYABkAAAACAAEAAAAYABoAAAACAAEAAAAYABsAAAACAAEAAAAYABwAAAACAAEAAAAYAB0AAAACAAEAAAAYAB4AAAACAAEAAAAYAB8AAAACAAEAAAAYACAAAAACAAEAAAAYACEAAAACAAEAAAAYACIAAAACAAEAAAAYACMAAAACAAEAAAAYACQAAAACAAEAAAAYACUAAAACAAEAAAAYACYAAAACAAEAAAAYACcAAAACAAEAAAAYACgAAAACAAEAAAAZAAAAAAACAAEAAAAZAAEAAAACAAEAAAAZAAIAAAACAAEAAAAZAAMAAAACAAEAAAAZAAQAAAACAAEAAAAZAAUAAAACAAEAAAAZABkAAAACAAEAAAAZABoAAAACAAEAAAAZABsAAAACAAEAAAAZABwAAAACAAEAAAAZAB0AAAACAAEAAAAZAB4AAAACAAEAAAAZAB8AAAACAAEAAAAZACAAAAACAAEAAAAZACEAAAACAAEAAAAZACIAAAACAAEAAAAZACMAAAACAAEAAAAZACQAAAACAAEAAAAZACUAAAACAAEAAAAZACYAAAACAAEAAAAZACcAAAACAAEAAAAZACgAAAACAAEAAAAaAAAAAAACAAEAAAAaAAEAAAACAAEAAAAaAAIAAAACAAEAAAAaAAMAAAACAAEAAAAaAAQAAAACAAEAAAAaAAUAAAACAAEAAAAaABkAAAACAAEAAAAaABoAAAACAAEAAAAaABsAAAACAAEAAAAaABwAAAACAAEAAAAaAB0AAAACAAEAAAAaAB4AAAACAAEAAAAaAB8AAAACAAEAAAAaACAAAAACAAEAAAAaACEAAAACAAEAAAAaACIAAAACAAEAAAAaACMAAAACAAEAAAAaACQAAAACAAEAAAAaACUAAAACAAEAAAAaACYAAAACAAEAAAAaACcAAAACAAEAAAAaACgAAAACAAEAAAAbAAAAAAACAAEAAAAbAAEAAAACAAEAAAAbAAIAAAACAAEAAAAbAAMAAAACAAEAAAAbAAQAAAACAAEAAAAbAAUAAAACAAEAAAAbABkAAAACAAEAAAAbABoAAAACAAEAAAAbABsAAAACAAEAAAAbABwAAAACAAEAAAAbAB0AAAACAAEAAAAbAB4AAAACAAEAAAAbAB8AAAACAAEAAAAbACAAAAACAAEAAAAbACEAAAACAAEAAAAbACIAAAACAAEAAAAbACMAAAACAAEAAAAbACQAAAACAAEAAAAbACUAAAACAAEAAAAbACYAAAACAAEAAAAbACcAAAACAAEAAAAbACgAAAACAAEAAAAcAAAAAAACAAEAAAAcAAEAAAACAAEAAAAcAAIAAAACAAEAAAAcAAMAAAACAAEAAAAcAAQAAAACAAEAAAAcAAUAAAACAAEAAAAcABkAAAABAAEAAAAcABoAAAABAAEAAAAcABsAAAABAAEAAAAcABwAAAABAAIAAAAcAB0AAAACAAEAAAAcAB4AAAACAAEAAAAcAB8AAAACAAEAAAAcACAAAAACAAEAAAAcACEAAAACAAEAAAAcACIAAAACAAEAAAAcACMAAAACAAEAAAAcACQAAAACAAEAAAAcACUAAAACAAEAAAAcACYAAAACAAEAAAAcACcAAAACAAEAAAAcACgAAAACAAEAAAAdAAAAAAACAAEAAAAdAAEAAAACAAEAAAAdAAIAAAACAAEAAAAdAAMAAAACAAEAAAAdAAQAAAACAAEAAAAdAAUAAAACAAEAAAAdABkAAAAAAAIAAAAdABoAAAAAAAIAAAAdABsAAAAAAAIAAAAdABwAAAACAAIAAAAdAB0AAAACAAEAAAAdAB4AAAACAAEAAAAdAB8AAAACAAEAAAAdACAAAAACAAEAAAAdACEAAAACAAEAAAAdACIAAAACAAEAAAAdACMAAAACAAEAAAAdACQAAAACAAEAAAAdACUAAAACAAEAAAAdACYAAAACAAEAAAAdACcAAAACAAEAAAAdACgAAAACAAEAAAAeAAAAAAACAAEAAAAeAAEAAAACAAEAAAAeAAIAAAACAAEAAAAeAAMAAAACAAEAAAAeAAQAAAACAAEAAAAeAAUAAAACAAEAAAAeABkAAAAAAAIAAAAeABoAAAAAAAIAAAAeABsAAAAAAAIAAAAeABwAAAACAAIAAAAeAB0AAAACAAEAAAAeAB4AAAACAAEAAAAeAB8AAAACAAEAAAAeACAAAAACAAEAAAAeACEAAAACAAEAAAAeACIAAAACAAEAAAAeACMAAAACAAEAAAAeACQAAAACAAEAAAAeACUAAAACAAEAAAAeACYAAAACAAEAAAAeACcAAAACAAEAAAAeACgAAAACAAEAAAAfAAAAAAACAAEAAAAfAAEAAAACAAEAAAAfAAIAAAACAAEAAAAfAAMAAAACAAEAAAAfAAQAAAACAAEAAAAfAAUAAAACAAEAAAAfABkAAAAAAAIAAAAfABoAAAAAAAIAAAAfABsAAAAAAAIAAAAfABwAAAACAAIAAAAfAB0AAAACAAEAAAAfAB4AAAACAAEAAAAfAB8AAAACAAEAAAAfACAAAAACAAEAAAAfACEAAAACAAEAAAAfACIAAAACAAEAAAAfACMAAAACAAEAAAAfACQAAAACAAEAAAAfACUAAAACAAEAAAAfACYAAAACAAEAAAAfACcAAAACAAEAAAAfACgAAAACAAEAAAAgAAAAAAACAAEAAAAgAAEAAAACAAEAAAAgAAIAAAACAAEAAAAgAAMAAAACAAEAAAAgAAQAAAACAAEAAAAgAAUAAAACAAEAAAAgABkAAAAAAAIAAAAgABoAAAAAAAIAAAAgABsAAAAAAAIAAAAgABwAAAACAAIAAAAgAB0AAAACAAEAAAAgAB4AAAACAAEAAAAgAB8AAAACAAEAAAAgACAAAAACAAEAAAAgACEAAAACAAEAAAAgACIAAAACAAEAAAAgACMAAAACAAEAAAAgACQAAAACAAEAAAAgACUAAAACAAEAAAAgACYAAAACAAEAAAAgACcAAAACAAEAAAAgACgAAAACAAEAAAAhAAAAAAACAAEAAAAhAAEAAAACAAEAAAAhAAIAAAACAAEAAAAhAAMAAAACAAEAAAAhAAQAAAACAAEAAAAhAAUAAAACAAEAAAAhABkAAAAAAAIAAAAhABoAAAAAAAIAAAAhABsAAAAAAAIAAAAhABwAAAACAAIAAAAhAB0AAAACAAEAAAAhAB4AAAACAAEAAAAhAB8AAAACAAEAAAAhACAAAAACAAEAAAAhACEAAAACAAEAAAAhACIAAAACAAEAAAAhACMAAAACAAEAAAAhACQAAAACAAEAAAAhACUAAAACAAEAAAAhACYAAAACAAEAAAAhACcAAAACAAEAAAAhACgAAAACAAEAAAAiAAAAAAACAAEAAAAiAAEAAAACAAEAAAAiAAIAAAACAAEAAAAiAAMAAAACAAEAAAAiAAQAAAACAAEAAAAiAAUAAAACAAEAAAAiABkAAAAAAAIAAAAiABoAAAAAAAIAAAAiABsAAAAAAAIAAAAiABwAAAACAAIAAAAiAB0AAAACAAEAAAAiAB4AAAACAAEAAAAiAB8AAAACAAEAAAAiACAAAAACAAEAAAAiACEAAAACAAEAAAAiACIAAAACAAEAAAAiACMAAAACAAEAAAAiACQAAAACAAEAAAAiACUAAAACAAEAAAAiACYAAAACAAEAAAAiACcAAAACAAEAAAAiACgAAAACAAEAAAAjAAAAAAACAAEAAAAjAAEAAAACAAEAAAAjAAIAAAACAAEAAAAjAAMAAAACAAEAAAAjAAQAAAACAAEAAAAjAAUAAAACAAEAAAAjABkAAAAAAAIAAAAjABoAAAAAAAIAAAAjABsAAAAAAAIAAAAjABwAAAAAAAAAAAAjAB0AAAACAAEAAAAjAB4AAAACAAEAAAAjAB8AAAACAAEAAAAjACAAAAACAAEAAAAjACEAAAACAAEAAAAjACIAAAACAAEAAAAjACMAAAACAAEAAAAjACQAAAACAAEAAAAjACUAAAACAAEAAAAjACYAAAACAAEAAAAjACcAAAACAAEAAAAjACgAAAACAAEAAAAkAAAAAAACAAEAAAAkAAEAAAACAAEAAAAkAAIAAAACAAEAAAAkAAMAAAACAAEAAAAkAAQAAAACAAEAAAAkAAUAAAACAAEAAAAkABkAAAAAAAIAAAAkABoAAAAAAAIAAAAkABsAAAAAAAIAAAAkABwAAAAAAAAAAAAkAB0AAAACAAEAAAAkAB4AAAACAAEAAAAkAB8AAAACAAEAAAAkACAAAAACAAEAAAAkACEAAAACAAEAAAAkACIAAAACAAEAAAAkACMAAAACAAEAAAAkACQAAAACAAEAAAAkACUAAAACAAEAAAAkACYAAAACAAEAAAAkACcAAAACAAEAAAAkACgAAAACAAEAAAAlAAAAAAACAAEAAAAlAAEAAAACAAEAAAAlAAIAAAACAAEAAAAlAAMAAAACAAEAAAAlAAQAAAACAAEAAAAlAAUAAAACAAEAAAAlABkAAAAAAAIAAAAlABoAAAAAAAIAAAAlABsAAAAAAAIAAAAlABwAAAAAAAAAAAAlAB0AAAACAAEAAAAlAB4AAAACAAEAAAAlAB8AAAACAAEAAAAlACAAAAACAAEAAAAlACEAAAACAAEAAAAlACIAAAACAAEAAAAlACMAAAACAAEAAAAlACQAAAACAAEAAAAlACUAAAACAAEAAAAlACYAAAACAAEAAAAlACcAAAACAAEAAAAlACgAAAACAAEAAAAmAAAAAAACAAEAAAAmAAEAAAACAAEAAAAmAAIAAAACAAEAAAAmAAMAAAACAAEAAAAmAAQAAAACAAEAAAAmAAUAAAACAAEAAAAmABkAAAAAAAIAAAAmABoAAAAAAAIAAAAmABsAAAAAAAIAAAAmABwAAAACAAIAAAAmAB0AAAACAAEAAAAmAB4AAAACAAEAAAAmAB8AAAACAAEAAAAmACAAAAACAAEAAAAmACEAAAACAAEAAAAmACIAAAACAAEAAAAmACMAAAACAAEAAAAmACQAAAACAAEAAAAmACUAAAACAAEAAAAmACYAAAACAAEAAAAmACcAAAACAAEAAAAmACgAAAACAAEAAAAnAAAAAAACAAEAAAAnAAEAAAACAAEAAAAnAAIAAAACAAEAAAAnAAMAAAACAAEAAAAnAAQAAAACAAEAAAAnAAUAAAACAAEAAAAnABkAAAAAAAIAAAAnABoAAAAAAAIAAAAnABsAAAAAAAIAAAAnABwAAAACAAIAAAAnAB0AAAACAAEAAAAnAB4AAAACAAEAAAAnAB8AAAACAAEAAAAnACAAAAACAAEAAAAnACEAAAACAAEAAAAnACIAAAACAAEAAAAnACMAAAACAAEAAAAnACQAAAACAAEAAAAnACUAAAACAAEAAAAnACYAAAACAAEAAAAnACcAAAACAAEAAAAnACgAAAACAAEAAAAoAAAAAAACAAEAAAAoAAEAAAACAAEAAAAoAAIAAAACAAEAAAAoAAMAAAACAAEAAAAoAAQAAAACAAEAAAAoAAUAAAACAAEAAAAoABkAAAAAAAIAAAAoABoAAAAAAAIAAAAoABsAAAAAAAIAAAAoABwAAAACAAIAAAAoAB0AAAACAAEAAAAoAB4AAAACAAEAAAAoAB8AAAACAAEAAAAoACAAAAACAAEAAAAoACEAAAACAAEAAAAoACIAAAACAAEAAAAoACMAAAACAAEAAAAoACQAAAACAAEAAAAoACUAAAACAAEAAAAoACYAAAACAAEAAAAoACcAAAACAAEAAAAoACgAAAACAAEAAAApAAAAAAACAAEAAAApAAEAAAACAAEAAAApAAIAAAACAAEAAAApAAMAAAACAAEAAAApAAQAAAACAAEAAAApAAUAAAACAAEAAAApABkAAAAAAAIAAAApABoAAAAAAAIAAAApABsAAAAAAAIAAAApABwAAAACAAIAAAApAB0AAAACAAEAAAApAB4AAAACAAEAAAApAB8AAAACAAEAAAApACAAAAACAAEAAAApACEAAAACAAEAAAApACIAAAACAAEAAAApACMAAAACAAEAAAApACQAAAACAAEAAAApACUAAAACAAEAAAApACYAAAACAAEAAAApACcAAAACAAEAAAApACgAAAACAAEAAAAqAAAAAAACAAEAAAAqAAEAAAACAAEAAAAqAAIAAAACAAEAAAAqAAMAAAACAAEAAAAqAAQAAAACAAEAAAAqAAUAAAACAAEAAAAqAAYAAAACAAEAAAAqAAcAAAACAAEAAAAqAAgAAAACAAEAAAAqAAkAAAACAAEAAAAqAAoAAAACAAEAAAAqAAsAAAACAAEAAAAqAAwAAAACAAMAAAAqAA0AAAACAAQAAAAqAA4AAAACAAUAAAAqAA8AAAAAAAIAAAAqABAAAAAAAAIAAAAqABEAAAAAAAIAAAAqABIAAAAAAAIAAAAqABMAAAAAAAIAAAAqABQAAAAAAAIAAAAqABUAAAAAAAIAAAAqABYAAAAAAAIAAAAqABcAAAAAAAIAAAAqABgAAAAAAAIAAAAqABkAAAAAAAIAAAAqABoAAAAAAAIAAAAqABsAAAAAAAIAAAAqABwAAAACAAIAAAAqAB0AAAACAAEAAAAqAB4AAAACAAEAAAAqAB8AAAACAAEAAAAqACAAAAACAAEAAAAqACEAAAACAAEAAAAqACIAAAACAAEAAAAqACMAAAACAAEAAAAqACQAAAACAAEAAAAqACUAAAACAAEAAAAqACYAAAACAAEAAAAqACcAAAACAAEAAAAqACgAAAACAAEAAAArAAAAAAACAAEAAAArAAEAAAACAAEAAAArAAIAAAACAAEAAAArAAMAAAACAAEAAAArAAQAAAACAAEAAAArAAUAAAACAAEAAAArAAYAAAACAAEAAAArAAcAAAACAAEAAAArAAgAAAACAAEAAAArAAkAAAACAAEAAAArAAoAAAACAAEAAAArAAsAAAACAAEAAAArAAwAAAADAAMAAAArAA0AAAADAAQAAAArAA4AAAADAAUAAAArAA8AAAAAAAIAAAArABAAAAAAAAIAAAArABEAAAAAAAIAAAArABIAAAAAAAIAAAArABMAAAAAAAIAAAArABQAAAAAAAIAAAArABYAAAAAAAIAAAArABcAAAAAAAIAAAArABgAAAAAAAIAAAArABkAAAAAAAIAAAArABoAAAAAAAIAAAArABsAAAAAAAIAAAArABwAAAACAAIAAAArAB0AAAACAAEAAAArAB4AAAACAAEAAAArAB8AAAACAAEAAAArACAAAAACAAEAAAArACEAAAACAAEAAAArACIAAAACAAEAAAArACMAAAACAAEAAAArACQAAAACAAEAAAArACUAAAACAAEAAAArACYAAAACAAEAAAArACcAAAACAAEAAAArACgAAAACAAEAAAAsAAAAAAACAAEAAAAsAAEAAAACAAEAAAAsAAIAAAACAAEAAAAsAAMAAAACAAEAAAAsAAQAAAACAAEAAAAsAAUAAAACAAEAAAAsAAYAAAACAAEAAAAsAAcAAAACAAEAAAAsAAgAAAACAAEAAAAsAAkAAAACAAEAAAAsAAoAAAACAAEAAAAsAAsAAAACAAEAAAAsAAwAAAACAAEAAAAsAA0AAAACAAEAAAAsAA4AAAADAAAAAAAsABAAAAADAAEAAAAsABEAAAADAAEAAAAsABIAAAADAAEAAAAsABMAAAADAAEAAAAsABQAAAADAAEAAAAsABUAAAADAAEAAAAsABYAAAADAAEAAAAsABcAAAADAAEAAAAsABgAAAADAAEAAAAsABkAAAADAAEAAAAsABoAAAADAAEAAAAsABsAAAADAAEAAAAsABwAAAADAAIAAAAsAB0AAAACAAEAAAAsAB4AAAACAAEAAAAsAB8AAAACAAEAAAAsACAAAAACAAEAAAAsACEAAAACAAEAAAAsACIAAAACAAEAAAAsACMAAAACAAEAAAAsACQAAAACAAEAAAAsACUAAAACAAEAAAAsACYAAAACAAEAAAAsACcAAAACAAEAAAAsACgAAAACAAEAAAAtAAAAAAACAAEAAAAtAAEAAAACAAEAAAAtAAIAAAACAAEAAAAtAAMAAAACAAEAAAAtAAQAAAACAAEAAAAtAAUAAAACAAEAAAAtAAYAAAACAAEAAAAtAAcAAAACAAEAAAAtAAgAAAACAAEAAAAtAAkAAAACAAEAAAAtAAoAAAACAAEAAAAtAAsAAAACAAEAAAAtAAwAAAACAAEAAAAtAA0AAAACAAEAAAAtAA4AAAACAAEAAAAtAA8AAAACAAEAAAAtABAAAAACAAEAAAAtABEAAAACAAEAAAAtABIAAAACAAEAAAAtABMAAAACAAEAAAAtABQAAAACAAEAAAAtABUAAAACAAEAAAAtABYAAAACAAEAAAAtABcAAAACAAEAAAAtABgAAAACAAEAAAAtABkAAAACAAEAAAAtABoAAAACAAEAAAAtABsAAAACAAEAAAAtABwAAAACAAEAAAAtAB0AAAACAAEAAAAtAB4AAAACAAEAAAAtAB8AAAACAAEAAAAtACAAAAACAAEAAAAtACEAAAACAAEAAAAtACIAAAACAAEAAAAtACMAAAACAAEAAAAtACQAAAACAAEAAAAtACUAAAACAAEAAAAtACYAAAACAAEAAAAtACcAAAACAAEAAAAtACgAAAACAAEAAAAuAAAAAAACAAEAAAAuAAEAAAACAAEAAAAuAAIAAAACAAEAAAAuAAMAAAACAAEAAAAuAAQAAAACAAEAAAAuAAUAAAACAAEAAAAuAAYAAAACAAEAAAAuAAcAAAACAAEAAAAuAAgAAAACAAEAAAAuAAkAAAACAAEAAAAuAAoAAAACAAEAAAAuAAsAAAACAAEAAAAuAAwAAAACAAEAAAAuAA0AAAACAAEAAAAuAA4AAAACAAEAAAAuAA8AAAACAAEAAAAuABAAAAACAAEAAAAuABEAAAACAAEAAAAuABIAAAACAAEAAAAuABMAAAACAAEAAAAuABQAAAACAAEAAAAuABUAAAACAAEAAAAuABYAAAACAAEAAAAuABcAAAACAAEAAAAuABgAAAACAAEAAAAuABkAAAACAAEAAAAuABoAAAACAAEAAAAuABsAAAACAAEAAAAuABwAAAACAAEAAAAuAB0AAAACAAEAAAAuAB4AAAACAAEAAAAuAB8AAAACAAEAAAAuACAAAAACAAEAAAAuACEAAAACAAEAAAAuACIAAAACAAEAAAAuACMAAAACAAEAAAAuACQAAAACAAEAAAAuACUAAAACAAEAAAAuACYAAAACAAEAAAAuACcAAAACAAEAAAAuACgAAAACAAEAAAAvAAAAAAACAAEAAAAvAAEAAAACAAEAAAAvAAIAAAACAAEAAAAvAAMAAAACAAEAAAAvAAQAAAACAAEAAAAvAAUAAAACAAEAAAAvAAYAAAACAAEAAAAvAAcAAAACAAEAAAAvAAgAAAACAAEAAAAvAAkAAAACAAEAAAAvAAoAAAACAAEAAAAvAAsAAAACAAEAAAAvAAwAAAACAAEAAAAvAA0AAAACAAEAAAAvAA4AAAACAAEAAAAvAA8AAAACAAEAAAAvABAAAAACAAEAAAAvABEAAAACAAEAAAAvABIAAAACAAEAAAAvABMAAAACAAEAAAAvABQAAAACAAEAAAAvABUAAAACAAEAAAAvABYAAAACAAEAAAAvABcAAAACAAEAAAAvABgAAAACAAEAAAAvABkAAAACAAEAAAAvABoAAAACAAEAAAAvABsAAAACAAEAAAAvABwAAAACAAEAAAAvAB0AAAACAAEAAAAvAB4AAAACAAEAAAAvAB8AAAACAAEAAAAvACAAAAACAAEAAAAvACEAAAACAAEAAAAvACIAAAACAAEAAAAvACMAAAACAAEAAAAvACQAAAACAAEAAAAvACUAAAACAAEAAAAvACYAAAACAAEAAAAvACcAAAACAAEAAAAvACgAAAACAAEAAAAwAAAAAAACAAEAAAAwAAEAAAACAAEAAAAwAAIAAAACAAEAAAAwAAMAAAACAAEAAAAwAAQAAAACAAEAAAAwAAUAAAACAAEAAAAwAAYAAAACAAEAAAAwAAcAAAACAAEAAAAwAAgAAAACAAEAAAAwAAkAAAACAAEAAAAwAAoAAAACAAEAAAAwAAsAAAACAAEAAAAwAAwAAAACAAEAAAAwAA0AAAACAAEAAAAwAA4AAAACAAEAAAAwAA8AAAACAAEAAAAwABAAAAACAAEAAAAwABEAAAACAAEAAAAwABIAAAACAAEAAAAwABMAAAACAAEAAAAwABQAAAACAAEAAAAwABUAAAACAAEAAAAwABYAAAACAAEAAAAwABcAAAACAAEAAAAwABgAAAACAAEAAAAwABkAAAACAAEAAAAwABoAAAACAAEAAAAwABsAAAACAAEAAAAwABwAAAACAAEAAAAwAB0AAAACAAEAAAAwAB4AAAACAAEAAAAwAB8AAAACAAEAAAAwACAAAAACAAEAAAAwACEAAAACAAEAAAAwACIAAAACAAEAAAAwACMAAAACAAEAAAAwACQAAAACAAEAAAAwACUAAAACAAEAAAAwACYAAAACAAEAAAAwACcAAAACAAEAAAAwACgAAAACAAEAAAAxAAAAAAACAAEAAAAxAAEAAAACAAEAAAAxAAIAAAACAAEAAAAxAAMAAAACAAEAAAAxAAQAAAACAAEAAAAxAAUAAAACAAEAAAAxAAYAAAACAAEAAAAxAAcAAAACAAEAAAAxAAgAAAACAAEAAAAxAAkAAAACAAEAAAAxAAoAAAACAAEAAAAxAAsAAAACAAEAAAAxAAwAAAACAAEAAAAxAA0AAAACAAEAAAAxAA4AAAACAAEAAAAxAA8AAAACAAEAAAAxABAAAAACAAEAAAAxABEAAAACAAEAAAAxABIAAAACAAEAAAAxABMAAAACAAEAAAAxABQAAAACAAEAAAAxABUAAAACAAEAAAAxABYAAAACAAEAAAAxABcAAAACAAEAAAAxABgAAAACAAEAAAAxABkAAAACAAEAAAAxABoAAAACAAEAAAAxABsAAAACAAEAAAAxABwAAAACAAEAAAAxAB0AAAACAAEAAAAxAB4AAAACAAEAAAAxAB8AAAACAAEAAAAxACAAAAACAAEAAAAxACEAAAACAAEAAAAxACIAAAACAAEAAAAxACMAAAACAAEAAAAxACQAAAACAAEAAAAxACUAAAACAAEAAAAxACYAAAACAAEAAAAxACcAAAACAAEAAAAxACgAAAACAAEAAAAyAAAAAAACAAEAAAAyAAEAAAACAAEAAAAyAAIAAAACAAEAAAAyAAMAAAACAAEAAAAyAAQAAAACAAEAAAAyAAUAAAACAAEAAAAyAAYAAAACAAEAAAAyAAcAAAACAAEAAAAyAAgAAAACAAEAAAAyAAkAAAACAAEAAAAyAAoAAAACAAEAAAAyAAsAAAACAAEAAAAyAAwAAAACAAEAAAAyAA0AAAACAAEAAAAyAA4AAAACAAEAAAAyAA8AAAACAAEAAAAyABAAAAACAAEAAAAyABEAAAACAAEAAAAyABIAAAACAAEAAAAyABMAAAACAAEAAAAyABQAAAACAAEAAAAyABUAAAACAAEAAAAyABYAAAACAAEAAAAyABcAAAACAAEAAAAyABgAAAACAAEAAAAyABkAAAACAAEAAAAyABoAAAACAAEAAAAyABsAAAACAAEAAAAyABwAAAACAAEAAAAyAB0AAAACAAEAAAAyAB4AAAACAAEAAAAyAB8AAAACAAEAAAAyACAAAAACAAEAAAAyACEAAAACAAEAAAAyACIAAAACAAEAAAAyACMAAAACAAEAAAAyACQAAAACAAEAAAAyACUAAAACAAEAAAAyACYAAAACAAEAAAAyACcAAAACAAEAAAAyACgAAAACAAEAAAAzAAAAAAACAAEAAAAzAAEAAAACAAEAAAAzAAIAAAACAAEAAAAzAAMAAAACAAEAAAAzAAQAAAACAAEAAAAzAAUAAAACAAEAAAAzAAYAAAACAAEAAAAzAAcAAAACAAEAAAAzAAgAAAACAAEAAAAzAAkAAAACAAEAAAAzAAoAAAACAAEAAAAzAAsAAAACAAEAAAAzAAwAAAACAAEAAAAzAA0AAAACAAEAAAAzAA4AAAACAAEAAAAzAA8AAAACAAEAAAAzABAAAAACAAEAAAAzABEAAAACAAEAAAAzABIAAAACAAEAAAAzABMAAAACAAEAAAAzABQAAAACAAEAAAAzABUAAAACAAEAAAAzABYAAAACAAEAAAAzABcAAAACAAEAAAAzABgAAAACAAEAAAAzABkAAAACAAEAAAAzABoAAAACAAEAAAAzABsAAAACAAEAAAAzABwAAAACAAEAAAAzAB0AAAACAAEAAAAzAB4AAAACAAEAAAAzAB8AAAACAAEAAAAzACAAAAACAAEAAAAzACEAAAACAAEAAAAzACIAAAACAAEAAAAzACMAAAACAAEAAAAzACQAAAACAAEAAAAzACUAAAACAAEAAAAzACYAAAACAAEAAAAzACcAAAACAAEAAAAzACgAAAACAAEAAAA0AAAAAAACAAEAAAA0AAEAAAACAAEAAAA0AAIAAAACAAEAAAA0AAMAAAACAAEAAAA0AAQAAAACAAEAAAA0AAUAAAACAAEAAAA0AAYAAAACAAEAAAA0AAcAAAACAAEAAAA0AAgAAAACAAEAAAA0AAkAAAACAAEAAAA0AAoAAAACAAEAAAA0AAsAAAACAAEAAAA0AAwAAAACAAEAAAA0AA0AAAACAAEAAAA0AA4AAAACAAEAAAA0AA8AAAACAAEAAAA0ABAAAAACAAEAAAA0ABEAAAACAAEAAAA0ABIAAAACAAEAAAA0ABMAAAACAAEAAAA0ABQAAAACAAEAAAA0ABUAAAACAAEAAAA0ABYAAAACAAEAAAA0ABcAAAACAAEAAAA0ABgAAAACAAEAAAA0ABkAAAACAAEAAAA0ABoAAAACAAEAAAA0ABsAAAACAAEAAAA0ABwAAAACAAEAAAA0AB0AAAACAAEAAAA0AB4AAAACAAEAAAA0AB8AAAACAAEAAAA0ACAAAAACAAEAAAA0ACEAAAACAAEAAAA0ACIAAAACAAEAAAA0ACMAAAACAAEAAAA0ACQAAAACAAEAAAA0ACUAAAACAAEAAAA0ACYAAAACAAEAAAA0ACcAAAACAAEAAAA0ACgAAAACAAEAAAA1AAAAAAACAAEAAAA1AAEAAAACAAEAAAA1AAIAAAACAAEAAAA1AAMAAAACAAEAAAA1AAQAAAACAAEAAAA1AAUAAAACAAEAAAA1AAYAAAACAAEAAAA1AAcAAAACAAEAAAA1AAgAAAACAAEAAAA1AAkAAAACAAEAAAA1AAoAAAACAAEAAAA1AAsAAAACAAEAAAA1AAwAAAACAAEAAAA1AA0AAAACAAEAAAA1AA4AAAACAAEAAAA1AA8AAAACAAEAAAA1ABAAAAACAAEAAAA1ABEAAAACAAEAAAA1ABIAAAACAAEAAAA1ABMAAAACAAEAAAA1ABQAAAACAAEAAAA1ABUAAAACAAEAAAA1ABYAAAACAAEAAAA1ABcAAAACAAEAAAA1ABgAAAACAAEAAAA1ABkAAAACAAEAAAA1ABoAAAACAAEAAAA1ABsAAAACAAEAAAA1ABwAAAACAAEAAAA1AB0AAAACAAEAAAA1AB4AAAACAAEAAAA1AB8AAAACAAEAAAA1ACAAAAACAAEAAAA1ACEAAAACAAEAAAA1ACIAAAACAAEAAAA1ACMAAAACAAEAAAA1ACQAAAACAAEAAAA1ACUAAAACAAEAAAA1ACYAAAACAAEAAAA1ACcAAAACAAEAAAA1ACgAAAACAAEAAAA2AAAAAAACAAEAAAA2AAEAAAACAAEAAAA2AAIAAAACAAEAAAA2AAMAAAACAAEAAAA2AAQAAAACAAEAAAA2AAUAAAACAAEAAAA2AAYAAAACAAEAAAA2AAcAAAACAAEAAAA2AAgAAAACAAEAAAA2AAkAAAACAAEAAAA2AAoAAAACAAEAAAA2AAsAAAACAAEAAAA2AAwAAAACAAEAAAA2AA0AAAACAAEAAAA2AA4AAAACAAEAAAA2AA8AAAACAAEAAAA2ABAAAAACAAEAAAA2ABEAAAACAAEAAAA2ABIAAAACAAEAAAA2ABMAAAACAAEAAAA2ABQAAAACAAEAAAA2ABUAAAACAAEAAAA2ABYAAAACAAEAAAA2ABcAAAACAAEAAAA2ABgAAAACAAEAAAA2ABkAAAACAAEAAAA2ABoAAAACAAEAAAA2ABsAAAACAAEAAAA2ABwAAAACAAEAAAA2AB0AAAACAAEAAAA2AB4AAAACAAEAAAA2AB8AAAACAAEAAAA2ACAAAAACAAEAAAA2ACEAAAACAAEAAAA2ACIAAAACAAEAAAA2ACMAAAACAAEAAAA2ACQAAAACAAEAAAA2ACUAAAACAAEAAAA2ACYAAAACAAEAAAA2ACcAAAACAAEAAAA2ACgAAAACAAEAAAA3AAAAAAACAAEAAAA3AAEAAAACAAEAAAA3AAIAAAACAAEAAAA3AAMAAAACAAEAAAA3AAQAAAACAAEAAAA3AAUAAAACAAEAAAA3AAYAAAACAAEAAAA3AAcAAAACAAEAAAA3AAgAAAACAAEAAAA3AAkAAAACAAEAAAA3AAoAAAACAAEAAAA3AAsAAAACAAEAAAA3AAwAAAACAAEAAAA3AA0AAAACAAEAAAA3AA4AAAACAAEAAAA3AA8AAAACAAEAAAA3ABAAAAACAAEAAAA3ABEAAAACAAEAAAA3ABIAAAACAAEAAAA3ABMAAAACAAEAAAA3ABQAAAACAAEAAAA3ABUAAAACAAEAAAA3ABYAAAACAAEAAAA3ABcAAAACAAEAAAA3ABgAAAACAAEAAAA3ABkAAAACAAEAAAA3ABoAAAACAAEAAAA3ABsAAAACAAEAAAA3ABwAAAACAAEAAAA3AB0AAAACAAEAAAA3AB4AAAACAAEAAAA3AB8AAAACAAEAAAA3ACAAAAACAAEAAAA3ACEAAAACAAEAAAA3ACIAAAACAAEAAAA3ACMAAAACAAEAAAA3ACQAAAACAAEAAAA3ACUAAAACAAEAAAA3ACYAAAACAAEAAAA3ACcAAAACAAEAAAA3ACgAAAACAAEAAAA4AAAAAAACAAEAAAA4AAEAAAACAAEAAAA4AAIAAAACAAEAAAA4AAMAAAACAAEAAAA4AAQAAAACAAEAAAA4AAUAAAACAAEAAAA4AAYAAAACAAEAAAA4AAcAAAACAAEAAAA4AAgAAAACAAEAAAA4AAkAAAACAAEAAAA4AAoAAAACAAEAAAA4AAsAAAACAAEAAAA4AAwAAAACAAEAAAA4AA0AAAACAAEAAAA4AA4AAAACAAEAAAA4AA8AAAACAAEAAAA4ABAAAAACAAEAAAA4ABEAAAACAAEAAAA4ABIAAAACAAEAAAA4ABMAAAACAAEAAAA4ABQAAAACAAEAAAA4ABUAAAACAAEAAAA4ABYAAAACAAEAAAA4ABcAAAACAAEAAAA4ABgAAAACAAEAAAA4ABkAAAACAAEAAAA4ABoAAAACAAEAAAA4ABsAAAACAAEAAAA4ABwAAAACAAEAAAA4AB0AAAACAAEAAAA4AB4AAAACAAEAAAA4AB8AAAACAAEAAAA4ACAAAAACAAEAAAA4ACEAAAACAAEAAAA4ACIAAAACAAEAAAA4ACMAAAACAAEAAAA4ACQAAAACAAEAAAA4ACUAAAACAAEAAAA4ACYAAAACAAEAAAA4ACcAAAACAAEAAAA4ACgAAAACAAEAAAA5AAAAAAACAAEAAAA5AAEAAAACAAEAAAA5AAIAAAACAAEAAAA5AAMAAAACAAEAAAA5AAQAAAACAAEAAAA5AAUAAAACAAEAAAA5AAYAAAACAAEAAAA5AAcAAAACAAEAAAA5AAgAAAACAAEAAAA5AAkAAAACAAEAAAA5AAoAAAACAAEAAAA5AAsAAAACAAEAAAA5AAwAAAACAAEAAAA5AA0AAAACAAEAAAA5AA4AAAACAAEAAAA5AA8AAAACAAEAAAA5ABAAAAACAAEAAAA5ABEAAAACAAEAAAA5ABIAAAACAAEAAAA5ABMAAAACAAEAAAA5ABQAAAACAAEAAAA5ABUAAAACAAEAAAA5ABYAAAACAAEAAAA5ABcAAAACAAEAAAA5ABgAAAACAAEAAAA5ABkAAAACAAEAAAA5ABoAAAACAAEAAAA5ABsAAAACAAEAAAA5ABwAAAACAAEAAAA5AB0AAAACAAEAAAA5AB4AAAACAAEAAAA5AB8AAAACAAEAAAA5ACAAAAACAAEAAAA5ACEAAAACAAEAAAA5ACIAAAACAAEAAAA5ACMAAAACAAEAAAA5ACQAAAACAAEAAAA5ACUAAAACAAEAAAA5ACYAAAACAAEAAAA5ACcAAAACAAEAAAA5ACgAAAACAAEAAAA6AAAAAAACAAEAAAA6AAEAAAACAAEAAAA6AAIAAAACAAEAAAA6AAMAAAACAAEAAAA6AAQAAAACAAEAAAA6AAUAAAACAAEAAAA6AAYAAAACAAEAAAA6AAcAAAACAAEAAAA6AAgAAAACAAEAAAA6AAkAAAACAAEAAAA6AAoAAAACAAEAAAA6AAsAAAACAAEAAAA6AAwAAAACAAEAAAA6AA0AAAACAAEAAAA6AA4AAAACAAEAAAA6AA8AAAACAAEAAAA6ABAAAAACAAEAAAA6ABEAAAACAAEAAAA6ABIAAAACAAEAAAA6ABMAAAACAAEAAAA6ABQAAAACAAEAAAA6ABUAAAACAAEAAAA6ABYAAAACAAEAAAA6ABcAAAACAAEAAAA6ABgAAAACAAEAAAA6ABkAAAACAAEAAAA6ABoAAAACAAEAAAA6ABsAAAACAAEAAAA6ABwAAAACAAEAAAA6AB0AAAACAAEAAAA6AB4AAAACAAEAAAA6AB8AAAACAAEAAAA6ACAAAAACAAEAAAA6ACEAAAACAAEAAAA6ACIAAAACAAEAAAA6ACMAAAACAAEAAAA6ACQAAAACAAEAAAA6ACUAAAACAAEAAAA6ACYAAAACAAEAAAA6ACcAAAACAAEAAAA6ACgAAAACAAEAAAA7AAAAAAACAAEAAAA7AAEAAAACAAEAAAA7AAIAAAACAAEAAAA7AAMAAAACAAEAAAA7AAQAAAACAAEAAAA7AAUAAAACAAEAAAA7AAYAAAACAAEAAAA7AAcAAAACAAEAAAA7AAgAAAACAAEAAAA7AAkAAAACAAEAAAA7AAoAAAACAAEAAAA7AAsAAAACAAEAAAA7AAwAAAACAAEAAAA7AA0AAAACAAEAAAA7AA4AAAACAAEAAAA7AA8AAAACAAEAAAA7ABAAAAACAAEAAAA7ABEAAAACAAEAAAA7ABIAAAACAAEAAAA7ABMAAAACAAEAAAA7ABQAAAACAAEAAAA7ABUAAAACAAEAAAA7ABYAAAACAAEAAAA7ABcAAAACAAEAAAA7ABgAAAACAAEAAAA7ABkAAAACAAEAAAA7ABoAAAACAAEAAAA7ABsAAAACAAEAAAA7ABwAAAACAAEAAAA7AB0AAAACAAEAAAA7AB4AAAACAAEAAAA7AB8AAAACAAEAAAA7ACAAAAACAAEAAAA7ACEAAAACAAEAAAA7ACIAAAACAAEAAAA7ACMAAAACAAEAAAA7ACQAAAACAAEAAAA7ACUAAAACAAEAAAA7ACYAAAACAAEAAAA7ACcAAAACAAEAAAA7ACgAAAACAAEAAAA8AAAAAAACAAEAAAA8AAEAAAACAAEAAAA8AAIAAAACAAEAAAA8AAMAAAACAAEAAAA8AAQAAAACAAEAAAA8AAUAAAACAAEAAAA8AAYAAAACAAEAAAA8AAcAAAACAAEAAAA8AAgAAAACAAEAAAA8AAkAAAACAAEAAAA8AAoAAAACAAEAAAA8AAsAAAACAAEAAAA8AAwAAAACAAEAAAA8AA0AAAACAAEAAAA8AA4AAAACAAEAAAA8AA8AAAACAAEAAAA8ABAAAAACAAEAAAA8ABEAAAACAAEAAAA8ABIAAAACAAEAAAA8ABMAAAACAAEAAAA8ABQAAAACAAEAAAA8ABUAAAACAAEAAAA8ABYAAAACAAEAAAA8ABcAAAACAAEAAAA8ABgAAAACAAEAAAA8ABkAAAACAAEAAAA8ABoAAAACAAEAAAA8ABsAAAACAAEAAAA8ABwAAAACAAEAAAA8AB0AAAACAAEAAAA8AB4AAAACAAEAAAA8AB8AAAACAAEAAAA8ACAAAAACAAEAAAA8ACEAAAACAAEAAAA8ACIAAAACAAEAAAA8ACMAAAACAAEAAAA8ACQAAAACAAEAAAA8ACUAAAACAAEAAAA8ACYAAAACAAEAAAA8ACcAAAACAAEAAAA8ACgAAAACAAEAAAA9AAAAAAACAAEAAAA9AAEAAAACAAEAAAA9AAIAAAACAAEAAAA9AAMAAAACAAEAAAA9AAQAAAACAAEAAAA9AAUAAAACAAEAAAA9AAYAAAACAAEAAAA9AAcAAAACAAEAAAA9AAgAAAACAAEAAAA9AAkAAAACAAEAAAA9AAoAAAACAAEAAAA9AAsAAAACAAEAAAA9AAwAAAACAAEAAAA9AA0AAAACAAEAAAA9AA4AAAACAAEAAAA9AA8AAAACAAEAAAA9ABAAAAACAAEAAAA9ABEAAAACAAEAAAA9ABIAAAACAAEAAAA9ABMAAAACAAEAAAA9ABQAAAACAAEAAAA9ABUAAAACAAEAAAA9ABYAAAACAAEAAAA9ABcAAAACAAEAAAA9ABgAAAACAAEAAAA9ABkAAAACAAEAAAA9ABoAAAACAAEAAAA9ABsAAAACAAEAAAA9ABwAAAACAAEAAAA9AB0AAAACAAEAAAA9AB4AAAACAAEAAAA9AB8AAAACAAEAAAA9ACAAAAACAAEAAAA9ACEAAAACAAEAAAA9ACIAAAACAAEAAAA9ACMAAAACAAEAAAA9ACQAAAACAAEAAAA9ACUAAAACAAEAAAA9ACYAAAACAAEAAAA9ACcAAAACAAEAAAA9ACgAAAACAAEAAAA+AAAAAAACAAEAAAA+AAEAAAACAAEAAAA+AAIAAAACAAEAAAA+AAMAAAACAAEAAAA+AAQAAAACAAEAAAA+AAUAAAACAAEAAAA+AAYAAAACAAEAAAA+AAcAAAACAAEAAAA+AAgAAAACAAEAAAA+AAkAAAACAAEAAAA+AAoAAAACAAEAAAA+AAsAAAACAAEAAAA+AAwAAAACAAEAAAA+AA0AAAACAAEAAAA+AA4AAAACAAEAAAA+AA8AAAACAAEAAAA+ABAAAAACAAEAAAA+ABEAAAACAAEAAAA+ABIAAAACAAEAAAA+ABMAAAACAAEAAAA+ABQAAAACAAEAAAA+ABUAAAACAAEAAAA+ABYAAAACAAEAAAA+ABcAAAACAAEAAAA+ABgAAAACAAEAAAA+ABkAAAACAAEAAAA+ABoAAAACAAEAAAA+ABsAAAACAAEAAAA+ABwAAAACAAEAAAA+AB0AAAACAAEAAAA+AB4AAAACAAEAAAA+AB8AAAACAAEAAAA+ACAAAAACAAEAAAA+ACEAAAACAAEAAAA+ACIAAAACAAEAAAA+ACMAAAACAAEAAAA+ACQAAAACAAEAAAA+ACUAAAACAAEAAAA+ACYAAAACAAEAAAA+ACcAAAACAAEAAAA+ACgAAAACAAEAAAA/AAAAAAACAAEAAAA/AAEAAAACAAEAAAA/AAIAAAACAAEAAAA/AAMAAAACAAEAAAA/AAQAAAACAAEAAAA/AAUAAAACAAEAAAA/AAYAAAACAAEAAAA/AAcAAAACAAEAAAA/AAgAAAACAAEAAAA/AAkAAAACAAEAAAA/AAoAAAACAAEAAAA/AAsAAAACAAEAAAA/AAwAAAACAAEAAAA/AA0AAAACAAEAAAA/AA4AAAACAAEAAAA/AA8AAAACAAEAAAA/ABAAAAACAAEAAAA/ABEAAAACAAEAAAA/ABIAAAACAAEAAAA/ABMAAAACAAEAAAA/ABQAAAACAAEAAAA/ABUAAAACAAEAAAA/ABYAAAACAAEAAAA/ABcAAAACAAEAAAA/ABgAAAACAAEAAAA/ABkAAAACAAEAAAA/ABoAAAACAAEAAAA/ABsAAAACAAEAAAA/ABwAAAACAAEAAAA/AB0AAAACAAEAAAA/AB4AAAACAAEAAAA/AB8AAAACAAEAAAA/ACAAAAACAAEAAAA/ACEAAAACAAEAAAA/ACIAAAACAAEAAAA/ACMAAAACAAEAAAA/ACQAAAACAAEAAAA/ACUAAAACAAEAAAA/ACYAAAACAAEAAAA/ACcAAAACAAEAAAA/ACgAAAACAAEAAABAAAAAAAACAAEAAABAAAEAAAACAAEAAABAAAIAAAACAAEAAABAAAMAAAACAAEAAABAAAQAAAACAAEAAABAAAUAAAACAAEAAABAAAYAAAACAAEAAABAAAcAAAACAAEAAABAAAgAAAACAAEAAABAAAkAAAACAAEAAABAAAoAAAACAAEAAABAAAsAAAACAAEAAABAAAwAAAACAAEAAABAAA0AAAACAAEAAABAAA4AAAACAAEAAABAAA8AAAACAAEAAABAABAAAAACAAEAAABAABEAAAACAAEAAABAABIAAAACAAEAAABAABMAAAACAAEAAABAABQAAAACAAEAAABAABUAAAACAAEAAABAABYAAAACAAEAAABAABcAAAACAAEAAABAABgAAAACAAEAAABAABkAAAACAAEAAABAABoAAAACAAEAAABAABsAAAACAAEAAABAABwAAAACAAEAAABAAB0AAAACAAEAAABAAB4AAAACAAEAAABAAB8AAAACAAEAAABAACAAAAACAAEAAABAACEAAAACAAEAAABAACIAAAACAAEAAABAACMAAAACAAEAAABAACQAAAACAAEAAABAACUAAAACAAEAAABAACYAAAACAAEAAABAACcAAAACAAEAAABAACgAAAACAAEAAABBAAAAAAACAAEAAABBAAEAAAACAAEAAABBAAIAAAACAAEAAABBAAMAAAACAAEAAABBAAQAAAACAAEAAABBAAUAAAACAAEAAABBAAYAAAACAAEAAABBAAcAAAACAAEAAABBAAgAAAACAAEAAABBAAkAAAACAAEAAABBAAoAAAACAAEAAABBAAsAAAACAAEAAABBAAwAAAACAAEAAABBAA0AAAACAAEAAABBAA4AAAACAAEAAABBAA8AAAACAAEAAABBABAAAAACAAEAAABBABEAAAACAAEAAABBABIAAAACAAEAAABBABMAAAACAAEAAABBABQAAAACAAEAAABBABUAAAACAAEAAABBABYAAAACAAEAAABBABcAAAACAAEAAABBABgAAAACAAEAAABBABkAAAACAAEAAABBABoAAAACAAEAAABBABsAAAACAAEAAABBABwAAAACAAEAAABBAB0AAAACAAEAAABBAB4AAAACAAEAAABBAB8AAAACAAEAAABBACAAAAACAAEAAABBACEAAAACAAEAAABBACIAAAACAAEAAABBACMAAAACAAEAAABBACQAAAACAAEAAABBACUAAAACAAEAAABBACYAAAACAAEAAABBACcAAAACAAEAAABBACgAAAACAAEAAABCAAAAAAACAAEAAABCAAEAAAACAAEAAABCAAIAAAACAAEAAABCAAMAAAACAAEAAABCAAQAAAACAAEAAABCAAUAAAACAAEAAABCAAYAAAACAAEAAABCAAcAAAACAAEAAABCAAgAAAACAAEAAABCAAkAAAACAAEAAABCAAoAAAACAAEAAABCAAsAAAACAAEAAABCAAwAAAACAAEAAABCAA0AAAACAAEAAABCAA4AAAACAAEAAABCAA8AAAACAAEAAABCABAAAAACAAEAAABCABEAAAACAAEAAABCABIAAAACAAEAAABCABMAAAACAAEAAABCABQAAAACAAEAAABCABUAAAACAAEAAABCABYAAAACAAEAAABCABcAAAACAAEAAABCABgAAAACAAEAAABCABkAAAACAAEAAABCABoAAAACAAEAAABCABsAAAACAAEAAABCABwAAAACAAEAAABCAB0AAAACAAEAAABCAB4AAAACAAEAAABCAB8AAAACAAEAAABCACAAAAACAAEAAABCACEAAAACAAEAAABCACIAAAACAAEAAABCACMAAAACAAEAAABCACQAAAACAAEAAABCACUAAAACAAEAAABCACYAAAACAAEAAABCACcAAAACAAEAAABCACgAAAACAAEAAABDAAAAAAACAAEAAABDAAEAAAACAAEAAABDAAIAAAACAAEAAABDAAMAAAACAAEAAABDAAQAAAACAAEAAABDAAUAAAACAAEAAABDAAYAAAACAAEAAABDAAcAAAACAAEAAABDAAgAAAACAAEAAABDAAkAAAACAAEAAABDAAoAAAACAAEAAABDAAsAAAACAAEAAABDAAwAAAACAAEAAABDAA0AAAACAAEAAABDAA4AAAACAAEAAABDAA8AAAACAAEAAABDABAAAAACAAEAAABDABEAAAACAAEAAABDABIAAAACAAEAAABDABMAAAACAAEAAABDABQAAAACAAEAAABDABUAAAACAAEAAABDABYAAAACAAEAAABDABcAAAACAAEAAABDABgAAAACAAEAAABDABkAAAACAAEAAABDABoAAAACAAEAAABDABsAAAACAAEAAABDABwAAAACAAEAAABDAB0AAAACAAEAAABDAB4AAAACAAEAAABDAB8AAAACAAEAAABDACAAAAACAAEAAABDACEAAAACAAEAAABDACIAAAACAAEAAABDACMAAAACAAEAAABDACQAAAACAAEAAABDACUAAAACAAEAAABDACYAAAACAAEAAABDACcAAAACAAEAAABDACgAAAACAAEAAABEAAAAAAACAAEAAABEAAEAAAACAAEAAABEAAIAAAACAAEAAABEAAMAAAACAAEAAABEAAQAAAACAAEAAABEAAUAAAACAAEAAABEAAYAAAACAAEAAABEAAcAAAACAAEAAABEAAgAAAACAAEAAABEAAkAAAACAAEAAABEAAoAAAACAAEAAABEAAsAAAACAAEAAABEAAwAAAACAAEAAABEAA0AAAACAAEAAABEAA4AAAACAAEAAABEAA8AAAACAAEAAABEABAAAAACAAEAAABEABEAAAACAAEAAABEABIAAAACAAEAAABEABMAAAACAAEAAABEABQAAAACAAEAAABEABUAAAACAAEAAABEABYAAAACAAEAAABEABcAAAACAAEAAABEABgAAAACAAEAAABEABkAAAACAAEAAABEABoAAAACAAEAAABEABsAAAACAAEAAABEABwAAAACAAEAAABEAB0AAAACAAEAAABEAB4AAAACAAEAAABEAB8AAAACAAEAAABEACAAAAACAAEAAABEACEAAAACAAEAAABEACIAAAACAAEAAABEACMAAAACAAEAAABEACQAAAACAAEAAABEACUAAAACAAEAAABEACYAAAACAAEAAABEACcAAAACAAEAAABEACgAAAACAAEAAABFAAAAAAACAAEAAABFAAEAAAACAAEAAABFAAIAAAACAAEAAABFAAMAAAACAAEAAABFAAQAAAACAAEAAABFAAUAAAACAAEAAABFAAYAAAACAAEAAABFAAcAAAACAAEAAABFAAgAAAACAAEAAABFAAkAAAACAAEAAABFAAoAAAACAAEAAABFAAsAAAACAAEAAABFAAwAAAACAAEAAABFAA0AAAACAAEAAABFAA4AAAACAAEAAABFAA8AAAACAAEAAABFABAAAAACAAEAAABFABEAAAACAAEAAABFABIAAAACAAEAAABFABMAAAACAAEAAABFABQAAAACAAEAAABFABUAAAACAAEAAABFABYAAAACAAEAAABFABcAAAACAAEAAABFABgAAAACAAEAAABFABkAAAACAAEAAABFABoAAAACAAEAAABFABsAAAACAAEAAABFABwAAAACAAEAAABFAB0AAAACAAEAAABFAB4AAAACAAEAAABFAB8AAAACAAEAAABFACAAAAACAAEAAABFACEAAAACAAEAAABFACIAAAACAAEAAABFACMAAAACAAEAAABFACQAAAACAAEAAABFACUAAAACAAEAAABFACYAAAACAAEAAABFACcAAAACAAEAAABFACgAAAACAAEAAABGAAAAAAACAAEAAABGAAEAAAACAAEAAABGAAIAAAACAAEAAABGAAMAAAACAAEAAABGAAQAAAACAAEAAABGAAUAAAACAAEAAABGAAYAAAACAAEAAABGAAcAAAACAAEAAABGAAgAAAACAAEAAABGAAkAAAACAAEAAABGAAoAAAACAAEAAABGAAsAAAACAAEAAABGAAwAAAACAAEAAABGAA0AAAACAAEAAABGAA4AAAACAAEAAABGAA8AAAACAAEAAABGABAAAAACAAEAAABGABEAAAACAAEAAABGABIAAAACAAEAAABGABMAAAACAAEAAABGABQAAAACAAEAAABGABUAAAACAAEAAABGABYAAAACAAEAAABGABcAAAACAAEAAABGABgAAAACAAEAAABGABkAAAACAAEAAABGABoAAAACAAEAAABGABsAAAACAAEAAABGABwAAAACAAEAAABGAB0AAAACAAEAAABGAB4AAAACAAEAAABGAB8AAAACAAEAAABGACAAAAACAAEAAABGACEAAAACAAEAAABGACIAAAACAAEAAABGACMAAAACAAEAAABGACQAAAACAAEAAABGACUAAAACAAEAAABGACYAAAACAAEAAABGACcAAAACAAEAAABGACgAAAACAAEAAABHAAAAAAACAAEAAABHAAEAAAACAAEAAABHAAIAAAACAAEAAABHAAMAAAACAAEAAABHAAQAAAACAAEAAABHAAUAAAACAAEAAABHAAYAAAACAAEAAABHAAcAAAACAAEAAABHAAgAAAACAAEAAABHAAkAAAACAAEAAABHAAoAAAACAAEAAABHAAsAAAACAAEAAABHAAwAAAACAAEAAABHAA0AAAACAAEAAABHAA4AAAACAAEAAABHAA8AAAACAAEAAABHABAAAAACAAEAAABHABEAAAACAAEAAABHABIAAAACAAEAAABHABMAAAACAAEAAABHABQAAAACAAEAAABHABUAAAACAAEAAABHABYAAAACAAEAAABHABcAAAACAAEAAABHABgAAAACAAEAAABHABkAAAACAAEAAABHABoAAAACAAEAAABHABsAAAACAAEAAABHABwAAAACAAEAAABHAB0AAAACAAEAAABHAB4AAAACAAEAAABHAB8AAAACAAEAAABHACAAAAACAAEAAABHACEAAAACAAEAAABHACIAAAACAAEAAABHACMAAAACAAEAAABHACQAAAACAAEAAABHACUAAAACAAEAAABHACYAAAACAAEAAABHACcAAAACAAEAAABHACgAAAACAAEAAAAsAA8AAAADAAEAAAArABUAAAAAAAIAAAAbAAsAAAACAAEAAAAbAAwAAAACAAEAAAAbAA0AAAACAAEAAAAbAA4AAAACAAEAAAAbAA8AAAACAAEAAAAbABAAAAACAAEAAAAbABEAAAACAAEAAAAbABIAAAACAAEAAAAbABMAAAACAAEAAAAbABQAAAACAAEAAAAbABUAAAACAAEAAAAbABYAAAACAAEAAAAbABcAAAACAAEAAAAbABgAAAACAAEAAAAcAAsAAAACAAEAAAAcAAwAAAACAAEAAAAcAA0AAAACAAEAAAAcAA4AAAABAAAAAAAcAA8AAAABAAEAAAAcABAAAAABAAEAAAAcABEAAAABAAEAAAAcABIAAAABAAEAAAAcABMAAAABAAEAAAAcABQAAAABAAEAAAAcABUAAAABAAEAAAAcABYAAAABAAEAAAAcABcAAAABAAEAAAAcABgAAAABAAEAAAAdAAsAAAACAAEAAAAdAAwAAAABAAMAAAAdAA0AAAABAAQAAAAdAA4AAAABAAUAAAAdAA8AAAAAAAIAAAAdABAAAAAAAAIAAAAdABEAAAAAAAIAAAAdABIAAAAAAAIAAAAdABMAAAAAAAIAAAAdABQAAAAAAAIAAAAdABUAAAAAAAIAAAAdABYAAAAAAAIAAAAdABcAAAAAAAIAAAAdABgAAAAAAAIAAAAeAAsAAAACAAEAAAAeAAwAAAACAAMAAAAeAA0AAAAMAAAAAAAeAA4AAAACAAUAAAAeAA8AAAAAAAIAAAAeABAAAAAAAAIAAAAeABEAAAAAAAIAAAAeABIAAAAAAAIAAAAeABMAAAAAAAIAAAAeABQAAAAAAAIAAAAeABUAAAAAAAIAAAAeABYAAAAAAAIAAAAeABcAAAAAAAIAAAAeABgAAAAAAAIAAAAfAAsAAAACAAEAAAAfAAwAAAADAAMAAAAfAA0AAAANAAAAAAAfAA4AAAADAAUAAAAfAA8AAAAAAAIAAAAfABAAAAAAAAIAAAAfABEAAAAAAAIAAAAfABIAAAAAAAIAAAAfABMAAAAAAAIAAAAfABQAAAAAAAIAAAAfABUAAAAAAAIAAAAfABYAAAAAAAIAAAAfABcAAAAAAAIAAAAfABgAAAAAAAIAAAAgAAsAAAACAAEAAAAgAAwAAAABAAMAAAAgAA0AAAACAAQAAAAgAA4AAAABAAUAAAAgAA8AAAAAAAIAAAAgABAAAAAAAAIAAAAgABEAAAAAAAIAAAAgABIAAAAAAAIAAAAgABMAAAAAAAIAAAAgABQAAAAAAAIAAAAgABUAAAAAAAIAAAAgABYAAAAAAAIAAAAgABcAAAAAAAIAAAAgABgAAAAAAAIAAAAhAAsAAAACAAEAAAAhAAwAAAACAAMAAAAhAA0AAAACAAQAAAAhAA4AAAACAAUAAAAhAA8AAAAAAAIAAAAhABAAAAAAAAIAAAAhABEAAAAAAAIAAAAhABIAAAAAAAIAAAAhABMAAAAAAAIAAAAhABQAAAAAAAIAAAAhABUAAAAAAAIAAAAhABYAAAAAAAIAAAAhABcAAAAAAAIAAAAhABgAAAAAAAIAAAAiAAsAAAACAAEAAAAiAAwAAAADAAMAAAAiAA0AAAAMAAoAAAAiAA4AAAAMAAsAAAAiAA8AAAAMAAwAAAAiABAAAAAAAAIAAAAiABEAAAAAAAIAAAAiABIAAAAAAAIAAAAiABMAAAAAAAIAAAAiABQAAAAAAAIAAAAiABUAAAAAAAIAAAAiABYAAAAAAAIAAAAiABcAAAAQAAQAAAAiABgAAAAAAAIAAAAjAAsAAAACAAEAAAAjAAwAAAACAAMAAAAjAA0AAAANAAoAAAAjAA4AAAANAAsAAAAjAA8AAAANAAwAAAAjABAAAAAAAAIAAAAjABEAAAAAAAIAAAAjABIAAAAAAAIAAAAjABMAAAAAAAIAAAAjABQAAAAAAAIAAAAjABUAAAAAAAIAAAAjABYAAAAAAAIAAAAjABcAAAAAAAIAAAAjABgAAAAAAAIAAAAkAAsAAAACAAEAAAAkAAwAAAACAAMAAAAkAA0AAAACAAQAAAAkAA4AAAACAAUAAAAkAA8AAAAAAAIAAAAkABAAAAAAAAIAAAAkABEAAAAAAAIAAAAkABIAAAAAAAIAAAAkABMAAAAAAAIAAAAkABQAAAAAAAIAAAAkABUAAAAPAAQAAAAkABYAAAAAAAIAAAAkABcAAAANAAEAAAAkABgAAAARAAQAAAAlAAsAAAACAAEAAAAlAAwAAAADAAMAAAAlAA0AAAADAAQAAAAlAA4AAAADAAUAAAAlAA8AAAAAAAIAAAAlABAAAAAAAAIAAAAlABEAAAAAAAIAAAAlABIAAAAAAAIAAAAlABMAAAAAAAIAAAAlABQAAAAAAAIAAAAlABUAAAAAAAIAAAAlABYAAAAAAAIAAAAlABcAAAAAAAIAAAAlABgAAAAAAAIAAAAmAAsAAAACAAEAAAAmAAwAAAABAAMAAAAmAA0AAAABAAQAAAAmAA4AAAABAAUAAAAmAA8AAAAAAAIAAAAmABAAAAAAAAIAAAAmABEAAAAAAAcAAAAmABIAAAAAAAgAAAAmABMAAAAAAAkAAAAmABQAAAAAAAIAAAAmABUAAAAAAAIAAAAmABYAAAAAAAIAAAAmABcAAAASAAQAAAAmABgAAAAAAAIAAAAnAAsAAAACAAEAAAAnAAwAAAACAAMAAAAnAA0AAAACAAQAAAAnAA4AAAACAAUAAAAnAA8AAAAAAAIAAAAnABAAAAAAAAIAAAAnABEAAAABAAcAAAAnABIAAAABAAgAAAAnABMAAAABAAkAAAAnABQAAAAAAAIAAAAnABUAAAAAAAIAAAAnABYAAAAAAAIAAAAnABcAAAAAAAIAAAAnABgAAAAAAAIAAAAoAAsAAAACAAEAAAAoAAwAAAADAAMAAAAoAA0AAAADAAQAAAAoAA4AAAADAAUAAAAoAA8AAAAAAAIAAAAoABAAAAAAAAIAAAAoABEAAAACAAcAAAAoABIAAAACAAgAAAAoABMAAAACAAkAAAAoABQAAAAAAAIAAAAoABUAAAAAAAIAAAAoABYAAAAAAAIAAAAoABcAAAAAAAIAAAAoABgAAAAAAAIAAAApAAsAAAACAAEAAAApAAwAAAABAAMAAAApAA0AAAABAAQAAAApAA4AAAABAAUAAAApAA8AAAATAAEAAAApABAAAAATAAIAAAApABEAAAATAAMAAAApABIAAAAAAAIAAAApABMAAAAAAAIAAAApABQAAAAAAAIAAAApABUAAAAAAAIAAAApABYAAAAAAAIAAAApABcAAAAAAAIAAAApABgAAAAAAAIAAAAXAAYAAAACAAEAAAAXAAcAAAACAAEAAAAXAAgAAAACAAEAAAAXAAkAAAACAAEAAAAXAAoAAAACAAEAAAAXAAsAAAACAAEAAAAXAAwAAAACAAEAAAAXAA0AAAACAAEAAAAXAA4AAAACAAEAAAAXAA8AAAACAAEAAAAXABAAAAACAAEAAAAXABEAAAACAAEAAAAXABIAAAACAAEAAAAYAAYAAAACAAEAAAAYAAcAAAACAAEAAAAYAAgAAAACAAEAAAAYAAkAAAACAAEAAAAYAAoAAAACAAEAAAAYAAsAAAACAAEAAAAYAAwAAAACAAEAAAAYAA0AAAACAAEAAAAYAA4AAAACAAEAAAAYAA8AAAACAAEAAAAYABAAAAACAAEAAAAYABEAAAACAAEAAAAYABIAAAACAAEAAAAZAAYAAAACAAEAAAAZAAcAAAACAAEAAAAZAAgAAAACAAEAAAAZAAkAAAACAAEAAAAZAAoAAAACAAEAAAAZAAsAAAACAAEAAAAZAAwAAAACAAEAAAAZAA0AAAACAAEAAAAZAA4AAAACAAEAAAAZAA8AAAACAAEAAAAZABAAAAACAAEAAAAZABEAAAACAAEAAAAZABIAAAACAAEAAAAaAAYAAAACAAEAAAAaAAcAAAACAAEAAAAaAAgAAAACAAEAAAAaAAkAAAACAAEAAAAaAAoAAAACAAEAAAAaAAsAAAACAAEAAAAaAAwAAAACAAEAAAAaAA0AAAACAAEAAAAaAA4AAAACAAEAAAAaAA8AAAACAAEAAAAaABAAAAACAAEAAAAaABEAAAACAAEAAAAaABIAAAACAAEAAAAbAAYAAAACAAEAAAAbAAcAAAACAAEAAAAbAAgAAAACAAEAAAAbAAkAAAACAAEAAAAbAAoAAAACAAEAAAAXABMAAAACAAEAAAAXABQAAAACAAEAAAAXABUAAAACAAEAAAAXABYAAAACAAEAAAAXABcAAAACAAEAAAAXABgAAAACAAEAAAAYABMAAAACAAEAAAAYABQAAAACAAEAAAAYABUAAAACAAEAAAAYABYAAAACAAEAAAAYABcAAAACAAEAAAAYABgAAAACAAEAAAAZABMAAAACAAEAAAAZABQAAAACAAEAAAAZABUAAAACAAEAAAAZABYAAAACAAEAAAAZABcAAAACAAEAAAAZABgAAAACAAEAAAAaABMAAAACAAEAAAAaABQAAAACAAEAAAAaABUAAAACAAEAAAAaABYAAAACAAEAAAAaABcAAAACAAEAAAAaABgAAAACAAEAAAAcAAYAAAACAAEAAAAcAAcAAAACAAEAAAAcAAgAAAACAAEAAAAcAAkAAAACAAEAAAAcAAoAAAACAAEAAAAdAAYAAAACAAEAAAAdAAcAAAACAAEAAAAdAAgAAAACAAEAAAAdAAkAAAACAAEAAAAdAAoAAAACAAEAAAAeAAYAAAACAAEAAAAeAAcAAAACAAEAAAAeAAgAAAACAAEAAAAeAAkAAAACAAEAAAAeAAoAAAACAAEAAAAfAAYAAAACAAEAAAAfAAcAAAACAAEAAAAfAAgAAAACAAEAAAAfAAkAAAACAAEAAAAfAAoAAAACAAEAAAAgAAYAAAACAAEAAAAgAAcAAAACAAEAAAAgAAgAAAACAAEAAAAgAAkAAAACAAEAAAAgAAoAAAACAAEAAAAhAAYAAAACAAEAAAAhAAcAAAACAAEAAAAhAAgAAAACAAEAAAAhAAkAAAACAAEAAAAhAAoAAAACAAEAAAAiAAYAAAACAAEAAAAiAAcAAAACAAEAAAAiAAgAAAACAAEAAAAiAAkAAAACAAEAAAAiAAoAAAACAAEAAAAjAAYAAAACAAEAAAAjAAcAAAACAAEAAAAjAAgAAAACAAEAAAAjAAkAAAACAAEAAAAjAAoAAAACAAEAAAAkAAYAAAACAAEAAAAkAAcAAAACAAEAAAAkAAgAAAACAAEAAAAkAAkAAAACAAEAAAAkAAoAAAACAAEAAAAlAAYAAAACAAEAAAAlAAcAAAACAAEAAAAlAAgAAAACAAEAAAAlAAkAAAACAAEAAAAlAAoAAAACAAEAAAAmAAYAAAACAAEAAAAmAAcAAAACAAEAAAAmAAgAAAACAAEAAAAmAAkAAAACAAEAAAAmAAoAAAACAAEAAAAnAAYAAAACAAEAAAAnAAcAAAACAAEAAAAnAAgAAAACAAEAAAAnAAkAAAACAAEAAAAnAAoAAAACAAEAAAAoAAYAAAACAAEAAAAoAAcAAAACAAEAAAAoAAgAAAACAAEAAAAoAAkAAAACAAEAAAAoAAoAAAACAAEAAAApAAYAAAACAAEAAAApAAcAAAACAAEAAAApAAgAAAACAAEAAAApAAkAAAACAAEAAAApAAoAAAACAAEAAAD0////AAACAAEAAAD1////AAACAAEAAAD1/wAAAAACAAEAAAD2/wAAAAACAAEAAAD2/wEAAAACAAEAAAD3/wIAAAACAAEAAAD4/wMAAAACAAEAAAD4/wQAAAACAAEAAAD5/wUAAAACAAEAAAD6/wYAAAACAAEAAAD6/wcAAAACAAEAAAD7/wgAAAACAAEAAAD8/wkAAAACAAEAAAD9/woAAAACAAEAAAD+/wsAAAACAAEAAAD+/wwAAAACAAEAAAD//w0AAAACAAEAAADl//T/AAACAAEAAADl//X/AAACAAEAAADl//b/AAACAAEAAADl//f/AAACAAEAAADl//j/AAACAAEAAADl//n/AAACAAEAAADl//r/AAACAAEAAADl//v/AAACAAEAAADl//z/AAACAAEAAADl//3/AAACAAEAAADl//7/AAACAAEAAADl////AAACAAEAAADl/wAAAAACAAEAAADl/wEAAAACAAEAAADl/wIAAAACAAEAAADl/wMAAAACAAEAAADl/wQAAAACAAEAAADl/wUAAAACAAEAAADl/wYAAAACAAEAAADl/wcAAAACAAEAAADl/wgAAAACAAEAAADl/wkAAAACAAEAAADl/woAAAACAAEAAADl/wsAAAACAAEAAADl/wwAAAACAAEAAADl/w0AAAACAAEAAADl/w4AAAACAAEAAADl/w8AAAACAAEAAADl/xAAAAACAAEAAADl/xEAAAACAAEAAADl/xIAAAACAAEAAADl/xMAAAACAAEAAADl/xQAAAACAAEAAADl/xUAAAACAAEAAADl/xYAAAACAAEAAADl/xcAAAACAAEAAADl/xgAAAACAAEAAADl/xkAAAACAAEAAADl/xoAAAACAAEAAADl/xsAAAACAAEAAADl/xwAAAACAAEAAADl/x0AAAACAAEAAADl/x4AAAACAAEAAADl/x8AAAACAAEAAADl/yAAAAACAAEAAADl/yEAAAACAAEAAADl/yIAAAACAAEAAADl/yMAAAACAAEAAADl/yQAAAACAAEAAADl/yUAAAACAAEAAADl/yYAAAACAAEAAADl/ycAAAACAAEAAADl/ygAAAACAAEAAADl/ykAAAACAAEAAADl/yoAAAACAAEAAADl/ysAAAACAAEAAADl/ywAAAACAAEAAADl/y0AAAACAAEAAADl/y4AAAACAAEAAADl/y8AAAACAAEAAADl/zAAAAACAAEAAADl/zEAAAACAAEAAADl/zIAAAACAAEAAADl/zMAAAACAAEAAADl/zQAAAACAAEAAADl/zUAAAACAAEAAADl/zYAAAACAAEAAADl/zcAAAACAAEAAADl/zgAAAACAAEAAADm//T/AAACAAEAAADm//X/AAACAAEAAADm//b/AAACAAEAAADm//f/AAACAAEAAADm//j/AAACAAEAAADm//n/AAACAAEAAADm//r/AAACAAEAAADm//v/AAACAAEAAADm//z/AAACAAEAAADm//3/AAACAAEAAADm//7/AAACAAEAAADm////AAACAAEAAADm/wAAAAACAAEAAADm/wEAAAACAAEAAADm/wIAAAACAAEAAADm/wMAAAACAAEAAADm/wQAAAACAAEAAADm/wUAAAACAAEAAADm/wYAAAACAAEAAADm/wcAAAACAAEAAADm/wgAAAACAAEAAADm/wkAAAACAAEAAADm/woAAAACAAEAAADm/wsAAAACAAEAAADm/wwAAAACAAEAAADm/w0AAAACAAEAAADm/w4AAAACAAEAAADm/w8AAAACAAEAAADm/xAAAAACAAEAAADm/xEAAAACAAEAAADm/xIAAAACAAEAAADm/xMAAAACAAEAAADm/xQAAAACAAEAAADm/xUAAAACAAEAAADm/xYAAAACAAEAAADm/xcAAAACAAEAAADm/xgAAAACAAEAAADm/xkAAAACAAEAAADm/xoAAAACAAEAAADm/xsAAAACAAEAAADm/xwAAAACAAEAAADm/x0AAAACAAEAAADm/x4AAAACAAEAAADm/x8AAAACAAEAAADm/yAAAAACAAEAAADm/yEAAAACAAEAAADm/yIAAAACAAEAAADm/yMAAAACAAEAAADm/yQAAAACAAEAAADm/yUAAAACAAEAAADm/yYAAAACAAEAAADm/ycAAAACAAEAAADm/ygAAAACAAEAAADm/ykAAAACAAEAAADm/yoAAAACAAEAAADm/ysAAAACAAEAAADm/ywAAAACAAEAAADm/y0AAAACAAEAAADm/y4AAAACAAEAAADm/y8AAAACAAEAAADm/zAAAAACAAEAAADm/zEAAAACAAEAAADm/zIAAAACAAEAAADm/zMAAAACAAEAAADm/zQAAAACAAEAAADm/zUAAAACAAEAAADm/zYAAAACAAEAAADm/zcAAAACAAEAAADm/zgAAAACAAEAAADn//T/AAACAAEAAADn//X/AAACAAEAAADn//b/AAACAAEAAADn//f/AAACAAEAAADn//j/AAACAAEAAADn//n/AAACAAEAAADn//r/AAACAAEAAADn//v/AAACAAEAAADn//z/AAACAAEAAADn//3/AAACAAEAAADn//7/AAACAAEAAADn////AAACAAEAAADn/wAAAAACAAEAAADn/wEAAAACAAEAAADn/wIAAAACAAEAAADn/wMAAAACAAEAAADn/wQAAAACAAEAAADn/wUAAAACAAEAAADn/wYAAAACAAEAAADn/wcAAAACAAEAAADn/wgAAAACAAEAAADn/wkAAAACAAEAAADn/woAAAACAAEAAADn/wsAAAACAAEAAADn/wwAAAACAAEAAADn/w0AAAACAAEAAADn/w4AAAACAAEAAADn/w8AAAACAAEAAADn/xAAAAACAAEAAADn/xEAAAACAAEAAADn/xIAAAACAAEAAADn/xMAAAACAAEAAADn/xQAAAACAAEAAADn/xUAAAACAAEAAADn/xYAAAACAAEAAADn/xcAAAACAAEAAADn/xgAAAACAAEAAADn/xkAAAACAAEAAADn/xoAAAACAAEAAADn/xsAAAACAAEAAADn/xwAAAACAAEAAADn/x0AAAACAAEAAADn/x4AAAACAAEAAADn/x8AAAACAAEAAADn/yAAAAACAAEAAADn/yEAAAACAAEAAADn/yIAAAACAAEAAADn/yMAAAACAAEAAADn/yQAAAACAAEAAADn/yUAAAACAAEAAADn/yYAAAACAAEAAADn/ycAAAACAAEAAADn/ygAAAACAAEAAADn/ykAAAACAAEAAADn/yoAAAACAAEAAADn/ysAAAACAAEAAADn/ywAAAACAAEAAADn/y0AAAACAAEAAADn/y4AAAACAAEAAADn/y8AAAACAAEAAADn/zAAAAACAAEAAADn/zEAAAACAAEAAADn/zIAAAACAAEAAADn/zMAAAACAAEAAADn/zQAAAACAAEAAADn/zUAAAACAAEAAADn/zYAAAACAAEAAADn/zcAAAACAAEAAADn/zgAAAACAAEAAADo//T/AAACAAEAAADo//X/AAACAAEAAADo//b/AAACAAEAAADo//f/AAACAAEAAADo//j/AAACAAEAAADo//n/AAACAAEAAADo//r/AAACAAEAAADo//v/AAACAAEAAADo//z/AAACAAEAAADo//3/AAACAAEAAADo//7/AAACAAEAAADo////AAACAAEAAADo/wAAAAACAAEAAADo/wEAAAACAAEAAADo/wIAAAACAAEAAADo/wMAAAACAAEAAADo/wQAAAACAAEAAADo/wUAAAACAAEAAADo/wYAAAACAAEAAADo/wcAAAACAAEAAADo/wgAAAACAAEAAADo/wkAAAACAAEAAADo/woAAAACAAEAAADo/wsAAAACAAEAAADo/wwAAAACAAEAAADo/w0AAAACAAEAAADo/w4AAAACAAEAAADo/w8AAAACAAEAAADo/xAAAAACAAEAAADo/xEAAAACAAEAAADo/xIAAAACAAEAAADo/xMAAAACAAEAAADo/xQAAAACAAEAAADo/xUAAAACAAEAAADo/xYAAAACAAEAAADo/xcAAAACAAEAAADo/xgAAAACAAEAAADo/xkAAAACAAEAAADo/xoAAAACAAEAAADo/xsAAAACAAEAAADo/xwAAAACAAEAAADo/x0AAAACAAEAAADo/x4AAAACAAEAAADo/x8AAAACAAEAAADo/yAAAAACAAEAAADo/yEAAAACAAEAAADo/yIAAAACAAEAAADo/yMAAAACAAEAAADo/yQAAAACAAEAAADo/yUAAAACAAEAAADo/yYAAAACAAEAAADo/ycAAAACAAEAAADo/ygAAAACAAEAAADo/ykAAAACAAEAAADo/yoAAAACAAEAAADo/ysAAAACAAEAAADo/ywAAAACAAEAAADo/y0AAAACAAEAAADo/y4AAAACAAEAAADo/y8AAAACAAEAAADo/zAAAAACAAEAAADo/zEAAAACAAEAAADo/zIAAAACAAEAAADo/zMAAAACAAEAAADo/zQAAAACAAEAAADo/zUAAAACAAEAAADo/zYAAAACAAEAAADo/zcAAAACAAEAAADo/zgAAAACAAEAAADp//T/AAACAAEAAADp//X/AAACAAEAAADp//b/AAACAAEAAADp//f/AAACAAEAAADp//j/AAACAAEAAADp//n/AAACAAEAAADp//r/AAACAAEAAADp//v/AAACAAEAAADp//z/AAACAAEAAADp//3/AAACAAEAAADp//7/AAACAAEAAADp////AAACAAEAAADp/wAAAAACAAEAAADp/wEAAAACAAEAAADp/wIAAAACAAEAAADp/wMAAAACAAEAAADp/wQAAAACAAEAAADp/wUAAAACAAEAAADp/wYAAAACAAEAAADp/wcAAAACAAEAAADp/wgAAAACAAEAAADp/wkAAAACAAEAAADp/woAAAACAAEAAADp/wsAAAACAAEAAADp/wwAAAACAAEAAADp/w0AAAACAAEAAADp/w4AAAACAAEAAADp/w8AAAACAAEAAADp/xAAAAACAAEAAADp/xEAAAACAAEAAADp/xIAAAACAAEAAADp/xMAAAACAAEAAADp/xQAAAACAAEAAADp/xUAAAACAAEAAADp/xYAAAACAAEAAADp/xcAAAACAAEAAADp/xgAAAACAAEAAADp/xkAAAACAAEAAADp/xoAAAACAAEAAADp/xsAAAACAAEAAADp/xwAAAACAAEAAADp/x0AAAACAAEAAADp/x4AAAACAAEAAADp/x8AAAACAAEAAADp/yAAAAACAAEAAADp/yEAAAACAAEAAADp/yIAAAACAAEAAADp/yMAAAACAAEAAADp/yQAAAACAAEAAADp/yUAAAACAAEAAADp/yYAAAACAAEAAADp/ycAAAACAAEAAADp/ygAAAACAAEAAADp/ykAAAACAAEAAADp/yoAAAACAAEAAADp/ysAAAACAAEAAADp/ywAAAACAAEAAADp/y0AAAACAAEAAADp/y4AAAACAAEAAADp/y8AAAACAAEAAADp/zAAAAACAAEAAADp/zEAAAACAAEAAADp/zIAAAACAAEAAADp/zMAAAACAAEAAADp/zQAAAACAAEAAADp/zUAAAACAAEAAADp/zYAAAACAAEAAADp/zcAAAACAAEAAADp/zgAAAACAAEAAADq//T/AAACAAEAAADq//X/AAACAAEAAADq//b/AAACAAEAAADq//f/AAACAAEAAADq//j/AAACAAEAAADq//n/AAACAAEAAADq//r/AAACAAEAAADq//v/AAACAAEAAADq//z/AAACAAEAAADq//3/AAACAAEAAADq//7/AAACAAEAAADq////AAACAAEAAADq/wAAAAACAAEAAADq/wEAAAACAAEAAADq/wIAAAACAAEAAADq/wMAAAACAAEAAADq/wQAAAACAAEAAADq/wUAAAACAAEAAADq/wYAAAACAAEAAADq/wcAAAACAAEAAADq/wgAAAACAAEAAADq/wkAAAACAAEAAADq/woAAAACAAEAAADq/wsAAAACAAEAAADq/wwAAAACAAEAAADq/w0AAAACAAEAAADq/w4AAAACAAEAAADq/w8AAAACAAEAAADq/xAAAAACAAEAAADq/xEAAAACAAEAAADq/xIAAAACAAEAAADq/xMAAAACAAEAAADq/xQAAAACAAEAAADq/xUAAAACAAEAAADq/xYAAAACAAEAAADq/xcAAAACAAEAAADq/xgAAAACAAEAAADq/xkAAAACAAEAAADq/xoAAAACAAEAAADq/xsAAAACAAEAAADq/xwAAAACAAEAAADq/x0AAAACAAEAAADq/x4AAAACAAEAAADq/x8AAAACAAEAAADq/yAAAAACAAEAAADq/yEAAAACAAEAAADq/yIAAAACAAEAAADq/yMAAAACAAEAAADq/yQAAAACAAEAAADq/yUAAAACAAEAAADq/yYAAAACAAEAAADq/ycAAAACAAEAAADq/ygAAAACAAEAAADq/ykAAAACAAEAAADq/yoAAAACAAEAAADq/ysAAAACAAEAAADq/ywAAAACAAEAAADq/y0AAAACAAEAAADq/y4AAAACAAEAAADq/y8AAAACAAEAAADq/zAAAAACAAEAAADq/zEAAAACAAEAAADq/zIAAAACAAEAAADq/zMAAAACAAEAAADq/zQAAAACAAEAAADq/zUAAAACAAEAAADq/zYAAAACAAEAAADq/zcAAAACAAEAAADq/zgAAAACAAEAAADr//T/AAACAAEAAADr//X/AAACAAEAAADr//b/AAACAAEAAADr//f/AAACAAEAAADr//j/AAACAAEAAADr//n/AAACAAEAAADr//r/AAACAAEAAADr//v/AAACAAEAAADr//z/AAACAAEAAADr//3/AAACAAEAAADr//7/AAACAAEAAADr////AAACAAEAAADr/wAAAAACAAEAAADr/wEAAAACAAEAAADr/wIAAAACAAEAAADr/wMAAAACAAEAAADr/wQAAAACAAEAAADr/wUAAAACAAEAAADr/wYAAAACAAEAAADr/wcAAAACAAEAAADr/wgAAAACAAEAAADr/wkAAAACAAEAAADr/woAAAACAAEAAADr/wsAAAACAAEAAADr/wwAAAACAAEAAADr/w0AAAACAAEAAADr/w4AAAACAAEAAADr/w8AAAACAAEAAADr/xAAAAACAAEAAADr/xEAAAACAAEAAADr/xIAAAACAAEAAADr/xMAAAACAAEAAADr/xQAAAACAAEAAADr/xUAAAACAAEAAADr/xYAAAACAAEAAADr/xcAAAACAAEAAADr/xgAAAACAAEAAADr/xkAAAACAAEAAADr/xoAAAACAAEAAADr/xsAAAACAAEAAADr/xwAAAACAAEAAADr/x0AAAACAAEAAADr/x4AAAACAAEAAADr/x8AAAACAAEAAADr/yAAAAACAAEAAADr/yEAAAACAAEAAADr/yIAAAACAAEAAADr/yMAAAACAAEAAADr/yQAAAACAAEAAADr/yUAAAACAAEAAADr/yYAAAACAAEAAADr/ycAAAACAAEAAADr/ygAAAACAAEAAADr/ykAAAACAAEAAADr/yoAAAACAAEAAADr/ysAAAACAAEAAADr/ywAAAACAAEAAADr/y0AAAACAAEAAADr/y4AAAACAAEAAADr/y8AAAACAAEAAADr/zAAAAACAAEAAADr/zEAAAACAAEAAADr/zIAAAACAAEAAADr/zMAAAACAAEAAADr/zQAAAACAAEAAADr/zUAAAACAAEAAADr/zYAAAACAAEAAADr/zcAAAACAAEAAADr/zgAAAACAAEAAADs//T/AAACAAEAAADs//X/AAACAAEAAADs//b/AAACAAEAAADs//f/AAACAAEAAADs//j/AAACAAEAAADs//n/AAACAAEAAADs//r/AAACAAEAAADs//v/AAACAAEAAADs//z/AAACAAEAAADs//3/AAACAAEAAADs//7/AAACAAEAAADs////AAACAAEAAADs/wAAAAACAAEAAADs/wEAAAACAAEAAADs/wIAAAACAAEAAADs/wMAAAACAAEAAADs/wQAAAACAAEAAADs/wUAAAACAAEAAADs/wYAAAACAAEAAADs/wcAAAACAAEAAADs/wgAAAACAAEAAADs/wkAAAACAAEAAADs/woAAAACAAEAAADs/wsAAAACAAEAAADs/wwAAAACAAEAAADs/w0AAAACAAEAAADs/w4AAAACAAEAAADs/w8AAAACAAEAAADs/xAAAAACAAEAAADs/xEAAAACAAEAAADs/xIAAAACAAEAAADs/xMAAAACAAEAAADs/xQAAAACAAEAAADs/xUAAAACAAEAAADs/xYAAAACAAEAAADs/xcAAAACAAEAAADs/xgAAAACAAEAAADs/xkAAAACAAEAAADs/xoAAAACAAEAAADs/xsAAAACAAEAAADs/xwAAAACAAEAAADs/x0AAAACAAEAAADs/x4AAAACAAEAAADs/x8AAAACAAEAAADs/yAAAAACAAEAAADs/yEAAAACAAEAAADs/yIAAAACAAEAAADs/yMAAAACAAEAAADs/yQAAAACAAEAAADs/yUAAAACAAEAAADs/yYAAAACAAEAAADs/ycAAAACAAEAAADs/ygAAAACAAEAAADs/ykAAAACAAEAAADs/yoAAAACAAEAAADs/ysAAAACAAEAAADs/ywAAAACAAEAAADs/y0AAAACAAEAAADs/y4AAAACAAEAAADs/y8AAAACAAEAAADs/zAAAAACAAEAAADs/zEAAAACAAEAAADs/zIAAAACAAEAAADs/zMAAAACAAEAAADs/zQAAAACAAEAAADs/zUAAAACAAEAAADs/zYAAAACAAEAAADs/zcAAAACAAEAAADs/zgAAAACAAEAAADt//T/AAACAAEAAADt//X/AAACAAEAAADt//b/AAACAAEAAADt//f/AAACAAEAAADt//j/AAACAAEAAADt//n/AAACAAEAAADt//r/AAACAAEAAADt//v/AAACAAEAAADt//z/AAACAAEAAADt//3/AAACAAEAAADt//7/AAACAAEAAADt////AAACAAEAAADt/wAAAAACAAEAAADt/wEAAAACAAEAAADt/wIAAAACAAEAAADt/wMAAAACAAEAAADt/wQAAAACAAEAAADt/wUAAAACAAEAAADt/wYAAAACAAEAAADt/wcAAAACAAEAAADt/wgAAAACAAEAAADt/wkAAAACAAEAAADt/woAAAACAAEAAADt/wsAAAACAAEAAADt/wwAAAACAAEAAADt/w0AAAACAAEAAADt/w4AAAACAAEAAADt/w8AAAACAAEAAADt/xAAAAACAAEAAADt/xEAAAACAAEAAADt/xIAAAACAAEAAADt/xMAAAACAAEAAADt/xQAAAACAAEAAADt/xUAAAACAAEAAADt/xYAAAACAAEAAADt/xcAAAACAAEAAADt/xgAAAACAAEAAADt/xkAAAACAAEAAADt/xoAAAACAAEAAADt/xsAAAACAAEAAADt/xwAAAACAAEAAADt/x0AAAACAAEAAADt/x4AAAACAAEAAADt/x8AAAACAAEAAADt/yAAAAACAAEAAADt/yEAAAACAAEAAADt/yIAAAACAAEAAADt/yMAAAACAAEAAADt/yQAAAACAAEAAADt/yUAAAACAAEAAADt/yYAAAACAAEAAADt/ycAAAACAAEAAADt/ygAAAACAAEAAADt/ykAAAACAAEAAADt/yoAAAACAAEAAADt/ysAAAACAAEAAADt/ywAAAACAAEAAADt/y0AAAACAAEAAADt/y4AAAACAAEAAADt/y8AAAACAAEAAADt/zAAAAACAAEAAADt/zEAAAACAAEAAADt/zIAAAACAAEAAADt/zMAAAACAAEAAADt/zQAAAACAAEAAADt/zUAAAACAAEAAADt/zYAAAACAAEAAADt/zcAAAACAAEAAADt/zgAAAACAAEAAADu//T/AAACAAEAAADu//X/AAACAAEAAADu//b/AAACAAEAAADu//f/AAACAAEAAADu//j/AAACAAEAAADu//n/AAACAAEAAADu//r/AAACAAEAAADu//v/AAACAAEAAADu//z/AAACAAEAAADu//3/AAACAAEAAADu//7/AAACAAEAAADu////AAACAAEAAADu/wAAAAACAAEAAADu/wEAAAACAAEAAADu/wIAAAACAAEAAADu/wMAAAACAAEAAADu/wQAAAACAAEAAADu/wUAAAACAAEAAADu/wYAAAACAAEAAADu/wcAAAACAAEAAADu/wgAAAACAAEAAADu/wkAAAACAAEAAADu/woAAAACAAEAAADu/wsAAAACAAEAAADu/wwAAAACAAEAAADu/w0AAAACAAEAAADu/w4AAAACAAEAAADu/w8AAAACAAEAAADu/xAAAAACAAEAAADu/xEAAAACAAEAAADu/xIAAAACAAEAAADu/xMAAAACAAEAAADu/xQAAAACAAEAAADu/xUAAAACAAEAAADu/xYAAAACAAEAAADu/xcAAAACAAEAAADu/xgAAAACAAEAAADu/xkAAAACAAEAAADu/xoAAAACAAEAAADu/xsAAAACAAEAAADu/xwAAAACAAEAAADu/x0AAAACAAEAAADu/x4AAAACAAEAAADu/x8AAAACAAEAAADu/yAAAAACAAEAAADu/yEAAAACAAEAAADu/yIAAAACAAEAAADu/yMAAAACAAEAAADu/yQAAAACAAEAAADu/yUAAAACAAEAAADu/yYAAAACAAEAAADu/ycAAAACAAEAAADu/ygAAAACAAEAAADu/ykAAAACAAEAAADu/yoAAAACAAEAAADu/ysAAAACAAEAAADu/ywAAAACAAEAAADu/y0AAAACAAEAAADu/y4AAAACAAEAAADu/y8AAAACAAEAAADu/zAAAAACAAEAAADu/zEAAAACAAEAAADu/zIAAAACAAEAAADu/zMAAAACAAEAAADu/zQAAAACAAEAAADu/zUAAAACAAEAAADu/zYAAAACAAEAAADu/zcAAAACAAEAAADu/zgAAAACAAEAAADv//T/AAACAAEAAADv//X/AAACAAEAAADv//b/AAACAAEAAADv//f/AAACAAEAAADv//j/AAACAAEAAADv//n/AAACAAEAAADv//r/AAACAAEAAADv//v/AAACAAEAAADv//z/AAACAAEAAADv//3/AAACAAEAAADv//7/AAACAAEAAADv////AAACAAEAAADv/wAAAAACAAEAAADv/wEAAAACAAEAAADv/wIAAAACAAEAAADv/wMAAAACAAEAAADv/wQAAAACAAEAAADv/wUAAAACAAEAAADv/wYAAAACAAEAAADv/wcAAAACAAEAAADv/wgAAAACAAEAAADv/wkAAAACAAEAAADv/woAAAACAAEAAADv/wsAAAACAAEAAADv/wwAAAACAAEAAADv/w0AAAACAAEAAADv/w4AAAACAAEAAADv/w8AAAACAAEAAADv/xAAAAACAAEAAADv/xEAAAACAAEAAADv/xIAAAACAAEAAADv/xMAAAACAAEAAADv/xQAAAACAAEAAADv/xUAAAACAAEAAADv/xYAAAACAAEAAADv/xcAAAACAAEAAADv/xgAAAACAAEAAADv/xkAAAACAAEAAADv/xoAAAACAAEAAADv/xsAAAACAAEAAADv/xwAAAACAAEAAADv/x0AAAACAAEAAADv/x4AAAACAAEAAADv/x8AAAACAAEAAADv/yAAAAACAAEAAADv/yEAAAACAAEAAADv/yIAAAACAAEAAADv/yMAAAACAAEAAADv/yQAAAACAAEAAADv/yUAAAACAAEAAADv/yYAAAACAAEAAADv/ycAAAACAAEAAADv/ygAAAACAAEAAADv/ykAAAACAAEAAADv/yoAAAACAAEAAADv/ysAAAACAAEAAADv/ywAAAACAAEAAADv/y0AAAACAAEAAADv/y4AAAACAAEAAADv/y8AAAACAAEAAADv/zAAAAACAAEAAADv/zEAAAACAAEAAADv/zIAAAACAAEAAADv/zMAAAACAAEAAADv/zQAAAACAAEAAADv/zUAAAACAAEAAADv/zYAAAACAAEAAADv/zcAAAACAAEAAADv/zgAAAACAAEAAADw//T/AAACAAEAAADw//X/AAACAAEAAADw//b/AAACAAEAAADw//f/AAACAAEAAADw//j/AAACAAEAAADw//n/AAACAAEAAADw//r/AAACAAEAAADw//v/AAACAAEAAADw//z/AAACAAEAAADw//3/AAACAAEAAADw//7/AAACAAEAAADw////AAACAAEAAADw/wAAAAACAAEAAADw/wEAAAACAAEAAADw/wIAAAACAAEAAADw/wMAAAACAAEAAADw/wQAAAACAAEAAADw/wUAAAACAAEAAADw/wYAAAACAAEAAADw/wcAAAACAAEAAADw/wgAAAACAAEAAADw/wkAAAACAAEAAADw/woAAAACAAEAAADw/wsAAAACAAEAAADw/wwAAAACAAEAAADw/w0AAAACAAEAAADw/w4AAAACAAEAAADw/w8AAAACAAEAAADw/xAAAAACAAEAAADw/xEAAAACAAEAAADw/xIAAAACAAEAAADw/xMAAAACAAEAAADw/xQAAAACAAEAAADw/xUAAAACAAEAAADw/xYAAAACAAEAAADw/xcAAAACAAEAAADw/xgAAAACAAEAAADw/xkAAAACAAEAAADw/xoAAAACAAEAAADw/xsAAAACAAEAAADw/xwAAAACAAEAAADw/x0AAAACAAEAAADw/x4AAAACAAEAAADw/x8AAAACAAEAAADw/yAAAAACAAEAAADw/yEAAAACAAEAAADw/yIAAAACAAEAAADw/yMAAAACAAEAAADw/yQAAAACAAEAAADw/yUAAAACAAEAAADw/yYAAAACAAEAAADw/ycAAAACAAEAAADw/ygAAAACAAEAAADw/ykAAAACAAEAAADw/yoAAAACAAEAAADw/ysAAAACAAEAAADw/ywAAAACAAEAAADw/y0AAAACAAEAAADw/y4AAAACAAEAAADw/y8AAAACAAEAAADw/zAAAAACAAEAAADw/zEAAAACAAEAAADw/zIAAAACAAEAAADw/zMAAAACAAEAAADw/zQAAAACAAEAAADw/zUAAAACAAEAAADw/zYAAAACAAEAAADw/zcAAAACAAEAAADw/zgAAAACAAEAAADx//T/AAACAAEAAADx//X/AAACAAEAAADx//b/AAACAAEAAADx//f/AAACAAEAAADx//j/AAACAAEAAADx//n/AAACAAEAAADx//r/AAACAAEAAADx//v/AAACAAEAAADx//z/AAACAAEAAADx//3/AAACAAEAAADx//7/AAACAAEAAADx////AAACAAEAAADx/wAAAAACAAEAAADx/wEAAAACAAEAAADx/wIAAAACAAEAAADx/wMAAAACAAEAAADx/wQAAAACAAEAAADx/wUAAAACAAEAAADx/wYAAAACAAEAAADx/wcAAAACAAEAAADx/wgAAAACAAEAAADx/wkAAAACAAEAAADx/woAAAACAAEAAADx/wsAAAACAAEAAADx/wwAAAACAAEAAADx/w0AAAACAAEAAADx/w4AAAACAAEAAADx/w8AAAACAAEAAADx/xAAAAACAAEAAADx/xEAAAACAAEAAADx/xIAAAACAAEAAADx/xMAAAACAAEAAADx/xQAAAACAAEAAADx/xUAAAACAAEAAADx/xYAAAACAAEAAADx/xcAAAACAAEAAADx/xgAAAACAAEAAADx/xkAAAACAAEAAADx/xoAAAACAAEAAADx/xsAAAACAAEAAADx/xwAAAACAAEAAADx/x0AAAACAAEAAADx/x4AAAACAAEAAADx/x8AAAACAAEAAADx/yAAAAACAAEAAADx/yEAAAACAAEAAADx/yIAAAACAAEAAADx/yMAAAACAAEAAADx/yQAAAACAAEAAADx/yUAAAACAAEAAADx/yYAAAACAAEAAADx/ycAAAACAAEAAADx/ygAAAACAAEAAADx/ykAAAACAAEAAADx/yoAAAACAAEAAADx/ysAAAACAAEAAADx/ywAAAACAAEAAADx/y0AAAACAAEAAADx/y4AAAACAAEAAADx/y8AAAACAAEAAADx/zAAAAACAAEAAADx/zEAAAACAAEAAADx/zIAAAACAAEAAADx/zMAAAACAAEAAADx/zQAAAACAAEAAADx/zUAAAACAAEAAADx/zYAAAACAAEAAADx/zcAAAACAAEAAADx/zgAAAACAAEAAADy//T/AAACAAEAAADy//X/AAACAAEAAADy//b/AAACAAEAAADy//f/AAACAAEAAADy//j/AAACAAEAAADy//n/AAACAAEAAADy//r/AAACAAEAAADy//v/AAACAAEAAADy//z/AAACAAEAAADy//3/AAACAAEAAADy//7/AAACAAEAAADy////AAACAAEAAADy/wAAAAACAAEAAADy/wEAAAACAAEAAADy/wIAAAACAAEAAADy/wMAAAACAAEAAADy/wQAAAACAAEAAADy/wUAAAACAAEAAADy/wYAAAACAAEAAADy/wcAAAACAAEAAADy/wgAAAACAAEAAADy/wkAAAACAAEAAADy/woAAAACAAEAAADy/wsAAAACAAEAAADy/wwAAAACAAEAAADy/w0AAAACAAEAAADy/w4AAAACAAEAAADy/w8AAAACAAEAAADy/xAAAAACAAEAAADy/xEAAAACAAEAAADy/xIAAAACAAEAAADy/xMAAAACAAEAAADy/xQAAAACAAEAAADy/xUAAAACAAEAAADy/xYAAAACAAEAAADy/xcAAAACAAEAAADy/xgAAAACAAEAAADy/xkAAAACAAEAAADy/xoAAAACAAEAAADy/xsAAAACAAEAAADy/xwAAAACAAEAAADy/x0AAAACAAEAAADy/x4AAAACAAEAAADy/x8AAAACAAEAAADy/yAAAAACAAEAAADy/yEAAAACAAEAAADy/yIAAAACAAEAAADy/yMAAAACAAEAAADy/yQAAAACAAEAAADy/yUAAAACAAEAAADy/yYAAAACAAEAAADy/ycAAAACAAEAAADy/ygAAAACAAEAAADy/ykAAAACAAEAAADy/yoAAAACAAEAAADy/ysAAAACAAEAAADy/ywAAAACAAEAAADy/y0AAAACAAEAAADy/y4AAAACAAEAAADy/y8AAAACAAEAAADy/zAAAAACAAEAAADy/zEAAAACAAEAAADy/zIAAAACAAEAAADy/zMAAAACAAEAAADy/zQAAAACAAEAAADy/zUAAAACAAEAAADy/zYAAAACAAEAAADy/zcAAAACAAEAAADy/zgAAAACAAEAAADz//T/AAACAAEAAADz//X/AAACAAEAAADz//b/AAACAAEAAADz//f/AAACAAEAAADz//j/AAACAAEAAADz//n/AAACAAEAAADz//r/AAACAAEAAADz//v/AAACAAEAAADz//z/AAACAAEAAADz//3/AAACAAEAAADz//7/AAACAAEAAADz////AAACAAEAAADz/wAAAAACAAEAAADz/wEAAAACAAEAAADz/wIAAAACAAEAAADz/wMAAAACAAEAAADz/wQAAAACAAEAAADz/wUAAAACAAEAAADz/wYAAAACAAEAAADz/wcAAAACAAEAAADz/wgAAAACAAEAAADz/wkAAAACAAEAAADz/woAAAACAAEAAADz/wsAAAACAAEAAADz/wwAAAACAAEAAADz/w0AAAACAAEAAADz/w4AAAACAAEAAADz/w8AAAACAAEAAADz/xAAAAACAAEAAADz/xEAAAACAAEAAADz/xIAAAACAAEAAADz/xMAAAACAAEAAADz/xQAAAACAAEAAADz/xUAAAACAAEAAADz/xYAAAACAAEAAADz/xcAAAACAAEAAADz/xgAAAACAAEAAADz/xkAAAACAAEAAADz/xoAAAACAAEAAADz/xsAAAACAAEAAADz/xwAAAACAAEAAADz/x0AAAACAAEAAADz/x4AAAACAAEAAADz/x8AAAACAAEAAADz/yAAAAACAAEAAADz/yEAAAACAAEAAADz/yIAAAACAAEAAADz/yMAAAACAAEAAADz/yQAAAACAAEAAADz/yUAAAACAAEAAADz/yYAAAACAAEAAADz/ycAAAACAAEAAADz/ygAAAACAAEAAADz/ykAAAACAAEAAADz/yoAAAACAAEAAADz/ysAAAACAAEAAADz/ywAAAACAAEAAADz/y0AAAACAAEAAADz/y4AAAACAAEAAADz/y8AAAACAAEAAADz/zAAAAACAAEAAADz/zEAAAACAAEAAADz/zIAAAACAAEAAADz/zMAAAACAAEAAADz/zQAAAACAAEAAADz/zUAAAACAAEAAADz/zYAAAACAAEAAADz/zcAAAACAAEAAADz/zgAAAACAAEAAAD0//T/AAACAAEAAAD0//X/AAACAAEAAAD0//b/AAACAAEAAAD0//f/AAACAAEAAAD0//j/AAACAAEAAAD0//n/AAACAAEAAAD0//r/AAACAAEAAAD0//v/AAACAAEAAAD0//z/AAACAAEAAAD0//3/AAACAAEAAAD0//7/AAACAAEAAAD0/wAAAAACAAEAAAD0/wEAAAACAAEAAAD0/wIAAAACAAEAAAD0/wMAAAACAAEAAAD0/wQAAAACAAEAAAD0/wUAAAACAAEAAAD0/wYAAAACAAEAAAD0/wcAAAACAAEAAAD0/wgAAAACAAEAAAD0/wkAAAACAAEAAAD0/woAAAACAAEAAAD0/wsAAAACAAEAAAD0/wwAAAACAAEAAAD0/w0AAAACAAEAAAD0/w4AAAACAAEAAAD0/w8AAAACAAEAAAD0/xAAAAACAAEAAAD0/xEAAAACAAEAAAD0/xIAAAACAAEAAAD0/xMAAAACAAEAAAD0/xQAAAACAAEAAAD0/xUAAAACAAEAAAD0/xYAAAACAAEAAAD0/xcAAAACAAEAAAD0/xgAAAACAAEAAAD0/xkAAAACAAEAAAD0/xoAAAACAAEAAAD0/xsAAAACAAEAAAD0/xwAAAACAAEAAAD0/x0AAAACAAEAAAD0/x4AAAACAAEAAAD0/x8AAAACAAEAAAD0/yAAAAACAAEAAAD0/yEAAAACAAEAAAD0/yIAAAACAAEAAAD0/yMAAAACAAEAAAD0/yQAAAACAAEAAAD0/yUAAAACAAEAAAD0/yYAAAACAAEAAAD0/ycAAAACAAEAAAD0/ygAAAACAAEAAAD0/ykAAAACAAEAAAD0/yoAAAACAAEAAAD0/ysAAAACAAEAAAD0/ywAAAACAAEAAAD0/y0AAAACAAEAAAD0/y4AAAACAAEAAAD0/y8AAAACAAEAAAD0/zAAAAACAAEAAAD0/zEAAAACAAEAAAD0/zIAAAACAAEAAAD0/zMAAAACAAEAAAD0/zQAAAACAAEAAAD0/zUAAAACAAEAAAD0/zYAAAACAAEAAAD0/zcAAAACAAEAAAD0/zgAAAACAAEAAAD1//T/AAACAAEAAAD1//X/AAACAAEAAAD1//b/AAACAAEAAAD1//f/AAACAAEAAAD1//j/AAACAAEAAAD1//n/AAACAAEAAAD1//r/AAACAAEAAAD1//v/AAACAAEAAAD1//z/AAACAAEAAAD1//3/AAACAAEAAAD1//7/AAACAAEAAAD1/wEAAAACAAEAAAD1/wIAAAACAAEAAAD1/wMAAAACAAEAAAD1/wQAAAACAAEAAAD1/wUAAAACAAEAAAD1/wYAAAACAAEAAAD1/wcAAAACAAEAAAD1/wgAAAACAAEAAAD1/wkAAAACAAEAAAD1/woAAAACAAEAAAD1/wsAAAACAAEAAAD1/wwAAAACAAEAAAD1/w0AAAACAAEAAAD1/w4AAAACAAEAAAD1/w8AAAACAAEAAAD1/xAAAAACAAEAAAD1/xEAAAACAAEAAAD1/xIAAAACAAEAAAD1/xMAAAACAAEAAAD1/xQAAAACAAEAAAD1/xUAAAACAAEAAAD1/xYAAAACAAEAAAD1/xcAAAACAAEAAAD1/xgAAAACAAEAAAD1/xkAAAACAAEAAAD1/xoAAAACAAEAAAD1/xsAAAACAAEAAAD1/xwAAAACAAEAAAD1/x0AAAACAAEAAAD1/x4AAAACAAEAAAD1/x8AAAACAAEAAAD1/yAAAAACAAEAAAD1/yEAAAACAAEAAAD1/yIAAAACAAEAAAD1/yMAAAACAAEAAAD1/yQAAAACAAEAAAD1/yUAAAACAAEAAAD1/yYAAAACAAEAAAD1/ycAAAACAAEAAAD1/ygAAAACAAEAAAD1/ykAAAACAAEAAAD1/yoAAAACAAEAAAD1/ysAAAACAAEAAAD1/ywAAAACAAEAAAD1/y0AAAACAAEAAAD1/y4AAAACAAEAAAD1/y8AAAACAAEAAAD1/zAAAAACAAEAAAD1/zEAAAACAAEAAAD1/zIAAAACAAEAAAD1/zMAAAACAAEAAAD1/zQAAAACAAEAAAD1/zUAAAACAAEAAAD1/zYAAAACAAEAAAD1/zcAAAACAAEAAAD1/zgAAAACAAEAAAD2//T/AAACAAEAAAD2//X/AAACAAEAAAD2//b/AAACAAEAAAD2//f/AAACAAEAAAD2//j/AAACAAEAAAD2//n/AAACAAEAAAD2//r/AAACAAEAAAD2//v/AAACAAEAAAD2//z/AAACAAEAAAD2//3/AAACAAEAAAD2//7/AAACAAEAAAD2////AAACAAEAAAD2/wIAAAACAAEAAAD2/wMAAAACAAEAAAD2/wQAAAACAAEAAAD2/wUAAAACAAEAAAD2/wYAAAACAAEAAAD2/wcAAAACAAEAAAD2/wgAAAACAAEAAAD2/wkAAAACAAEAAAD2/woAAAACAAEAAAD2/wsAAAACAAEAAAD2/wwAAAACAAEAAAD2/w0AAAACAAEAAAD2/w4AAAACAAEAAAD2/w8AAAACAAEAAAD2/xAAAAACAAEAAAD2/xEAAAACAAEAAAD2/xIAAAACAAEAAAD2/xMAAAACAAEAAAD2/xQAAAACAAEAAAD2/xUAAAACAAEAAAD2/xYAAAACAAEAAAD2/xcAAAACAAEAAAD2/xgAAAACAAEAAAD2/xkAAAACAAEAAAD2/xoAAAACAAEAAAD2/xsAAAACAAEAAAD2/xwAAAACAAEAAAD2/x0AAAACAAEAAAD2/x4AAAACAAEAAAD2/x8AAAACAAEAAAD2/yAAAAACAAEAAAD2/yEAAAACAAEAAAD2/yIAAAACAAEAAAD2/yMAAAACAAEAAAD2/yQAAAACAAEAAAD2/yUAAAACAAEAAAD2/yYAAAACAAEAAAD2/ycAAAACAAEAAAD2/ygAAAACAAEAAAD2/ykAAAACAAEAAAD2/yoAAAACAAEAAAD2/ysAAAACAAEAAAD2/ywAAAACAAEAAAD2/y0AAAACAAEAAAD2/y4AAAACAAEAAAD2/y8AAAACAAEAAAD2/zAAAAACAAEAAAD2/zEAAAACAAEAAAD2/zIAAAACAAEAAAD2/zMAAAACAAEAAAD2/zQAAAACAAEAAAD2/zUAAAACAAEAAAD2/zYAAAACAAEAAAD2/zcAAAACAAEAAAD2/zgAAAACAAEAAAD3//T/AAACAAEAAAD3//X/AAACAAEAAAD3//b/AAACAAEAAAD3//f/AAACAAEAAAD3//j/AAACAAEAAAD3//n/AAACAAEAAAD3//r/AAACAAEAAAD3//v/AAACAAEAAAD3//z/AAACAAEAAAD3//3/AAACAAEAAAD3//7/AAACAAEAAAD3////AAACAAEAAAD3/wAAAAACAAEAAAD3/wEAAAACAAEAAAD3/wMAAAACAAEAAAD3/wQAAAACAAEAAAD3/wUAAAACAAEAAAD3/wYAAAACAAEAAAD3/wcAAAACAAEAAAD3/wgAAAACAAEAAAD3/wkAAAACAAEAAAD3/woAAAACAAEAAAD3/wsAAAACAAEAAAD3/wwAAAACAAEAAAD3/w0AAAACAAEAAAD3/w4AAAACAAEAAAD3/w8AAAACAAEAAAD3/xAAAAACAAEAAAD3/xEAAAACAAEAAAD3/xIAAAACAAEAAAD3/xMAAAACAAEAAAD3/xQAAAACAAEAAAD3/xUAAAACAAEAAAD3/xYAAAACAAEAAAD3/xcAAAACAAEAAAD3/xgAAAACAAEAAAD3/xkAAAACAAEAAAD3/xoAAAACAAEAAAD3/xsAAAACAAEAAAD3/xwAAAACAAEAAAD3/x0AAAACAAEAAAD3/x4AAAACAAEAAAD3/x8AAAACAAEAAAD3/yAAAAACAAEAAAD3/yEAAAACAAEAAAD3/yIAAAACAAEAAAD3/yMAAAACAAEAAAD3/yQAAAACAAEAAAD3/yUAAAACAAEAAAD3/yYAAAACAAEAAAD3/ycAAAACAAEAAAD3/ygAAAACAAEAAAD3/ykAAAACAAEAAAD3/yoAAAACAAEAAAD3/ysAAAACAAEAAAD3/ywAAAACAAEAAAD3/y0AAAACAAEAAAD3/y4AAAACAAEAAAD3/y8AAAACAAEAAAD3/zAAAAACAAEAAAD3/zEAAAACAAEAAAD3/zIAAAACAAEAAAD3/zMAAAACAAEAAAD3/zQAAAACAAEAAAD3/zUAAAACAAEAAAD3/zYAAAACAAEAAAD3/zcAAAACAAEAAAD3/zgAAAACAAEAAAD4//T/AAACAAEAAAD4//X/AAACAAEAAAD4//b/AAACAAEAAAD4//f/AAACAAEAAAD4//j/AAACAAEAAAD4//n/AAACAAEAAAD4//r/AAACAAEAAAD4//v/AAACAAEAAAD4//z/AAACAAEAAAD4//3/AAACAAEAAAD4//7/AAACAAEAAAD4////AAACAAEAAAD4/wAAAAACAAEAAAD4/wEAAAACAAEAAAD4/wIAAAACAAEAAAD4/wUAAAACAAEAAAD4/wYAAAACAAEAAAD4/wcAAAACAAEAAAD4/wgAAAACAAEAAAD4/wkAAAACAAEAAAD4/woAAAACAAEAAAD4/wsAAAACAAEAAAD4/wwAAAACAAEAAAD4/w0AAAACAAEAAAD4/w4AAAACAAEAAAD4/w8AAAACAAEAAAD4/xAAAAACAAEAAAD4/xEAAAACAAEAAAD4/xIAAAACAAEAAAD4/xMAAAACAAEAAAD4/xQAAAACAAEAAAD4/xUAAAACAAEAAAD4/xYAAAACAAEAAAD4/xcAAAACAAEAAAD4/xgAAAACAAEAAAD4/xkAAAACAAEAAAD4/xoAAAACAAEAAAD4/xsAAAACAAEAAAD4/xwAAAACAAEAAAD4/x0AAAACAAEAAAD4/x4AAAACAAEAAAD4/x8AAAACAAEAAAD4/yAAAAACAAEAAAD4/yEAAAACAAEAAAD4/yIAAAACAAEAAAD4/yMAAAACAAEAAAD4/yQAAAACAAEAAAD4/yUAAAACAAEAAAD4/yYAAAACAAEAAAD4/ycAAAACAAEAAAD4/ygAAAACAAEAAAD4/ykAAAACAAEAAAD4/yoAAAACAAEAAAD4/ysAAAACAAEAAAD4/ywAAAACAAEAAAD4/y0AAAACAAEAAAD4/y4AAAACAAEAAAD4/y8AAAACAAEAAAD4/zAAAAACAAEAAAD4/zEAAAACAAEAAAD4/zIAAAACAAEAAAD4/zMAAAACAAEAAAD4/zQAAAACAAEAAAD4/zUAAAACAAEAAAD4/zYAAAACAAEAAAD4/zcAAAACAAEAAAD4/zgAAAACAAEAAAD5//T/AAACAAEAAAD5//X/AAACAAEAAAD5//b/AAACAAEAAAD5//f/AAACAAEAAAD5//j/AAACAAEAAAD5//n/AAACAAEAAAD5//r/AAACAAEAAAD5//v/AAACAAEAAAD5//z/AAACAAEAAAD5//3/AAACAAEAAAD5//7/AAACAAEAAAD5////AAACAAEAAAD5/wAAAAACAAEAAAD5/wEAAAACAAEAAAD5/wIAAAACAAEAAAD5/wMAAAACAAEAAAD5/wQAAAACAAEAAAD5/wYAAAACAAEAAAD5/wcAAAACAAEAAAD5/wgAAAACAAEAAAD5/wkAAAACAAEAAAD5/woAAAACAAEAAAD5/wsAAAACAAEAAAD5/wwAAAACAAEAAAD5/w0AAAACAAEAAAD5/w4AAAACAAEAAAD5/w8AAAACAAEAAAD5/xAAAAACAAEAAAD5/xEAAAACAAEAAAD5/xIAAAACAAEAAAD5/xMAAAACAAEAAAD5/xQAAAACAAEAAAD5/xUAAAACAAEAAAD5/xYAAAACAAEAAAD5/xcAAAACAAEAAAD5/xgAAAACAAEAAAD5/xkAAAACAAEAAAD5/xoAAAACAAEAAAD5/xsAAAACAAEAAAD5/xwAAAACAAEAAAD5/x0AAAACAAEAAAD5/x4AAAACAAEAAAD5/x8AAAACAAEAAAD5/yAAAAACAAEAAAD5/yEAAAACAAEAAAD5/yIAAAACAAEAAAD5/yMAAAACAAEAAAD5/yQAAAACAAEAAAD5/yUAAAACAAEAAAD5/yYAAAACAAEAAAD5/ycAAAACAAEAAAD5/ygAAAACAAEAAAD5/ykAAAACAAEAAAD5/yoAAAACAAEAAAD5/ysAAAACAAEAAAD5/ywAAAACAAEAAAD5/y0AAAACAAEAAAD5/y4AAAACAAEAAAD5/y8AAAACAAEAAAD5/zAAAAACAAEAAAD5/zEAAAACAAEAAAD5/zIAAAACAAEAAAD5/zMAAAACAAEAAAD5/zQAAAACAAEAAAD5/zUAAAACAAEAAAD5/zYAAAACAAEAAAD5/zcAAAACAAEAAAD5/zgAAAACAAEAAAD6//T/AAACAAEAAAD6//X/AAACAAEAAAD6//b/AAACAAEAAAD6//f/AAACAAEAAAD6//j/AAACAAEAAAD6//n/AAACAAEAAAD6//r/AAACAAEAAAD6//v/AAACAAEAAAD6//z/AAACAAEAAAD6//3/AAACAAEAAAD6//7/AAACAAEAAAD6////AAACAAEAAAD6/wAAAAACAAEAAAD6/wEAAAACAAEAAAD6/wIAAAACAAEAAAD6/wMAAAACAAEAAAD6/wQAAAACAAEAAAD6/wUAAAACAAEAAAD6/wgAAAACAAEAAAD6/wkAAAACAAEAAAD6/woAAAACAAEAAAD6/wsAAAACAAEAAAD6/wwAAAACAAEAAAD6/w0AAAACAAEAAAD6/w4AAAACAAEAAAD6/w8AAAACAAEAAAD6/xAAAAACAAEAAAD6/xEAAAACAAEAAAD6/xIAAAACAAEAAAD6/xMAAAACAAEAAAD6/xQAAAACAAEAAAD6/xUAAAACAAEAAAD6/xYAAAACAAEAAAD6/xcAAAACAAEAAAD6/xgAAAACAAEAAAD6/xkAAAACAAEAAAD6/xoAAAACAAEAAAD6/xsAAAACAAEAAAD6/xwAAAACAAEAAAD6/x0AAAACAAEAAAD6/x4AAAACAAEAAAD6/x8AAAACAAEAAAD6/yAAAAACAAEAAAD6/yEAAAACAAEAAAD6/yIAAAACAAEAAAD6/yMAAAACAAEAAAD6/yQAAAACAAEAAAD6/yUAAAACAAEAAAD6/yYAAAACAAEAAAD6/ycAAAACAAEAAAD6/ygAAAACAAEAAAD6/ykAAAACAAEAAAD6/yoAAAACAAEAAAD6/ysAAAACAAEAAAD6/ywAAAACAAEAAAD6/y0AAAACAAEAAAD6/y4AAAACAAEAAAD6/y8AAAACAAEAAAD6/zAAAAACAAEAAAD6/zEAAAACAAEAAAD6/zIAAAACAAEAAAD6/zMAAAACAAEAAAD6/zQAAAACAAEAAAD6/zUAAAACAAEAAAD6/zYAAAACAAEAAAD6/zcAAAACAAEAAAD6/zgAAAACAAEAAAD7//T/AAACAAEAAAD7//X/AAACAAEAAAD7//b/AAACAAEAAAD7//f/AAACAAEAAAD7//j/AAACAAEAAAD7//n/AAACAAEAAAD7//r/AAACAAEAAAD7//v/AAACAAEAAAD7//z/AAACAAEAAAD7//3/AAACAAEAAAD7//7/AAACAAEAAAD7////AAACAAEAAAD7/wAAAAACAAEAAAD7/wEAAAACAAEAAAD7/wIAAAACAAEAAAD7/wMAAAACAAEAAAD7/wQAAAACAAEAAAD7/wUAAAACAAEAAAD7/wYAAAACAAEAAAD7/wcAAAACAAEAAAD7/wkAAAACAAEAAAD7/woAAAACAAEAAAD7/wsAAAACAAEAAAD7/wwAAAACAAEAAAD7/w0AAAACAAEAAAD7/w4AAAACAAEAAAD7/w8AAAACAAEAAAD7/xAAAAACAAEAAAD7/xEAAAACAAEAAAD7/xIAAAACAAEAAAD7/xMAAAACAAEAAAD7/xQAAAACAAEAAAD7/xUAAAACAAEAAAD7/xYAAAACAAEAAAD7/xcAAAACAAEAAAD7/xgAAAACAAEAAAD7/xkAAAACAAEAAAD7/xoAAAACAAEAAAD7/xsAAAACAAEAAAD7/xwAAAACAAEAAAD7/x0AAAACAAEAAAD7/x4AAAACAAEAAAD7/x8AAAACAAEAAAD7/yAAAAACAAEAAAD7/yEAAAACAAEAAAD7/yIAAAACAAEAAAD7/yMAAAACAAEAAAD7/yQAAAACAAEAAAD7/yUAAAACAAEAAAD7/yYAAAACAAEAAAD7/ycAAAACAAEAAAD7/ygAAAACAAEAAAD7/ykAAAACAAEAAAD7/yoAAAACAAEAAAD7/ysAAAACAAEAAAD7/ywAAAACAAEAAAD7/y0AAAACAAEAAAD7/y4AAAACAAEAAAD7/y8AAAACAAEAAAD7/zAAAAACAAEAAAD7/zEAAAACAAEAAAD7/zIAAAACAAEAAAD7/zMAAAACAAEAAAD7/zQAAAACAAEAAAD7/zUAAAACAAEAAAD7/zYAAAACAAEAAAD7/zcAAAACAAEAAAD7/zgAAAACAAEAAAD8//T/AAACAAEAAAD8//X/AAACAAEAAAD8//b/AAACAAEAAAD8//f/AAACAAEAAAD8//j/AAACAAEAAAD8//n/AAACAAEAAAD8//r/AAACAAEAAAD8//v/AAACAAEAAAD8//z/AAACAAEAAAD8//3/AAACAAEAAAD8//7/AAACAAEAAAD8////AAACAAEAAAD8/wAAAAACAAEAAAD8/wEAAAACAAEAAAD8/wIAAAACAAEAAAD8/wMAAAACAAEAAAD8/wQAAAACAAEAAAD8/wUAAAACAAEAAAD8/wYAAAACAAEAAAD8/wcAAAACAAEAAAD8/wgAAAACAAEAAAD8/woAAAACAAEAAAD8/wsAAAACAAEAAAD8/wwAAAACAAEAAAD8/w0AAAACAAEAAAD8/w4AAAACAAEAAAD8/w8AAAACAAEAAAD8/xAAAAACAAEAAAD8/xEAAAACAAEAAAD8/xIAAAACAAEAAAD8/xMAAAACAAEAAAD8/xQAAAACAAEAAAD8/xUAAAACAAEAAAD8/xYAAAACAAEAAAD8/xcAAAACAAEAAAD8/xgAAAACAAEAAAD8/xkAAAACAAEAAAD8/xoAAAACAAEAAAD8/xsAAAACAAEAAAD8/xwAAAACAAEAAAD8/x0AAAACAAEAAAD8/x4AAAACAAEAAAD8/x8AAAACAAEAAAD8/yAAAAACAAEAAAD8/yEAAAACAAEAAAD8/yIAAAACAAEAAAD8/yMAAAACAAEAAAD8/yQAAAACAAEAAAD8/yUAAAACAAEAAAD8/yYAAAACAAEAAAD8/ycAAAACAAEAAAD8/ygAAAACAAEAAAD8/ykAAAACAAEAAAD8/yoAAAACAAEAAAD8/ysAAAACAAEAAAD8/ywAAAACAAEAAAD8/y0AAAACAAEAAAD8/y4AAAACAAEAAAD8/y8AAAACAAEAAAD8/zAAAAACAAEAAAD8/zEAAAACAAEAAAD8/zIAAAACAAEAAAD8/zMAAAACAAEAAAD8/zQAAAACAAEAAAD8/zUAAAACAAEAAAD8/zYAAAACAAEAAAD8/zcAAAACAAEAAAD8/zgAAAACAAEAAAD9//T/AAACAAEAAAD9//X/AAACAAEAAAD9//b/AAACAAEAAAD9//f/AAACAAEAAAD9//j/AAACAAEAAAD9//n/AAACAAEAAAD9//r/AAACAAEAAAD9//v/AAACAAEAAAD9//z/AAACAAEAAAD9//3/AAACAAEAAAD9//7/AAACAAEAAAD9////AAACAAEAAAD9/wAAAAACAAEAAAD9/wEAAAACAAEAAAD9/wIAAAACAAEAAAD9/wMAAAACAAEAAAD9/wQAAAACAAEAAAD9/wUAAAACAAEAAAD9/wYAAAACAAEAAAD9/wcAAAACAAEAAAD9/wgAAAACAAEAAAD9/wkAAAACAAEAAAD9/wsAAAACAAEAAAD9/wwAAAACAAEAAAD9/w0AAAACAAEAAAD9/w4AAAACAAEAAAD9/w8AAAACAAEAAAD9/xAAAAACAAEAAAD9/xEAAAACAAEAAAD9/xIAAAACAAEAAAD9/xMAAAACAAEAAAD9/xQAAAACAAEAAAD9/xUAAAACAAEAAAD9/xYAAAACAAEAAAD9/xcAAAACAAEAAAD9/xgAAAACAAEAAAD9/xkAAAACAAEAAAD9/xoAAAACAAEAAAD9/xsAAAACAAEAAAD9/xwAAAACAAEAAAD9/x0AAAACAAEAAAD9/x4AAAACAAEAAAD9/x8AAAACAAEAAAD9/yAAAAACAAEAAAD9/yEAAAACAAEAAAD9/yIAAAACAAEAAAD9/yMAAAACAAEAAAD9/yQAAAACAAEAAAD9/yUAAAACAAEAAAD9/yYAAAACAAEAAAD9/ycAAAACAAEAAAD9/ygAAAACAAEAAAD9/ykAAAACAAEAAAD9/yoAAAACAAEAAAD9/ysAAAACAAEAAAD9/ywAAAACAAEAAAD9/y0AAAACAAEAAAD9/y4AAAACAAEAAAD9/y8AAAACAAEAAAD9/zAAAAACAAEAAAD9/zEAAAACAAEAAAD9/zIAAAACAAEAAAD9/zMAAAACAAEAAAD9/zQAAAACAAEAAAD9/zUAAAACAAEAAAD9/zYAAAACAAEAAAD9/zcAAAACAAEAAAD9/zgAAAACAAEAAAD+//T/AAACAAEAAAD+//X/AAACAAEAAAD+//b/AAACAAEAAAD+//f/AAACAAEAAAD+//j/AAACAAEAAAD+//n/AAACAAEAAAD+//r/AAACAAEAAAD+//v/AAACAAEAAAD+//z/AAACAAEAAAD+//3/AAACAAEAAAD+//7/AAACAAEAAAD+////AAACAAEAAAD+/wAAAAACAAEAAAD+/wEAAAACAAEAAAD+/wIAAAACAAEAAAD+/wMAAAACAAEAAAD+/wQAAAACAAEAAAD+/wUAAAACAAEAAAD+/wYAAAACAAEAAAD+/wcAAAACAAEAAAD+/wgAAAACAAEAAAD+/wkAAAACAAEAAAD+/woAAAACAAEAAAD+/w0AAAACAAEAAAD+/w4AAAACAAEAAAD+/w8AAAACAAEAAAD+/xAAAAACAAEAAAD+/xEAAAACAAEAAAD+/xIAAAACAAEAAAD+/xMAAAACAAEAAAD+/xQAAAACAAEAAAD+/xUAAAACAAEAAAD+/xYAAAACAAEAAAD+/xcAAAACAAEAAAD+/xgAAAACAAEAAAD+/xkAAAACAAEAAAD+/xoAAAACAAEAAAD+/xsAAAACAAEAAAD+/xwAAAACAAEAAAD+/x0AAAACAAEAAAD+/x4AAAACAAEAAAD+/x8AAAACAAEAAAD+/yAAAAACAAEAAAD+/yEAAAACAAEAAAD+/yIAAAACAAEAAAD+/yMAAAACAAEAAAD+/yQAAAACAAEAAAD+/yUAAAACAAEAAAD+/yYAAAACAAEAAAD+/ycAAAACAAEAAAD+/ygAAAACAAEAAAD+/ykAAAACAAEAAAD+/yoAAAACAAEAAAD+/ysAAAACAAEAAAD+/ywAAAACAAEAAAD+/y0AAAACAAEAAAD+/y4AAAACAAEAAAD+/y8AAAACAAEAAAD+/zAAAAACAAEAAAD+/zEAAAACAAEAAAD+/zIAAAACAAEAAAD+/zMAAAACAAEAAAD+/zQAAAACAAEAAAD+/zUAAAACAAEAAAD+/zYAAAACAAEAAAD+/zcAAAACAAEAAAD+/zgAAAACAAEAAAD///T/AAACAAEAAAD///X/AAACAAEAAAD///b/AAACAAEAAAD///f/AAACAAEAAAD///j/AAACAAEAAAD///n/AAACAAEAAAD///r/AAACAAEAAAD///v/AAACAAEAAAD///z/AAACAAEAAAD///3/AAACAAEAAAD///7/AAACAAEAAAD/////AAACAAEAAAD//wAAAAACAAEAAAD//wEAAAACAAEAAAD//wIAAAACAAEAAAD//wMAAAACAAEAAAD//wQAAAACAAEAAAD//wUAAAACAAEAAAD//wYAAAACAAEAAAD//wcAAAACAAEAAAD//wgAAAACAAEAAAD//wkAAAACAAEAAAD//woAAAACAAEAAAD//wsAAAACAAEAAAD//wwAAAACAAEAAAD//w4AAAACAAEAAAD//w8AAAACAAEAAAD//xAAAAACAAEAAAD//xEAAAACAAEAAAD//xIAAAACAAEAAAD//xMAAAACAAEAAAD//xQAAAACAAEAAAD//xUAAAACAAEAAAD//xYAAAACAAEAAAD//xcAAAACAAEAAAD//xgAAAACAAEAAAD//xkAAAACAAEAAAD//xoAAAACAAEAAAD//xsAAAACAAEAAAD//xwAAAACAAEAAAD//x0AAAACAAEAAAD//x4AAAACAAEAAAD//x8AAAACAAEAAAD//yAAAAACAAEAAAD//yEAAAACAAEAAAD//yIAAAACAAEAAAD//yMAAAACAAEAAAD//yQAAAACAAEAAAD//yUAAAACAAEAAAD//yYAAAACAAEAAAD//ycAAAACAAEAAAD//ygAAAACAAEAAAD//ykAAAACAAEAAAD//yoAAAACAAEAAAD//ysAAAACAAEAAAD//ywAAAACAAEAAAD//y0AAAACAAEAAAD//y4AAAACAAEAAAD//y8AAAACAAEAAAD//zAAAAACAAEAAAD//zEAAAACAAEAAAD//zIAAAACAAEAAAD//zMAAAACAAEAAAD//zQAAAACAAEAAAD//zUAAAACAAEAAAD//zYAAAACAAEAAAD//zcAAAACAAEAAAD//zgAAAACAAEAAAAAAPT/AAACAAEAAAAAAPX/AAACAAEAAAAAAPb/AAACAAEAAAAAAPf/AAACAAEAAAAAAPj/AAACAAEAAAAAAPn/AAACAAEAAAAAAPr/AAACAAEAAAAAAPv/AAACAAEAAAAAAPz/AAACAAEAAAAAAP3/AAACAAEAAAAAAP7/AAACAAEAAAAAAP//AAACAAEAAAAAACkAAAACAAEAAAAAACoAAAACAAEAAAAAACsAAAACAAEAAAAAACwAAAACAAEAAAAAAC0AAAACAAEAAAAAAC4AAAACAAEAAAAAAC8AAAACAAEAAAAAADAAAAACAAEAAAAAADEAAAACAAEAAAAAADIAAAACAAEAAAAAADMAAAACAAEAAAAAADQAAAACAAEAAAAAADUAAAACAAEAAAAAADYAAAACAAEAAAAAADcAAAACAAEAAAAAADgAAAACAAEAAAABAPT/AAACAAEAAAABAPX/AAACAAEAAAABAPb/AAACAAEAAAABAPf/AAACAAEAAAABAPj/AAACAAEAAAABAPn/AAACAAEAAAABAPr/AAACAAEAAAABAPv/AAACAAEAAAABAPz/AAACAAEAAAABAP3/AAACAAEAAAABAP7/AAACAAEAAAABAP//AAACAAEAAAABACkAAAACAAEAAAABACoAAAACAAEAAAABACsAAAACAAEAAAABACwAAAACAAEAAAABAC0AAAACAAEAAAABAC4AAAACAAEAAAABAC8AAAACAAEAAAABADAAAAACAAEAAAABADEAAAACAAEAAAABADIAAAACAAEAAAABADMAAAACAAEAAAABADQAAAACAAEAAAABADUAAAACAAEAAAABADYAAAACAAEAAAABADcAAAACAAEAAAABADgAAAACAAEAAAACAPT/AAACAAEAAAACAPX/AAACAAEAAAACAPb/AAACAAEAAAACAPf/AAACAAEAAAACAPj/AAACAAEAAAACAPn/AAACAAEAAAACAPr/AAACAAEAAAACAPv/AAACAAEAAAACAPz/AAACAAEAAAACAP3/AAACAAEAAAACAP7/AAACAAEAAAACAP//AAACAAEAAAACACkAAAACAAEAAAACACoAAAACAAEAAAACACsAAAACAAEAAAACACwAAAACAAEAAAACAC0AAAACAAEAAAACAC4AAAACAAEAAAACAC8AAAACAAEAAAACADAAAAACAAEAAAACADEAAAACAAEAAAACADIAAAACAAEAAAACADMAAAACAAEAAAACADQAAAACAAEAAAACADUAAAACAAEAAAACADYAAAACAAEAAAACADcAAAACAAEAAAACADgAAAACAAEAAAADAPT/AAACAAEAAAADAPX/AAACAAEAAAADAPb/AAACAAEAAAADAPf/AAACAAEAAAADAPj/AAACAAEAAAADAPn/AAACAAEAAAADAPr/AAACAAEAAAADAPv/AAACAAEAAAADAPz/AAACAAEAAAADAP3/AAACAAEAAAADAP7/AAACAAEAAAADAP//AAACAAEAAAADACkAAAACAAEAAAADACoAAAACAAEAAAADACsAAAACAAEAAAADACwAAAACAAEAAAADAC0AAAACAAEAAAADAC4AAAACAAEAAAADAC8AAAACAAEAAAADADAAAAACAAEAAAADADEAAAACAAEAAAADADIAAAACAAEAAAADADMAAAACAAEAAAADADQAAAACAAEAAAADADUAAAACAAEAAAADADYAAAACAAEAAAADADcAAAACAAEAAAADADgAAAACAAEAAAAEAPT/AAACAAEAAAAEAPX/AAACAAEAAAAEAPb/AAACAAEAAAAEAPf/AAACAAEAAAAEAPj/AAACAAEAAAAEAPn/AAACAAEAAAAEAPr/AAACAAEAAAAEAPv/AAACAAEAAAAEAPz/AAACAAEAAAAEAP3/AAACAAEAAAAEAP7/AAACAAEAAAAEAP//AAACAAEAAAAEACkAAAACAAEAAAAEACoAAAACAAEAAAAEACsAAAACAAEAAAAEACwAAAACAAEAAAAEAC0AAAACAAEAAAAEAC4AAAACAAEAAAAEAC8AAAACAAEAAAAEADAAAAACAAEAAAAEADEAAAACAAEAAAAEADIAAAACAAEAAAAEADMAAAACAAEAAAAEADQAAAACAAEAAAAEADUAAAACAAEAAAAEADYAAAACAAEAAAAEADcAAAACAAEAAAAEADgAAAACAAEAAAAFAPT/AAACAAEAAAAFAPX/AAACAAEAAAAFAPb/AAACAAEAAAAFAPf/AAACAAEAAAAFAPj/AAACAAEAAAAFAPn/AAACAAEAAAAFAPr/AAACAAEAAAAFAPv/AAACAAEAAAAFAPz/AAACAAEAAAAFAP3/AAACAAEAAAAFAP7/AAACAAEAAAAFAP//AAACAAEAAAAFACkAAAACAAEAAAAFACoAAAACAAEAAAAFACsAAAACAAEAAAAFACwAAAACAAEAAAAFAC0AAAACAAEAAAAFAC4AAAACAAEAAAAFAC8AAAACAAEAAAAFADAAAAACAAEAAAAFADEAAAACAAEAAAAFADIAAAACAAEAAAAFADMAAAACAAEAAAAFADQAAAACAAEAAAAFADUAAAACAAEAAAAFADYAAAACAAEAAAAFADcAAAACAAEAAAAFADgAAAACAAEAAAAGAPT/AAACAAEAAAAGAPX/AAACAAEAAAAGAPb/AAACAAEAAAAGAPf/AAACAAEAAAAGAPj/AAACAAEAAAAGAPn/AAACAAEAAAAGAPr/AAACAAEAAAAGAPv/AAACAAEAAAAGAPz/AAACAAEAAAAGAP3/AAACAAEAAAAGAP7/AAACAAEAAAAGAP//AAACAAEAAAAGACkAAAACAAEAAAAGACoAAAACAAEAAAAGACsAAAACAAEAAAAGACwAAAACAAEAAAAGAC0AAAACAAEAAAAGAC4AAAACAAEAAAAGAC8AAAACAAEAAAAGADAAAAACAAEAAAAGADEAAAACAAEAAAAGADIAAAACAAEAAAAGADMAAAACAAEAAAAGADQAAAACAAEAAAAGADUAAAACAAEAAAAGADYAAAACAAEAAAAGADcAAAACAAEAAAAGADgAAAACAAEAAAAHAPT/AAACAAEAAAAHAPX/AAACAAEAAAAHAPb/AAACAAEAAAAHAPf/AAACAAEAAAAHAPj/AAACAAEAAAAHAPn/AAACAAEAAAAHAPr/AAACAAEAAAAHAPv/AAACAAEAAAAHAPz/AAACAAEAAAAHAP3/AAACAAEAAAAHAP7/AAACAAEAAAAHAP//AAACAAEAAAAHACkAAAACAAEAAAAHACoAAAACAAEAAAAHACsAAAACAAEAAAAHACwAAAACAAEAAAAHAC0AAAACAAEAAAAHAC4AAAACAAEAAAAHAC8AAAACAAEAAAAHADAAAAACAAEAAAAHADEAAAACAAEAAAAHADIAAAACAAEAAAAHADMAAAACAAEAAAAHADQAAAACAAEAAAAHADUAAAACAAEAAAAHADYAAAACAAEAAAAHADcAAAACAAEAAAAHADgAAAACAAEAAAAIACkAAAACAAEAAAAIACoAAAACAAEAAAAIACsAAAACAAEAAAAIACwAAAACAAEAAAAIAC0AAAACAAEAAAAIAC4AAAACAAEAAAAIAC8AAAACAAEAAAAIADAAAAACAAEAAAAIADEAAAACAAEAAAAIADIAAAACAAEAAAAIADMAAAACAAEAAAAIADQAAAACAAEAAAAIADUAAAACAAEAAAAIADYAAAACAAEAAAAIADcAAAACAAEAAAAIADgAAAACAAEAAAAJACkAAAACAAEAAAAJACoAAAACAAEAAAAJACsAAAACAAEAAAAJACwAAAACAAEAAAAJAC0AAAACAAEAAAAJAC4AAAACAAEAAAAJAC8AAAACAAEAAAAJADAAAAACAAEAAAAJADEAAAACAAEAAAAJADIAAAACAAEAAAAJADMAAAACAAEAAAAJADQAAAACAAEAAAAJADUAAAACAAEAAAAJADYAAAACAAEAAAAJADcAAAACAAEAAAAJADgAAAACAAEAAAAKACkAAAACAAEAAAAKACoAAAACAAEAAAAKACsAAAACAAEAAAAKACwAAAACAAEAAAAKAC0AAAACAAEAAAAKAC4AAAACAAEAAAAKAC8AAAACAAEAAAAKADAAAAACAAEAAAAKADEAAAACAAEAAAAKADIAAAACAAEAAAAKADMAAAACAAEAAAAKADQAAAACAAEAAAAKADUAAAACAAEAAAAKADYAAAACAAEAAAAKADcAAAACAAEAAAAKADgAAAACAAEAAAALACkAAAACAAEAAAALACoAAAACAAEAAAALACsAAAACAAEAAAALACwAAAACAAEAAAALAC0AAAACAAEAAAALAC4AAAACAAEAAAALAC8AAAACAAEAAAALADAAAAACAAEAAAALADEAAAACAAEAAAALADIAAAACAAEAAAALADMAAAACAAEAAAALADQAAAACAAEAAAALADUAAAACAAEAAAALADYAAAACAAEAAAALADcAAAACAAEAAAALADgAAAACAAEAAAAMACkAAAACAAEAAAAMACoAAAACAAEAAAAMACsAAAACAAEAAAAMACwAAAACAAEAAAAMAC0AAAACAAEAAAAMAC4AAAACAAEAAAAMAC8AAAACAAEAAAAMADAAAAACAAEAAAAMADEAAAACAAEAAAAMADIAAAACAAEAAAAMADMAAAACAAEAAAAMADQAAAACAAEAAAAMADUAAAACAAEAAAAMADYAAAACAAEAAAAMADcAAAACAAEAAAAMADgAAAACAAEAAAANACkAAAACAAEAAAANACoAAAACAAEAAAANACsAAAACAAEAAAANACwAAAACAAEAAAANAC0AAAACAAEAAAANAC4AAAACAAEAAAANAC8AAAACAAEAAAANADAAAAACAAEAAAANADEAAAACAAEAAAANADIAAAACAAEAAAANADMAAAACAAEAAAANADQAAAACAAEAAAANADUAAAACAAEAAAANADYAAAACAAEAAAANADcAAAACAAEAAAANADgAAAACAAEAAAAOACkAAAACAAEAAAAOACoAAAACAAEAAAAOACsAAAACAAEAAAAOACwAAAACAAEAAAAOAC0AAAACAAEAAAAOAC4AAAACAAEAAAAOAC8AAAACAAEAAAAOADAAAAACAAEAAAAOADEAAAACAAEAAAAOADIAAAACAAEAAAAOADMAAAACAAEAAAAOADQAAAACAAEAAAAOADUAAAACAAEAAAAOADYAAAACAAEAAAAOADcAAAACAAEAAAAOADgAAAACAAEAAAAPACkAAAACAAEAAAAPACoAAAACAAEAAAAPACsAAAACAAEAAAAPACwAAAACAAEAAAAPAC0AAAACAAEAAAAPAC4AAAACAAEAAAAPAC8AAAACAAEAAAAPADAAAAACAAEAAAAPADEAAAACAAEAAAAPADIAAAACAAEAAAAPADMAAAACAAEAAAAPADQAAAACAAEAAAAPADUAAAACAAEAAAAPADYAAAACAAEAAAAPADcAAAACAAEAAAAPADgAAAACAAEAAAAQACkAAAACAAEAAAAQACoAAAACAAEAAAAQACsAAAACAAEAAAAQACwAAAACAAEAAAAQAC0AAAACAAEAAAAQAC4AAAACAAEAAAAQAC8AAAACAAEAAAAQADAAAAACAAEAAAAQADEAAAACAAEAAAAQADIAAAACAAEAAAAQADMAAAACAAEAAAAQADQAAAACAAEAAAAQADUAAAACAAEAAAAQADYAAAACAAEAAAAQADcAAAACAAEAAAAQADgAAAACAAEAAAARACkAAAACAAEAAAARACoAAAACAAEAAAARACsAAAACAAEAAAARACwAAAACAAEAAAARAC0AAAACAAEAAAARAC4AAAACAAEAAAARAC8AAAACAAEAAAARADAAAAACAAEAAAARADEAAAACAAEAAAARADIAAAACAAEAAAARADMAAAACAAEAAAARADQAAAACAAEAAAARADUAAAACAAEAAAARADYAAAACAAEAAAARADcAAAACAAEAAAARADgAAAACAAEAAAASACkAAAACAAEAAAASACoAAAACAAEAAAASACsAAAACAAEAAAASACwAAAACAAEAAAASAC0AAAACAAEAAAASAC4AAAACAAEAAAASAC8AAAACAAEAAAASADAAAAACAAEAAAASADEAAAACAAEAAAASADIAAAACAAEAAAASADMAAAACAAEAAAASADQAAAACAAEAAAASADUAAAACAAEAAAASADYAAAACAAEAAAASADcAAAACAAEAAAASADgAAAACAAEAAAATACkAAAACAAEAAAATACoAAAACAAEAAAATACsAAAACAAEAAAATACwAAAACAAEAAAATAC0AAAACAAEAAAATAC4AAAACAAEAAAATAC8AAAACAAEAAAATADAAAAACAAEAAAATADEAAAACAAEAAAATADIAAAACAAEAAAATADMAAAACAAEAAAATADQAAAACAAEAAAATADUAAAACAAEAAAATADYAAAACAAEAAAATADcAAAACAAEAAAATADgAAAACAAEAAAAUACkAAAACAAEAAAAUACoAAAACAAEAAAAUACsAAAACAAEAAAAUACwAAAACAAEAAAAUAC0AAAACAAEAAAAUAC4AAAACAAEAAAAUAC8AAAACAAEAAAAUADAAAAACAAEAAAAUADEAAAACAAEAAAAUADIAAAACAAEAAAAUADMAAAACAAEAAAAUADQAAAACAAEAAAAUADUAAAACAAEAAAAUADYAAAACAAEAAAAUADcAAAACAAEAAAAUADgAAAACAAEAAAAVACkAAAACAAEAAAAVACoAAAACAAEAAAAVACsAAAACAAEAAAAVACwAAAACAAEAAAAVAC0AAAACAAEAAAAVAC4AAAACAAEAAAAVAC8AAAACAAEAAAAVADAAAAACAAEAAAAVADEAAAACAAEAAAAVADIAAAACAAEAAAAVADMAAAACAAEAAAAVADQAAAACAAEAAAAVADUAAAACAAEAAAAVADYAAAACAAEAAAAVADcAAAACAAEAAAAVADgAAAACAAEAAAAWACkAAAACAAEAAAAWACoAAAACAAEAAAAWACsAAAACAAEAAAAWACwAAAACAAEAAAAWAC0AAAACAAEAAAAWAC4AAAACAAEAAAAWAC8AAAACAAEAAAAWADAAAAACAAEAAAAWADEAAAACAAEAAAAWADIAAAACAAEAAAAWADMAAAACAAEAAAAWADQAAAACAAEAAAAWADUAAAACAAEAAAAWADYAAAACAAEAAAAWADcAAAACAAEAAAAWADgAAAACAAEAAAAXACkAAAACAAEAAAAXACoAAAACAAEAAAAXACsAAAACAAEAAAAXACwAAAACAAEAAAAXAC0AAAACAAEAAAAXAC4AAAACAAEAAAAXAC8AAAACAAEAAAAXADAAAAACAAEAAAAXADEAAAACAAEAAAAXADIAAAACAAEAAAAXADMAAAACAAEAAAAXADQAAAACAAEAAAAXADUAAAACAAEAAAAXADYAAAACAAEAAAAXADcAAAACAAEAAAAXADgAAAACAAEAAAAYACkAAAACAAEAAAAYACoAAAACAAEAAAAYACsAAAACAAEAAAAYACwAAAACAAEAAAAYAC0AAAACAAEAAAAYAC4AAAACAAEAAAAYAC8AAAACAAEAAAAYADAAAAACAAEAAAAYADEAAAACAAEAAAAYADIAAAACAAEAAAAYADMAAAACAAEAAAAYADQAAAACAAEAAAAYADUAAAACAAEAAAAYADYAAAACAAEAAAAYADcAAAACAAEAAAAYADgAAAACAAEAAAAZACkAAAACAAEAAAAZACoAAAACAAEAAAAZACsAAAACAAEAAAAZACwAAAACAAEAAAAZAC0AAAACAAEAAAAZAC4AAAACAAEAAAAZAC8AAAACAAEAAAAZADAAAAACAAEAAAAZADEAAAACAAEAAAAZADIAAAACAAEAAAAZADMAAAACAAEAAAAZADQAAAACAAEAAAAZADUAAAACAAEAAAAZADYAAAACAAEAAAAZADcAAAACAAEAAAAZADgAAAACAAEAAAAaACkAAAACAAEAAAAaACoAAAACAAEAAAAaACsAAAACAAEAAAAaACwAAAACAAEAAAAaAC0AAAACAAEAAAAaAC4AAAACAAEAAAAaAC8AAAACAAEAAAAaADAAAAACAAEAAAAaADEAAAACAAEAAAAaADIAAAACAAEAAAAaADMAAAACAAEAAAAaADQAAAACAAEAAAAaADUAAAACAAEAAAAaADYAAAACAAEAAAAaADcAAAACAAEAAAAaADgAAAACAAEAAAAbACkAAAACAAEAAAAbACoAAAACAAEAAAAbACsAAAACAAEAAAAbACwAAAACAAEAAAAbAC0AAAACAAEAAAAbAC4AAAACAAEAAAAbAC8AAAACAAEAAAAbADAAAAACAAEAAAAbADEAAAACAAEAAAAbADIAAAACAAEAAAAbADMAAAACAAEAAAAbADQAAAACAAEAAAAbADUAAAACAAEAAAAbADYAAAACAAEAAAAbADcAAAACAAEAAAAbADgAAAACAAEAAAAcACkAAAACAAEAAAAcACoAAAACAAEAAAAcACsAAAACAAEAAAAcACwAAAACAAEAAAAcAC0AAAACAAEAAAAcAC4AAAACAAEAAAAcAC8AAAACAAEAAAAcADAAAAACAAEAAAAcADEAAAACAAEAAAAcADIAAAACAAEAAAAcADMAAAACAAEAAAAcADQAAAACAAEAAAAcADUAAAACAAEAAAAcADYAAAACAAEAAAAcADcAAAACAAEAAAAcADgAAAACAAEAAAAdACkAAAACAAEAAAAdACoAAAACAAEAAAAdACsAAAACAAEAAAAdACwAAAACAAEAAAAdAC0AAAACAAEAAAAdAC4AAAACAAEAAAAdAC8AAAACAAEAAAAdADAAAAACAAEAAAAdADEAAAACAAEAAAAdADIAAAACAAEAAAAdADMAAAACAAEAAAAdADQAAAACAAEAAAAdADUAAAACAAEAAAAdADYAAAACAAEAAAAdADcAAAACAAEAAAAdADgAAAACAAEAAAAeACkAAAACAAEAAAAeACoAAAACAAEAAAAeACsAAAACAAEAAAAeACwAAAACAAEAAAAeAC0AAAACAAEAAAAeAC4AAAACAAEAAAAeAC8AAAACAAEAAAAeADAAAAACAAEAAAAeADEAAAACAAEAAAAeADIAAAACAAEAAAAeADMAAAACAAEAAAAeADQAAAACAAEAAAAeADUAAAACAAEAAAAeADYAAAACAAEAAAAeADcAAAACAAEAAAAeADgAAAACAAEAAAAfACkAAAACAAEAAAAfACoAAAACAAEAAAAfACsAAAACAAEAAAAfACwAAAACAAEAAAAfAC0AAAACAAEAAAAfAC4AAAACAAEAAAAfAC8AAAACAAEAAAAfADAAAAACAAEAAAAfADEAAAACAAEAAAAfADIAAAACAAEAAAAfADMAAAACAAEAAAAfADQAAAACAAEAAAAfADUAAAACAAEAAAAfADYAAAACAAEAAAAfADcAAAACAAEAAAAfADgAAAACAAEAAAAgACkAAAACAAEAAAAgACoAAAACAAEAAAAgACsAAAACAAEAAAAgACwAAAACAAEAAAAgAC0AAAACAAEAAAAgAC4AAAACAAEAAAAgAC8AAAACAAEAAAAgADAAAAACAAEAAAAgADEAAAACAAEAAAAgADIAAAACAAEAAAAgADMAAAACAAEAAAAgADQAAAACAAEAAAAgADUAAAACAAEAAAAgADYAAAACAAEAAAAgADcAAAACAAEAAAAgADgAAAACAAEAAAAhACkAAAACAAEAAAAhACoAAAACAAEAAAAhACsAAAACAAEAAAAhACwAAAACAAEAAAAhAC0AAAACAAEAAAAhAC4AAAACAAEAAAAhAC8AAAACAAEAAAAhADAAAAACAAEAAAAhADEAAAACAAEAAAAhADIAAAACAAEAAAAhADMAAAACAAEAAAAhADQAAAACAAEAAAAhADUAAAACAAEAAAAhADYAAAACAAEAAAAhADcAAAACAAEAAAAhADgAAAACAAEAAAAiACkAAAACAAEAAAAiACoAAAACAAEAAAAiACsAAAACAAEAAAAiACwAAAACAAEAAAAiAC0AAAACAAEAAAAiAC4AAAACAAEAAAAiAC8AAAACAAEAAAAiADAAAAACAAEAAAAiADEAAAACAAEAAAAiADIAAAACAAEAAAAiADMAAAACAAEAAAAiADQAAAACAAEAAAAiADUAAAACAAEAAAAiADYAAAACAAEAAAAiADcAAAACAAEAAAAiADgAAAACAAEAAAAjACkAAAACAAEAAAAjACoAAAACAAEAAAAjACsAAAACAAEAAAAjACwAAAACAAEAAAAjAC0AAAACAAEAAAAjAC4AAAACAAEAAAAjAC8AAAACAAEAAAAjADAAAAACAAEAAAAjADEAAAACAAEAAAAjADIAAAACAAEAAAAjADMAAAACAAEAAAAjADQAAAACAAEAAAAjADUAAAACAAEAAAAjADYAAAACAAEAAAAjADcAAAACAAEAAAAjADgAAAACAAEAAAAkACkAAAACAAEAAAAkACoAAAACAAEAAAAkACsAAAACAAEAAAAkACwAAAACAAEAAAAkAC0AAAACAAEAAAAkAC4AAAACAAEAAAAkAC8AAAACAAEAAAAkADAAAAACAAEAAAAkADEAAAACAAEAAAAkADIAAAACAAEAAAAkADMAAAACAAEAAAAkADQAAAACAAEAAAAkADUAAAACAAEAAAAkADYAAAACAAEAAAAkADcAAAACAAEAAAAkADgAAAACAAEAAAAlACkAAAACAAEAAAAlACoAAAACAAEAAAAlACsAAAACAAEAAAAlACwAAAACAAEAAAAlAC0AAAACAAEAAAAlAC4AAAACAAEAAAAlAC8AAAACAAEAAAAlADAAAAACAAEAAAAlADEAAAACAAEAAAAlADIAAAACAAEAAAAlADMAAAACAAEAAAAlADQAAAACAAEAAAAlADUAAAACAAEAAAAlADYAAAACAAEAAAAlADcAAAACAAEAAAAlADgAAAACAAEAAAAmACkAAAACAAEAAAAmACoAAAACAAEAAAAmACsAAAACAAEAAAAmACwAAAACAAEAAAAmAC0AAAACAAEAAAAmAC4AAAACAAEAAAAmAC8AAAACAAEAAAAmADAAAAACAAEAAAAmADEAAAACAAEAAAAmADIAAAACAAEAAAAmADMAAAACAAEAAAAmADQAAAACAAEAAAAmADUAAAACAAEAAAAmADYAAAACAAEAAAAmADcAAAACAAEAAAAmADgAAAACAAEAAAAnACkAAAACAAEAAAAnACoAAAACAAEAAAAnACsAAAACAAEAAAAnACwAAAACAAEAAAAnAC0AAAACAAEAAAAnAC4AAAACAAEAAAAnAC8AAAACAAEAAAAnADAAAAACAAEAAAAnADEAAAACAAEAAAAnADIAAAACAAEAAAAnADMAAAACAAEAAAAnADQAAAACAAEAAAAnADUAAAACAAEAAAAnADYAAAACAAEAAAAnADcAAAACAAEAAAAnADgAAAACAAEAAAAoACkAAAACAAEAAAAoACoAAAACAAEAAAAoACsAAAACAAEAAAAoACwAAAACAAEAAAAoAC0AAAACAAEAAAAoAC4AAAACAAEAAAAoAC8AAAACAAEAAAAoADAAAAACAAEAAAAoADEAAAACAAEAAAAoADIAAAACAAEAAAAoADMAAAACAAEAAAAoADQAAAACAAEAAAAoADUAAAACAAEAAAAoADYAAAACAAEAAAAoADcAAAACAAEAAAAoADgAAAACAAEAAAApACkAAAACAAEAAAApACoAAAACAAEAAAApACsAAAACAAEAAAApACwAAAACAAEAAAApAC0AAAACAAEAAAApAC4AAAACAAEAAAApAC8AAAACAAEAAAApADAAAAACAAEAAAApADEAAAACAAEAAAApADIAAAACAAEAAAApADMAAAACAAEAAAApADQAAAACAAEAAAApADUAAAACAAEAAAApADYAAAACAAEAAAApADcAAAACAAEAAAApADgAAAACAAEAAAAqACkAAAACAAEAAAAqACoAAAACAAEAAAAqACsAAAACAAEAAAAqACwAAAACAAEAAAAqAC0AAAACAAEAAAAqAC4AAAACAAEAAAAqAC8AAAACAAEAAAAqADAAAAACAAEAAAAqADEAAAACAAEAAAAqADIAAAACAAEAAAAqADMAAAACAAEAAAAqADQAAAACAAEAAAAqADUAAAACAAEAAAAqADYAAAACAAEAAAAqADcAAAACAAEAAAAqADgAAAACAAEAAAArACkAAAACAAEAAAArACoAAAACAAEAAAArACsAAAACAAEAAAArACwAAAACAAEAAAArAC0AAAACAAEAAAArAC4AAAACAAEAAAArAC8AAAACAAEAAAArADAAAAACAAEAAAArADEAAAACAAEAAAArADIAAAACAAEAAAArADMAAAACAAEAAAArADQAAAACAAEAAAArADUAAAACAAEAAAArADYAAAACAAEAAAArADcAAAACAAEAAAArADgAAAACAAEAAAAsACkAAAACAAEAAAAsACoAAAACAAEAAAAsACsAAAACAAEAAAAsACwAAAACAAEAAAAsAC0AAAACAAEAAAAsAC4AAAACAAEAAAAsAC8AAAACAAEAAAAsADAAAAACAAEAAAAsADEAAAACAAEAAAAsADIAAAACAAEAAAAsADMAAAACAAEAAAAsADQAAAACAAEAAAAsADUAAAACAAEAAAAsADYAAAACAAEAAAAsADcAAAACAAEAAAAsADgAAAACAAEAAAAtACkAAAACAAEAAAAtACoAAAACAAEAAAAtACsAAAACAAEAAAAtACwAAAACAAEAAAAtAC0AAAACAAEAAAAtAC4AAAACAAEAAAAtAC8AAAACAAEAAAAtADAAAAACAAEAAAAtADEAAAACAAEAAAAtADIAAAACAAEAAAAtADMAAAACAAEAAAAtADQAAAACAAEAAAAtADUAAAACAAEAAAAtADYAAAACAAEAAAAtADcAAAACAAEAAAAtADgAAAACAAEAAAAuACkAAAACAAEAAAAuACoAAAACAAEAAAAuACsAAAACAAEAAAAuACwAAAACAAEAAAAuAC0AAAACAAEAAAAuAC4AAAACAAEAAAAuAC8AAAACAAEAAAAuADAAAAACAAEAAAAuADEAAAACAAEAAAAuADIAAAACAAEAAAAuADMAAAACAAEAAAAuADQAAAACAAEAAAAuADUAAAACAAEAAAAuADYAAAACAAEAAAAuADcAAAACAAEAAAAuADgAAAACAAEAAAAvACkAAAACAAEAAAAvACoAAAACAAEAAAAvACsAAAACAAEAAAAvACwAAAACAAEAAAAvAC0AAAACAAEAAAAvAC4AAAACAAEAAAAvAC8AAAACAAEAAAAvADAAAAACAAEAAAAvADEAAAACAAEAAAAvADIAAAACAAEAAAAvADMAAAACAAEAAAAvADQAAAACAAEAAAAvADUAAAACAAEAAAAvADYAAAACAAEAAAAvADcAAAACAAEAAAAvADgAAAACAAEAAAAwACkAAAACAAEAAAAwACoAAAACAAEAAAAwACsAAAACAAEAAAAwACwAAAACAAEAAAAwAC0AAAACAAEAAAAwAC4AAAACAAEAAAAwAC8AAAACAAEAAAAwADAAAAACAAEAAAAwADEAAAACAAEAAAAwADIAAAACAAEAAAAwADMAAAACAAEAAAAwADQAAAACAAEAAAAwADUAAAACAAEAAAAwADYAAAACAAEAAAAwADcAAAACAAEAAAAwADgAAAACAAEAAAAxACkAAAACAAEAAAAxACoAAAACAAEAAAAxACsAAAACAAEAAAAxACwAAAACAAEAAAAxAC0AAAACAAEAAAAxAC4AAAACAAEAAAAxAC8AAAACAAEAAAAxADAAAAACAAEAAAAxADEAAAACAAEAAAAxADIAAAACAAEAAAAxADMAAAACAAEAAAAxADQAAAACAAEAAAAxADUAAAACAAEAAAAxADYAAAACAAEAAAAxADcAAAACAAEAAAAxADgAAAACAAEAAAAyACkAAAACAAEAAAAyACoAAAACAAEAAAAyACsAAAACAAEAAAAyACwAAAACAAEAAAAyAC0AAAACAAEAAAAyAC4AAAACAAEAAAAyAC8AAAACAAEAAAAyADAAAAACAAEAAAAyADEAAAACAAEAAAAyADIAAAACAAEAAAAyADMAAAACAAEAAAAyADQAAAACAAEAAAAyADUAAAACAAEAAAAyADYAAAACAAEAAAAyADcAAAACAAEAAAAyADgAAAACAAEAAAAzACkAAAACAAEAAAAzACoAAAACAAEAAAAzACsAAAACAAEAAAAzACwAAAACAAEAAAAzAC0AAAACAAEAAAAzAC4AAAACAAEAAAAzAC8AAAACAAEAAAAzADAAAAACAAEAAAAzADEAAAACAAEAAAAzADIAAAACAAEAAAAzADMAAAACAAEAAAAzADQAAAACAAEAAAAzADUAAAACAAEAAAAzADYAAAACAAEAAAAzADcAAAACAAEAAAAzADgAAAACAAEAAAA0ACkAAAACAAEAAAA0ACoAAAACAAEAAAA0ACsAAAACAAEAAAA0ACwAAAACAAEAAAA0AC0AAAACAAEAAAA0AC4AAAACAAEAAAA0AC8AAAACAAEAAAA0ADAAAAACAAEAAAA0ADEAAAACAAEAAAA0ADIAAAACAAEAAAA0ADMAAAACAAEAAAA0ADQAAAACAAEAAAA0ADUAAAACAAEAAAA0ADYAAAACAAEAAAA0ADcAAAACAAEAAAA0ADgAAAACAAEAAAA1ACkAAAACAAEAAAA1ACoAAAACAAEAAAA1ACsAAAACAAEAAAA1ACwAAAACAAEAAAA1AC0AAAACAAEAAAA1AC4AAAACAAEAAAA1AC8AAAACAAEAAAA1ADAAAAACAAEAAAA1ADEAAAACAAEAAAA1ADIAAAACAAEAAAA1ADMAAAACAAEAAAA1ADQAAAACAAEAAAA1ADUAAAACAAEAAAA1ADYAAAACAAEAAAA1ADcAAAACAAEAAAA1ADgAAAACAAEAAAA2ACkAAAACAAEAAAA2ACoAAAACAAEAAAA2ACsAAAACAAEAAAA2ACwAAAACAAEAAAA2AC0AAAACAAEAAAA2AC4AAAACAAEAAAA2AC8AAAACAAEAAAA2ADAAAAACAAEAAAA2ADEAAAACAAEAAAA2ADIAAAACAAEAAAA2ADMAAAACAAEAAAA2ADQAAAACAAEAAAA2ADUAAAACAAEAAAA2ADYAAAACAAEAAAA2ADcAAAACAAEAAAA2ADgAAAACAAEAAAA3ACkAAAACAAEAAAA3ACoAAAACAAEAAAA3ACsAAAACAAEAAAA3ACwAAAACAAEAAAA3AC0AAAACAAEAAAA3AC4AAAACAAEAAAA3AC8AAAACAAEAAAA3ADAAAAACAAEAAAA3ADEAAAACAAEAAAA3ADIAAAACAAEAAAA3ADMAAAACAAEAAAA3ADQAAAACAAEAAAA3ADUAAAACAAEAAAA3ADYAAAACAAEAAAA3ADcAAAACAAEAAAA3ADgAAAACAAEAAAA4ACkAAAACAAEAAAA4ACoAAAACAAEAAAA4ACsAAAACAAEAAAA4ACwAAAACAAEAAAA4AC0AAAACAAEAAAA4AC4AAAACAAEAAAA4AC8AAAACAAEAAAA4ADAAAAACAAEAAAA4ADEAAAACAAEAAAA4ADIAAAACAAEAAAA4ADMAAAACAAEAAAA4ADQAAAACAAEAAAA4ADUAAAACAAEAAAA4ADYAAAACAAEAAAA4ADcAAAACAAEAAAA4ADgAAAACAAEAAAA5ACkAAAACAAEAAAA5ACoAAAACAAEAAAA5ACsAAAACAAEAAAA5ACwAAAACAAEAAAA5AC0AAAACAAEAAAA5AC4AAAACAAEAAAA5AC8AAAACAAEAAAA5ADAAAAACAAEAAAA5ADEAAAACAAEAAAA5ADIAAAACAAEAAAA5ADMAAAACAAEAAAA5ADQAAAACAAEAAAA5ADUAAAACAAEAAAA5ADYAAAACAAEAAAA5ADcAAAACAAEAAAA5ADgAAAACAAEAAAA6ACkAAAACAAEAAAA6ACoAAAACAAEAAAA6ACsAAAACAAEAAAA6ACwAAAACAAEAAAA6AC0AAAACAAEAAAA6AC4AAAACAAEAAAA6AC8AAAACAAEAAAA6ADAAAAACAAEAAAA6ADEAAAACAAEAAAA6ADIAAAACAAEAAAA6ADMAAAACAAEAAAA6ADQAAAACAAEAAAA6ADUAAAACAAEAAAA6ADYAAAACAAEAAAA6ADcAAAACAAEAAAA6ADgAAAACAAEAAAA7ACkAAAACAAEAAAA7ACoAAAACAAEAAAA7ACsAAAACAAEAAAA7ACwAAAACAAEAAAA7AC0AAAACAAEAAAA7AC4AAAACAAEAAAA7AC8AAAACAAEAAAA7ADAAAAACAAEAAAA7ADEAAAACAAEAAAA7ADIAAAACAAEAAAA7ADMAAAACAAEAAAA7ADQAAAACAAEAAAA7ADUAAAACAAEAAAA7ADYAAAACAAEAAAA7ADcAAAACAAEAAAA7ADgAAAACAAEAAAA8ACkAAAACAAEAAAA8ACoAAAACAAEAAAA8ACsAAAACAAEAAAA8ACwAAAACAAEAAAA8AC0AAAACAAEAAAA8AC4AAAACAAEAAAA8AC8AAAACAAEAAAA8ADAAAAACAAEAAAA8ADEAAAACAAEAAAA8ADIAAAACAAEAAAA8ADMAAAACAAEAAAA8ADQAAAACAAEAAAA8ADUAAAACAAEAAAA8ADYAAAACAAEAAAA8ADcAAAACAAEAAAA8ADgAAAACAAEAAAA9ACkAAAACAAEAAAA9ACoAAAACAAEAAAA9ACsAAAACAAEAAAA9ACwAAAACAAEAAAA9AC0AAAACAAEAAAA9AC4AAAACAAEAAAA9AC8AAAACAAEAAAA9ADAAAAACAAEAAAA9ADEAAAACAAEAAAA9ADIAAAACAAEAAAA9ADMAAAACAAEAAAA9ADQAAAACAAEAAAA9ADUAAAACAAEAAAA9ADYAAAACAAEAAAA9ADcAAAACAAEAAAA9ADgAAAACAAEAAAA+ACkAAAACAAEAAAA+ACoAAAACAAEAAAA+ACsAAAACAAEAAAA+ACwAAAACAAEAAAA+AC0AAAACAAEAAAA+AC4AAAACAAEAAAA+AC8AAAACAAEAAAA+ADAAAAACAAEAAAA+ADEAAAACAAEAAAA+ADIAAAACAAEAAAA+ADMAAAACAAEAAAA+ADQAAAACAAEAAAA+ADUAAAACAAEAAAA+ADYAAAACAAEAAAA+ADcAAAACAAEAAAA+ADgAAAACAAEAAAA/ACkAAAACAAEAAAA/ACoAAAACAAEAAAA/ACsAAAACAAEAAAA/ACwAAAACAAEAAAA/AC0AAAACAAEAAAA/AC4AAAACAAEAAAA/AC8AAAACAAEAAAA/ADAAAAACAAEAAAA/ADEAAAACAAEAAAA/ADIAAAACAAEAAAA/ADMAAAACAAEAAAA/ADQAAAACAAEAAAA/ADUAAAACAAEAAAA/ADYAAAACAAEAAAA/ADcAAAACAAEAAAA/ADgAAAACAAEAAABAACkAAAACAAEAAABAACoAAAACAAEAAABAACsAAAACAAEAAABAACwAAAACAAEAAABAAC0AAAACAAEAAABAAC4AAAACAAEAAABAAC8AAAACAAEAAABAADAAAAACAAEAAABAADEAAAACAAEAAABAADIAAAACAAEAAABAADMAAAACAAEAAABAADQAAAACAAEAAABAADUAAAACAAEAAABAADYAAAACAAEAAABAADcAAAACAAEAAABAADgAAAACAAEAAABBACkAAAACAAEAAABBACoAAAACAAEAAABBACsAAAACAAEAAABBACwAAAACAAEAAABBAC0AAAACAAEAAABBAC4AAAACAAEAAABBAC8AAAACAAEAAABBADAAAAACAAEAAABBADEAAAACAAEAAABBADIAAAACAAEAAABBADMAAAACAAEAAABBADQAAAACAAEAAABBADUAAAACAAEAAABBADYAAAACAAEAAABBADcAAAACAAEAAABBADgAAAACAAEAAABCACkAAAACAAEAAABCACoAAAACAAEAAABCACsAAAACAAEAAABCACwAAAACAAEAAABCAC0AAAACAAEAAABCAC4AAAACAAEAAABCAC8AAAACAAEAAABCADAAAAACAAEAAABCADEAAAACAAEAAABCADIAAAACAAEAAABCADMAAAACAAEAAABCADQAAAACAAEAAABCADUAAAACAAEAAABCADYAAAACAAEAAABCADcAAAACAAEAAABCADgAAAACAAEAAABDACkAAAACAAEAAABDACoAAAACAAEAAABDACsAAAACAAEAAABDACwAAAACAAEAAABDAC0AAAACAAEAAABDAC4AAAACAAEAAABDAC8AAAACAAEAAABDADAAAAACAAEAAABDADEAAAACAAEAAABDADIAAAACAAEAAABDADMAAAACAAEAAABDADQAAAACAAEAAABDADUAAAACAAEAAABDADYAAAACAAEAAABDADcAAAACAAEAAABDADgAAAACAAEAAABEACkAAAACAAEAAABEACoAAAACAAEAAABEACsAAAACAAEAAABEACwAAAACAAEAAABEAC0AAAACAAEAAABEAC4AAAACAAEAAABEAC8AAAACAAEAAABEADAAAAACAAEAAABEADEAAAACAAEAAABEADIAAAACAAEAAABEADMAAAACAAEAAABEADQAAAACAAEAAABEADUAAAACAAEAAABEADYAAAACAAEAAABEADcAAAACAAEAAABEADgAAAACAAEAAABFACkAAAACAAEAAABFACoAAAACAAEAAABFACsAAAACAAEAAABFACwAAAACAAEAAABFAC0AAAACAAEAAABFAC4AAAACAAEAAABFAC8AAAACAAEAAABFADAAAAACAAEAAABFADEAAAACAAEAAABFADIAAAACAAEAAABFADMAAAACAAEAAABFADQAAAACAAEAAABFADUAAAACAAEAAABFADYAAAACAAEAAABFADcAAAACAAEAAABFADgAAAACAAEAAABGACkAAAACAAEAAABGACoAAAACAAEAAABGACsAAAACAAEAAABGACwAAAACAAEAAABGAC0AAAACAAEAAABGAC4AAAACAAEAAABGAC8AAAACAAEAAABGADAAAAACAAEAAABGADEAAAACAAEAAABGADIAAAACAAEAAABGADMAAAACAAEAAABGADQAAAACAAEAAABGADUAAAACAAEAAABGADYAAAACAAEAAABGADcAAAACAAEAAABGADgAAAACAAEAAABHACkAAAACAAEAAABHACoAAAACAAEAAABHACsAAAACAAEAAABHACwAAAACAAEAAABHAC0AAAACAAEAAABHAC4AAAACAAEAAABHAC8AAAACAAEAAABHADAAAAACAAEAAABHADEAAAACAAEAAABHADIAAAACAAEAAABHADMAAAACAAEAAABHADQAAAACAAEAAABHADUAAAACAAEAAABHADYAAAACAAEAAABHADcAAAACAAEAAABHADgAAAACAAEAAABIACYAAAACAAEAAABIACcAAAACAAEAAABIACgAAAACAAEAAABIACkAAAACAAEAAABIACoAAAACAAEAAABIACsAAAACAAEAAABIACwAAAACAAEAAABIAC0AAAACAAEAAABIAC4AAAACAAEAAABIAC8AAAACAAEAAABIADAAAAACAAEAAABIADEAAAACAAEAAABIADIAAAACAAEAAABIADMAAAACAAEAAABIADQAAAACAAEAAABIADUAAAACAAEAAABIADYAAAACAAEAAABIADcAAAACAAEAAABIADgAAAACAAEAAABJACYAAAACAAEAAABJACcAAAACAAEAAABJACgAAAACAAEAAABJACkAAAACAAEAAABJACoAAAACAAEAAABJACsAAAACAAEAAABJACwAAAACAAEAAABJAC0AAAACAAEAAABJAC4AAAACAAEAAABJAC8AAAACAAEAAABJADAAAAACAAEAAABJADEAAAACAAEAAABJADIAAAACAAEAAABJADMAAAACAAEAAABJADQAAAACAAEAAABJADUAAAACAAEAAABJADYAAAACAAEAAABJADcAAAACAAEAAABJADgAAAACAAEAAABKACYAAAACAAEAAABKACcAAAACAAEAAABKACgAAAACAAEAAABKACkAAAACAAEAAABKACoAAAACAAEAAABKACsAAAACAAEAAABKACwAAAACAAEAAABKAC0AAAACAAEAAABKAC4AAAACAAEAAABKAC8AAAACAAEAAABKADAAAAACAAEAAABKADEAAAACAAEAAABKADIAAAACAAEAAABKADMAAAACAAEAAABKADQAAAACAAEAAABKADUAAAACAAEAAABKADYAAAACAAEAAABKADcAAAACAAEAAABKADgAAAACAAEAAABLACYAAAACAAEAAABLACcAAAACAAEAAABLACgAAAACAAEAAABLACkAAAACAAEAAABLACoAAAACAAEAAABLACsAAAACAAEAAABLACwAAAACAAEAAABLAC0AAAACAAEAAABLAC4AAAACAAEAAABLAC8AAAACAAEAAABLADAAAAACAAEAAABLADEAAAACAAEAAABLADIAAAACAAEAAABLADMAAAACAAEAAABLADQAAAACAAEAAABLADUAAAACAAEAAABLADYAAAACAAEAAABLADcAAAACAAEAAABLADgAAAACAAEAAABMACYAAAACAAEAAABMACcAAAACAAEAAABMACgAAAACAAEAAABMACkAAAACAAEAAABMACoAAAACAAEAAABMACsAAAACAAEAAABMACwAAAACAAEAAABMAC0AAAACAAEAAABMAC4AAAACAAEAAABMAC8AAAACAAEAAABMADAAAAACAAEAAABMADEAAAACAAEAAABMADIAAAACAAEAAABMADMAAAACAAEAAABMADQAAAACAAEAAABMADUAAAACAAEAAABMADYAAAACAAEAAABMADcAAAACAAEAAABMADgAAAACAAEAAABNACYAAAACAAEAAABNACcAAAACAAEAAABNACgAAAACAAEAAABNACkAAAACAAEAAABNACoAAAACAAEAAABNACsAAAACAAEAAABNACwAAAACAAEAAABNAC0AAAACAAEAAABNAC4AAAACAAEAAABNAC8AAAACAAEAAABNADAAAAACAAEAAABNADEAAAACAAEAAABNADIAAAACAAEAAABNADMAAAACAAEAAABNADQAAAACAAEAAABNADUAAAACAAEAAABNADYAAAACAAEAAABNADcAAAACAAEAAABNADgAAAACAAEAAABOACYAAAACAAEAAABOACcAAAACAAEAAABOACgAAAACAAEAAABOACkAAAACAAEAAABOACoAAAACAAEAAABOACsAAAACAAEAAABOACwAAAACAAEAAABOAC0AAAACAAEAAABOAC4AAAACAAEAAABOAC8AAAACAAEAAABOADAAAAACAAEAAABOADEAAAACAAEAAABOADIAAAACAAEAAABOADMAAAACAAEAAABOADQAAAACAAEAAABOADUAAAACAAEAAABOADYAAAACAAEAAABOADcAAAACAAEAAABOADgAAAACAAEAAABPACYAAAACAAEAAABPACcAAAACAAEAAABPACgAAAACAAEAAABPACkAAAACAAEAAABPACoAAAACAAEAAABPACsAAAACAAEAAABPACwAAAACAAEAAABPAC0AAAACAAEAAABPAC4AAAACAAEAAABPAC8AAAACAAEAAABPADAAAAACAAEAAABPADEAAAACAAEAAABPADIAAAACAAEAAABPADMAAAACAAEAAABPADQAAAACAAEAAABPADUAAAACAAEAAABPADYAAAACAAEAAABPADcAAAACAAEAAABPADgAAAACAAEAAABQACYAAAACAAEAAABQACcAAAACAAEAAABQACgAAAACAAEAAABQACkAAAACAAEAAABQACoAAAACAAEAAABQACsAAAACAAEAAABQACwAAAACAAEAAABQAC0AAAACAAEAAABQAC4AAAACAAEAAABQAC8AAAACAAEAAABQADAAAAACAAEAAABQADEAAAACAAEAAABQADIAAAACAAEAAABQADMAAAACAAEAAABQADQAAAACAAEAAABQADUAAAACAAEAAABQADYAAAACAAEAAABQADcAAAACAAEAAABQADgAAAACAAEAAABRACYAAAACAAEAAABRACcAAAACAAEAAABRACgAAAACAAEAAABRACkAAAACAAEAAABRACoAAAACAAEAAABRACsAAAACAAEAAABRACwAAAACAAEAAABRAC0AAAACAAEAAABRAC4AAAACAAEAAABRAC8AAAACAAEAAABRADAAAAACAAEAAABRADEAAAACAAEAAABRADIAAAACAAEAAABRADMAAAACAAEAAABRADQAAAACAAEAAABRADUAAAACAAEAAABRADYAAAACAAEAAABRADcAAAACAAEAAABRADgAAAACAAEAAABSACYAAAACAAEAAABSACcAAAACAAEAAABSACgAAAACAAEAAABSACkAAAACAAEAAABSACoAAAACAAEAAABSACsAAAACAAEAAABSACwAAAACAAEAAABSAC0AAAACAAEAAABSAC4AAAACAAEAAABSAC8AAAACAAEAAABSADAAAAACAAEAAABSADEAAAACAAEAAABSADIAAAACAAEAAABSADMAAAACAAEAAABSADQAAAACAAEAAABSADUAAAACAAEAAABSADYAAAACAAEAAABSADcAAAACAAEAAABSADgAAAACAAEAAABTACYAAAACAAEAAABTACcAAAACAAEAAABTACgAAAACAAEAAABTACkAAAACAAEAAABTACoAAAACAAEAAABTACsAAAACAAEAAABTACwAAAACAAEAAABTAC0AAAACAAEAAABTAC4AAAACAAEAAABTAC8AAAACAAEAAABTADAAAAACAAEAAABTADEAAAACAAEAAABTADIAAAACAAEAAABTADMAAAACAAEAAABTADQAAAACAAEAAABTADUAAAACAAEAAABTADYAAAACAAEAAABTADcAAAACAAEAAABTADgAAAACAAEAAABUACYAAAACAAEAAABUACcAAAACAAEAAABUACgAAAACAAEAAABUACkAAAACAAEAAABUACoAAAACAAEAAABUACsAAAACAAEAAABUACwAAAACAAEAAABUAC0AAAACAAEAAABUAC4AAAACAAEAAABUAC8AAAACAAEAAABUADAAAAACAAEAAABUADEAAAACAAEAAABUADIAAAACAAEAAABUADMAAAACAAEAAABUADQAAAACAAEAAABUADUAAAACAAEAAABUADYAAAACAAEAAABUADcAAAACAAEAAABUADgAAAACAAEAAABVACYAAAACAAEAAABVACcAAAACAAEAAABVACgAAAACAAEAAABVACkAAAACAAEAAABVACoAAAACAAEAAABVACsAAAACAAEAAABVACwAAAACAAEAAABVAC0AAAACAAEAAABVAC4AAAACAAEAAABVAC8AAAACAAEAAABVADAAAAACAAEAAABVADEAAAACAAEAAABVADIAAAACAAEAAABVADMAAAACAAEAAABVADQAAAACAAEAAABVADUAAAACAAEAAABVADYAAAACAAEAAABVADcAAAACAAEAAABVADgAAAACAAEAAABWACYAAAACAAEAAABWACcAAAACAAEAAABWACgAAAACAAEAAABWACkAAAACAAEAAABWACoAAAACAAEAAABWACsAAAACAAEAAABWACwAAAACAAEAAABWAC0AAAACAAEAAABWAC4AAAACAAEAAABWAC8AAAACAAEAAABWADAAAAACAAEAAABWADEAAAACAAEAAABWADIAAAACAAEAAABWADMAAAACAAEAAABWADQAAAACAAEAAABWADUAAAACAAEAAABWADYAAAACAAEAAABWADcAAAACAAEAAABWADgAAAACAAEAAABXACYAAAACAAEAAABXACcAAAACAAEAAABXACgAAAACAAEAAABXACkAAAACAAEAAABXACoAAAACAAEAAABXACsAAAACAAEAAABXACwAAAACAAEAAABXAC0AAAACAAEAAABXAC4AAAACAAEAAABXAC8AAAACAAEAAABXADAAAAACAAEAAABXADEAAAACAAEAAABXADIAAAACAAEAAABXADMAAAACAAEAAABXADQAAAACAAEAAABXADUAAAACAAEAAABXADYAAAACAAEAAABXADcAAAACAAEAAABXADgAAAACAAEAAABYACYAAAACAAEAAABYACcAAAACAAEAAABYACgAAAACAAEAAABYACkAAAACAAEAAABYACoAAAACAAEAAABYACsAAAACAAEAAABYACwAAAACAAEAAABYAC0AAAACAAEAAABYAC4AAAACAAEAAABYAC8AAAACAAEAAABYADAAAAACAAEAAABYADEAAAACAAEAAABYADIAAAACAAEAAABYADMAAAACAAEAAABYADQAAAACAAEAAABYADUAAAACAAEAAABYADYAAAACAAEAAABYADcAAAACAAEAAABYADgAAAACAAEAAABZACYAAAACAAEAAABZACcAAAACAAEAAABZACgAAAACAAEAAABZACkAAAACAAEAAABZACoAAAACAAEAAABZACsAAAACAAEAAABZACwAAAACAAEAAABZAC0AAAACAAEAAABZAC4AAAACAAEAAABZAC8AAAACAAEAAABZADAAAAACAAEAAABZADEAAAACAAEAAABZADIAAAACAAEAAABZADMAAAACAAEAAABZADQAAAACAAEAAABZADUAAAACAAEAAABZADYAAAACAAEAAABZADcAAAACAAEAAABZADgAAAACAAEAAABaACYAAAACAAEAAABaACcAAAACAAEAAABaACgAAAACAAEAAABaACkAAAACAAEAAABaACoAAAACAAEAAABaACsAAAACAAEAAABaACwAAAACAAEAAABaAC0AAAACAAEAAABaAC4AAAACAAEAAABaAC8AAAACAAEAAABaADAAAAACAAEAAABaADEAAAACAAEAAABaADIAAAACAAEAAABaADMAAAACAAEAAABaADQAAAACAAEAAABaADUAAAACAAEAAABaADYAAAACAAEAAABaADcAAAACAAEAAABaADgAAAACAAEAAABbACYAAAACAAEAAABbACcAAAACAAEAAABbACgAAAACAAEAAABbACkAAAACAAEAAABbACoAAAACAAEAAABbACsAAAACAAEAAABbACwAAAACAAEAAABbAC0AAAACAAEAAABbAC4AAAACAAEAAABbAC8AAAACAAEAAABbADAAAAACAAEAAABbADEAAAACAAEAAABbADIAAAACAAEAAABbADMAAAACAAEAAABbADQAAAACAAEAAABbADUAAAACAAEAAABbADYAAAACAAEAAABbADcAAAACAAEAAABbADgAAAACAAEAAABcACYAAAACAAEAAABcACcAAAACAAEAAABcACgAAAACAAEAAABcACkAAAACAAEAAABcACoAAAACAAEAAABcACsAAAACAAEAAABcACwAAAACAAEAAABcAC0AAAACAAEAAABcAC4AAAACAAEAAABcAC8AAAACAAEAAABcADAAAAACAAEAAABcADEAAAACAAEAAABcADIAAAACAAEAAABcADMAAAACAAEAAABcADQAAAACAAEAAABcADUAAAACAAEAAABcADYAAAACAAEAAABcADcAAAACAAEAAABcADgAAAACAAEAAABdACYAAAACAAEAAABdACcAAAACAAEAAABdACgAAAACAAEAAABdACkAAAACAAEAAABdACoAAAACAAEAAABdACsAAAACAAEAAABdACwAAAACAAEAAABdAC0AAAACAAEAAABdAC4AAAACAAEAAABdAC8AAAACAAEAAABdADAAAAACAAEAAABdADEAAAACAAEAAABdADIAAAACAAEAAABdADMAAAACAAEAAABdADQAAAACAAEAAABdADUAAAACAAEAAABdADYAAAACAAEAAABdADcAAAACAAEAAABdADgAAAACAAEAAABeACYAAAACAAEAAABeACcAAAACAAEAAABeACgAAAACAAEAAABeACkAAAACAAEAAABeACoAAAACAAEAAABeACsAAAACAAEAAABeACwAAAACAAEAAABeAC0AAAACAAEAAABeAC4AAAACAAEAAABeAC8AAAACAAEAAABeADAAAAACAAEAAABeADEAAAACAAEAAABeADIAAAACAAEAAABeADMAAAACAAEAAABeADQAAAACAAEAAABeADUAAAACAAEAAABeADYAAAACAAEAAABeADcAAAACAAEAAABeADgAAAACAAEAAABfACYAAAACAAEAAABfACcAAAACAAEAAABfACgAAAACAAEAAABfACkAAAACAAEAAABfACoAAAACAAEAAABfACsAAAACAAEAAABfACwAAAACAAEAAABfAC0AAAACAAEAAABfAC4AAAACAAEAAABfAC8AAAACAAEAAABfADAAAAACAAEAAABfADEAAAACAAEAAABfADIAAAACAAEAAABfADMAAAACAAEAAABfADQAAAACAAEAAABfADUAAAACAAEAAABfADYAAAACAAEAAABfADcAAAACAAEAAABfADgAAAACAAEAAABgACYAAAACAAEAAABgACcAAAACAAEAAABgACgAAAACAAEAAABgACkAAAACAAEAAABgACoAAAACAAEAAABgACsAAAACAAEAAABgACwAAAACAAEAAABgAC0AAAACAAEAAABgAC4AAAACAAEAAABgAC8AAAACAAEAAABgADAAAAACAAEAAABgADEAAAACAAEAAABgADIAAAACAAEAAABgADMAAAACAAEAAABgADQAAAACAAEAAABgADUAAAACAAEAAABgADYAAAACAAEAAABgADcAAAACAAEAAABgADgAAAACAAEAAABhACYAAAACAAEAAABhACcAAAACAAEAAABhACgAAAACAAEAAABhACkAAAACAAEAAABhACoAAAACAAEAAABhACsAAAACAAEAAABhACwAAAACAAEAAABhAC0AAAACAAEAAABhAC4AAAACAAEAAABhAC8AAAACAAEAAABhADAAAAACAAEAAABhADEAAAACAAEAAABhADIAAAACAAEAAABhADMAAAACAAEAAABhADQAAAACAAEAAABhADUAAAACAAEAAABhADYAAAACAAEAAABhADcAAAACAAEAAABhADgAAAACAAEAAABiACYAAAACAAEAAABiACcAAAACAAEAAABiACgAAAACAAEAAABiACkAAAACAAEAAABiACoAAAACAAEAAABiACsAAAACAAEAAABiACwAAAACAAEAAABiAC0AAAACAAEAAABiAC4AAAACAAEAAABiAC8AAAACAAEAAABiADAAAAACAAEAAABiADEAAAACAAEAAABiADIAAAACAAEAAABiADMAAAACAAEAAABiADQAAAACAAEAAABiADUAAAACAAEAAABiADYAAAACAAEAAABiADcAAAACAAEAAABiADgAAAACAAEAAABjACYAAAACAAEAAABjACcAAAACAAEAAABjACgAAAACAAEAAABjACkAAAACAAEAAABjACoAAAACAAEAAABjACsAAAACAAEAAABjACwAAAACAAEAAABjAC0AAAACAAEAAABjAC4AAAACAAEAAABjAC8AAAACAAEAAABjADAAAAACAAEAAABjADEAAAACAAEAAABjADIAAAACAAEAAABjADMAAAACAAEAAABjADQAAAACAAEAAABjADUAAAACAAEAAABjADYAAAACAAEAAABjADcAAAACAAEAAABjADgAAAACAAEAAABkACYAAAACAAEAAABkACcAAAACAAEAAABkACgAAAACAAEAAABkACkAAAACAAEAAABkACoAAAACAAEAAABkACsAAAACAAEAAABkACwAAAACAAEAAABkAC0AAAACAAEAAABkAC4AAAACAAEAAABkAC8AAAACAAEAAABkADAAAAACAAEAAABkADEAAAACAAEAAABkADIAAAACAAEAAABkADMAAAACAAEAAABkADQAAAACAAEAAABkADUAAAACAAEAAABkADYAAAACAAEAAABkADcAAAACAAEAAABkADgAAAACAAEAAABlACYAAAACAAEAAABlACcAAAACAAEAAABlACgAAAACAAEAAABlACkAAAACAAEAAABlACoAAAACAAEAAABlACsAAAACAAEAAABlACwAAAACAAEAAABlAC0AAAACAAEAAABlAC4AAAACAAEAAABlAC8AAAACAAEAAABlADAAAAACAAEAAABlADEAAAACAAEAAABlADIAAAACAAEAAABlADMAAAACAAEAAABlADQAAAACAAEAAABlADUAAAACAAEAAABlADYAAAACAAEAAABlADcAAAACAAEAAABlADgAAAACAAEAAABmACYAAAACAAEAAABmACcAAAACAAEAAABmACgAAAACAAEAAABmACkAAAACAAEAAABmACoAAAACAAEAAABmACsAAAACAAEAAABmACwAAAACAAEAAABmAC0AAAACAAEAAABmAC4AAAACAAEAAABmAC8AAAACAAEAAABmADAAAAACAAEAAABmADEAAAACAAEAAABmADIAAAACAAEAAABmADMAAAACAAEAAABmADQAAAACAAEAAABmADUAAAACAAEAAABmADYAAAACAAEAAABmADcAAAACAAEAAABmADgAAAACAAEAAABGAPL/AAACAAEAAABGAPP/AAACAAEAAABGAPT/AAACAAEAAABGAPX/AAACAAEAAABGAPb/AAACAAEAAABGAPf/AAACAAEAAABGAPj/AAACAAEAAABGAPn/AAACAAEAAABGAPr/AAACAAEAAABGAPv/AAACAAEAAABGAPz/AAACAAEAAABGAP3/AAACAAEAAABGAP7/AAACAAEAAABGAP//AAACAAEAAABHAPL/AAACAAEAAABHAPP/AAACAAEAAABHAPT/AAACAAEAAABHAPX/AAACAAEAAABHAPb/AAACAAEAAABHAPf/AAACAAEAAABHAPj/AAACAAEAAABHAPn/AAACAAEAAABHAPr/AAACAAEAAABHAPv/AAACAAEAAABHAPz/AAACAAEAAABHAP3/AAACAAEAAABHAP7/AAACAAEAAABHAP//AAACAAEAAABIAPL/AAACAAEAAABIAPP/AAACAAEAAABIAPT/AAACAAEAAABIAPX/AAACAAEAAABIAPb/AAACAAEAAABIAPf/AAACAAEAAABIAPj/AAACAAEAAABIAPn/AAACAAEAAABIAPr/AAACAAEAAABIAPv/AAACAAEAAABIAPz/AAACAAEAAABIAP3/AAACAAEAAABIAP7/AAACAAEAAABIAP//AAACAAEAAABIAAAAAAACAAEAAABIAAEAAAACAAEAAABIAAIAAAACAAEAAABIAAMAAAACAAEAAABIAAQAAAACAAEAAABIAAUAAAACAAEAAABIAAYAAAACAAEAAABIAAcAAAACAAEAAABIAAgAAAACAAEAAABIAAkAAAACAAEAAABIAAoAAAACAAEAAABIAAsAAAACAAEAAABIAAwAAAACAAEAAABIAA0AAAACAAEAAABIAA4AAAACAAEAAABIAA8AAAACAAEAAABIABAAAAACAAEAAABIABEAAAACAAEAAABIABIAAAACAAEAAABIABMAAAACAAEAAABIABQAAAACAAEAAABIABUAAAACAAEAAABIABYAAAACAAEAAABIABcAAAACAAEAAABIABgAAAACAAEAAABIABkAAAACAAEAAABIABoAAAACAAEAAABIABsAAAACAAEAAABIABwAAAACAAEAAABIAB0AAAACAAEAAABIAB4AAAACAAEAAABIAB8AAAACAAEAAABIACAAAAACAAEAAABIACEAAAACAAEAAABIACIAAAACAAEAAABIACMAAAACAAEAAABIACQAAAACAAEAAABIACUAAAACAAEAAABJAPL/AAACAAEAAABJAPP/AAACAAEAAABJAPT/AAACAAEAAABJAPX/AAACAAEAAABJAPb/AAACAAEAAABJAPf/AAACAAEAAABJAPj/AAACAAEAAABJAPn/AAACAAEAAABJAPr/AAACAAEAAABJAPv/AAACAAEAAABJAPz/AAACAAEAAABJAP3/AAACAAEAAABJAP7/AAACAAEAAABJAP//AAACAAEAAABJAAAAAAACAAEAAABJAAEAAAACAAEAAABJAAIAAAACAAEAAABJAAMAAAACAAEAAABJAAQAAAACAAEAAABJAAUAAAACAAEAAABJAAYAAAACAAEAAABJAAcAAAACAAEAAABJAAgAAAACAAEAAABJAAkAAAACAAEAAABJAAoAAAACAAEAAABJAAsAAAACAAEAAABJAAwAAAACAAEAAABJAA0AAAACAAEAAABJAA4AAAACAAEAAABJAA8AAAACAAEAAABJABAAAAACAAEAAABJABEAAAACAAEAAABJABIAAAACAAEAAABJABMAAAACAAEAAABJABQAAAACAAEAAABJABUAAAACAAEAAABJABYAAAACAAEAAABJABcAAAACAAEAAABJABgAAAACAAEAAABJABkAAAACAAEAAABJABoAAAACAAEAAABJABsAAAACAAEAAABJABwAAAACAAEAAABJAB0AAAACAAEAAABJAB4AAAACAAEAAABJAB8AAAACAAEAAABJACAAAAACAAEAAABJACEAAAACAAEAAABJACIAAAACAAEAAABJACMAAAACAAEAAABJACQAAAACAAEAAABJACUAAAACAAEAAABKAPL/AAACAAEAAABKAPP/AAACAAEAAABKAPT/AAACAAEAAABKAPX/AAACAAEAAABKAPb/AAACAAEAAABKAPf/AAACAAEAAABKAPj/AAACAAEAAABKAPn/AAACAAEAAABKAPr/AAACAAEAAABKAPv/AAACAAEAAABKAPz/AAACAAEAAABKAP3/AAACAAEAAABKAP7/AAACAAEAAABKAP//AAACAAEAAABKAAAAAAACAAEAAABKAAEAAAACAAEAAABKAAIAAAACAAEAAABKAAMAAAACAAEAAABKAAQAAAACAAEAAABKAAUAAAACAAEAAABKAAYAAAACAAEAAABKAAcAAAACAAEAAABKAAgAAAACAAEAAABKAAkAAAACAAEAAABKAAoAAAACAAEAAABKAAsAAAACAAEAAABKAAwAAAACAAEAAABKAA0AAAACAAEAAABKAA4AAAACAAEAAABKAA8AAAACAAEAAABKABAAAAACAAEAAABKABEAAAACAAEAAABKABIAAAACAAEAAABKABMAAAACAAEAAABKABQAAAACAAEAAABKABUAAAACAAEAAABKABYAAAACAAEAAABKABcAAAACAAEAAABKABgAAAACAAEAAABKABkAAAACAAEAAABKABoAAAACAAEAAABKABsAAAACAAEAAABKABwAAAACAAEAAABKAB0AAAACAAEAAABKAB4AAAACAAEAAABKAB8AAAACAAEAAABKACAAAAACAAEAAABKACEAAAACAAEAAABKACIAAAACAAEAAABKACMAAAACAAEAAABKACQAAAACAAEAAABKACUAAAACAAEAAABLAPL/AAACAAEAAABLAPP/AAACAAEAAABLAPT/AAACAAEAAABLAPX/AAACAAEAAABLAPb/AAACAAEAAABLAPf/AAACAAEAAABLAPj/AAACAAEAAABLAPn/AAACAAEAAABLAPr/AAACAAEAAABLAPv/AAACAAEAAABLAPz/AAACAAEAAABLAP3/AAACAAEAAABLAP7/AAACAAEAAABLAP//AAACAAEAAABLAAAAAAACAAEAAABLAAEAAAACAAEAAABLAAIAAAACAAEAAABLAAMAAAACAAEAAABLAAQAAAACAAEAAABLAAUAAAACAAEAAABLAAYAAAACAAEAAABLAAcAAAACAAEAAABLAAgAAAACAAEAAABLAAkAAAACAAEAAABLAAoAAAACAAEAAABLAAsAAAACAAEAAABLAAwAAAACAAEAAABLAA0AAAACAAEAAABLAA4AAAACAAEAAABLAA8AAAACAAEAAABLABAAAAACAAEAAABLABEAAAACAAEAAABLABIAAAACAAEAAABLABMAAAACAAEAAABLABQAAAACAAEAAABLABUAAAACAAEAAABLABYAAAACAAEAAABLABcAAAACAAEAAABLABgAAAACAAEAAABLABkAAAACAAEAAABLABoAAAACAAEAAABLABsAAAACAAEAAABLABwAAAACAAEAAABLAB0AAAACAAEAAABLAB4AAAACAAEAAABLAB8AAAACAAEAAABLACAAAAACAAEAAABLACEAAAACAAEAAABLACIAAAACAAEAAABLACMAAAACAAEAAABLACQAAAACAAEAAABLACUAAAACAAEAAABMAPL/AAACAAEAAABMAPP/AAACAAEAAABMAPT/AAACAAEAAABMAPX/AAACAAEAAABMAPb/AAACAAEAAABMAPf/AAACAAEAAABMAPj/AAACAAEAAABMAPn/AAACAAEAAABMAPr/AAACAAEAAABMAPv/AAACAAEAAABMAPz/AAACAAEAAABMAP3/AAACAAEAAABMAP7/AAACAAEAAABMAP//AAACAAEAAABMAAAAAAACAAEAAABMAAEAAAACAAEAAABMAAIAAAACAAEAAABMAAMAAAACAAEAAABMAAQAAAACAAEAAABMAAUAAAACAAEAAABMAAYAAAACAAEAAABMAAcAAAACAAEAAABMAAgAAAACAAEAAABMAAkAAAACAAEAAABMAAoAAAACAAEAAABMAAsAAAACAAEAAABMAAwAAAACAAEAAABMAA0AAAACAAEAAABMAA4AAAACAAEAAABMAA8AAAACAAEAAABMABAAAAACAAEAAABMABEAAAACAAEAAABMABIAAAACAAEAAABMABMAAAACAAEAAABMABQAAAACAAEAAABMABUAAAACAAEAAABMABYAAAACAAEAAABMABcAAAACAAEAAABMABgAAAACAAEAAABMABkAAAACAAEAAABMABoAAAACAAEAAABMABsAAAACAAEAAABMABwAAAACAAEAAABMAB0AAAACAAEAAABMAB4AAAACAAEAAABMAB8AAAACAAEAAABMACAAAAACAAEAAABMACEAAAACAAEAAABMACIAAAACAAEAAABMACMAAAACAAEAAABMACQAAAACAAEAAABMACUAAAACAAEAAABNAPL/AAACAAEAAABNAPP/AAACAAEAAABNAPT/AAACAAEAAABNAPX/AAACAAEAAABNAPb/AAACAAEAAABNAPf/AAACAAEAAABNAPj/AAACAAEAAABNAPn/AAACAAEAAABNAPr/AAACAAEAAABNAPv/AAACAAEAAABNAPz/AAACAAEAAABNAP3/AAACAAEAAABNAP7/AAACAAEAAABNAP//AAACAAEAAABNAAAAAAACAAEAAABNAAEAAAACAAEAAABNAAIAAAACAAEAAABNAAMAAAACAAEAAABNAAQAAAACAAEAAABNAAUAAAACAAEAAABNAAYAAAACAAEAAABNAAcAAAACAAEAAABNAAgAAAACAAEAAABNAAkAAAACAAEAAABNAAoAAAACAAEAAABNAAsAAAACAAEAAABNAAwAAAACAAEAAABNAA0AAAACAAEAAABNAA4AAAACAAEAAABNAA8AAAACAAEAAABNABAAAAACAAEAAABNABEAAAACAAEAAABNABIAAAACAAEAAABNABMAAAACAAEAAABNABQAAAACAAEAAABNABUAAAACAAEAAABNABYAAAACAAEAAABNABcAAAACAAEAAABNABgAAAACAAEAAABNABkAAAACAAEAAABNABoAAAACAAEAAABNABsAAAACAAEAAABNABwAAAACAAEAAABNAB0AAAACAAEAAABNAB4AAAACAAEAAABNAB8AAAACAAEAAABNACAAAAACAAEAAABNACEAAAACAAEAAABNACIAAAACAAEAAABNACMAAAACAAEAAABNACQAAAACAAEAAABNACUAAAACAAEAAABOAPL/AAACAAEAAABOAPP/AAACAAEAAABOAPT/AAACAAEAAABOAPX/AAACAAEAAABOAPb/AAACAAEAAABOAPf/AAACAAEAAABOAPj/AAACAAEAAABOAPn/AAACAAEAAABOAPr/AAACAAEAAABOAPv/AAACAAEAAABOAPz/AAACAAEAAABOAP3/AAACAAEAAABOAP7/AAACAAEAAABOAP//AAACAAEAAABOAAAAAAACAAEAAABOAAEAAAACAAEAAABOAAIAAAACAAEAAABOAAMAAAACAAEAAABOAAQAAAACAAEAAABOAAUAAAACAAEAAABOAAYAAAACAAEAAABOAAcAAAACAAEAAABOAAgAAAACAAEAAABOAAkAAAACAAEAAABOAAoAAAACAAEAAABOAAsAAAACAAEAAABOAAwAAAACAAEAAABOAA0AAAACAAEAAABOAA4AAAACAAEAAABOAA8AAAACAAEAAABOABAAAAACAAEAAABOABEAAAACAAEAAABOABIAAAACAAEAAABOABMAAAACAAEAAABOABQAAAACAAEAAABOABUAAAACAAEAAABOABYAAAACAAEAAABOABcAAAACAAEAAABOABgAAAACAAEAAABOABkAAAACAAEAAABOABoAAAACAAEAAABOABsAAAACAAEAAABOABwAAAACAAEAAABOAB0AAAACAAEAAABOAB4AAAACAAEAAABOAB8AAAACAAEAAABOACAAAAACAAEAAABOACEAAAACAAEAAABOACIAAAACAAEAAABOACMAAAACAAEAAABOACQAAAACAAEAAABOACUAAAACAAEAAABPAPL/AAACAAEAAABPAPP/AAACAAEAAABPAPT/AAACAAEAAABPAPX/AAACAAEAAABPAPb/AAACAAEAAABPAPf/AAACAAEAAABPAPj/AAACAAEAAABPAPn/AAACAAEAAABPAPr/AAACAAEAAABPAPv/AAACAAEAAABPAPz/AAACAAEAAABPAP3/AAACAAEAAABPAP7/AAACAAEAAABPAP//AAACAAEAAABPAAAAAAACAAEAAABPAAEAAAACAAEAAABPAAIAAAACAAEAAABPAAMAAAACAAEAAABPAAQAAAACAAEAAABPAAUAAAACAAEAAABPAAYAAAACAAEAAABPAAcAAAACAAEAAABPAAgAAAACAAEAAABPAAkAAAACAAEAAABPAAoAAAACAAEAAABPAAsAAAACAAEAAABPAAwAAAACAAEAAABPAA0AAAACAAEAAABPAA4AAAACAAEAAABPAA8AAAACAAEAAABPABAAAAACAAEAAABPABEAAAACAAEAAABPABIAAAACAAEAAABPABMAAAACAAEAAABPABQAAAACAAEAAABPABUAAAACAAEAAABPABYAAAACAAEAAABPABcAAAACAAEAAABPABgAAAACAAEAAABPABkAAAACAAEAAABPABoAAAACAAEAAABPABsAAAACAAEAAABPABwAAAACAAEAAABPAB0AAAACAAEAAABPAB4AAAACAAEAAABPAB8AAAACAAEAAABPACAAAAACAAEAAABPACEAAAACAAEAAABPACIAAAACAAEAAABPACMAAAACAAEAAABPACQAAAACAAEAAABPACUAAAACAAEAAABQAPL/AAACAAEAAABQAPP/AAACAAEAAABQAPT/AAACAAEAAABQAPX/AAACAAEAAABQAPb/AAACAAEAAABQAPf/AAACAAEAAABQAPj/AAACAAEAAABQAPn/AAACAAEAAABQAPr/AAACAAEAAABQAPv/AAACAAEAAABQAPz/AAACAAEAAABQAP3/AAACAAEAAABQAP7/AAACAAEAAABQAP//AAACAAEAAABQAAAAAAACAAEAAABQAAEAAAACAAEAAABQAAIAAAACAAEAAABQAAMAAAACAAEAAABQAAQAAAACAAEAAABQAAUAAAACAAEAAABQAAYAAAACAAEAAABQAAcAAAACAAEAAABQAAgAAAACAAEAAABQAAkAAAACAAEAAABQAAoAAAACAAEAAABQAAsAAAACAAEAAABQAAwAAAACAAEAAABQAA0AAAACAAEAAABQAA4AAAACAAEAAABQAA8AAAACAAEAAABQABAAAAACAAEAAABQABEAAAACAAEAAABQABIAAAACAAEAAABQABMAAAACAAEAAABQABQAAAACAAEAAABQABUAAAACAAEAAABQABYAAAACAAEAAABQABcAAAACAAEAAABQABgAAAACAAEAAABQABkAAAACAAEAAABQABoAAAACAAEAAABQABsAAAACAAEAAABQABwAAAACAAEAAABQAB0AAAACAAEAAABQAB4AAAACAAEAAABQAB8AAAACAAEAAABQACAAAAACAAEAAABQACEAAAACAAEAAABQACIAAAACAAEAAABQACMAAAACAAEAAABQACQAAAACAAEAAABQACUAAAACAAEAAABRAPL/AAACAAEAAABRAPP/AAACAAEAAABRAPT/AAACAAEAAABRAPX/AAACAAEAAABRAPb/AAACAAEAAABRAPf/AAACAAEAAABRAPj/AAACAAEAAABRAPn/AAACAAEAAABRAPr/AAACAAEAAABRAPv/AAACAAEAAABRAPz/AAACAAEAAABRAP3/AAACAAEAAABRAP7/AAACAAEAAABRAP//AAACAAEAAABRAAAAAAACAAEAAABRAAEAAAACAAEAAABRAAIAAAACAAEAAABRAAMAAAACAAEAAABRAAQAAAACAAEAAABRAAUAAAACAAEAAABRAAYAAAACAAEAAABRAAcAAAACAAEAAABRAAgAAAACAAEAAABRAAkAAAACAAEAAABRAAoAAAACAAEAAABRAAsAAAACAAEAAABRAAwAAAACAAEAAABRAA0AAAACAAEAAABRAA4AAAACAAEAAABRAA8AAAACAAEAAABRABAAAAACAAEAAABRABEAAAACAAEAAABRABIAAAACAAEAAABRABMAAAACAAEAAABRABQAAAACAAEAAABRABUAAAACAAEAAABRABYAAAACAAEAAABRABcAAAACAAEAAABRABgAAAACAAEAAABRABkAAAACAAEAAABRABoAAAACAAEAAABRABsAAAACAAEAAABRABwAAAACAAEAAABRAB0AAAACAAEAAABRAB4AAAACAAEAAABRAB8AAAACAAEAAABRACAAAAACAAEAAABRACEAAAACAAEAAABRACIAAAACAAEAAABRACMAAAACAAEAAABRACQAAAACAAEAAABRACUAAAACAAEAAABSAPL/AAACAAEAAABSAPP/AAACAAEAAABSAPT/AAACAAEAAABSAPX/AAACAAEAAABSAPb/AAACAAEAAABSAPf/AAACAAEAAABSAPj/AAACAAEAAABSAPn/AAACAAEAAABSAPr/AAACAAEAAABSAPv/AAACAAEAAABSAPz/AAACAAEAAABSAP3/AAACAAEAAABSAP7/AAACAAEAAABSAP//AAACAAEAAABSAAAAAAACAAEAAABSAAEAAAACAAEAAABSAAIAAAACAAEAAABSAAMAAAACAAEAAABSAAQAAAACAAEAAABSAAUAAAACAAEAAABSAAYAAAACAAEAAABSAAcAAAACAAEAAABSAAgAAAACAAEAAABSAAkAAAACAAEAAABSAAoAAAACAAEAAABSAAsAAAACAAEAAABSAAwAAAACAAEAAABSAA0AAAACAAEAAABSAA4AAAACAAEAAABSAA8AAAACAAEAAABSABAAAAACAAEAAABSABEAAAACAAEAAABSABIAAAACAAEAAABSABMAAAACAAEAAABSABQAAAACAAEAAABSABUAAAACAAEAAABSABYAAAACAAEAAABSABcAAAACAAEAAABSABgAAAACAAEAAABSABkAAAACAAEAAABSABoAAAACAAEAAABSABsAAAACAAEAAABSABwAAAACAAEAAABSAB0AAAACAAEAAABSAB4AAAACAAEAAABSAB8AAAACAAEAAABSACAAAAACAAEAAABSACEAAAACAAEAAABSACIAAAACAAEAAABSACMAAAACAAEAAABSACQAAAACAAEAAABSACUAAAACAAEAAABTAPL/AAACAAEAAABTAPP/AAACAAEAAABTAPT/AAACAAEAAABTAPX/AAACAAEAAABTAPb/AAACAAEAAABTAPf/AAACAAEAAABTAPj/AAACAAEAAABTAPn/AAACAAEAAABTAPr/AAACAAEAAABTAPv/AAACAAEAAABTAPz/AAACAAEAAABTAP3/AAACAAEAAABTAP7/AAACAAEAAABTAP//AAACAAEAAABTAAAAAAACAAEAAABTAAEAAAACAAEAAABTAAIAAAACAAEAAABTAAMAAAACAAEAAABTAAQAAAACAAEAAABTAAUAAAACAAEAAABTAAYAAAACAAEAAABTAAcAAAACAAEAAABTAAgAAAACAAEAAABTAAkAAAACAAEAAABTAAoAAAACAAEAAABTAAsAAAACAAEAAABTAAwAAAACAAEAAABTAA0AAAACAAEAAABTAA4AAAACAAEAAABTAA8AAAACAAEAAABTABAAAAACAAEAAABTABEAAAACAAEAAABTABIAAAACAAEAAABTABMAAAACAAEAAABTABQAAAACAAEAAABTABUAAAACAAEAAABTABYAAAACAAEAAABTABcAAAACAAEAAABTABgAAAACAAEAAABTABkAAAACAAEAAABTABoAAAACAAEAAABTABsAAAACAAEAAABTABwAAAACAAEAAABTAB0AAAACAAEAAABTAB4AAAACAAEAAABTAB8AAAACAAEAAABTACAAAAACAAEAAABTACEAAAACAAEAAABTACIAAAACAAEAAABTACMAAAACAAEAAABTACQAAAACAAEAAABTACUAAAACAAEAAABUAPL/AAACAAEAAABUAPP/AAACAAEAAABUAPT/AAACAAEAAABUAPX/AAACAAEAAABUAPb/AAACAAEAAABUAPf/AAACAAEAAABUAPj/AAACAAEAAABUAPn/AAACAAEAAABUAPr/AAACAAEAAABUAPv/AAACAAEAAABUAPz/AAACAAEAAABUAP3/AAACAAEAAABUAP7/AAACAAEAAABUAP//AAACAAEAAABUAAAAAAACAAEAAABUAAEAAAACAAEAAABUAAIAAAACAAEAAABUAAMAAAACAAEAAABUAAQAAAACAAEAAABUAAUAAAACAAEAAABUAAYAAAACAAEAAABUAAcAAAACAAEAAABUAAgAAAACAAEAAABUAAkAAAACAAEAAABUAAoAAAACAAEAAABUAAsAAAACAAEAAABUAAwAAAACAAEAAABUAA0AAAACAAEAAABUAA4AAAACAAEAAABUAA8AAAACAAEAAABUABAAAAACAAEAAABUABEAAAACAAEAAABUABIAAAACAAEAAABUABMAAAACAAEAAABUABQAAAACAAEAAABUABUAAAACAAEAAABUABYAAAACAAEAAABUABcAAAACAAEAAABUABgAAAACAAEAAABUABkAAAACAAEAAABUABoAAAACAAEAAABUABsAAAACAAEAAABUABwAAAACAAEAAABUAB0AAAACAAEAAABUAB4AAAACAAEAAABUAB8AAAACAAEAAABUACAAAAACAAEAAABUACEAAAACAAEAAABUACIAAAACAAEAAABUACMAAAACAAEAAABUACQAAAACAAEAAABUACUAAAACAAEAAABVAPL/AAACAAEAAABVAPP/AAACAAEAAABVAPT/AAACAAEAAABVAPX/AAACAAEAAABVAPb/AAACAAEAAABVAPf/AAACAAEAAABVAPj/AAACAAEAAABVAPn/AAACAAEAAABVAPr/AAACAAEAAABVAPv/AAACAAEAAABVAPz/AAACAAEAAABVAP3/AAACAAEAAABVAP7/AAACAAEAAABVAP//AAACAAEAAABVAAAAAAACAAEAAABVAAEAAAACAAEAAABVAAIAAAACAAEAAABVAAMAAAACAAEAAABVAAQAAAACAAEAAABVAAUAAAACAAEAAABVAAYAAAACAAEAAABVAAcAAAACAAEAAABVAAgAAAACAAEAAABVAAkAAAACAAEAAABVAAoAAAACAAEAAABVAAsAAAACAAEAAABVAAwAAAACAAEAAABVAA0AAAACAAEAAABVAA4AAAACAAEAAABVAA8AAAACAAEAAABVABAAAAACAAEAAABVABEAAAACAAEAAABVABIAAAACAAEAAABVABMAAAACAAEAAABVABQAAAACAAEAAABVABUAAAACAAEAAABVABYAAAACAAEAAABVABcAAAACAAEAAABVABgAAAACAAEAAABVABkAAAACAAEAAABVABoAAAACAAEAAABVABsAAAACAAEAAABVABwAAAACAAEAAABVAB0AAAACAAEAAABVAB4AAAACAAEAAABVAB8AAAACAAEAAABVACAAAAACAAEAAABVACEAAAACAAEAAABVACIAAAACAAEAAABVACMAAAACAAEAAABVACQAAAACAAEAAABVACUAAAACAAEAAABWAPL/AAACAAEAAABWAPP/AAACAAEAAABWAPT/AAACAAEAAABWAPX/AAACAAEAAABWAPb/AAACAAEAAABWAPf/AAACAAEAAABWAPj/AAACAAEAAABWAPn/AAACAAEAAABWAPr/AAACAAEAAABWAPv/AAACAAEAAABWAPz/AAACAAEAAABWAP3/AAACAAEAAABWAP7/AAACAAEAAABWAP//AAACAAEAAABWAAAAAAACAAEAAABWAAEAAAACAAEAAABWAAIAAAACAAEAAABWAAMAAAACAAEAAABWAAQAAAACAAEAAABWAAUAAAACAAEAAABWAAYAAAACAAEAAABWAAcAAAACAAEAAABWAAgAAAACAAEAAABWAAkAAAACAAEAAABWAAoAAAACAAEAAABWAAsAAAACAAEAAABWAAwAAAACAAEAAABWAA0AAAACAAEAAABWAA4AAAACAAEAAABWAA8AAAACAAEAAABWABAAAAACAAEAAABWABEAAAACAAEAAABWABIAAAACAAEAAABWABMAAAACAAEAAABWABQAAAACAAEAAABWABUAAAACAAEAAABWABYAAAACAAEAAABWABcAAAACAAEAAABWABgAAAACAAEAAABWABkAAAACAAEAAABWABoAAAACAAEAAABWABsAAAACAAEAAABWABwAAAACAAEAAABWAB0AAAACAAEAAABWAB4AAAACAAEAAABWAB8AAAACAAEAAABWACAAAAACAAEAAABWACEAAAACAAEAAABWACIAAAACAAEAAABWACMAAAACAAEAAABWACQAAAACAAEAAABWACUAAAACAAEAAABXAPL/AAACAAEAAABXAPP/AAACAAEAAABXAPT/AAACAAEAAABXAPX/AAACAAEAAABXAPb/AAACAAEAAABXAPf/AAACAAEAAABXAPj/AAACAAEAAABXAPn/AAACAAEAAABXAPr/AAACAAEAAABXAPv/AAACAAEAAABXAPz/AAACAAEAAABXAP3/AAACAAEAAABXAP7/AAACAAEAAABXAP//AAACAAEAAABXAAAAAAACAAEAAABXAAEAAAACAAEAAABXAAIAAAACAAEAAABXAAMAAAACAAEAAABXAAQAAAACAAEAAABXAAUAAAACAAEAAABXAAYAAAACAAEAAABXAAcAAAACAAEAAABXAAgAAAACAAEAAABXAAkAAAACAAEAAABXAAoAAAACAAEAAABXAAsAAAACAAEAAABXAAwAAAACAAEAAABXAA0AAAACAAEAAABXAA4AAAACAAEAAABXAA8AAAACAAEAAABXABAAAAACAAEAAABXABEAAAACAAEAAABXABIAAAACAAEAAABXABMAAAACAAEAAABXABQAAAACAAEAAABXABUAAAACAAEAAABXABYAAAACAAEAAABXABcAAAACAAEAAABXABgAAAACAAEAAABXABkAAAACAAEAAABXABoAAAACAAEAAABXABsAAAACAAEAAABXABwAAAACAAEAAABXAB0AAAACAAEAAABXAB4AAAACAAEAAABXAB8AAAACAAEAAABXACAAAAACAAEAAABXACEAAAACAAEAAABXACIAAAACAAEAAABXACMAAAACAAEAAABXACQAAAACAAEAAABXACUAAAACAAEAAABYAPL/AAACAAEAAABYAPP/AAACAAEAAABYAPT/AAACAAEAAABYAPX/AAACAAEAAABYAPb/AAACAAEAAABYAPf/AAACAAEAAABYAPj/AAACAAEAAABYAPn/AAACAAEAAABYAPr/AAACAAEAAABYAPv/AAACAAEAAABYAPz/AAACAAEAAABYAP3/AAACAAEAAABYAP7/AAACAAEAAABYAP//AAACAAEAAABYAAAAAAACAAEAAABYAAEAAAACAAEAAABYAAIAAAACAAEAAABYAAMAAAACAAEAAABYAAQAAAACAAEAAABYAAUAAAACAAEAAABYAAYAAAACAAEAAABYAAcAAAACAAEAAABYAAgAAAACAAEAAABYAAkAAAACAAEAAABYAAoAAAACAAEAAABYAAsAAAACAAEAAABYAAwAAAACAAEAAABYAA0AAAACAAEAAABYAA4AAAACAAEAAABYAA8AAAACAAEAAABYABAAAAACAAEAAABYABEAAAACAAEAAABYABIAAAACAAEAAABYABMAAAACAAEAAABYABQAAAACAAEAAABYABUAAAACAAEAAABYABYAAAACAAEAAABYABcAAAACAAEAAABYABgAAAACAAEAAABYABkAAAACAAEAAABYABoAAAACAAEAAABYABsAAAACAAEAAABYABwAAAACAAEAAABYAB0AAAACAAEAAABYAB4AAAACAAEAAABYAB8AAAACAAEAAABYACAAAAACAAEAAABYACEAAAACAAEAAABYACIAAAACAAEAAABYACMAAAACAAEAAABYACQAAAACAAEAAABYACUAAAACAAEAAABZAPL/AAACAAEAAABZAPP/AAACAAEAAABZAPT/AAACAAEAAABZAPX/AAACAAEAAABZAPb/AAACAAEAAABZAPf/AAACAAEAAABZAPj/AAACAAEAAABZAPn/AAACAAEAAABZAPr/AAACAAEAAABZAPv/AAACAAEAAABZAPz/AAACAAEAAABZAP3/AAACAAEAAABZAP7/AAACAAEAAABZAP//AAACAAEAAABZAAAAAAACAAEAAABZAAEAAAACAAEAAABZAAIAAAACAAEAAABZAAMAAAACAAEAAABZAAQAAAACAAEAAABZAAUAAAACAAEAAABZAAYAAAACAAEAAABZAAcAAAACAAEAAABZAAgAAAACAAEAAABZAAkAAAACAAEAAABZAAoAAAACAAEAAABZAAsAAAACAAEAAABZAAwAAAACAAEAAABZAA0AAAACAAEAAABZAA4AAAACAAEAAABZAA8AAAACAAEAAABZABAAAAACAAEAAABZABEAAAACAAEAAABZABIAAAACAAEAAABZABMAAAACAAEAAABZABQAAAACAAEAAABZABUAAAACAAEAAABZABYAAAACAAEAAABZABcAAAACAAEAAABZABgAAAACAAEAAABZABkAAAACAAEAAABZABoAAAACAAEAAABZABsAAAACAAEAAABZABwAAAACAAEAAABZAB0AAAACAAEAAABZAB4AAAACAAEAAABZAB8AAAACAAEAAABZACAAAAACAAEAAABZACEAAAACAAEAAABZACIAAAACAAEAAABZACMAAAACAAEAAABZACQAAAACAAEAAABZACUAAAACAAEAAABaAPL/AAACAAEAAABaAPP/AAACAAEAAABaAPT/AAACAAEAAABaAPX/AAACAAEAAABaAPb/AAACAAEAAABaAPf/AAACAAEAAABaAPj/AAACAAEAAABaAPn/AAACAAEAAABaAPr/AAACAAEAAABaAPv/AAACAAEAAABaAPz/AAACAAEAAABaAP3/AAACAAEAAABaAP7/AAACAAEAAABaAP//AAACAAEAAABaAAAAAAACAAEAAABaAAEAAAACAAEAAABaAAIAAAACAAEAAABaAAMAAAACAAEAAABaAAQAAAACAAEAAABaAAUAAAACAAEAAABaAAYAAAACAAEAAABaAAcAAAACAAEAAABaAAgAAAACAAEAAABaAAkAAAACAAEAAABaAAoAAAACAAEAAABaAAsAAAACAAEAAABaAAwAAAACAAEAAABaAA0AAAACAAEAAABaAA4AAAACAAEAAABaAA8AAAACAAEAAABaABAAAAACAAEAAABaABEAAAACAAEAAABaABIAAAACAAEAAABaABMAAAACAAEAAABaABQAAAACAAEAAABaABUAAAACAAEAAABaABYAAAACAAEAAABaABcAAAACAAEAAABaABgAAAACAAEAAABaABkAAAACAAEAAABaABoAAAACAAEAAABaABsAAAACAAEAAABaABwAAAACAAEAAABaAB0AAAACAAEAAABaAB4AAAACAAEAAABaAB8AAAACAAEAAABaACAAAAACAAEAAABaACEAAAACAAEAAABaACIAAAACAAEAAABaACMAAAACAAEAAABaACQAAAACAAEAAABaACUAAAACAAEAAABbAPL/AAACAAEAAABbAPP/AAACAAEAAABbAPT/AAACAAEAAABbAPX/AAACAAEAAABbAPb/AAACAAEAAABbAPf/AAACAAEAAABbAPj/AAACAAEAAABbAPn/AAACAAEAAABbAPr/AAACAAEAAABbAPv/AAACAAEAAABbAPz/AAACAAEAAABbAP3/AAACAAEAAABbAP7/AAACAAEAAABbAP//AAACAAEAAABbAAAAAAACAAEAAABbAAEAAAACAAEAAABbAAIAAAACAAEAAABbAAMAAAACAAEAAABbAAQAAAACAAEAAABbAAUAAAACAAEAAABbAAYAAAACAAEAAABbAAcAAAACAAEAAABbAAgAAAACAAEAAABbAAkAAAACAAEAAABbAAoAAAACAAEAAABbAAsAAAACAAEAAABbAAwAAAACAAEAAABbAA0AAAACAAEAAABbAA4AAAACAAEAAABbAA8AAAACAAEAAABbABAAAAACAAEAAABbABEAAAACAAEAAABbABIAAAACAAEAAABbABMAAAACAAEAAABbABQAAAACAAEAAABbABUAAAACAAEAAABbABYAAAACAAEAAABbABcAAAACAAEAAABbABgAAAACAAEAAABbABkAAAACAAEAAABbABoAAAACAAEAAABbABsAAAACAAEAAABbABwAAAACAAEAAABbAB0AAAACAAEAAABbAB4AAAACAAEAAABbAB8AAAACAAEAAABbACAAAAACAAEAAABbACEAAAACAAEAAABbACIAAAACAAEAAABbACMAAAACAAEAAABbACQAAAACAAEAAABbACUAAAACAAEAAABcAPL/AAACAAEAAABcAPP/AAACAAEAAABcAPT/AAACAAEAAABcAPX/AAACAAEAAABcAPb/AAACAAEAAABcAPf/AAACAAEAAABcAPj/AAACAAEAAABcAPn/AAACAAEAAABcAPr/AAACAAEAAABcAPv/AAACAAEAAABcAPz/AAACAAEAAABcAP3/AAACAAEAAABcAP7/AAACAAEAAABcAP//AAACAAEAAABcAAAAAAACAAEAAABcAAEAAAACAAEAAABcAAIAAAACAAEAAABcAAMAAAACAAEAAABcAAQAAAACAAEAAABcAAUAAAACAAEAAABcAAYAAAACAAEAAABcAAcAAAACAAEAAABcAAgAAAACAAEAAABcAAkAAAACAAEAAABcAAoAAAACAAEAAABcAAsAAAACAAEAAABcAAwAAAACAAEAAABcAA0AAAACAAEAAABcAA4AAAACAAEAAABcAA8AAAACAAEAAABcABAAAAACAAEAAABcABEAAAACAAEAAABcABIAAAACAAEAAABcABMAAAACAAEAAABcABQAAAACAAEAAABcABUAAAACAAEAAABcABYAAAACAAEAAABcABcAAAACAAEAAABcABgAAAACAAEAAABcABkAAAACAAEAAABcABoAAAACAAEAAABcABsAAAACAAEAAABcABwAAAACAAEAAABcAB0AAAACAAEAAABcAB4AAAACAAEAAABcAB8AAAACAAEAAABcACAAAAACAAEAAABcACEAAAACAAEAAABcACIAAAACAAEAAABcACMAAAACAAEAAABcACQAAAACAAEAAABcACUAAAACAAEAAABdAPL/AAACAAEAAABdAPP/AAACAAEAAABdAPT/AAACAAEAAABdAPX/AAACAAEAAABdAPb/AAACAAEAAABdAPf/AAACAAEAAABdAPj/AAACAAEAAABdAPn/AAACAAEAAABdAPr/AAACAAEAAABdAPv/AAACAAEAAABdAPz/AAACAAEAAABdAP3/AAACAAEAAABdAP7/AAACAAEAAABdAP//AAACAAEAAABdAAAAAAACAAEAAABdAAEAAAACAAEAAABdAAIAAAACAAEAAABdAAMAAAACAAEAAABdAAQAAAACAAEAAABdAAUAAAACAAEAAABdAAYAAAACAAEAAABdAAcAAAACAAEAAABdAAgAAAACAAEAAABdAAkAAAACAAEAAABdAAoAAAACAAEAAABdAAsAAAACAAEAAABdAAwAAAACAAEAAABdAA0AAAACAAEAAABdAA4AAAACAAEAAABdAA8AAAACAAEAAABdABAAAAACAAEAAABdABEAAAACAAEAAABdABIAAAACAAEAAABdABMAAAACAAEAAABdABQAAAACAAEAAABdABUAAAACAAEAAABdABYAAAACAAEAAABdABcAAAACAAEAAABdABgAAAACAAEAAABdABkAAAACAAEAAABdABoAAAACAAEAAABdABsAAAACAAEAAABdABwAAAACAAEAAABdAB0AAAACAAEAAABdAB4AAAACAAEAAABdAB8AAAACAAEAAABdACAAAAACAAEAAABdACEAAAACAAEAAABdACIAAAACAAEAAABdACMAAAACAAEAAABdACQAAAACAAEAAABdACUAAAACAAEAAABeAPL/AAACAAEAAABeAPP/AAACAAEAAABeAPT/AAACAAEAAABeAPX/AAACAAEAAABeAPb/AAACAAEAAABeAPf/AAACAAEAAABeAPj/AAACAAEAAABeAPn/AAACAAEAAABeAPr/AAACAAEAAABeAPv/AAACAAEAAABeAPz/AAACAAEAAABeAP3/AAACAAEAAABeAP7/AAACAAEAAABeAP//AAACAAEAAABeAAAAAAACAAEAAABeAAEAAAACAAEAAABeAAIAAAACAAEAAABeAAMAAAACAAEAAABeAAQAAAACAAEAAABeAAUAAAACAAEAAABeAAYAAAACAAEAAABeAAcAAAACAAEAAABeAAgAAAACAAEAAABeAAkAAAACAAEAAABeAAoAAAACAAEAAABeAAsAAAACAAEAAABeAAwAAAACAAEAAABeAA0AAAACAAEAAABeAA4AAAACAAEAAABeAA8AAAACAAEAAABeABAAAAACAAEAAABeABEAAAACAAEAAABeABIAAAACAAEAAABeABMAAAACAAEAAABeABQAAAACAAEAAABeABUAAAACAAEAAABeABYAAAACAAEAAABeABcAAAACAAEAAABeABgAAAACAAEAAABeABkAAAACAAEAAABeABoAAAACAAEAAABeABsAAAACAAEAAABeABwAAAACAAEAAABeAB0AAAACAAEAAABeAB4AAAACAAEAAABeAB8AAAACAAEAAABeACAAAAACAAEAAABeACEAAAACAAEAAABeACIAAAACAAEAAABeACMAAAACAAEAAABeACQAAAACAAEAAABeACUAAAACAAEAAABfAPL/AAACAAEAAABfAPP/AAACAAEAAABfAPT/AAACAAEAAABfAPX/AAACAAEAAABfAPb/AAACAAEAAABfAPf/AAACAAEAAABfAPj/AAACAAEAAABfAPn/AAACAAEAAABfAPr/AAACAAEAAABfAPv/AAACAAEAAABfAPz/AAACAAEAAABfAP3/AAACAAEAAABfAP7/AAACAAEAAABfAP//AAACAAEAAABfAAAAAAACAAEAAABfAAEAAAACAAEAAABfAAIAAAACAAEAAABfAAMAAAACAAEAAABfAAQAAAACAAEAAABfAAUAAAACAAEAAABfAAYAAAACAAEAAABfAAcAAAACAAEAAABfAAgAAAACAAEAAABfAAkAAAACAAEAAABfAAoAAAACAAEAAABfAAsAAAACAAEAAABfAAwAAAACAAEAAABfAA0AAAACAAEAAABfAA4AAAACAAEAAABfAA8AAAACAAEAAABfABAAAAACAAEAAABfABEAAAACAAEAAABfABIAAAACAAEAAABfABMAAAACAAEAAABfABQAAAACAAEAAABfABUAAAACAAEAAABfABYAAAACAAEAAABfABcAAAACAAEAAABfABgAAAACAAEAAABfABkAAAACAAEAAABfABoAAAACAAEAAABfABsAAAACAAEAAABfABwAAAACAAEAAABfAB0AAAACAAEAAABfAB4AAAACAAEAAABfAB8AAAACAAEAAABfACAAAAACAAEAAABfACEAAAACAAEAAABfACIAAAACAAEAAABfACMAAAACAAEAAABfACQAAAACAAEAAABfACUAAAACAAEAAABgAPL/AAACAAEAAABgAPP/AAACAAEAAABgAPT/AAACAAEAAABgAPX/AAACAAEAAABgAPb/AAACAAEAAABgAPf/AAACAAEAAABgAPj/AAACAAEAAABgAPn/AAACAAEAAABgAPr/AAACAAEAAABgAPv/AAACAAEAAABgAPz/AAACAAEAAABgAP3/AAACAAEAAABgAP7/AAACAAEAAABgAP//AAACAAEAAABgAAAAAAACAAEAAABgAAEAAAACAAEAAABgAAIAAAACAAEAAABgAAMAAAACAAEAAABgAAQAAAACAAEAAABgAAUAAAACAAEAAABgAAYAAAACAAEAAABgAAcAAAACAAEAAABgAAgAAAACAAEAAABgAAkAAAACAAEAAABgAAoAAAACAAEAAABgAAsAAAACAAEAAABgAAwAAAACAAEAAABgAA0AAAACAAEAAABgAA4AAAACAAEAAABgAA8AAAACAAEAAABgABAAAAACAAEAAABgABEAAAACAAEAAABgABIAAAACAAEAAABgABMAAAACAAEAAABgABQAAAACAAEAAABgABUAAAACAAEAAABgABYAAAACAAEAAABgABcAAAACAAEAAABgABgAAAACAAEAAABgABkAAAACAAEAAABgABoAAAACAAEAAABgABsAAAACAAEAAABgABwAAAACAAEAAABgAB0AAAACAAEAAABgAB4AAAACAAEAAABgAB8AAAACAAEAAABgACAAAAACAAEAAABgACEAAAACAAEAAABgACIAAAACAAEAAABgACMAAAACAAEAAABgACQAAAACAAEAAABgACUAAAACAAEAAABhAPL/AAACAAEAAABhAPP/AAACAAEAAABhAPT/AAACAAEAAABhAPX/AAACAAEAAABhAPb/AAACAAEAAABhAPf/AAACAAEAAABhAPj/AAACAAEAAABhAPn/AAACAAEAAABhAPr/AAACAAEAAABhAPv/AAACAAEAAABhAPz/AAACAAEAAABhAP3/AAACAAEAAABhAP7/AAACAAEAAABhAP//AAACAAEAAABhAAAAAAACAAEAAABhAAEAAAACAAEAAABhAAIAAAACAAEAAABhAAMAAAACAAEAAABhAAQAAAACAAEAAABhAAUAAAACAAEAAABhAAYAAAACAAEAAABhAAcAAAACAAEAAABhAAgAAAACAAEAAABhAAkAAAACAAEAAABhAAoAAAACAAEAAABhAAsAAAACAAEAAABhAAwAAAACAAEAAABhAA0AAAACAAEAAABhAA4AAAACAAEAAABhAA8AAAACAAEAAABhABAAAAACAAEAAABhABEAAAACAAEAAABhABIAAAACAAEAAABhABMAAAACAAEAAABhABQAAAACAAEAAABhABUAAAACAAEAAABhABYAAAACAAEAAABhABcAAAACAAEAAABhABgAAAACAAEAAABhABkAAAACAAEAAABhABoAAAACAAEAAABhABsAAAACAAEAAABhABwAAAACAAEAAABhAB0AAAACAAEAAABhAB4AAAACAAEAAABhAB8AAAACAAEAAABhACAAAAACAAEAAABhACEAAAACAAEAAABhACIAAAACAAEAAABhACMAAAACAAEAAABhACQAAAACAAEAAABhACUAAAACAAEAAABiAPL/AAACAAEAAABiAPP/AAACAAEAAABiAPT/AAACAAEAAABiAPX/AAACAAEAAABiAPb/AAACAAEAAABiAPf/AAACAAEAAABiAPj/AAACAAEAAABiAPn/AAACAAEAAABiAPr/AAACAAEAAABiAPv/AAACAAEAAABiAPz/AAACAAEAAABiAP3/AAACAAEAAABiAP7/AAACAAEAAABiAP//AAACAAEAAABiAAAAAAACAAEAAABiAAEAAAACAAEAAABiAAIAAAACAAEAAABiAAMAAAACAAEAAABiAAQAAAACAAEAAABiAAUAAAACAAEAAABiAAYAAAACAAEAAABiAAcAAAACAAEAAABiAAgAAAACAAEAAABiAAkAAAACAAEAAABiAAoAAAACAAEAAABiAAsAAAACAAEAAABiAAwAAAACAAEAAABiAA0AAAACAAEAAABiAA4AAAACAAEAAABiAA8AAAACAAEAAABiABAAAAACAAEAAABiABEAAAACAAEAAABiABIAAAACAAEAAABiABMAAAACAAEAAABiABQAAAACAAEAAABiABUAAAACAAEAAABiABYAAAACAAEAAABiABcAAAACAAEAAABiABgAAAACAAEAAABiABkAAAACAAEAAABiABoAAAACAAEAAABiABsAAAACAAEAAABiABwAAAACAAEAAABiAB0AAAACAAEAAABiAB4AAAACAAEAAABiAB8AAAACAAEAAABiACAAAAACAAEAAABiACEAAAACAAEAAABiACIAAAACAAEAAABiACMAAAACAAEAAABiACQAAAACAAEAAABiACUAAAACAAEAAABjAPL/AAACAAEAAABjAPP/AAACAAEAAABjAPT/AAACAAEAAABjAPX/AAACAAEAAABjAPb/AAACAAEAAABjAPf/AAACAAEAAABjAPj/AAACAAEAAABjAPn/AAACAAEAAABjAPr/AAACAAEAAABjAPv/AAACAAEAAABjAPz/AAACAAEAAABjAP3/AAACAAEAAABjAP7/AAACAAEAAABjAP//AAACAAEAAABjAAAAAAACAAEAAABjAAEAAAACAAEAAABjAAIAAAACAAEAAABjAAMAAAACAAEAAABjAAQAAAACAAEAAABjAAUAAAACAAEAAABjAAYAAAACAAEAAABjAAcAAAACAAEAAABjAAgAAAACAAEAAABjAAkAAAACAAEAAABjAAoAAAACAAEAAABjAAsAAAACAAEAAABjAAwAAAACAAEAAABjAA0AAAACAAEAAABjAA4AAAACAAEAAABjAA8AAAACAAEAAABjABAAAAACAAEAAABjABEAAAACAAEAAABjABIAAAACAAEAAABjABMAAAACAAEAAABjABQAAAACAAEAAABjABUAAAACAAEAAABjABYAAAACAAEAAABjABcAAAACAAEAAABjABgAAAACAAEAAABjABkAAAACAAEAAABjABoAAAACAAEAAABjABsAAAACAAEAAABjABwAAAACAAEAAABjAB0AAAACAAEAAABjAB4AAAACAAEAAABjAB8AAAACAAEAAABjACAAAAACAAEAAABjACEAAAACAAEAAABjACIAAAACAAEAAABjACMAAAACAAEAAABjACQAAAACAAEAAABjACUAAAACAAEAAABkAPL/AAACAAEAAABkAPP/AAACAAEAAABkAPT/AAACAAEAAABkAPX/AAACAAEAAABkAPb/AAACAAEAAABkAPf/AAACAAEAAABkAPj/AAACAAEAAABkAPn/AAACAAEAAABkAPr/AAACAAEAAABkAPv/AAACAAEAAABkAPz/AAACAAEAAABkAP3/AAACAAEAAABkAP7/AAACAAEAAABkAP//AAACAAEAAABkAAAAAAACAAEAAABkAAEAAAACAAEAAABkAAIAAAACAAEAAABkAAMAAAACAAEAAABkAAQAAAACAAEAAABkAAUAAAACAAEAAABkAAYAAAACAAEAAABkAAcAAAACAAEAAABkAAgAAAACAAEAAABkAAkAAAACAAEAAABkAAoAAAACAAEAAABkAAsAAAACAAEAAABkAAwAAAACAAEAAABkAA0AAAACAAEAAABkAA4AAAACAAEAAABkAA8AAAACAAEAAABkABAAAAACAAEAAABkABEAAAACAAEAAABkABIAAAACAAEAAABkABMAAAACAAEAAABkABQAAAACAAEAAABkABUAAAACAAEAAABkABYAAAACAAEAAABkABcAAAACAAEAAABkABgAAAACAAEAAABkABkAAAACAAEAAABkABoAAAACAAEAAABkABsAAAACAAEAAABkABwAAAACAAEAAABkAB0AAAACAAEAAABkAB4AAAACAAEAAABkAB8AAAACAAEAAABkACAAAAACAAEAAABkACEAAAACAAEAAABkACIAAAACAAEAAABkACMAAAACAAEAAABkACQAAAACAAEAAABkACUAAAACAAEAAABlAPL/AAACAAEAAABlAPP/AAACAAEAAABlAPT/AAACAAEAAABlAPX/AAACAAEAAABlAPb/AAACAAEAAABlAPf/AAACAAEAAABlAPj/AAACAAEAAABlAPn/AAACAAEAAABlAPr/AAACAAEAAABlAPv/AAACAAEAAABlAPz/AAACAAEAAABlAP3/AAACAAEAAABlAP7/AAACAAEAAABlAP//AAACAAEAAABlAAAAAAACAAEAAABlAAEAAAACAAEAAABlAAIAAAACAAEAAABlAAMAAAACAAEAAABlAAQAAAACAAEAAABlAAUAAAACAAEAAABlAAYAAAACAAEAAABlAAcAAAACAAEAAABlAAgAAAACAAEAAABlAAkAAAACAAEAAABlAAoAAAACAAEAAABlAAsAAAACAAEAAABlAAwAAAACAAEAAABlAA0AAAACAAEAAABlAA4AAAACAAEAAABlAA8AAAACAAEAAABlABAAAAACAAEAAABlABEAAAACAAEAAABlABIAAAACAAEAAABlABMAAAACAAEAAABlABQAAAACAAEAAABlABUAAAACAAEAAABlABYAAAACAAEAAABlABcAAAACAAEAAABlABgAAAACAAEAAABlABkAAAACAAEAAABlABoAAAACAAEAAABlABsAAAACAAEAAABlABwAAAACAAEAAABlAB0AAAACAAEAAABlAB4AAAACAAEAAABlAB8AAAACAAEAAABlACAAAAACAAEAAABlACEAAAACAAEAAABlACIAAAACAAEAAABlACMAAAACAAEAAABlACQAAAACAAEAAABlACUAAAACAAEAAABmAPL/AAACAAEAAABmAPP/AAACAAEAAABmAPT/AAACAAEAAABmAPX/AAACAAEAAABmAPb/AAACAAEAAABmAPf/AAACAAEAAABmAPj/AAACAAEAAABmAPn/AAACAAEAAABmAPr/AAACAAEAAABmAPv/AAACAAEAAABmAPz/AAACAAEAAABmAP3/AAACAAEAAABmAP7/AAACAAEAAABmAP//AAACAAEAAABmAAAAAAACAAEAAABmAAEAAAACAAEAAABmAAIAAAACAAEAAABmAAMAAAACAAEAAABmAAQAAAACAAEAAABmAAUAAAACAAEAAABmAAYAAAACAAEAAABmAAcAAAACAAEAAABmAAgAAAACAAEAAABmAAkAAAACAAEAAABmAAoAAAACAAEAAABmAAsAAAACAAEAAABmAAwAAAACAAEAAABmAA0AAAACAAEAAABmAA4AAAACAAEAAABmAA8AAAACAAEAAABmABAAAAACAAEAAABmABEAAAACAAEAAABmABIAAAACAAEAAABmABMAAAACAAEAAABmABQAAAACAAEAAABmABUAAAACAAEAAABmABYAAAACAAEAAABmABcAAAACAAEAAABmABgAAAACAAEAAABmABkAAAACAAEAAABmABoAAAACAAEAAABmABsAAAACAAEAAABmABwAAAACAAEAAABmAB0AAAACAAEAAABmAB4AAAACAAEAAABmAB8AAAACAAEAAABmACAAAAACAAEAAABmACEAAAACAAEAAABmACIAAAACAAEAAABmACMAAAACAAEAAABmACQAAAACAAEAAABmACUAAAACAAEAAADl//L/AAACAAEAAADl//P/AAACAAEAAADm//L/AAACAAEAAADm//P/AAACAAEAAADn//L/AAACAAEAAADn//P/AAACAAEAAADo//L/AAACAAEAAADo//P/AAACAAEAAADp//L/AAACAAEAAADp//P/AAACAAEAAADq//L/AAACAAEAAADq//P/AAACAAEAAADr//L/AAACAAEAAADr//P/AAACAAEAAADs//L/AAACAAEAAADs//P/AAACAAEAAADt//L/AAACAAEAAADt//P/AAACAAEAAADu//L/AAACAAEAAADu//P/AAACAAEAAADv//L/AAACAAEAAADv//P/AAACAAEAAADw//L/AAACAAEAAADw//P/AAACAAEAAADx//L/AAACAAEAAADx//P/AAACAAEAAADy//L/AAACAAEAAADy//P/AAACAAEAAADz//L/AAACAAEAAADz//P/AAACAAEAAAD0//L/AAACAAEAAAD0//P/AAACAAEAAAD1//L/AAACAAEAAAD1//P/AAACAAEAAAD2//L/AAACAAEAAAD2//P/AAACAAEAAAD3//L/AAACAAEAAAD3//P/AAACAAEAAAD4//L/AAACAAEAAAD4//P/AAACAAEAAAD5//L/AAACAAEAAAD5//P/AAACAAEAAAD6//L/AAACAAEAAAD6//P/AAACAAEAAAD7//L/AAACAAEAAAD7//P/AAACAAEAAAD8//L/AAACAAEAAAD8//P/AAACAAEAAAD9//L/AAACAAEAAAD9//P/AAACAAEAAAD+//L/AAACAAEAAAD+//P/AAACAAEAAAD///L/AAACAAEAAAD///P/AAACAAEAAAAAAPL/AAACAAEAAAAAAPP/AAACAAEAAAABAPL/AAACAAEAAAABAPP/AAACAAEAAAACAPL/AAACAAEAAAACAPP/AAACAAEAAAADAPL/AAACAAEAAAADAPP/AAACAAEAAAAEAPL/AAACAAEAAAAEAPP/AAACAAEAAAAFAPL/AAACAAEAAAAFAPP/AAACAAEAAAAGAPL/AAACAAEAAAAGAPP/AAACAAEAAAAHAPL/AAACAAEAAAAHAPP/AAACAAEAAAAIAPL/AAACAAEAAAAIAPP/AAACAAEAAAAIAPT/AAACAAEAAAAIAPX/AAACAAEAAAAIAPb/AAACAAEAAAAIAPf/AAACAAEAAAAIAPj/AAACAAEAAAAIAPn/AAACAAEAAAAIAPr/AAACAAEAAAAIAPv/AAACAAEAAAAIAPz/AAACAAEAAAAIAP3/AAACAAEAAAAIAP7/AAACAAEAAAAIAP//AAACAAEAAAAJAPL/AAACAAEAAAAJAPP/AAACAAEAAAAJAPT/AAACAAEAAAAJAPX/AAACAAEAAAAJAPb/AAACAAEAAAAJAPf/AAACAAEAAAAJAPj/AAACAAEAAAAJAPn/AAACAAEAAAAJAPr/AAACAAEAAAAJAPv/AAACAAEAAAAJAPz/AAACAAEAAAAJAP3/AAACAAEAAAAJAP7/AAACAAEAAAAJAP//AAACAAEAAAAKAPL/AAACAAEAAAAKAPP/AAACAAEAAAAKAPT/AAACAAEAAAAKAPX/AAACAAEAAAAKAPb/AAACAAEAAAAKAPf/AAACAAEAAAAKAPj/AAACAAEAAAAKAPn/AAACAAEAAAAKAPr/AAACAAEAAAAKAPv/AAACAAEAAAAKAPz/AAACAAEAAAAKAP3/AAACAAEAAAAKAP7/AAACAAEAAAAKAP//AAACAAEAAAALAPL/AAACAAEAAAALAPP/AAACAAEAAAALAPT/AAACAAEAAAALAPX/AAACAAEAAAALAPb/AAACAAEAAAALAPf/AAACAAEAAAALAPj/AAACAAEAAAALAPn/AAACAAEAAAALAPr/AAACAAEAAAALAPv/AAACAAEAAAALAPz/AAACAAEAAAALAP3/AAACAAEAAAALAP7/AAACAAEAAAALAP//AAACAAEAAAAMAPL/AAACAAEAAAAMAPP/AAACAAEAAAAMAPT/AAACAAEAAAAMAPX/AAACAAEAAAAMAPb/AAACAAEAAAAMAPf/AAACAAEAAAAMAPj/AAACAAEAAAAMAPn/AAACAAEAAAAMAPr/AAACAAEAAAAMAPv/AAACAAEAAAAMAPz/AAACAAEAAAAMAP3/AAACAAEAAAAMAP7/AAACAAEAAAAMAP//AAACAAEAAAANAPL/AAACAAEAAAANAPP/AAACAAEAAAANAPT/AAACAAEAAAANAPX/AAACAAEAAAANAPb/AAACAAEAAAANAPf/AAACAAEAAAANAPj/AAACAAEAAAANAPn/AAACAAEAAAANAPr/AAACAAEAAAANAPv/AAACAAEAAAANAPz/AAACAAEAAAANAP3/AAACAAEAAAANAP7/AAACAAEAAAANAP//AAACAAEAAAAOAPL/AAACAAEAAAAOAPP/AAACAAEAAAAOAPT/AAACAAEAAAAOAPX/AAACAAEAAAAOAPb/AAACAAEAAAAOAPf/AAACAAEAAAAOAPj/AAACAAEAAAAOAPn/AAACAAEAAAAOAPr/AAACAAEAAAAOAPv/AAACAAEAAAAOAPz/AAACAAEAAAAOAP3/AAACAAEAAAAOAP7/AAACAAEAAAAOAP//AAACAAEAAAAPAPL/AAACAAEAAAAPAPP/AAACAAEAAAAPAPT/AAACAAEAAAAPAPX/AAACAAEAAAAPAPb/AAACAAEAAAAPAPf/AAACAAEAAAAPAPj/AAACAAEAAAAPAPn/AAACAAEAAAAPAPr/AAACAAEAAAAPAPv/AAACAAEAAAAPAPz/AAACAAEAAAAPAP3/AAACAAEAAAAPAP7/AAACAAEAAAAPAP//AAACAAEAAAAQAPL/AAACAAEAAAAQAPP/AAACAAEAAAAQAPT/AAACAAEAAAAQAPX/AAACAAEAAAAQAPb/AAACAAEAAAAQAPf/AAACAAEAAAAQAPj/AAACAAEAAAAQAPn/AAACAAEAAAAQAPr/AAACAAEAAAAQAPv/AAACAAEAAAAQAPz/AAACAAEAAAAQAP3/AAACAAEAAAAQAP7/AAACAAEAAAAQAP//AAACAAEAAAARAPL/AAACAAEAAAARAPP/AAACAAEAAAARAPT/AAACAAEAAAARAPX/AAACAAEAAAARAPb/AAACAAEAAAARAPf/AAACAAEAAAARAPj/AAACAAEAAAARAPn/AAACAAEAAAARAPr/AAACAAEAAAARAPv/AAACAAEAAAARAPz/AAACAAEAAAARAP3/AAACAAEAAAARAP7/AAACAAEAAAARAP//AAACAAEAAAASAPL/AAACAAEAAAASAPP/AAACAAEAAAASAPT/AAACAAEAAAASAPX/AAACAAEAAAASAPb/AAACAAEAAAASAPf/AAACAAEAAAASAPj/AAACAAEAAAASAPn/AAACAAEAAAASAPr/AAACAAEAAAASAPv/AAACAAEAAAASAPz/AAACAAEAAAASAP3/AAACAAEAAAASAP7/AAACAAEAAAASAP//AAACAAEAAAATAPL/AAACAAEAAAATAPP/AAACAAEAAAATAPT/AAACAAEAAAATAPX/AAACAAEAAAATAPb/AAACAAEAAAATAPf/AAACAAEAAAATAPj/AAACAAEAAAATAPn/AAACAAEAAAATAPr/AAACAAEAAAATAPv/AAACAAEAAAATAPz/AAACAAEAAAATAP3/AAACAAEAAAATAP7/AAACAAEAAAATAP//AAACAAEAAAAUAPL/AAACAAEAAAAUAPP/AAACAAEAAAAUAPT/AAACAAEAAAAUAPX/AAACAAEAAAAUAPb/AAACAAEAAAAUAPf/AAACAAEAAAAUAPj/AAACAAEAAAAUAPn/AAACAAEAAAAUAPr/AAACAAEAAAAUAPv/AAACAAEAAAAUAPz/AAACAAEAAAAUAP3/AAACAAEAAAAUAP7/AAACAAEAAAAUAP//AAACAAEAAAAVAPL/AAACAAEAAAAVAPP/AAACAAEAAAAVAPT/AAACAAEAAAAVAPX/AAACAAEAAAAVAPb/AAACAAEAAAAVAPf/AAACAAEAAAAVAPj/AAACAAEAAAAVAPn/AAACAAEAAAAVAPr/AAACAAEAAAAVAPv/AAACAAEAAAAVAPz/AAACAAEAAAAVAP3/AAACAAEAAAAVAP7/AAACAAEAAAAVAP//AAACAAEAAAAWAPL/AAACAAEAAAAWAPP/AAACAAEAAAAWAPT/AAACAAEAAAAWAPX/AAACAAEAAAAWAPb/AAACAAEAAAAWAPf/AAACAAEAAAAWAPj/AAACAAEAAAAWAPn/AAACAAEAAAAWAPr/AAACAAEAAAAWAPv/AAACAAEAAAAWAPz/AAACAAEAAAAWAP3/AAACAAEAAAAWAP7/AAACAAEAAAAWAP//AAACAAEAAAAXAPL/AAACAAEAAAAXAPP/AAACAAEAAAAXAPT/AAACAAEAAAAXAPX/AAACAAEAAAAXAPb/AAACAAEAAAAXAPf/AAACAAEAAAAXAPj/AAACAAEAAAAXAPn/AAACAAEAAAAXAPr/AAACAAEAAAAXAPv/AAACAAEAAAAXAPz/AAACAAEAAAAXAP3/AAACAAEAAAAXAP7/AAACAAEAAAAXAP//AAACAAEAAAAYAPL/AAACAAEAAAAYAPP/AAACAAEAAAAYAPT/AAACAAEAAAAYAPX/AAACAAEAAAAYAPb/AAACAAEAAAAYAPf/AAACAAEAAAAYAPj/AAACAAEAAAAYAPn/AAACAAEAAAAYAPr/AAACAAEAAAAYAPv/AAACAAEAAAAYAPz/AAACAAEAAAAYAP3/AAACAAEAAAAYAP7/AAACAAEAAAAYAP//AAACAAEAAAAZAPL/AAACAAEAAAAZAPP/AAACAAEAAAAZAPT/AAACAAEAAAAZAPX/AAACAAEAAAAZAPb/AAACAAEAAAAZAPf/AAACAAEAAAAZAPj/AAACAAEAAAAZAPn/AAACAAEAAAAZAPr/AAACAAEAAAAZAPv/AAACAAEAAAAZAPz/AAACAAEAAAAZAP3/AAACAAEAAAAZAP7/AAACAAEAAAAZAP//AAACAAEAAAAaAPL/AAACAAEAAAAaAPP/AAACAAEAAAAaAPT/AAACAAEAAAAaAPX/AAACAAEAAAAaAPb/AAACAAEAAAAaAPf/AAACAAEAAAAaAPj/AAACAAEAAAAaAPn/AAACAAEAAAAaAPr/AAACAAEAAAAaAPv/AAACAAEAAAAaAPz/AAACAAEAAAAaAP3/AAACAAEAAAAaAP7/AAACAAEAAAAaAP//AAACAAEAAAAbAPL/AAACAAEAAAAbAPP/AAACAAEAAAAbAPT/AAACAAEAAAAbAPX/AAACAAEAAAAbAPb/AAACAAEAAAAbAPf/AAACAAEAAAAbAPj/AAACAAEAAAAbAPn/AAACAAEAAAAbAPr/AAACAAEAAAAbAPv/AAACAAEAAAAbAPz/AAACAAEAAAAbAP3/AAACAAEAAAAbAP7/AAACAAEAAAAbAP//AAACAAEAAAAcAPL/AAACAAEAAAAcAPP/AAACAAEAAAAcAPT/AAACAAEAAAAcAPX/AAACAAEAAAAcAPb/AAACAAEAAAAcAPf/AAACAAEAAAAcAPj/AAACAAEAAAAcAPn/AAACAAEAAAAcAPr/AAACAAEAAAAcAPv/AAACAAEAAAAcAPz/AAACAAEAAAAcAP3/AAACAAEAAAAcAP7/AAACAAEAAAAcAP//AAACAAEAAAAdAPL/AAACAAEAAAAdAPP/AAACAAEAAAAdAPT/AAACAAEAAAAdAPX/AAACAAEAAAAdAPb/AAACAAEAAAAdAPf/AAACAAEAAAAdAPj/AAACAAEAAAAdAPn/AAACAAEAAAAdAPr/AAACAAEAAAAdAPv/AAACAAEAAAAdAPz/AAACAAEAAAAdAP3/AAACAAEAAAAdAP7/AAACAAEAAAAdAP//AAACAAEAAAAeAPL/AAACAAEAAAAeAPP/AAACAAEAAAAeAPT/AAACAAEAAAAeAPX/AAACAAEAAAAeAPb/AAACAAEAAAAeAPf/AAACAAEAAAAeAPj/AAACAAEAAAAeAPn/AAACAAEAAAAeAPr/AAACAAEAAAAeAPv/AAACAAEAAAAeAPz/AAACAAEAAAAeAP3/AAACAAEAAAAeAP7/AAACAAEAAAAeAP//AAACAAEAAAAfAPL/AAACAAEAAAAfAPP/AAACAAEAAAAfAPT/AAACAAEAAAAfAPX/AAACAAEAAAAfAPb/AAACAAEAAAAfAPf/AAACAAEAAAAfAPj/AAACAAEAAAAfAPn/AAACAAEAAAAfAPr/AAACAAEAAAAfAPv/AAACAAEAAAAfAPz/AAACAAEAAAAfAP3/AAACAAEAAAAfAP7/AAACAAEAAAAfAP//AAACAAEAAAAgAPL/AAACAAEAAAAgAPP/AAACAAEAAAAgAPT/AAACAAEAAAAgAPX/AAACAAEAAAAgAPb/AAACAAEAAAAgAPf/AAACAAEAAAAgAPj/AAACAAEAAAAgAPn/AAACAAEAAAAgAPr/AAACAAEAAAAgAPv/AAACAAEAAAAgAPz/AAACAAEAAAAgAP3/AAACAAEAAAAgAP7/AAACAAEAAAAgAP//AAACAAEAAAAhAPL/AAACAAEAAAAhAPP/AAACAAEAAAAhAPT/AAACAAEAAAAhAPX/AAACAAEAAAAhAPb/AAACAAEAAAAhAPf/AAACAAEAAAAhAPj/AAACAAEAAAAhAPn/AAACAAEAAAAhAPr/AAACAAEAAAAhAPv/AAACAAEAAAAhAPz/AAACAAEAAAAhAP3/AAACAAEAAAAhAP7/AAACAAEAAAAhAP//AAACAAEAAAAiAPL/AAACAAEAAAAiAPP/AAACAAEAAAAiAPT/AAACAAEAAAAiAPX/AAACAAEAAAAiAPb/AAACAAEAAAAiAPf/AAACAAEAAAAiAPj/AAACAAEAAAAiAPn/AAACAAEAAAAiAPr/AAACAAEAAAAiAPv/AAACAAEAAAAiAPz/AAACAAEAAAAiAP3/AAACAAEAAAAiAP7/AAACAAEAAAAiAP//AAACAAEAAAAjAPL/AAACAAEAAAAjAPP/AAACAAEAAAAjAPT/AAACAAEAAAAjAPX/AAACAAEAAAAjAPb/AAACAAEAAAAjAPf/AAACAAEAAAAjAPj/AAACAAEAAAAjAPn/AAACAAEAAAAjAPr/AAACAAEAAAAjAPv/AAACAAEAAAAjAPz/AAACAAEAAAAjAP3/AAACAAEAAAAjAP7/AAACAAEAAAAjAP//AAACAAEAAAAkAPL/AAACAAEAAAAkAPP/AAACAAEAAAAkAPT/AAACAAEAAAAkAPX/AAACAAEAAAAkAPb/AAACAAEAAAAkAPf/AAACAAEAAAAkAPj/AAACAAEAAAAkAPn/AAACAAEAAAAkAPr/AAACAAEAAAAkAPv/AAACAAEAAAAkAPz/AAACAAEAAAAkAP3/AAACAAEAAAAkAP7/AAACAAEAAAAkAP//AAACAAEAAAAlAPL/AAACAAEAAAAlAPP/AAACAAEAAAAlAPT/AAACAAEAAAAlAPX/AAACAAEAAAAlAPb/AAACAAEAAAAlAPf/AAACAAEAAAAlAPj/AAACAAEAAAAlAPn/AAACAAEAAAAlAPr/AAACAAEAAAAlAPv/AAACAAEAAAAlAPz/AAACAAEAAAAlAP3/AAACAAEAAAAlAP7/AAACAAEAAAAlAP//AAACAAEAAAAmAPL/AAACAAEAAAAmAPP/AAACAAEAAAAmAPT/AAACAAEAAAAmAPX/AAACAAEAAAAmAPb/AAACAAEAAAAmAPf/AAACAAEAAAAmAPj/AAACAAEAAAAmAPn/AAACAAEAAAAmAPr/AAACAAEAAAAmAPv/AAACAAEAAAAmAPz/AAACAAEAAAAmAP3/AAACAAEAAAAmAP7/AAACAAEAAAAmAP//AAACAAEAAAAnAPL/AAACAAEAAAAnAPP/AAACAAEAAAAnAPT/AAACAAEAAAAnAPX/AAACAAEAAAAnAPb/AAACAAEAAAAnAPf/AAACAAEAAAAnAPj/AAACAAEAAAAnAPn/AAACAAEAAAAnAPr/AAACAAEAAAAnAPv/AAACAAEAAAAnAPz/AAACAAEAAAAnAP3/AAACAAEAAAAnAP7/AAACAAEAAAAnAP//AAACAAEAAAAoAPL/AAACAAEAAAAoAPP/AAACAAEAAAAoAPT/AAACAAEAAAAoAPX/AAACAAEAAAAoAPb/AAACAAEAAAAoAPf/AAACAAEAAAAoAPj/AAACAAEAAAAoAPn/AAACAAEAAAAoAPr/AAACAAEAAAAoAPv/AAACAAEAAAAoAPz/AAACAAEAAAAoAP3/AAACAAEAAAAoAP7/AAACAAEAAAAoAP//AAACAAEAAAApAPL/AAACAAEAAAApAPP/AAACAAEAAAApAPT/AAACAAEAAAApAPX/AAACAAEAAAApAPb/AAACAAEAAAApAPf/AAACAAEAAAApAPj/AAACAAEAAAApAPn/AAACAAEAAAApAPr/AAACAAEAAAApAPv/AAACAAEAAAApAPz/AAACAAEAAAApAP3/AAACAAEAAAApAP7/AAACAAEAAAApAP//AAACAAEAAAAqAPL/AAACAAEAAAAqAPP/AAACAAEAAAAqAPT/AAACAAEAAAAqAPX/AAACAAEAAAAqAPb/AAACAAEAAAAqAPf/AAACAAEAAAAqAPj/AAACAAEAAAAqAPn/AAACAAEAAAAqAPr/AAACAAEAAAAqAPv/AAACAAEAAAAqAPz/AAACAAEAAAAqAP3/AAACAAEAAAAqAP7/AAACAAEAAAAqAP//AAACAAEAAAArAPL/AAACAAEAAAArAPP/AAACAAEAAAArAPT/AAACAAEAAAArAPX/AAACAAEAAAArAPb/AAACAAEAAAArAPf/AAACAAEAAAArAPj/AAACAAEAAAArAPn/AAACAAEAAAArAPr/AAACAAEAAAArAPv/AAACAAEAAAArAPz/AAACAAEAAAArAP3/AAACAAEAAAArAP7/AAACAAEAAAArAP//AAACAAEAAAAsAPL/AAACAAEAAAAsAPP/AAACAAEAAAAsAPT/AAACAAEAAAAsAPX/AAACAAEAAAAsAPb/AAACAAEAAAAsAPf/AAACAAEAAAAsAPj/AAACAAEAAAAsAPn/AAACAAEAAAAsAPr/AAACAAEAAAAsAPv/AAACAAEAAAAsAPz/AAACAAEAAAAsAP3/AAACAAEAAAAsAP7/AAACAAEAAAAsAP//AAACAAEAAAAtAPL/AAACAAEAAAAtAPP/AAACAAEAAAAtAPT/AAACAAEAAAAtAPX/AAACAAEAAAAtAPb/AAACAAEAAAAtAPf/AAACAAEAAAAtAPj/AAACAAEAAAAtAPn/AAACAAEAAAAtAPr/AAACAAEAAAAtAPv/AAACAAEAAAAtAPz/AAACAAEAAAAtAP3/AAACAAEAAAAtAP7/AAACAAEAAAAtAP//AAACAAEAAAAuAPL/AAACAAEAAAAuAPP/AAACAAEAAAAuAPT/AAACAAEAAAAuAPX/AAACAAEAAAAuAPb/AAACAAEAAAAuAPf/AAACAAEAAAAuAPj/AAACAAEAAAAuAPn/AAACAAEAAAAuAPr/AAACAAEAAAAuAPv/AAACAAEAAAAuAPz/AAACAAEAAAAuAP3/AAACAAEAAAAuAP7/AAACAAEAAAAuAP//AAACAAEAAAAvAPL/AAACAAEAAAAvAPP/AAACAAEAAAAvAPT/AAACAAEAAAAvAPX/AAACAAEAAAAvAPb/AAACAAEAAAAvAPf/AAACAAEAAAAvAPj/AAACAAEAAAAvAPn/AAACAAEAAAAvAPr/AAACAAEAAAAvAPv/AAACAAEAAAAvAPz/AAACAAEAAAAvAP3/AAACAAEAAAAvAP7/AAACAAEAAAAvAP//AAACAAEAAAAwAPL/AAACAAEAAAAwAPP/AAACAAEAAAAwAPT/AAACAAEAAAAwAPX/AAACAAEAAAAwAPb/AAACAAEAAAAwAPf/AAACAAEAAAAwAPj/AAACAAEAAAAwAPn/AAACAAEAAAAwAPr/AAACAAEAAAAwAPv/AAACAAEAAAAwAPz/AAACAAEAAAAwAP3/AAACAAEAAAAwAP7/AAACAAEAAAAwAP//AAACAAEAAAAxAPL/AAACAAEAAAAxAPP/AAACAAEAAAAxAPT/AAACAAEAAAAxAPX/AAACAAEAAAAxAPb/AAACAAEAAAAxAPf/AAACAAEAAAAxAPj/AAACAAEAAAAxAPn/AAACAAEAAAAxAPr/AAACAAEAAAAxAPv/AAACAAEAAAAxAPz/AAACAAEAAAAxAP3/AAACAAEAAAAxAP7/AAACAAEAAAAxAP//AAACAAEAAAAyAPL/AAACAAEAAAAyAPP/AAACAAEAAAAyAPT/AAACAAEAAAAyAPX/AAACAAEAAAAyAPb/AAACAAEAAAAyAPf/AAACAAEAAAAyAPj/AAACAAEAAAAyAPn/AAACAAEAAAAyAPr/AAACAAEAAAAyAPv/AAACAAEAAAAyAPz/AAACAAEAAAAyAP3/AAACAAEAAAAyAP7/AAACAAEAAAAyAP//AAACAAEAAAAzAPL/AAACAAEAAAAzAPP/AAACAAEAAAAzAPT/AAACAAEAAAAzAPX/AAACAAEAAAAzAPb/AAACAAEAAAAzAPf/AAACAAEAAAAzAPj/AAACAAEAAAAzAPn/AAACAAEAAAAzAPr/AAACAAEAAAAzAPv/AAACAAEAAAAzAPz/AAACAAEAAAAzAP3/AAACAAEAAAAzAP7/AAACAAEAAAAzAP//AAACAAEAAAA0APL/AAACAAEAAAA0APP/AAACAAEAAAA0APT/AAACAAEAAAA0APX/AAACAAEAAAA0APb/AAACAAEAAAA0APf/AAACAAEAAAA0APj/AAACAAEAAAA0APn/AAACAAEAAAA0APr/AAACAAEAAAA0APv/AAACAAEAAAA0APz/AAACAAEAAAA0AP3/AAACAAEAAAA0AP7/AAACAAEAAAA0AP//AAACAAEAAAA1APL/AAACAAEAAAA1APP/AAACAAEAAAA1APT/AAACAAEAAAA1APX/AAACAAEAAAA1APb/AAACAAEAAAA1APf/AAACAAEAAAA1APj/AAACAAEAAAA1APn/AAACAAEAAAA1APr/AAACAAEAAAA1APv/AAACAAEAAAA1APz/AAACAAEAAAA1AP3/AAACAAEAAAA1AP7/AAACAAEAAAA1AP//AAACAAEAAAA2APL/AAACAAEAAAA2APP/AAACAAEAAAA2APT/AAACAAEAAAA2APX/AAACAAEAAAA2APb/AAACAAEAAAA2APf/AAACAAEAAAA2APj/AAACAAEAAAA2APn/AAACAAEAAAA2APr/AAACAAEAAAA2APv/AAACAAEAAAA2APz/AAACAAEAAAA2AP3/AAACAAEAAAA2AP7/AAACAAEAAAA2AP//AAACAAEAAAA3APL/AAACAAEAAAA3APP/AAACAAEAAAA3APT/AAACAAEAAAA3APX/AAACAAEAAAA3APb/AAACAAEAAAA3APf/AAACAAEAAAA3APj/AAACAAEAAAA3APn/AAACAAEAAAA3APr/AAACAAEAAAA3APv/AAACAAEAAAA3APz/AAACAAEAAAA3AP3/AAACAAEAAAA3AP7/AAACAAEAAAA3AP//AAACAAEAAAA4APL/AAACAAEAAAA4APP/AAACAAEAAAA4APT/AAACAAEAAAA4APX/AAACAAEAAAA4APb/AAACAAEAAAA4APf/AAACAAEAAAA4APj/AAACAAEAAAA4APn/AAACAAEAAAA4APr/AAACAAEAAAA4APv/AAACAAEAAAA4APz/AAACAAEAAAA4AP3/AAACAAEAAAA4AP7/AAACAAEAAAA4AP//AAACAAEAAAA5APL/AAACAAEAAAA5APP/AAACAAEAAAA5APT/AAACAAEAAAA5APX/AAACAAEAAAA5APb/AAACAAEAAAA5APf/AAACAAEAAAA5APj/AAACAAEAAAA5APn/AAACAAEAAAA5APr/AAACAAEAAAA5APv/AAACAAEAAAA5APz/AAACAAEAAAA5AP3/AAACAAEAAAA5AP7/AAACAAEAAAA5AP//AAACAAEAAAA6APL/AAACAAEAAAA6APP/AAACAAEAAAA6APT/AAACAAEAAAA6APX/AAACAAEAAAA6APb/AAACAAEAAAA6APf/AAACAAEAAAA6APj/AAACAAEAAAA6APn/AAACAAEAAAA6APr/AAACAAEAAAA6APv/AAACAAEAAAA6APz/AAACAAEAAAA6AP3/AAACAAEAAAA6AP7/AAACAAEAAAA6AP//AAACAAEAAAA7APL/AAACAAEAAAA7APP/AAACAAEAAAA7APT/AAACAAEAAAA7APX/AAACAAEAAAA7APb/AAACAAEAAAA7APf/AAACAAEAAAA7APj/AAACAAEAAAA7APn/AAACAAEAAAA7APr/AAACAAEAAAA7APv/AAACAAEAAAA7APz/AAACAAEAAAA7AP3/AAACAAEAAAA7AP7/AAACAAEAAAA7AP//AAACAAEAAAA8APL/AAACAAEAAAA8APP/AAACAAEAAAA8APT/AAACAAEAAAA8APX/AAACAAEAAAA8APb/AAACAAEAAAA8APf/AAACAAEAAAA8APj/AAACAAEAAAA8APn/AAACAAEAAAA8APr/AAACAAEAAAA8APv/AAACAAEAAAA8APz/AAACAAEAAAA8AP3/AAACAAEAAAA8AP7/AAACAAEAAAA8AP//AAACAAEAAAA9APL/AAACAAEAAAA9APP/AAACAAEAAAA9APT/AAACAAEAAAA9APX/AAACAAEAAAA9APb/AAACAAEAAAA9APf/AAACAAEAAAA9APj/AAACAAEAAAA9APn/AAACAAEAAAA9APr/AAACAAEAAAA9APv/AAACAAEAAAA9APz/AAACAAEAAAA9AP3/AAACAAEAAAA9AP7/AAACAAEAAAA9AP//AAACAAEAAAA+APL/AAACAAEAAAA+APP/AAACAAEAAAA+APT/AAACAAEAAAA+APX/AAACAAEAAAA+APb/AAACAAEAAAA+APf/AAACAAEAAAA+APj/AAACAAEAAAA+APn/AAACAAEAAAA+APr/AAACAAEAAAA+APv/AAACAAEAAAA+APz/AAACAAEAAAA+AP3/AAACAAEAAAA+AP7/AAACAAEAAAA+AP//AAACAAEAAAA/APL/AAACAAEAAAA/APP/AAACAAEAAAA/APT/AAACAAEAAAA/APX/AAACAAEAAAA/APb/AAACAAEAAAA/APf/AAACAAEAAAA/APj/AAACAAEAAAA/APn/AAACAAEAAAA/APr/AAACAAEAAAA/APv/AAACAAEAAAA/APz/AAACAAEAAAA/AP3/AAACAAEAAAA/AP7/AAACAAEAAAA/AP//AAACAAEAAABAAPL/AAACAAEAAABAAPP/AAACAAEAAABAAPT/AAACAAEAAABAAPX/AAACAAEAAABAAPb/AAACAAEAAABAAPf/AAACAAEAAABAAPj/AAACAAEAAABAAPn/AAACAAEAAABAAPr/AAACAAEAAABAAPv/AAACAAEAAABAAPz/AAACAAEAAABAAP3/AAACAAEAAABAAP7/AAACAAEAAABAAP//AAACAAEAAABBAPL/AAACAAEAAABBAPP/AAACAAEAAABBAPT/AAACAAEAAABBAPX/AAACAAEAAABBAPb/AAACAAEAAABBAPf/AAACAAEAAABBAPj/AAACAAEAAABBAPn/AAACAAEAAABBAPr/AAACAAEAAABBAPv/AAACAAEAAABBAPz/AAACAAEAAABBAP3/AAACAAEAAABBAP7/AAACAAEAAABBAP//AAACAAEAAABCAPL/AAACAAEAAABCAPP/AAACAAEAAABCAPT/AAACAAEAAABCAPX/AAACAAEAAABCAPb/AAACAAEAAABCAPf/AAACAAEAAABCAPj/AAACAAEAAABCAPn/AAACAAEAAABCAPr/AAACAAEAAABCAPv/AAACAAEAAABCAPz/AAACAAEAAABCAP3/AAACAAEAAABCAP7/AAACAAEAAABCAP//AAACAAEAAABDAPL/AAACAAEAAABDAPP/AAACAAEAAABDAPT/AAACAAEAAABDAPX/AAACAAEAAABDAPb/AAACAAEAAABDAPf/AAACAAEAAABDAPj/AAACAAEAAABDAPn/AAACAAEAAABDAPr/AAACAAEAAABDAPv/AAACAAEAAABDAPz/AAACAAEAAABDAP3/AAACAAEAAABDAP7/AAACAAEAAABDAP//AAACAAEAAABEAPL/AAACAAEAAABEAPP/AAACAAEAAABEAPT/AAACAAEAAABEAPX/AAACAAEAAABEAPb/AAACAAEAAABEAPf/AAACAAEAAABEAPj/AAACAAEAAABEAPn/AAACAAEAAABEAPr/AAACAAEAAABEAPv/AAACAAEAAABEAPz/AAACAAEAAABEAP3/AAACAAEAAABEAP7/AAACAAEAAABEAP//AAACAAEAAABFAPL/AAACAAEAAABFAPP/AAACAAEAAABFAPT/AAACAAEAAABFAPX/AAACAAEAAABFAPb/AAACAAEAAABFAPf/AAACAAEAAABFAPj/AAACAAEAAABFAPn/AAACAAEAAABFAPr/AAACAAEAAABFAPv/AAACAAEAAABFAPz/AAACAAEAAABFAP3/AAACAAEAAABFAP7/AAACAAEAAABFAP//AAACAAEAAAA=") tile_set = SubResource("TileSet_5bd38") -[node name="Player" parent="." instance=ExtResource("2_07rl6")] +[node name="Player" parent="." instance=ExtResource("3_3sswl")] position = Vector2(584, 442) -[node name="DoorSceneManager" parent="." node_paths=PackedStringArray("player") instance=ExtResource("3_3eu8f")] +[node name="DoorSceneManager" parent="." node_paths=PackedStringArray("player") instance=ExtResource("4_3t3gn")] position = Vector2(584, 456) scale = Vector2(3.44061, 0.770942) player = NodePath("../Player") @@ -487,4 +487,4 @@ z_index = 4096 position = Vector2(582, 328) zoom = Vector2(2, 2) -[node name="PauseMenu" parent="Camera2D" instance=ExtResource("1_yi287")] +[node name="PauseMenu" parent="Camera2D" instance=ExtResource("5_gl2jq")] diff --git a/scenes/main_level.tscn b/scenes/level/main_level.tscn similarity index 94% rename from scenes/main_level.tscn rename to scenes/level/main_level.tscn index 831ac97..8cdd347 100644 --- a/scenes/main_level.tscn +++ b/scenes/level/main_level.tscn @@ -1,14 +1,14 @@ [gd_scene load_steps=9 format=4 uid="uid://ds1fjw3marbia"] -[ext_resource type="PackedScene" uid="uid://k76535tjepm3" path="res://scenes/elements/player.tscn" id="1_6iuf6"] -[ext_resource type="Script" path="res://scripts/main_level.gd" id="1_fdviv"] -[ext_resource type="Texture2D" uid="uid://bj3fteudhyal6" path="res://assets/textures/Overworld.png" id="1_pt2os"] -[ext_resource type="PackedScene" uid="uid://da1uex028xkv1" path="res://scenes/elements/door_scene_manager.tscn" id="1_qqjfh"] -[ext_resource type="PackedScene" uid="uid://d11oo2pxcah1g" path="res://scenes/interfaces/pause_menu.tscn" id="2_4k3ic"] -[ext_resource type="PackedScene" uid="uid://cjvtoi20cy8wi" path="res://scenes/interfaces/inventory.tscn" id="6_a0ayx"] +[ext_resource type="Script" uid="uid://2k5farej1c8m" path="res://scripts/main_level.gd" id="1_rqc32"] +[ext_resource type="Texture2D" uid="uid://bj3fteudhyal6" path="res://assets/textures/Overworld.png" id="2_hr3vg"] +[ext_resource type="PackedScene" uid="uid://da1uex028xkv1" path="res://scenes/elements/door_scene_manager.tscn" id="3_5ranr"] +[ext_resource type="PackedScene" uid="uid://k76535tjepm3" path="res://scenes/elements/player.tscn" id="4_y0qys"] +[ext_resource type="PackedScene" uid="uid://d11oo2pxcah1g" path="res://scenes/menu/pause_menu.tscn" id="5_06oyi"] +[ext_resource type="PackedScene" uid="uid://cjvtoi20cy8wi" path="res://scenes/menu/inventory.tscn" id="6_cymwe"] [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_n0o3p"] -texture = ExtResource("1_pt2os") +texture = ExtResource("2_hr3vg") 0:0/0 = 0 0:0/0/terrain_set = 0 0:0/0/terrain = 0 @@ -1635,25 +1635,26 @@ terrain_set_0/terrain_2/color = Color(0.588235, 0.713726, 0.239216, 1) sources/0 = SubResource("TileSetAtlasSource_n0o3p") [node name="MainLevel" type="Node2D"] -script = ExtResource("1_fdviv") +script = ExtResource("1_rqc32") [node name="TileMapLayer" type="TileMapLayer" parent="."] -tile_map_data = PackedByteArray("AAAAAP//AAASACEAAAD/////AAARACEAAAD+////AAARACEAAAD9////AAARACEAAAD7////AAAQACEAAAD6////AAAHAAoAAAD5////AAAHAAkAAAD4////AAAHAAkAAAD5/wAAAAAFAAoAAAD6/wAAAAAAAAMAAAD7/wAAAAABAAMAAAD8/wAAAAABAAMAAAD9/wAAAAABAAMAAAD+/wAAAAABAAMAAAD//wAAAAABAAMAAAAAAAAAAAABAAMAAAABAAAAAAABAAMAAAACAAEAAAABAAQAAAADAAEAAAABAAQAAAAEAAEAAAABAAQAAAD4/wAAAAANABwAAAD3/wAAAAAIAAoAAAACAAAAAAABAAMAAAADAAAAAAABAAMAAAAEAAAAAAABAAMAAAAFAAAAAAABAAMAAAAGAAAAAAABAAcAAAAHAAAAAAABAAQAAAAIAAAAAAAAAAcAAAABAP//AAAIAAoAAAACAP//AAAIAAoAAAADAP//AAAFAAkAAAAEAP//AAAHAAoAAAAFAP//AAAFAAkAAAAGAP//AAAAAAMAAAD2/wAAAAAMABwAAAD1/wAAAAALABwAAAD9/wEAAAABAAQAAAD+/wEAAAABAAQAAAD//wEAAAABAAQAAAAAAAEAAAABAAQAAAABAAEAAAABAAQAAAAFAAEAAAABAAQAAAAGAAEAAAABAAQAAAAHAAEAAAABAAQAAAAIAAEAAAABAAQAAAAJAAEAAAABAAQAAAD8/wEAAAABAAQAAAD7/wEAAAABAAQAAAD6/wEAAAABAAcAAAD5/wEAAAABAAMAAAD4/wEAAAAAAAMAAAD3/wEAAAAHAAkAAAD2/wEAAAAFAAoAAAD1/wEAAAAFAAkAAAD0/wEAAAAHAAoAAAD5//7/AAAFAAkAAAD6//7/AAAIAAoAAAD7//7/AAAQACAAAAD8//7/AAARACAAAAD9//7/AAARACAAAAD+//7/AAARACAAAAD///7/AAARACAAAAAAAP7/AAASACAAAAABAP7/AAAFAAoAAAACAP7/AAAIAAoAAAADAP7/AAAFAAoAAAAFAP7/AAAFAAkAAAAGAP7/AAAAAAAAAAAIAP7/AAACAAMAAAAJAP7/AAAHAAkAAAALAP7/AAAFAAoAAAAMAP7/AAAAAAAAAAD4//7/AAAFAAoAAAD3//7/AAAAAAAAAAD3//3/AAANABwAAAD4//3/AAAHAAoAAAD5//3/AAAFAAoAAAD6//3/AAAHAAoAAAD7//3/AAAHAAoAAAD8//3/AAAIAAkAAAD9//3/AAAFAAkAAAD+//3/AAAAAAAAAAD///3/AAAIAAoAAAAAAP3/AAAIAAkAAAABAP3/AAAIAAoAAAACAP3/AAAHAAkAAAADAP3/AAANABwAAAAEAPz/AAAHAAkAAAAFAPz/AAAAAAAAAAAHAPz/AAAIAAoAAAADAPz/AAAFAAkAAAACAPz/AAAIAAoAAAABAPz/AAAIAAkAAAAAAPz/AAAHAAoAAAD///z/AAAHAAoAAAD+//z/AAAIAAoAAAD9//z/AAAFAAoAAAD8//z/AAAAAAAAAAD7//z/AAAFAAoAAAD6//z/AAAAAAAAAAD5//z/AAANABwAAAD4//z/AAAIAAkAAAD3//z/AAAFAAkAAAAEAP3/AAAAAAAAAAAFAP3/AAAFAAkAAAAGAP3/AAAAAAAAAAAIAP3/AAAFAAoAAAAJAP3/AAAHAAoAAAALAP3/AAAIAAkAAAAMAP3/AAAFAAoAAAANAP7/AAAHAAoAAAAJAPz/AAAHAAoAAAAKAPz/AAAIAAoAAAALAPz/AAAFAAoAAAD+//v/AAAHAAoAAAD9//v/AAAFAAkAAAD8//v/AAAHAAoAAAD7//v/AAAIAAoAAAD6//v/AAAAAAAAAAD5//v/AAAIAAkAAAD4//v/AAAFAAkAAAD3//v/AAAIAAkAAAD2//v/AAAAAAAAAAD///v/AAANABwAAAAAAPv/AAAHAAkAAAABAPv/AAAIAAkAAAACAPv/AAAHAAkAAAADAPv/AAAAAAAAAAAEAPv/AAAFAAoAAAAFAPv/AAAHAAoAAAAGAPv/AAAHAAoAAAAHAPv/AAAIAAoAAAAJAPv/AAAFAAkAAAAKAPv/AAAFAAoAAAALAPv/AAAFAAoAAAAMAPv/AAAAAAAAAAD1//v/AAAFAAkAAAD0//v/AAAIAAkAAADz//r/AAAFAAkAAADy//r/AAAFAAkAAADy//v/AAAHAAoAAADz//v/AAAAAAAAAAAAAPr/AAAFAAoAAAD///r/AAAFAAoAAAD+//r/AAAFAAoAAAD9//r/AAAHAAoAAAD8//r/AAAHAAkAAAD7//r/AAAAAAAAAAD6//r/AAAHAAoAAAD5//r/AAAAAAAAAAD4//r/AAAIAAkAAAD3//r/AAAHAAoAAAD2//r/AAAFAAkAAAD1//r/AAAIAAkAAAD0//r/AAAFAAkAAAABAPr/AAAIAAkAAAACAPr/AAAFAAoAAAADAPr/AAAHAAkAAAAEAPr/AAAFAAoAAAAFAPr/AAAIAAoAAAAGAPr/AAAIAAkAAAAHAPr/AAAIAAkAAAAIAPr/AAAFAAoAAAAJAPr/AAAFAAoAAAAKAPr/AAAIAAoAAAALAPr/AAAHAAkAAAD6//n/AAAHAAkAAAD5//n/AAAIAAkAAAD4//n/AAAAAAAAAAD3//n/AAAIAAkAAAD2//n/AAAFAAoAAAD1//n/AAAFAAoAAAD0//n/AAAHAAoAAAAMAPr/AAAFAAkAAAANAPr/AAAHAAoAAAAOAPr/AAAIAAoAAAAPAPr/AAAAAAAAAAAQAPr/AAAFAAkAAAAIAPn/AAAFAAkAAAAHAPn/AAAHAAkAAAAGAPn/AAAAAAAAAAAFAPn/AAAAAAAAAAAEAPn/AAAFAAkAAAADAPn/AAAFAAoAAAACAPn/AAAAAAAAAAABAPn/AAAFAAkAAAAAAPn/AAAIAAkAAAD///n/AAAHAAoAAAD+//n/AAAFAAkAAAD9//n/AAAHAAkAAAD8//n/AAAFAAkAAAD7//n/AAAFAAoAAAD2//j/AAAHAAoAAAD1//j/AAAHAAkAAAD0//j/AAAHAAoAAADz//j/AAAFAAoAAADy//j/AAAFAAkAAADx//j/AAAFAAoAAAAJAPn/AAAFAAkAAAD///j/AAAFAAkAAAD+//j/AAAIAAkAAAD9//j/AAAFAAkAAAD8//j/AAAIAAkAAAD7//j/AAAFAAoAAAD6//j/AAAFAAoAAAD5//j/AAAIAAoAAAD4//j/AAAIAAkAAAD3//j/AAAFAAkAAAAAAPj/AAAIAAoAAAABAPj/AAAHAAoAAAACAPj/AAAFAAoAAAADAPj/AAAHAAoAAAAEAPj/AAAIAAkAAAAFAPj/AAAHAAoAAAAGAPj/AAAAAAAAAAAHAPj/AAAIAAoAAAAIAPj/AAAHAAkAAAAJAPj/AAAFAAoAAAAKAPj/AAAAAAAAAAAEAPf/AAAHAAkAAAADAPf/AAAFAAkAAAACAPf/AAAHAAkAAAABAPf/AAAIAAoAAAAAAPf/AAAFAAkAAAD///f/AAAIAAoAAAD+//f/AAAHAAoAAAD9//f/AAAIAAoAAAD8//f/AAAIAAkAAAD7//f/AAAIAAoAAAD6//f/AAAIAAkAAAD5//f/AAAHAAoAAAD4//f/AAAIAAkAAAD3//f/AAAIAAoAAAD2//f/AAAIAAkAAAD1//f/AAAHAAkAAAD0//f/AAAFAAoAAADz//f/AAAFAAkAAAALAPj/AAAFAAoAAAAMAPj/AAAHAAoAAAANAPj/AAAFAAoAAAAOAPj/AAAHAAoAAAAPAPj/AAAHAAoAAAAQAPn/AAAIAAkAAAARAPn/AAAIAAkAAAASAPn/AAAFAAkAAAATAPn/AAAFAAoAAAAPAPn/AAAHAAoAAAAOAPn/AAAHAAoAAADx//7/AAADAAcAAADx//3/AAADAAcAAADx//z/AAADAAYAAADx//v/AAAFAAkAAADx//r/AAAFAAoAAADx//n/AAAAAAAAAADy//n/AAAFAAoAAADz//n/AAAAAAAAAADy//z/AAAEAAYAAADy//3/AAACAAoAAADy//7/AAAAAAEAAADy////AAADAAcAAADx////AAADAAcAAADx/wAAAAADAAcAAADx/wEAAAAAAAEAAADy/wEAAAACAAkAAADy/wAAAAADAAcAAADz/wAAAAACAAkAAADz////AAADAAcAAADz//7/AAADAAcAAADz//3/AAADAAYAAADz//z/AAAFAAoAAAD0//z/AAAIAAkAAAD0//3/AAAEAAYAAAD0//7/AAAEAAcAAAD0////AAAEAAcAAAD0/wAAAAAEAAgAAAD1////AAAAAAAAAAD1//7/AAAFAAoAAAD1//3/AAAFAAoAAAD1//z/AAAAAAAAAAD2//z/AAAIAAoAAAD2//3/AAAAAAAAAAD2//7/AAAHAAkAAAD2////AAAIAAkAAAD3////AAAHAAoAAADz/wEAAAAEAAgAAADy//f/AAAHAAoAAADx//f/AAAFAAoAAAAIAPf/AAAIAAoAAAAHAPf/AAAIAAoAAAAGAPf/AAAIAAkAAAAFAPf/AAAFAAkAAAAJAPf/AAAIAAoAAAAKAPf/AAAIAAkAAAALAPf/AAAHAAoAAAAMAPf/AAAHAAoAAAANAPf/AAAAAAAAAAAOAPf/AAAAAAAAAAAPAPf/AAAHAAkAAAAQAPf/AAAAAAAAAAAQAPj/AAAHAAkAAAARAPj/AAAHAAoAAAARAPf/AAAIAAkAAAASAPf/AAAAAAAAAAASAPj/AAAIAAoAAAATAPj/AAAFAAoAAAATAPf/AAAIAAoAAAAMAPn/AAAHAAkAAAALAPn/AAAIAAkAAAAKAPn/AAAFAAoAAAANAPn/AAAIAAkAAAASAPv/AAAFAAkAAAASAPr/AAAFAAoAAAARAPr/AAAHAAkAAAARAPv/AAAAAAAAAAAQAPv/AAAFAAkAAAAPAPv/AAAFAAkAAAAOAPv/AAAAAAAAAAANAPv/AAAAAAAAAAANAPz/AAAHAAkAAAAMAPz/AAAFAAkAAAANAP3/AAAFAAoAAAAOAP3/AAANABwAAAAOAPz/AAAAAAAAAAAPAPz/AAAFAAkAAAAPAP3/AAAFAAoAAAAPAP7/AAAHAAkAAAAOAP7/AAAIAAkAAAAOAP//AAAHAAkAAAANAP//AAAIAAoAAAAMAP//AAAIAAoAAAALAP//AAAHAAkAAAAKAP//AAAIAAoAAAAJAP//AAAAAAAAAAAIAP//AAACAAQAAAAJAAAAAAABAAMAAAAKAAAAAAABAAMAAAAKAAEAAAABAAQAAAALAAEAAAABAAQAAAALAAAAAAABAAMAAAAMAAAAAAABAAMAAAAMAAEAAAABAAQAAAANAAEAAAABAAQAAAANAAAAAAABAAMAAAAOAAAAAAABAAMAAAAOAAEAAAABAAQAAAAPAP//AAAIAAkAAAAQAP//AAAIAAoAAAAQAP7/AAAIAAoAAAAQAP3/AAAHAAkAAAAQAPz/AAAHAAoAAAARAPz/AAAIAAoAAAARAP3/AAAHAAoAAAARAP7/AAAAAAAAAAARAP//AAAAAAAAAAASAAEAAAABAAQAAAASAAAAAAABAAMAAAASAP//AAAFAAoAAAASAP7/AAAIAAkAAAASAP3/AAAAAAAAAAASAPz/AAAFAAoAAAATAPz/AAAAAAAAAAATAPv/AAAHAAoAAAATAPr/AAAIAAkAAAATAP3/AAAFAAoAAAATAP7/AAAAAAAAAAATAP//AAAHAAkAAAATAAAAAAABAAMAAAATAAEAAAABAAQAAADi//D/AAAAAAsAAADi//H/AAABAAoAAADi//L/AAABAAkAAADi//P/AAABAAoAAADi//T/AAABAAkAAADi//X/AAABAAoAAADi//b/AAABAAkAAADi//f/AAABAAoAAADi//j/AAABAAkAAADi//n/AAABAAoAAADi//r/AAABAAkAAADi//v/AAABAAoAAADi//z/AAABAAkAAADi//3/AAABAAkAAADi//7/AAABAAkAAADi////AAABAAkAAADi/wAAAAABAAMAAADi/wEAAAABAAQAAADi/wIAAAABAAUAAADi/wMAAAAHAAkAAADi/wQAAAABAAkAAADi/wUAAAABAAkAAADi/wYAAAABAAoAAADi/wcAAAABAAkAAADi/wgAAAABAAoAAADi/wkAAAABAAkAAADi/woAAAABAAoAAADi/wsAAAABAAkAAADi/wwAAAABAAoAAADi/w0AAAABAAkAAADi/w4AAAABAAoAAADi/w8AAAABAAkAAADi/xAAAAABAAoAAADi/xEAAAABAAkAAADi/xIAAAABAAoAAADi/xMAAAABAAkAAADi/xQAAAABAAoAAADi/xUAAAABAAkAAADi/xYAAAABAAoAAADi/xcAAAABAAkAAADi/xgAAAABAAoAAADi/xkAAAABAAkAAADi/xoAAAABAAoAAADi/xsAAAABAAkAAADi/xwAAAABAAoAAADi/x0AAAABAAkAAADi/x4AAAABAAoAAADi/x8AAAABAAkAAADi/yAAAAABAAoAAADi/yEAAAABAAkAAADi/yIAAAABAAoAAADi/yMAAAABAAkAAADi/yQAAAABAAoAAADi/yUAAAABAAkAAADi/yYAAAABAAoAAADi/ycAAAABAAkAAADi/ygAAAABAAoAAADi/ykAAAAIAA4AAADi/yoAAAARAAcAAADi/ysAAAABAAQAAADi/ywAAAABAAUAAADi/y0AAAABAAkAAADi/y4AAAABAAoAAADi/y8AAAABAAkAAADi/zAAAAABAAoAAADi/zEAAAABAAkAAADi/zIAAAABAAoAAADi/zMAAAABAAkAAADj//D/AAABAAsAAADj//H/AAAIAAoAAADj//L/AAAIAAoAAADj//P/AAAHAAoAAADj//T/AAAIAAkAAADj//X/AAAIAAoAAADj//b/AAAFAAkAAADj//f/AAAIAAoAAADj//j/AAAFAAkAAADj//n/AAAHAAoAAADj//r/AAAHAAkAAADj//v/AAAIAAkAAADj//z/AAAHAAkAAADj//3/AAAFAAoAAADj//7/AAAIAAoAAADj////AAAIAAoAAADj/wAAAAABAAMAAADj/wEAAAABAAQAAADj/wIAAAABAAUAAADj/wMAAAAHAAoAAADj/wQAAAAIAAoAAADj/wUAAAAAAAAAAADj/wYAAAAFAAoAAADj/wcAAAAFAAoAAADj/wgAAAAHAAoAAADj/wkAAAAAAAAAAADj/woAAAAFAAkAAADj/wsAAAAFAAoAAADj/wwAAAAFAAkAAADj/w0AAAAFAAoAAADj/w4AAAAHAAoAAADj/w8AAAAAAAAAAADj/xAAAAAHAAkAAADj/xEAAAAIAAoAAADj/xIAAAAAAAAAAADj/xMAAAAIAAoAAADj/xQAAAAFAAoAAADj/xUAAAAIAAkAAADj/xYAAAAFAAoAAADj/xcAAAAFAAoAAADj/xgAAAAAAAAAAADj/xkAAAAIAAkAAADj/xoAAAAIAAkAAADj/xsAAAAHAAoAAADj/xwAAAAHAAkAAADj/x0AAAAFAAkAAADj/x4AAAAHAAoAAADj/x8AAAAHAAoAAADj/yAAAAAHAAkAAADj/yEAAAAIAAoAAADj/yIAAAAIAAkAAADj/yMAAAAFAAkAAADj/yQAAAAHAAoAAADj/yUAAAAAAAAAAADj/yYAAAAFAAoAAADj/ycAAAAIAAoAAADj/ygAAAAFAAkAAADj/ykAAAABAAMAAADj/yoAAAABAAQAAADj/ysAAAABAAQAAADj/ywAAAABAAUAAADj/y0AAAAFAAkAAADj/y4AAAAIAAkAAADj/y8AAAAHAAoAAADj/zAAAAAIAAkAAADj/zEAAAAHAAkAAADj/zIAAAAIAAkAAADj/zMAAAAFAAkAAADk//D/AAABAAsAAADk//H/AAAHAAkAAADk//L/AAAHAAoAAADk//P/AAAIAAkAAADk//T/AAAFAAoAAADk//X/AAAIAAkAAADk//b/AAAHAAoAAADk//f/AAAFAAoAAADk//j/AAAIAAoAAADk//n/AAAHAAkAAADk//r/AAAIAAkAAADk//v/AAAFAAoAAADk//z/AAAFAAoAAADk//3/AAAIAAkAAADk//7/AAAIAAoAAADk////AAAAAAAAAADk/wAAAAABAAMAAADk/wEAAAABAAQAAADk/wIAAAABAAUAAADk/wMAAAAIAAkAAADk/wQAAAAAAAAAAADk/wUAAAAAAAAAAADk/wYAAAAIAAoAAADk/wcAAAAAAAAAAADk/wgAAAAAAAAAAADk/wkAAAAAAAAAAADk/woAAAAIAAkAAADk/wsAAAAHAAoAAADk/wwAAAAHAAoAAADk/w0AAAAFAAoAAADk/w4AAAAAAAAAAADk/w8AAAAAAAAAAADk/xAAAAAFAAoAAADk/xEAAAAFAAoAAADk/xIAAAAHAAoAAADk/xMAAAAAAAAAAADk/xQAAAAFAAoAAADk/xUAAAAIAAoAAADk/xYAAAAIAAoAAADk/xcAAAAFAAkAAADk/xgAAAAFAAoAAADk/xkAAAAAAAAAAADk/xoAAAAHAAoAAADk/xsAAAAHAAkAAADk/xwAAAAHAAkAAADk/x0AAAAFAAoAAADk/x4AAAAAAAAAAADk/x8AAAAFAAkAAADk/yAAAAAIAAkAAADk/yEAAAAHAAkAAADk/yIAAAAIAAoAAADk/yMAAAAFAAkAAADk/yQAAAAHAAkAAADk/yUAAAAIAAoAAADk/yYAAAAIAAoAAADk/ycAAAAFAAoAAADk/ygAAAAFAAoAAADk/ykAAAABAAMAAADk/yoAAAABAAQAAADk/ysAAAABAAQAAADk/ywAAAABAAUAAADk/y0AAAAHAAkAAADk/y4AAAAHAAoAAADk/y8AAAAHAAkAAADk/zAAAAAHAAkAAADk/zEAAAAHAAoAAADk/zIAAAAAAAAAAADk/zMAAAAHAAkAAADl//D/AAABAAsAAADl//H/AAAIAAkAAADl//L/AAAIAAoAAADl//P/AAAHAAkAAADl//T/AAAFAAoAAADl//X/AAAAAAAAAADl//b/AAAHAAoAAADl//f/AAAFAAoAAADl//j/AAAHAAoAAADl//n/AAAFAAkAAADl//r/AAAFAAkAAADl//v/AAAHAAkAAADl//z/AAAIAAkAAADl//3/AAAIAAoAAADl//7/AAAHAAoAAADl////AAAFAAoAAADl/wAAAAABAAMAAADl/wEAAAABAAQAAADl/wIAAAABAAUAAADl/wMAAAAFAAkAAADl/wQAAAAHAAoAAADl/wUAAAAHAAkAAADl/wYAAAAIAAoAAADl/wcAAAAIAAkAAADl/wgAAAAIAAoAAADl/wkAAAAIAAoAAADl/woAAAAHAAoAAADl/wsAAAAHAAkAAADl/wwAAAAIAAkAAADl/w0AAAAAAAAAAADl/w4AAAAIAAoAAADl/w8AAAAFAAoAAADl/xAAAAAIAAkAAADl/xEAAAAFAAoAAADl/xIAAAAFAAoAAADl/xMAAAAFAAoAAADl/xQAAAAFAAoAAADl/xUAAAAFAAkAAADl/xYAAAAHAAoAAADl/xcAAAAIAAkAAADl/xgAAAAIAAoAAADl/xkAAAAIAAoAAADl/xoAAAAFAAoAAADl/xsAAAAHAAkAAADl/xwAAAAHAAoAAADl/x0AAAAAAAAAAADl/x4AAAAIAAkAAADl/x8AAAAIAAoAAADl/yAAAAAIAAoAAADl/yEAAAAIAAkAAADl/yIAAAAHAAkAAADl/yMAAAAIAAoAAADl/yQAAAAFAAkAAADl/yUAAAAAAAAAAADl/yYAAAAHAAoAAADl/ycAAAAFAAkAAADl/ygAAAAAAAAAAADl/ykAAAABAAMAAADl/yoAAAABAAQAAADl/ysAAAABAAQAAADl/ywAAAABAAUAAADl/y0AAAAIAAkAAADl/y4AAAAAAAAAAADl/y8AAAAAAAAAAADl/zAAAAAHAAkAAADl/zEAAAAHAAkAAADl/zIAAAAFAAkAAADl/zMAAAAAAAAAAADm//D/AAABAAsAAADm//H/AAAIAAoAAADm//L/AAAFAAoAAADm//P/AAAHAAkAAADm//T/AAAIAAkAAADm//X/AAAHAAoAAADm//b/AAAFAAkAAADm//f/AAAFAAkAAADm//j/AAAHAAoAAADm//n/AAAHAAkAAADm//r/AAAAAAAAAADm//v/AAAHAAkAAADm//z/AAAAAAAAAADm//3/AAAIAAkAAADm//7/AAAAAAAAAADm////AAAIAAkAAADm/wAAAAABAAMAAADm/wEAAAABAAQAAADm/wIAAAABAAUAAADm/wMAAAAIAAkAAADm/wQAAAAHAAoAAADm/wUAAAAIAAoAAADm/wYAAAAHAAoAAADm/wcAAAAHAAkAAADm/wgAAAAIAAoAAADm/wkAAAAHAAoAAADm/woAAAAFAAoAAADm/wsAAAAIAAkAAADm/wwAAAAHAAkAAADm/w0AAAAIAAkAAADm/w4AAAAAAAAAAADm/w8AAAAIAAoAAADm/xAAAAAFAAkAAADm/xEAAAAFAAkAAADm/xIAAAAFAAoAAADm/xMAAAAIAAoAAADm/xQAAAAFAAkAAADm/xUAAAAFAAoAAADm/xYAAAAIAAoAAADm/xcAAAAFAAkAAADm/xgAAAAHAAoAAADm/xkAAAAIAAoAAADm/xoAAAAFAAkAAADm/xsAAAAFAAoAAADm/xwAAAAHAAoAAADm/x0AAAAIAAoAAADm/x4AAAAIAAoAAADm/x8AAAAIAAoAAADm/yAAAAAAAAAAAADm/yEAAAAFAAkAAADm/yIAAAAFAAoAAADm/yMAAAAHAAoAAADm/yQAAAAIAAoAAADm/yUAAAAFAAoAAADm/yYAAAAFAAoAAADm/ycAAAAAAAAAAADm/ygAAAAHAAkAAADm/ykAAAABAAMAAADm/yoAAAABAAQAAADm/ysAAAABAAQAAADm/ywAAAABAAYAAADm/y0AAAAAAAUAAADm/y4AAAAIAAoAAADm/y8AAAAIAAkAAADm/zAAAAAIAAoAAADm/zEAAAAHAAoAAADm/zIAAAAHAAkAAADm/zMAAAAIAAkAAADn//D/AAABAAsAAADn//H/AAAFAAoAAADn//L/AAAIAAoAAADn//P/AAAHAAkAAADn//T/AAAIAAkAAADn//X/AAAFAAoAAADn//b/AAAAAAAAAADn//f/AAAFAAoAAADn//j/AAAHAAkAAADn//n/AAAIAAkAAADn//r/AAAHAAoAAADn//v/AAAAAAAAAADn//z/AAAFAAkAAADn//3/AAAFAAkAAADn//7/AAAFAAoAAADn////AAAHAAoAAADn/wAAAAABAAMAAADn/wEAAAABAAQAAADn/wIAAAABAAUAAADn/wMAAAAFAAoAAADn/wQAAAAHAAoAAADn/wUAAAAHAAoAAADn/wYAAAAIAAoAAADn/wcAAAAAAAAAAADn/wgAAAAIAAoAAADn/wkAAAAHAAkAAADn/woAAAAHAAoAAADn/wsAAAAIAAoAAADn/wwAAAAHAAoAAADn/w0AAAAIAAoAAADn/w4AAAAFAAkAAADn/w8AAAAFAAoAAADn/xAAAAAFAAoAAADn/xEAAAAIAAoAAADn/xIAAAAHAAkAAADn/xMAAAAIAAoAAADn/xQAAAAAAAAAAADn/xUAAAAIAAkAAADn/xYAAAAFAAkAAADn/xcAAAAIAAoAAADn/xgAAAAHAAoAAADn/xkAAAAFAAkAAADn/xoAAAAHAAoAAADn/xsAAAAIAAkAAADn/xwAAAAFAAkAAADn/x0AAAAIAAoAAADn/x4AAAAHAAoAAADn/x8AAAAIAAoAAADn/yAAAAAHAAoAAADn/yEAAAAIAAoAAADn/yIAAAAIAAoAAADn/yMAAAAFAAoAAADn/yQAAAAIAAoAAADn/yUAAAAFAAoAAADn/yYAAAAHAAoAAADn/ycAAAAFAAoAAADn/ygAAAAIAAkAAADn/ykAAAABAAMAAADn/yoAAAABAAQAAADn/ysAAAABAAQAAADn/ywAAAABAAQAAADn/y0AAAABAAUAAADn/y4AAAAFAAkAAADn/y8AAAAHAAkAAADn/zAAAAAAAAAAAADn/zEAAAAFAAkAAADn/zIAAAAFAAoAAADn/zMAAAAFAAkAAADo//D/AAABAAsAAADo//H/AAAFAAkAAADo//L/AAAFAAkAAADo//P/AAAAAAAAAADo//T/AAAFAAoAAADo//X/AAAFAAoAAADo//b/AAAHAAkAAADo//f/AAAIAAkAAADo//j/AAAHAAkAAADo//n/AAAAAAAAAADo//r/AAAFAAkAAADo//v/AAAIAAkAAADo//z/AAAFAAkAAADo//3/AAAFAAoAAADo//7/AAAHAAkAAADo////AAAAAAAAAADo/wAAAAABAAMAAADo/wEAAAABAAQAAADo/wIAAAABAAYAAADo/wMAAAAAAAQAAADo/wQAAAAAAAQAAADo/wUAAAAAAAUAAADo/wYAAAAIAAkAAADo/wcAAAAFAAkAAADo/wgAAAAHAAkAAADo/wkAAAAFAAoAAADo/woAAAAHAAkAAADo/wsAAAAAAAAAAADo/wwAAAAFAAkAAADo/w0AAAAIAAoAAADo/w4AAAAIAAkAAADo/w8AAAAAAAAAAADo/xAAAAAAAAAAAADo/xEAAAAHAAoAAADo/xIAAAAHAAkAAADo/xMAAAAIAAoAAADo/xQAAAAFAAoAAADo/xUAAAAAAAAAAADo/xYAAAAIAAoAAADo/xcAAAAHAAkAAADo/xgAAAAFAAkAAADo/xkAAAAAAAAAAADo/xoAAAAFAAoAAADo/xsAAAAHAAoAAADo/xwAAAAAAAAAAADo/x0AAAAHAAoAAADo/x4AAAAFAAkAAADo/x8AAAAFAAkAAADo/yAAAAAIAAoAAADo/yEAAAAHAAoAAADo/yIAAAAFAAkAAADo/yMAAAAFAAkAAADo/yQAAAAIAAkAAADo/yUAAAAFAAoAAADo/yYAAAAAAAAAAADo/ycAAAAFAAkAAADo/ygAAAAHAAkAAADo/ykAAAABAAMAAADo/yoAAAABAAQAAADo/ysAAAABAAQAAADo/ywAAAABAAQAAADo/y0AAAABAAYAAADo/y4AAAAAAAUAAADo/y8AAAAHAAoAAADo/zAAAAAHAAoAAADo/zEAAAAAAAAAAADo/zIAAAAIAAoAAADo/zMAAAAAAAAAAADp//D/AAABAAsAAADp//H/AAAFAAoAAADp//L/AAAFAAkAAADp//P/AAAAAAAAAADp//T/AAAHAAkAAADp//X/AAAFAAoAAADp//b/AAAFAAoAAADp//f/AAAFAAkAAADp//j/AAAHAAoAAADp//n/AAAFAAkAAADp//r/AAAFAAoAAADp//v/AAAFAAoAAADp//z/AAAAAAAAAADp//3/AAAAAAAAAADp//7/AAAFAAkAAADp////AAAHAAoAAADp/wAAAAABAAMAAADp/wEAAAABAAQAAADp/wIAAAABAAQAAADp/wMAAAABAAQAAADp/wQAAAABAAQAAADp/wUAAAABAAYAAADp/wYAAAAAAAQAAADp/wcAAAAAAAUAAADp/wgAAAAFAAoAAADp/wkAAAAAAAAAAADp/woAAAAHAAkAAADp/wsAAAAFAAoAAADp/wwAAAAFAAoAAADp/w0AAAAFAAoAAADp/w4AAAAAAAAAAADp/w8AAAAIAAoAAADp/xAAAAAHAAoAAADp/xEAAAAFAAoAAADp/xIAAAAIAAkAAADp/xMAAAAFAAoAAADp/xQAAAAFAAkAAADp/xUAAAAFAAoAAADp/xYAAAAIAAoAAADp/xcAAAAHAAoAAADp/xgAAAAAAAAAAADp/xkAAAAFAAoAAADp/xoAAAAFAAkAAADp/xsAAAAAAAAAAADp/xwAAAAHAAkAAADp/x0AAAAFAAoAAADp/x4AAAAHAAkAAADp/x8AAAAIAAoAAADp/yAAAAAIAAkAAADp/yEAAAAAAAAAAADp/yIAAAAIAAkAAADp/yMAAAAIAAkAAADp/yQAAAAFAAoAAADp/yUAAAAAAAAAAADp/yYAAAAFAAkAAADp/ycAAAAIAAoAAADp/ygAAAAFAAoAAADp/ykAAAACAAMAAADp/yoAAAAAAAcAAADp/ysAAAABAAQAAADp/ywAAAABAAQAAADp/y0AAAABAAQAAADp/y4AAAABAAUAAADp/y8AAAAIAAoAAADp/zAAAAAFAAkAAADp/zEAAAAHAAkAAADp/zIAAAAFAAoAAADp/zMAAAAAAAAAAADq//D/AAABAAsAAADq//H/AAAFAAoAAADq//L/AAAIAAoAAADq//P/AAAAAAAAAADq//T/AAAIAAoAAADq//X/AAAHAAoAAADq//b/AAAFAAkAAADq//f/AAAHAAkAAADq//j/AAAAAAAAAADq//n/AAAHAAkAAADq//r/AAAAAAAAAADq//v/AAAFAAkAAADq//z/AAAFAAkAAADq//3/AAAFAAkAAADq//7/AAAFAAoAAADq////AAAIAAkAAADq/wAAAAACAAMAAADq/wEAAAACAAQAAADq/wIAAAACAAQAAADq/wMAAAACAAQAAADq/wQAAAAAAAcAAADq/wUAAAABAAQAAADq/wYAAAABAAQAAADq/wcAAAABAAYAAADq/wgAAAAAAAUAAADq/wkAAAAIAAoAAADq/woAAAAAAAAAAADq/wsAAAAIAAoAAADq/wwAAAAHAAoAAADq/w0AAAAIAAkAAADq/w4AAAAFAAoAAADq/w8AAAAIAAkAAADq/xAAAAAHAAoAAADq/xEAAAAHAAkAAADq/xIAAAAFAAkAAADq/xMAAAAHAAoAAADq/xQAAAAHAAoAAADq/xUAAAAFAAoAAADq/xYAAAAHAAoAAADq/xcAAAAIAAkAAADq/xgAAAAAAAAAAADq/xkAAAAHAAkAAADq/xoAAAAHAAkAAADq/xsAAAAHAAoAAADq/xwAAAAAAAAAAADq/x0AAAAHAAkAAADq/x4AAAAFAAoAAADq/x8AAAAIAAkAAADq/yAAAAAAAAAAAADq/yEAAAAAAAAAAADq/yIAAAAFAAoAAADq/yMAAAAIAAkAAADq/yQAAAAIAAkAAADq/yUAAAAIAAoAAADq/yYAAAAFAAkAAADq/ycAAAAIAAkAAADq/ygAAAAHAAoAAADq/ykAAAAFAAoAAADq/yoAAAACAAMAAADq/ysAAAAAAAcAAADq/ywAAAABAAQAAADq/y0AAAABAAQAAADq/y4AAAABAAYAAADq/y8AAAAAAAUAAADq/zAAAAAIAAoAAADq/zEAAAAHAAkAAADq/zIAAAAFAAkAAADq/zMAAAAAAAAAAADr//D/AAABAAsAAADr//H/AAAAAAAAAADr//L/AAAIAAkAAADr//P/AAAIAAkAAADr//T/AAAHAAoAAADr//X/AAAFAAkAAADr//b/AAAHAAkAAADr//f/AAAIAAoAAADr//j/AAAIAAkAAADr//n/AAAFAAoAAADr//r/AAAIAAkAAADr//v/AAAIAAoAAADr//z/AAAIAAoAAADr//3/AAAFAAkAAADr//7/AAAFAAkAAADr////AAAAAAAAAADr/wAAAAAHAAkAAADr/wEAAAAFAAoAAADr/wIAAAAIAAoAAADr/wMAAAAFAAoAAADr/wQAAAACAAMAAADr/wUAAAAAAAcAAADr/wYAAAABAAQAAADr/wcAAAABAAQAAADr/wgAAAABAAYAAADr/wkAAAAAAAUAAADr/woAAAAIAAoAAADr/wsAAAAIAAoAAADr/wwAAAAIAAkAAADr/w0AAAAFAAoAAADr/w4AAAAFAAoAAADr/w8AAAAIAAkAAADr/xAAAAAFAAkAAADr/xEAAAAFAAkAAADr/xIAAAAIAAoAAADr/xMAAAAFAAkAAADr/xQAAAAHAAoAAADr/xUAAAAHAAoAAADr/xYAAAAIAAkAAADr/xcAAAAIAAkAAADr/xgAAAAHAAoAAADr/xkAAAAIAAoAAADr/xoAAAAFAAoAAADr/xsAAAAIAAoAAADr/xwAAAAHAAkAAADr/x0AAAAAAAAAAADr/x4AAAAFAAoAAADr/x8AAAAAAAAAAADr/yAAAAAAAAAAAADr/yEAAAAHAAkAAADr/yIAAAAFAAkAAADr/yMAAAAAAAAAAADr/yQAAAAIAAkAAADr/yUAAAAIAAkAAADr/yYAAAAFAAkAAADr/ycAAAAAAAAAAADr/ygAAAAFAAkAAADr/ykAAAAHAAoAAADr/yoAAAAIAAoAAADr/ysAAAACAAMAAADr/ywAAAAAAAcAAADr/y0AAAABAAQAAADr/y4AAAABAAQAAADr/y8AAAABAAUAAADr/zAAAAAHAAoAAADr/zEAAAAFAAoAAADr/zIAAAAFAAoAAADr/zMAAAAAAAAAAADs//D/AAABAAsAAADs//H/AAAFAAkAAADs//L/AAAAAAAAAADs//P/AAAIAAkAAADs//T/AAAIAAoAAADs//X/AAAHAAoAAADs//b/AAAHAAoAAADs//f/AAAIAAoAAADs//j/AAAFAAkAAADs//n/AAAIAAoAAADs//r/AAAAAAAAAADs//v/AAAAAAAAAADs//z/AAAIAAkAAADs//3/AAAIAAkAAADs//7/AAAFAAkAAADs////AAAFAAkAAADs/wAAAAAFAAoAAADs/wEAAAAIAAoAAADs/wIAAAAIAAkAAADs/wMAAAAFAAoAAADs/wQAAAAIAAoAAADs/wUAAAACAAMAAADs/wYAAAAAAAcAAADs/wcAAAABAAQAAADs/wgAAAABAAQAAADs/wkAAAABAAYAAADs/woAAAAAAAUAAADs/wsAAAAFAAoAAADs/wwAAAAIAAoAAADs/w0AAAAIAAkAAADs/w4AAAAIAAoAAADs/w8AAAAHAAoAAADs/xAAAAAIAAoAAADs/xEAAAAHAAkAAADs/xIAAAAAAAAAAADs/xMAAAAHAAoAAADs/xQAAAAHAAkAAADs/xUAAAAHAAkAAADs/xYAAAAIAAkAAADs/xcAAAAAAAAAAADs/xgAAAAFAAoAAADs/xkAAAAHAAoAAADs/xoAAAAHAAkAAADs/xsAAAAHAAkAAADs/xwAAAAFAAoAAADs/x0AAAAHAAkAAADs/x4AAAAHAAoAAADs/x8AAAAHAAoAAADs/yAAAAAHAAkAAADs/yEAAAAIAAoAAADs/yIAAAAIAAoAAADs/yMAAAAFAAoAAADs/yQAAAAHAAkAAADs/yUAAAAHAAoAAADs/yYAAAAHAAkAAADs/ycAAAAIAAkAAADs/ygAAAAAAAAAAADs/ykAAAAIAAkAAADs/yoAAAAHAAoAAADs/ysAAAAHAAoAAADs/ywAAAABAAMAAADs/y0AAAABAAQAAADs/y4AAAABAAQAAADs/y8AAAABAAYAAADs/zAAAAAAAAUAAADs/zEAAAAIAAkAAADs/zIAAAAHAAkAAADs/zMAAAAIAAoAAADt//D/AAABAAsAAADt//H/AAAIAAoAAADt//L/AAAIAAoAAADt//P/AAAHAAoAAADt//T/AAAAAAAAAADt//X/AAAAAAAAAADt//b/AAAAAAAAAADt//f/AAAIAAkAAADt//j/AAAIAAkAAADt//n/AAAIAAkAAADt//r/AAAAAAAAAADt//v/AAAHAAoAAADt//z/AAAAAAAAAADt//3/AAAFAAkAAADt//7/AAAFAAkAAADt////AAAIAAoAAADt/wAAAAAFAAoAAADt/wEAAAAIAAoAAADt/wIAAAAIAAoAAADt/wMAAAAFAAoAAADt/wQAAAAIAAoAAADt/wUAAAAFAAoAAADt/wYAAAACAAMAAADt/wcAAAAAAAcAAADt/wgAAAABAAQAAADt/wkAAAABAAQAAADt/woAAAABAAYAAADt/wsAAAAAAAUAAADt/wwAAAAIAAoAAADt/w0AAAAIAAkAAADt/w4AAAAFAAoAAADt/w8AAAAIAAoAAADt/xAAAAAAAAAAAADt/xEAAAAHAAoAAADt/xIAAAAHAAkAAADt/xMAAAAFAAoAAADt/xQAAAAAAAAAAADt/xUAAAAFAAoAAADt/xYAAAAHAAoAAADt/xcAAAAAAAAAAADt/xgAAAAIAAoAAADt/xkAAAAIAAkAAADt/xoAAAAIAAoAAADt/xsAAAAHAAkAAADt/xwAAAAHAAkAAADt/x0AAAAHAAoAAADt/x4AAAAFAAoAAADt/x8AAAAAAAAAAADt/yAAAAAFAAoAAADt/yEAAAAHAAkAAADt/yIAAAAAAAAAAADt/yMAAAAIAAkAAADt/yQAAAAIAAoAAADt/yUAAAAFAAoAAADt/yYAAAAFAAoAAADt/ycAAAAFAAkAAADt/ygAAAAFAAoAAADt/ykAAAAFAAkAAADt/yoAAAAHAAkAAADt/ysAAAAIAAoAAADt/ywAAAABAAMAAADt/y0AAAABAAQAAADt/y4AAAABAAQAAADt/y8AAAABAAQAAADt/zAAAAABAAUAAADt/zEAAAAHAAoAAADt/zIAAAAIAAkAAADt/zMAAAAHAAoAAADu//D/AAABAAsAAADu//H/AAAIAAoAAADu//L/AAAIAAoAAADu//P/AAAFAAoAAADu//T/AAAHAAoAAADu//X/AAAIAAkAAADu//b/AAAIAAoAAADu//f/AAAFAAoAAADu//j/AAAFAAkAAADu//n/AAAHAAoAAADu//r/AAAFAAkAAADu//v/AAAHAAkAAADu//z/AAAIAAoAAADu//3/AAACAAYAAADu//7/AAACAAcAAADu////AAACAAcAAADu/wAAAAACAAgAAADu/wEAAAAAAAAAAADu/wIAAAAFAAkAAADu/wMAAAAIAAkAAADu/wQAAAAFAAkAAADu/wUAAAAFAAoAAADu/wYAAAAIAAoAAADu/wcAAAACAAMAAADu/wgAAAAAAAcAAADu/wkAAAABAAQAAADu/woAAAABAAQAAADu/wsAAAABAAUAAADu/wwAAAAFAAkAAADu/w0AAAAFAAkAAADu/w4AAAAIAAoAAADu/w8AAAAIAAoAAADu/xAAAAAHAAkAAADu/xEAAAAAAAAAAADu/xIAAAAAAAAAAADu/xMAAAAAAAAAAADu/xQAAAAFAAkAAADu/xUAAAAHAAkAAADu/xYAAAAHAAkAAADu/xcAAAAFAAkAAADu/xgAAAAIAAoAAADu/xkAAAAIAAoAAADu/xoAAAAFAAoAAADu/xsAAAAIAAkAAADu/xwAAAAHAAkAAADu/x0AAAAHAAkAAADu/x4AAAAFAAoAAADu/x8AAAAFAAkAAADu/yAAAAAFAAoAAADu/yEAAAAIAAoAAADu/yIAAAAAAAAAAADu/yMAAAAFAAoAAADu/yQAAAAFAAoAAADu/yUAAAAFAAoAAADu/yYAAAAFAAkAAADu/ycAAAAAAAAAAADu/ygAAAAHAAkAAADu/ykAAAAHAAoAAADu/yoAAAAIAAkAAADu/ysAAAAIAAkAAADu/ywAAAACAAMAAADu/y0AAAAAAAcAAADu/y4AAAABAAQAAADu/y8AAAABAAQAAADu/zAAAAABAAUAAADu/zEAAAAAAAAAAADu/zIAAAAAAAAAAADu/zMAAAAFAAoAAADv//D/AAABAAsAAADv//H/AAAFAAoAAADv//L/AAAHAAkAAADv//P/AAAIAAkAAADv//T/AAAIAAkAAADv//X/AAAAAAAAAADv//b/AAAFAAkAAADv//f/AAAHAAoAAADv//j/AAAFAAoAAADv//n/AAAIAAoAAADv//r/AAAAAAAAAADv//v/AAAFAAkAAADv//z/AAACAAYAAADv//3/AAADAAoAAADv//7/AAADAAcAAADv////AAAAAAEAAADv/wAAAAADAAkAAADv/wEAAAACAAgAAADv/wIAAAAIAAoAAADv/wMAAAAHAAkAAADv/wQAAAAFAAkAAADv/wUAAAAHAAoAAADv/wYAAAAFAAkAAADv/wcAAAAHAAoAAADv/wgAAAACAAMAAADv/wkAAAAAAAcAAADv/woAAAABAAQAAADv/wsAAAABAAYAAADv/wwAAAAAAAUAAADv/w0AAAAIAAkAAADv/w4AAAAFAAkAAADv/w8AAAAFAAoAAADv/xAAAAAFAAoAAADv/xEAAAAIAAoAAADv/xIAAAAAAAAAAADv/xMAAAAAAAAAAADv/xQAAAAFAAkAAADv/xUAAAAHAAoAAADv/xYAAAAHAAoAAADv/xcAAAAHAAkAAADv/xgAAAAHAAoAAADv/xkAAAAHAAoAAADv/xoAAAAFAAkAAADv/xsAAAAAAAAAAADv/xwAAAAFAAkAAADv/x0AAAAIAAkAAADv/x4AAAAHAAoAAADv/x8AAAAHAAoAAADv/yAAAAAIAAkAAADv/yEAAAAFAAkAAADv/yIAAAAAAAAAAADv/yMAAAAFAAoAAADv/yQAAAAAAAAAAADv/yUAAAAHAAoAAADv/yYAAAAIAAkAAADv/ycAAAAIAAoAAADv/ygAAAAHAAkAAADv/ykAAAAIAAkAAADv/yoAAAAFAAoAAADv/ysAAAAFAAoAAADv/ywAAAAAAAMAAADv/y0AAAABAAcAAADv/y4AAAABAAQAAADv/y8AAAABAAQAAADv/zAAAAABAAUAAADv/zEAAAAHAAoAAADv/zIAAAAIAAoAAADv/zMAAAAHAAoAAADw//D/AAABAAsAAADw//H/AAAIAAoAAADw//L/AAAHAAoAAADw//P/AAAHAAoAAADw//T/AAAHAAoAAADw//X/AAAIAAoAAADw//b/AAAHAAkAAADw//f/AAAFAAkAAADw//j/AAAAAAAAAADw//n/AAAHAAkAAADw//r/AAAIAAkAAADw//v/AAAIAAkAAADw//z/AAADAAYAAADw//3/AAAAAAEAAADw//7/AAADAAcAAADw////AAADAAcAAADw/wAAAAADAAcAAADw/wEAAAADAAkAAADw/wIAAAACAAgAAADw/wMAAAAHAAoAAADw/wQAAAAAAAAAAADw/wUAAAAHAAoAAADw/wYAAAAFAAkAAADw/wcAAAAHAAkAAADw/wgAAAAHAAkAAADw/wkAAAABAAMAAADw/woAAAABAAQAAADw/wsAAAABAAQAAADw/wwAAAABAAYAAADw/w0AAAAAAAQAAADw/w4AAAAAAAUAAADw/w8AAAAAAAAAAADw/xAAAAAFAAoAAADw/xEAAAAAAAAAAADw/xIAAAAAAAAAAADw/xMAAAAHAAoAAADw/xQAAAAFAAoAAADw/xUAAAAHAAkAAADw/xYAAAAFAAoAAADw/xcAAAAAAAAAAADw/xgAAAAIAAkAAADw/xkAAAAHAAkAAADw/xoAAAAAAAAAAADw/xsAAAAHAAoAAADw/xwAAAAAAAAAAADw/x0AAAAFAAkAAADw/x4AAAAIAAkAAADw/x8AAAAHAAoAAADw/yAAAAAIAAoAAADw/yEAAAAAAAAAAADw/yIAAAAFAAoAAADw/yMAAAAAAAAAAADw/yQAAAAHAAkAAADw/yUAAAAIAAkAAADw/yYAAAAFAAoAAADw/ycAAAAIAAoAAADw/ygAAAAIAAoAAADw/ykAAAAIAAkAAADw/yoAAAAHAAkAAADw/ysAAAAIAAkAAADw/ywAAAABAAMAAADw/y0AAAABAAQAAADw/y4AAAABAAQAAADw/y8AAAABAAQAAADw/zAAAAABAAUAAADw/zEAAAAIAAoAAADw/zIAAAAAAAAAAADw/zMAAAAIAAoAAADx//D/AAABAAsAAADx//H/AAAHAAkAAADx//L/AAAFAAkAAADx//P/AAAHAAoAAADx//T/AAAHAAkAAADx//X/AAAHAAkAAADx//b/AAAAAAAAAADx/wIAAAADAAgAAADx/wMAAAAIAAoAAADx/wQAAAAHAAoAAADx/wUAAAAHAAoAAADx/wYAAAAHAAkAAADx/wcAAAAHAAkAAADx/wgAAAAFAAkAAADx/wkAAAABAAMAAADx/woAAAABAAQAAADx/wsAAAABAAQAAADx/wwAAAABAAQAAADx/w0AAAABAAQAAADx/w4AAAABAAYAAADx/w8AAAAAAAQAAADx/xAAAAAAAAQAAADx/xEAAAAAAAUAAADx/xIAAAAIAAkAAADx/xMAAAAFAAkAAADx/xQAAAAIAAoAAADx/xUAAAAFAAkAAADx/xYAAAAIAAoAAADx/xcAAAAIAAkAAADx/xgAAAAAAAAAAADx/xkAAAAAAAAAAADx/xoAAAAAAAAAAADx/xsAAAAHAAkAAADx/xwAAAAIAAkAAADx/x0AAAAIAAkAAADx/x4AAAAIAAoAAADx/x8AAAAHAAkAAADx/yAAAAAIAAkAAADx/yEAAAAAAAAAAADx/yIAAAAIAAoAAADx/yMAAAAHAAoAAADx/yQAAAAIAAkAAADx/yUAAAAHAAoAAADx/yYAAAAIAAoAAADx/ycAAAAFAAkAAADx/ygAAAAHAAoAAADx/ykAAAAAAAAAAADx/yoAAAAFAAkAAADx/ysAAAAIAAoAAADx/ywAAAABAAMAAADx/y0AAAABAAQAAADx/y4AAAABAAQAAADx/y8AAAABAAQAAADx/zAAAAABAAUAAADx/zEAAAAIAAkAAADx/zIAAAAHAAoAAADx/zMAAAAAAAAAAADy//D/AAABAAsAAADy//H/AAAFAAoAAADy//L/AAAFAAkAAADy//P/AAAIAAkAAADy//T/AAAFAAoAAADy//X/AAAHAAkAAADy//b/AAAIAAkAAADy/wIAAAAEAAgAAADy/wMAAAAFAAoAAADy/wQAAAAIAAoAAADy/wUAAAAHAAoAAADy/wYAAAAHAAkAAADy/wcAAAAHAAoAAADy/wgAAAAAAAMAAADy/wkAAAABAAcAAADy/woAAAABAAQAAADy/wsAAAABAAQAAADy/wwAAAABAAQAAADy/w0AAAABAAQAAADy/w4AAAABAAQAAADy/w8AAAABAAQAAADy/xAAAAABAAQAAADy/xEAAAABAAYAAADy/xIAAAAAAAQAAADy/xMAAAAAAAQAAADy/xQAAAAAAAUAAADy/xUAAAAHAAkAAADy/xYAAAAHAAkAAADy/xcAAAAIAAkAAADy/xgAAAAIAAkAAADy/xkAAAAHAAkAAADy/xoAAAAIAAoAAADy/xsAAAAAAAAAAADy/xwAAAAFAAkAAADy/x0AAAAFAAkAAADy/x4AAAAAAAAAAADy/x8AAAAFAAoAAADy/yAAAAAFAAoAAADy/yEAAAAAAAAAAADy/yIAAAAFAAoAAADy/yMAAAAAAAAAAADy/yQAAAAIAAkAAADy/yUAAAAHAAoAAADy/yYAAAAAAAAAAADy/ycAAAAHAAkAAADy/ygAAAAIAAoAAADy/ykAAAAFAAkAAADy/yoAAAAIAAoAAADy/ysAAAAAAAAAAADy/ywAAAABAAMAAADy/y0AAAABAAQAAADy/y4AAAABAAQAAADy/y8AAAABAAQAAADy/zAAAAABAAUAAADy/zEAAAAIAAkAAADy/zIAAAAFAAoAAADy/zMAAAAIAAoAAADz//D/AAABAAsAAADz//H/AAAIAAoAAADz//L/AAAHAAoAAADz//P/AAAFAAkAAADz//T/AAAFAAoAAADz//X/AAAFAAoAAADz//b/AAAHAAoAAADz/wIAAAAAAAAAAADz/wMAAAAHAAoAAADz/wQAAAAIAAkAAADz/wUAAAAHAAkAAADz/wYAAAAIAAkAAADz/wcAAAAIAAkAAADz/wgAAAABAAMAAADz/wkAAAABAAQAAADz/woAAAABAAQAAADz/wsAAAAAAAYAAADz/wwAAAACAAQAAADz/w0AAAAAAAcAAADz/w4AAAABAAQAAADz/w8AAAABAAQAAADz/xAAAAABAAQAAADz/xEAAAABAAQAAADz/xIAAAABAAQAAADz/xMAAAABAAQAAADz/xQAAAABAAYAAADz/xUAAAAAAAQAAADz/xYAAAAAAAUAAADz/xcAAAAAAAAAAADz/xgAAAAHAAoAAADz/xkAAAAAAAAAAADz/xoAAAAFAAkAAADz/xsAAAAFAAkAAADz/xwAAAAHAAkAAADz/x0AAAAAAAAAAADz/x4AAAAFAAoAAADz/x8AAAAFAAkAAADz/yAAAAAIAAkAAADz/yEAAAAIAAkAAADz/yIAAAAAAAAAAADz/yMAAAAFAAoAAADz/yQAAAAFAAoAAADz/yUAAAAIAAkAAADz/yYAAAAIAAoAAADz/ycAAAAIAAkAAADz/ygAAAAIAAkAAADz/ykAAAAHAAoAAADz/yoAAAAIAAkAAADz/ysAAAAAAAMAAADz/ywAAAABAAcAAADz/y0AAAABAAQAAADz/y4AAAABAAQAAADz/y8AAAABAAQAAADz/zAAAAABAAUAAADz/zEAAAAHAAoAAADz/zIAAAAIAAkAAADz/zMAAAAHAAoAAAD0//D/AAABAAsAAAD0//H/AAAFAAoAAAD0//L/AAAFAAkAAAD0//P/AAAFAAkAAAD0//T/AAAAAAAAAAD0//X/AAAFAAkAAAD0//b/AAAHAAoAAAD0/wIAAAAFAAkAAAD0/wMAAAAHAAoAAAD0/wQAAAANABwAAAD0/wUAAAAHAAkAAAD0/wYAAAAFAAkAAAD0/wcAAAAAAAMAAAD0/wgAAAABAAcAAAD0/wkAAAABAAQAAAD0/woAAAAAAAYAAAD0/wsAAAACAAUAAAD0/wwAAAAHAAkAAAD0/w0AAAACAAMAAAD0/w4AAAACAAQAAAD0/w8AAAAAAAcAAAD0/xAAAAABAAQAAAD0/xEAAAABAAQAAAD0/xIAAAABAAQAAAD0/xMAAAABAAQAAAD0/xQAAAABAAQAAAD0/xUAAAABAAQAAAD0/xYAAAABAAYAAAD0/xcAAAAAAAQAAAD0/xgAAAAAAAUAAAD0/xkAAAAHAAkAAAD0/xoAAAAAAAAAAAD0/xsAAAAIAAkAAAD0/xwAAAAFAAoAAAD0/x0AAAAIAAoAAAD0/x4AAAAHAAkAAAD0/x8AAAAIAAkAAAD0/yAAAAAIAAkAAAD0/yEAAAAHAAoAAAD0/yIAAAAFAAkAAAD0/yMAAAAIAAkAAAD0/yQAAAAAAAAAAAD0/yUAAAAIAAoAAAD0/yYAAAAAAAAAAAD0/ycAAAAFAAkAAAD0/ygAAAAIAAoAAAD0/ykAAAAHAAkAAAD0/yoAAAAHAAoAAAD0/ysAAAABAAMAAAD0/ywAAAABAAQAAAD0/y0AAAABAAQAAAD0/y4AAAABAAQAAAD0/y8AAAAAAAYAAAD0/zAAAAACAAUAAAD0/zEAAAAFAAkAAAD0/zIAAAAIAAoAAAD0/zMAAAAIAAoAAAD1//D/AAABAAsAAAD1//H/AAAFAAkAAAD1//L/AAAIAAkAAAD1//P/AAAFAAkAAAD1//T/AAAHAAkAAAD1//X/AAAAAAAAAAD1//b/AAAHAAkAAAD1/wIAAAAFAAoAAAD1/wMAAAAHAAoAAAD1/wQAAAAFAAkAAAD1/wUAAAAIAAkAAAD1/wYAAAAAAAMAAAD1/wcAAAABAAcAAAD1/wgAAAABAAQAAAD1/wkAAAABAAQAAAD1/woAAAABAAUAAAD1/wsAAAAAAAAAAAD1/wwAAAAIAAoAAAD1/w0AAAAIAAoAAAD1/w4AAAAIAAoAAAD1/w8AAAACAAMAAAD1/xAAAAAAAAcAAAD1/xEAAAABAAQAAAD1/xIAAAABAAQAAAD1/xMAAAABAAQAAAD1/xQAAAABAAQAAAD1/xUAAAABAAQAAAD1/xYAAAABAAQAAAD1/xcAAAABAAQAAAD1/xgAAAABAAYAAAD1/xkAAAAAAAQAAAD1/xoAAAAAAAUAAAD1/xsAAAAFAAkAAAD1/xwAAAAFAAoAAAD1/x0AAAAFAAkAAAD1/x4AAAAIAAkAAAD1/x8AAAAAAAAAAAD1/yAAAAAHAAoAAAD1/yEAAAAAAAAAAAD1/yIAAAAIAAoAAAD1/yMAAAAIAAkAAAD1/yQAAAAFAAoAAAD1/yUAAAAFAAkAAAD1/yYAAAAHAAoAAAD1/ycAAAAAAAAAAAD1/ygAAAAIAAkAAAD1/ykAAAAFAAkAAAD1/yoAAAAAAAMAAAD1/ysAAAABAAcAAAD1/ywAAAABAAQAAAD1/y0AAAABAAQAAAD1/y4AAAAAAAYAAAD1/y8AAAACAAUAAAD1/zAAAAAAAAAAAAD1/zEAAAAHAAoAAAD1/zIAAAAFAAoAAAD1/zMAAAAHAAoAAAD2//D/AAABAAsAAAD2//H/AAAAAAAAAAD2//L/AAAHAAoAAAD2//P/AAAAAAAAAAD2//T/AAAAAAAAAAD2//X/AAAHAAoAAAD2//b/AAAAAAAAAAD2/wIAAAAAAAAAAAD2/wMAAAAAAAAAAAD2/wQAAAAAAAMAAAD2/wUAAAAAAAQAAAD2/wYAAAABAAcAAAD2/wcAAAABAAQAAAD2/wgAAAABAAQAAAD2/wkAAAAAAAYAAAD2/woAAAACAAUAAAD2/wsAAAAAAAAAAAD2/wwAAAAIAAkAAAD2/w0AAAAFAAoAAAD2/w4AAAAFAAoAAAD2/w8AAAAFAAoAAAD2/xAAAAACAAMAAAD2/xEAAAACAAQAAAD2/xIAAAACAAQAAAD2/xMAAAACAAQAAAD2/xQAAAAAAAcAAAD2/xUAAAABAAQAAAD2/xYAAAABAAQAAAD2/xcAAAABAAQAAAD2/xgAAAABAAQAAAD2/xkAAAABAAQAAAD2/xoAAAABAAYAAAD2/xsAAAAAAAUAAAD2/xwAAAAFAAkAAAD2/x0AAAAFAAkAAAD2/x4AAAAHAAkAAAD2/x8AAAAFAAkAAAD2/yAAAAAFAAkAAAD2/yEAAAAFAAkAAAD2/yIAAAAIAAkAAAD2/yMAAAAFAAkAAAD2/yQAAAAFAAkAAAD2/yUAAAAFAAkAAAD2/yYAAAAAAAAAAAD2/ycAAAAIAAkAAAD2/ygAAAAHAAoAAAD2/ykAAAAAAAMAAAD2/yoAAAABAAcAAAD2/ysAAAABAAQAAAD2/ywAAAABAAQAAAD2/y0AAAAAAAYAAAD2/y4AAAACAAUAAAD2/y8AAAAFAAoAAAD2/zAAAAAFAAkAAAD2/zEAAAAFAAoAAAD2/zIAAAAFAAkAAAD2/zMAAAAHAAkAAAD3//D/AAABAAsAAAD3//H/AAAFAAoAAAD3//L/AAAFAAkAAAD3//P/AAAFAAkAAAD3//T/AAAIAAoAAAD3//X/AAAIAAoAAAD3//b/AAAIAAkAAAD3/wIAAAAAAAMAAAD3/wMAAAAAAAQAAAD3/wQAAAABAAcAAAD3/wUAAAABAAQAAAD3/wYAAAABAAQAAAD3/wcAAAABAAQAAAD3/wgAAAAAAAYAAAD3/wkAAAACAAUAAAD3/woAAAAHAAkAAAD3/wsAAAAIAAkAAAD3/wwAAAAIAAkAAAD3/w0AAAAIAAkAAAD3/w4AAAAHAAkAAAD3/w8AAAAHAAoAAAD3/xAAAAAIAAkAAAD3/xEAAAAIAAkAAAD3/xIAAAAAAAAAAAD3/xMAAAAHAAoAAAD3/xQAAAACAAMAAAD3/xUAAAACAAQAAAD3/xYAAAAAAAcAAAD3/xcAAAABAAQAAAD3/xgAAAABAAQAAAD3/xkAAAABAAQAAAD3/xoAAAABAAQAAAD3/xsAAAABAAYAAAD3/xwAAAAAAAUAAAD3/x0AAAAHAAoAAAD3/x4AAAAHAAkAAAD3/x8AAAAHAAoAAAD3/yAAAAAFAAoAAAD3/yEAAAAFAAoAAAD3/yIAAAAIAAkAAAD3/yMAAAAHAAkAAAD3/yQAAAAFAAkAAAD3/yUAAAAFAAkAAAD3/yYAAAAHAAoAAAD3/ycAAAAHAAkAAAD3/ygAAAAHAAoAAAD3/ykAAAABAAMAAAD3/yoAAAABAAQAAAD3/ysAAAABAAQAAAD3/ywAAAABAAQAAAD3/y0AAAABAAUAAAD3/y4AAAAHAAkAAAD3/y8AAAAFAAkAAAD3/zAAAAAHAAoAAAD3/zEAAAAIAAoAAAD3/zIAAAAIAAkAAAD3/zMAAAAAAAAAAAD4//D/AAABAAsAAAD4//H/AAAIAAoAAAD4//L/AAAIAAkAAAD4//P/AAAFAAkAAAD4//T/AAAFAAoAAAD4//X/AAAFAAkAAAD4//b/AAAHAAoAAAD4/wIAAAABAAcAAAD4/wMAAAABAAQAAAD4/wQAAAABAAQAAAD4/wUAAAAAAAYAAAD4/wYAAAACAAQAAAD4/wcAAAACAAQAAAD4/wgAAAACAAUAAAD4/wkAAAAHAAoAAAD4/woAAAAHAAkAAAD4/wsAAAAHAAoAAAD4/wwAAAAIAAkAAAD4/w0AAAAIAAkAAAD4/w4AAAAHAAkAAAD4/w8AAAAHAAoAAAD4/xAAAAAAAAAAAAD4/xEAAAAHAAkAAAD4/xIAAAAAAAAAAAD4/xMAAAAIAAkAAAD4/xQAAAAAAAAAAAD4/xUAAAAIAAkAAAD4/xYAAAACAAMAAAD4/xcAAAACAAQAAAD4/xgAAAAAAAcAAAD4/xkAAAABAAQAAAD4/xoAAAABAAQAAAD4/xsAAAABAAQAAAD4/xwAAAABAAYAAAD4/x0AAAAAAAUAAAD4/x4AAAAFAAkAAAD4/x8AAAAFAAkAAAD4/yAAAAAHAAkAAAD4/yEAAAAHAAkAAAD4/yIAAAAIAAkAAAD4/yMAAAAHAAkAAAD4/yQAAAAHAAkAAAD4/yUAAAAFAAkAAAD4/yYAAAAHAAoAAAD4/ycAAAAIAAkAAAD4/ygAAAAAAAMAAAD4/ykAAAABAAcAAAD4/yoAAAABAAQAAAD4/ysAAAABAAQAAAD4/ywAAAABAAQAAAD4/y0AAAABAAUAAAD4/y4AAAAIAAoAAAD4/y8AAAAIAAoAAAD4/zAAAAAHAAkAAAD4/zEAAAAFAAoAAAD4/zIAAAAFAAoAAAD4/zMAAAAAAAAAAAD5//D/AAABAAsAAAD5//H/AAAIAAkAAAD5//L/AAAFAAoAAAD5//P/AAAIAAkAAAD5//T/AAAFAAoAAAD5//X/AAAFAAkAAAD5//b/AAAFAAoAAAD5/wIAAAABAAQAAAD5/wMAAAAAAAYAAAD5/wQAAAACAAQAAAD5/wUAAAACAAUAAAD5/wYAAAAFAAkAAAD5/wcAAAAHAAkAAAD5/wgAAAAFAAkAAAD5/wkAAAAFAAkAAAD5/woAAAAIAAoAAAD5/wsAAAAFAAkAAAD5/wwAAAAFAAoAAAD5/w0AAAAHAAkAAAD5/w4AAAAHAAoAAAD5/w8AAAAAAAAAAAD5/xAAAAAIAAoAAAD5/xEAAAAIAAoAAAD5/xIAAAAHAAkAAAD5/xMAAAAHAAoAAAD5/xQAAAAFAAkAAAD5/xUAAAAHAAoAAAD5/xYAAAAIAAkAAAD5/xcAAAAIAAoAAAD5/xgAAAACAAMAAAD5/xkAAAAAAAcAAAD5/xoAAAABAAQAAAD5/xsAAAABAAQAAAD5/xwAAAABAAQAAAD5/x0AAAABAAYAAAD5/x4AAAAAAAUAAAD5/x8AAAAFAAkAAAD5/yAAAAAFAAkAAAD5/yEAAAAHAAkAAAD5/yIAAAAHAAoAAAD5/yMAAAAHAAkAAAD5/yQAAAAHAAkAAAD5/yUAAAAHAAoAAAD5/yYAAAAAAAAAAAD5/ycAAAAFAAkAAAD5/ygAAAABAAMAAAD5/ykAAAABAAQAAAD5/yoAAAABAAQAAAD5/ysAAAABAAQAAAD5/ywAAAAAAAYAAAD5/y0AAAACAAUAAAD5/y4AAAAHAAkAAAD5/y8AAAAHAAoAAAD5/zAAAAAFAAkAAAD5/zEAAAAAAAAAAAD5/zIAAAAFAAkAAAD5/zMAAAAHAAkAAAD6//D/AAABAAsAAAD6//H/AAAHAAoAAAD6//L/AAAIAAoAAAD6//P/AAAFAAkAAAD6//T/AAAHAAkAAAD6//X/AAAIAAoAAAD6//b/AAAIAAkAAAD6/wIAAAABAAQAAAD6/wMAAAABAAUAAAD6/wQAAAAIAAoAAAD6/wUAAAAIAAoAAAD6/wYAAAAFAAkAAAD6/wcAAAAIAAoAAAD6/wgAAAAHAAkAAAD6/wkAAAAFAAoAAAD6/woAAAAHAAoAAAD6/wsAAAAHAAkAAAD6/wwAAAAIAAoAAAD6/w0AAAAHAAoAAAD6/w4AAAAFAAoAAAD6/w8AAAAHAAkAAAD6/xAAAAAHAAoAAAD6/xEAAAAFAAkAAAD6/xIAAAAFAAkAAAD6/xMAAAAHAAkAAAD6/xQAAAAIAAkAAAD6/xUAAAAHAAkAAAD6/xYAAAAIAAoAAAD6/xcAAAAHAAkAAAD6/xgAAAAIAAkAAAD6/xkAAAACAAMAAAD6/xoAAAAAAAcAAAD6/xsAAAABAAQAAAD6/xwAAAABAAQAAAD6/x0AAAABAAQAAAD6/x4AAAABAAYAAAD6/x8AAAAAAAUAAAD6/yAAAAAIAAkAAAD6/yEAAAAFAAoAAAD6/yIAAAAIAAkAAAD6/yMAAAAHAAkAAAD6/yQAAAAFAAkAAAD6/yUAAAAFAAkAAAD6/yYAAAAAAAMAAAD6/ycAAAAAAAQAAAD6/ygAAAABAAcAAAD6/ykAAAABAAQAAAD6/yoAAAABAAQAAAD6/ysAAAAAAAYAAAD6/ywAAAACAAUAAAD6/y0AAAAFAAkAAAD6/y4AAAAIAAoAAAD6/y8AAAAHAAkAAAD6/zAAAAAIAAoAAAD6/zEAAAAIAAoAAAD6/zIAAAAIAAoAAAD6/zMAAAAHAAkAAAD7//D/AAABAAsAAAD7//H/AAAIAAkAAAD7//L/AAAFAAoAAAD7//P/AAAFAAkAAAD7//T/AAAFAAoAAAD7//X/AAAFAAkAAAD7//b/AAAIAAoAAAD7/wIAAAABAAQAAAD7/wMAAAABAAUAAAD7/wQAAAAHAAkAAAD7/wUAAAAFAAoAAAD7/wYAAAAIAAoAAAD7/wcAAAAAAAAAAAD7/wgAAAAHAAoAAAD7/wkAAAAIAAkAAAD7/woAAAAIAAkAAAD7/wsAAAAIAAoAAAD7/wwAAAAIAAkAAAD7/w0AAAAAAAAAAAD7/w4AAAAAAAAAAAD7/w8AAAAFAAkAAAD7/xAAAAAIAAkAAAD7/xEAAAAFAAoAAAD7/xIAAAAAAAAAAAD7/xMAAAAIAAoAAAD7/xQAAAAAAAAAAAD7/xUAAAAIAAoAAAD7/xYAAAAHAAoAAAD7/xcAAAAAAAAAAAD7/xgAAAAIAAkAAAD7/xkAAAAFAAkAAAD7/xoAAAACAAMAAAD7/xsAAAAAAAcAAAD7/xwAAAABAAQAAAD7/x0AAAABAAQAAAD7/x4AAAABAAQAAAD7/x8AAAABAAUAAAD7/yAAAAAFAAoAAAD7/yEAAAAFAAkAAAD7/yIAAAAIAAoAAAD7/yMAAAAFAAoAAAD7/yQAAAAHAAkAAAD7/yUAAAAAAAMAAAD7/yYAAAABAAcAAAD7/ycAAAABAAQAAAD7/ygAAAABAAQAAAD7/ykAAAABAAQAAAD7/yoAAAAAAAYAAAD7/ysAAAACAAUAAAD7/ywAAAAIAAkAAAD7/y0AAAAIAAkAAAD7/y4AAAAHAAoAAAD7/y8AAAAIAAoAAAD7/zAAAAAFAAoAAAD7/zEAAAAHAAkAAAD7/zIAAAAHAAkAAAD7/zMAAAAHAAoAAAD8//D/AAABAAsAAAD8//H/AAAHAAoAAAD8//L/AAAHAAoAAAD8//P/AAAFAAkAAAD8//T/AAAFAAkAAAD8//X/AAAIAAkAAAD8//b/AAAAAAAAAAD8/wIAAAAAAAYAAAD8/wMAAAACAAUAAAD8/wQAAAANABwAAAD8/wUAAAAFAAkAAAD8/wYAAAAFAAkAAAD8/wcAAAAIAAoAAAD8/wgAAAAHAAoAAAD8/wkAAAAHAAoAAAD8/woAAAAAAAAAAAD8/wsAAAAHAAkAAAD8/wwAAAAAAAAAAAD8/w0AAAAIAAkAAAD8/w4AAAAHAAkAAAD8/w8AAAAAAAAAAAD8/xAAAAAFAAkAAAD8/xEAAAAFAAkAAAD8/xIAAAAFAAoAAAD8/xMAAAAHAAoAAAD8/xQAAAAFAAkAAAD8/xUAAAAFAAkAAAD8/xYAAAAIAAkAAAD8/xcAAAAIAAkAAAD8/xgAAAAIAAoAAAD8/xkAAAAHAAoAAAD8/xoAAAAIAAkAAAD8/xsAAAABAAMAAAD8/xwAAAABAAQAAAD8/x0AAAABAAQAAAD8/x4AAAABAAQAAAD8/x8AAAABAAYAAAD8/yAAAAAAAAUAAAD8/yEAAAAFAAoAAAD8/yIAAAAFAAoAAAD8/yMAAAAFAAkAAAD8/yQAAAAAAAMAAAD8/yUAAAABAAcAAAD8/yYAAAABAAQAAAD8/ycAAAABAAQAAAD8/ygAAAABAAQAAAD8/ykAAAAAAAYAAAD8/yoAAAACAAUAAAD8/ysAAAAHAAkAAAD8/ywAAAAAAAAAAAD8/y0AAAAFAAoAAAD8/y4AAAAAAAAAAAD8/y8AAAAIAAkAAAD8/zAAAAAHAAoAAAD8/zEAAAAIAAkAAAD8/zIAAAAHAAkAAAD8/zMAAAAFAAoAAAD9//D/AAABAAsAAAD9//H/AAAIAAoAAAD9//L/AAAIAAkAAAD9//P/AAAAAAAAAAD9//T/AAAAAAAAAAD9//X/AAAIAAkAAAD9//b/AAAAAAAAAAD9/wIAAAABAAUAAAD9/wMAAAAAAAAAAAD9/wQAAAAHAAoAAAD9/wUAAAAHAAkAAAD9/wYAAAALABwAAAD9/wcAAAAIAAkAAAD9/wgAAAAIAAoAAAD9/wkAAAAIAAoAAAD9/woAAAAIAAoAAAD9/wsAAAAHAAoAAAD9/wwAAAAFAAkAAAD9/w0AAAAFAAoAAAD9/w4AAAAAAAAAAAD9/w8AAAAIAAkAAAD9/xAAAAAIAAoAAAD9/xEAAAAFAAkAAAD9/xIAAAAAAAAAAAD9/xMAAAAFAAkAAAD9/xQAAAAFAAkAAAD9/xUAAAAHAAkAAAD9/xYAAAAFAAoAAAD9/xcAAAAFAAoAAAD9/xgAAAAHAAkAAAD9/xkAAAAFAAoAAAD9/xoAAAAAAAAAAAD9/xsAAAACAAMAAAD9/xwAAAAAAAcAAAD9/x0AAAABAAQAAAD9/x4AAAABAAQAAAD9/x8AAAABAAQAAAD9/yAAAAABAAUAAAD9/yEAAAAHAAoAAAD9/yIAAAAFAAkAAAD9/yMAAAAIAAoAAAD9/yQAAAABAAMAAAD9/yUAAAABAAQAAAD9/yYAAAABAAQAAAD9/ycAAAABAAQAAAD9/ygAAAABAAQAAAD9/ykAAAABAAUAAAD9/yoAAAAIAAoAAAD9/ysAAAAHAAoAAAD9/ywAAAAHAAoAAAD9/y0AAAAHAAkAAAD9/y4AAAAHAAkAAAD9/y8AAAAAAAAAAAD9/zAAAAAIAAoAAAD9/zEAAAAIAAkAAAD9/zIAAAAAAAAAAAD9/zMAAAAFAAkAAAD+//D/AAABAAsAAAD+//H/AAAHAAoAAAD+//L/AAAHAAoAAAD+//P/AAAIAAkAAAD+//T/AAAFAAkAAAD+//X/AAAIAAkAAAD+//b/AAAIAAoAAAD+/wIAAAABAAUAAAD+/wMAAAANABwAAAD+/wQAAAAFAAkAAAD+/wUAAAAIAAkAAAD+/wYAAAAMABwAAAD+/wgAAAAHAAkAAAD+/wkAAAAIAAoAAAD+/woAAAAHAAoAAAD+/wsAAAAHAAkAAAD+/wwAAAAHAAoAAAD+/w0AAAAFAAoAAAD+/w4AAAAIAAoAAAD+/w8AAAAIAAkAAAD+/xAAAAAIAAkAAAD+/xEAAAAHAAkAAAD+/xIAAAAFAAoAAAD+/xMAAAAAAAAAAAD+/xQAAAAFAAoAAAD+/xUAAAAIAAkAAAD+/xYAAAAHAAkAAAD+/xcAAAAHAAkAAAD+/xgAAAAIAAkAAAD+/xkAAAAAAAAAAAD+/xoAAAAHAAkAAAD+/xsAAAAAAAAAAAD+/xwAAAABAAMAAAD+/x0AAAABAAQAAAD+/x4AAAABAAQAAAD+/x8AAAABAAQAAAD+/yAAAAABAAUAAAD+/yEAAAAAAAAAAAD+/yIAAAAFAAkAAAD+/yMAAAAAAAMAAAD+/yQAAAABAAcAAAD+/yUAAAABAAQAAAD+/yYAAAABAAQAAAD+/ycAAAAAAAYAAAD+/ygAAAACAAQAAAD+/ykAAAACAAUAAAD+/yoAAAAHAAoAAAD+/ysAAAAIAAoAAAD+/ywAAAAIAAkAAAD+/y0AAAAHAAkAAAD+/y4AAAAFAAoAAAD+/y8AAAAIAAoAAAD+/zAAAAAHAAkAAAD+/zEAAAAHAAkAAAD+/zIAAAAHAAkAAAD+/zMAAAAFAAoAAAD///D/AAABAAsAAAD///H/AAAFAAkAAAD///L/AAAFAAoAAAD///P/AAAIAAoAAAD///T/AAAAAAAAAAD///X/AAAIAAkAAAD///b/AAAHAAkAAAD//wIAAAABAAUAAAD//wMAAAAIAAoAAAD//wQAAAAIAAkAAAD//wUAAAAFAAoAAAD//wYAAAAHAAoAAAD//wcAAAAIAAoAAAD//wgAAAAFAAkAAAD//wkAAAAHAAoAAAD//woAAAAAAAAAAAD//wsAAAAHAAkAAAD//wwAAAAFAAkAAAD//w0AAAAIAAkAAAD//w4AAAAHAAkAAAD//w8AAAAFAAkAAAD//xAAAAAHAAoAAAD//xEAAAAHAAoAAAD//xIAAAAIAAkAAAD//xMAAAAFAAkAAAD//xQAAAAIAAoAAAD//xUAAAAAAAAAAAD//xYAAAAFAAkAAAD//xcAAAAAAAAAAAD//xgAAAAIAAoAAAD//xkAAAAHAAkAAAD//xoAAAAFAAoAAAD//xsAAAAFAAkAAAD//xwAAAACAAMAAAD//x0AAAACAAQAAAD//x4AAAAAAAcAAAD//x8AAAABAAQAAAD//yAAAAABAAYAAAD//yEAAAAAAAQAAAD//yIAAAAAAAQAAAD//yMAAAABAAcAAAD//yQAAAABAAQAAAD//yUAAAABAAQAAAD//yYAAAAAAAYAAAD//ycAAAACAAUAAAD//ygAAAAFAAkAAAD//ykAAAAAAAAAAAD//yoAAAAHAAoAAAD//ysAAAAAAAAAAAD//ywAAAAHAAkAAAD//y0AAAAFAAoAAAD//y4AAAAFAAoAAAD//y8AAAAIAAoAAAD//zAAAAAIAAkAAAD//zEAAAAIAAkAAAD//zIAAAAIAAkAAAD//zMAAAAHAAoAAAAAAPD/AAABAAsAAAAAAPH/AAAIAAoAAAAAAPL/AAAIAAkAAAAAAPP/AAAHAAoAAAAAAPT/AAAIAAoAAAAAAPX/AAAAAAAAAAAAAPb/AAAIAAoAAAAAAAIAAAABAAUAAAAAAAMAAAAHAAoAAAAAAAQAAAALABwAAAAAAAUAAAAIAAkAAAAAAAYAAAANABwAAAAAAAcAAAAAAAAAAAAAAAgAAAAHAAkAAAAAAAkAAAAAAAAAAAAAAAoAAAAFAAkAAAAAAAsAAAAHAAkAAAAAAAwAAAAIAAoAAAAAAA0AAAAIAAkAAAAAAA4AAAAIAAkAAAAAAA8AAAAFAAoAAAAAABAAAAAHAAkAAAAAABEAAAAIAAkAAAAAABIAAAAHAAoAAAAAABMAAAAFAAoAAAAAABQAAAAAAAAAAAAAABUAAAAHAAkAAAAAABYAAAAAAAAAAAAAABcAAAAFAAkAAAAAABgAAAAIAAkAAAAAABkAAAAIAAoAAAAAABoAAAAIAAkAAAAAABsAAAAFAAoAAAAAABwAAAAIAAoAAAAAAB0AAAAFAAkAAAAAAB4AAAABAAMAAAAAAB8AAAABAAQAAAAAACAAAAABAAQAAAAAACEAAAABAAQAAAAAACIAAAABAAQAAAAAACMAAAABAAQAAAAAACQAAAABAAQAAAAAACUAAAABAAQAAAAAACYAAAABAAUAAAAAACcAAAAFAAoAAAAAACgAAAAFAAoAAAAAACkAAAAIAAoAAAAAACoAAAAFAAkAAAAAACsAAAAIAAkAAAAAACwAAAAFAAkAAAAAAC0AAAAAAAAAAAAAAC4AAAAAAAAAAAAAAC8AAAAIAAkAAAAAADAAAAAHAAkAAAAAADEAAAAIAAoAAAAAADIAAAAAAAAAAAAAADMAAAAFAAkAAAABAPD/AAABAAsAAAABAPH/AAAFAAkAAAABAPL/AAAHAAoAAAABAPP/AAAAAAAAAAABAPT/AAAAAAAAAAABAPX/AAAHAAkAAAABAPb/AAAFAAkAAAABAAIAAAABAAUAAAABAAMAAAAAAAAAAAABAAQAAAAMABwAAAABAAUAAAAAAAAAAAABAAYAAAAFAAoAAAABAAcAAAAHAAoAAAABAAgAAAAAAAAAAAABAAkAAAAHAAoAAAABAAoAAAAIAAoAAAABAAsAAAAIAAkAAAABAAwAAAAIAAkAAAABAA0AAAAIAAoAAAABAA4AAAAHAAkAAAABAA8AAAAIAAoAAAABABAAAAAIAAkAAAABABEAAAAAAAAAAAABABIAAAAFAAkAAAABABMAAAAAAAAAAAABABQAAAAHAAoAAAABABUAAAAFAAkAAAABABYAAAAFAAkAAAABABcAAAAHAAkAAAABABgAAAAAAAAAAAABABkAAAAFAAoAAAABABoAAAAFAAkAAAABABsAAAAIAAoAAAABABwAAAAHAAkAAAABAB0AAAAIAAoAAAABAB4AAAABAAMAAAABAB8AAAABAAQAAAABACAAAAABAAQAAAABACEAAAABAAQAAAABACIAAAABAAQAAAABACMAAAABAAQAAAABACQAAAAAAAYAAAABACUAAAACAAQAAAABACYAAAACAAUAAAABACcAAAAFAAkAAAABACgAAAAIAAkAAAABACkAAAAIAAoAAAABACoAAAAFAAoAAAABACsAAAAFAAkAAAABACwAAAAFAAoAAAABAC0AAAAHAAoAAAABAC4AAAAFAAoAAAABAC8AAAAFAAoAAAABADAAAAAIAAoAAAABADEAAAAIAAkAAAABADIAAAAAAAAAAAABADMAAAAFAAoAAAACAPD/AAABAAsAAAACAPH/AAAAAAAAAAACAPL/AAAFAAkAAAACAPP/AAAIAAoAAAACAPT/AAAFAAoAAAACAPX/AAAFAAoAAAACAPb/AAAFAAkAAAACAAIAAAABAAUAAAACAAMAAAAIAAoAAAACAAQAAAAFAAoAAAACAAUAAAAIAAkAAAACAAYAAAAFAAkAAAACAAcAAAAIAAoAAAACAAgAAAAAAAAAAAACAAkAAAAIAAkAAAACAAoAAAAFAAkAAAACAAsAAAAIAAkAAAACAAwAAAAAAAAAAAACAA0AAAAFAAkAAAACAA4AAAAFAAkAAAACAA8AAAAFAAkAAAACABAAAAAFAAkAAAACABEAAAAIAAoAAAACABIAAAAAAAAAAAACABMAAAAHAAoAAAACABQAAAAAAAAAAAACABUAAAAFAAoAAAACABYAAAAIAAoAAAACABcAAAAHAAoAAAACABgAAAAFAAoAAAACABkAAAAHAAoAAAACABoAAAAFAAkAAAACABsAAAAIAAkAAAACABwAAAAIAAkAAAACAB0AAAAHAAkAAAACAB4AAAACAAMAAAACAB8AAAAAAAcAAAACACAAAAABAAQAAAACACEAAAABAAQAAAACACIAAAABAAQAAAACACMAAAAAAAYAAAACACQAAAACAAUAAAACACUAAAAFAAkAAAACACYAAAAHAAkAAAACACcAAAAAAAAAAAACACgAAAAFAAoAAAACACkAAAAIAAkAAAACACoAAAAFAAoAAAACACsAAAAAAAAAAAACACwAAAAAAAAAAAACAC0AAAAFAAkAAAACAC4AAAAHAAkAAAACAC8AAAAIAAoAAAACADAAAAAFAAoAAAACADEAAAAAAAAAAAACADIAAAAHAAkAAAACADMAAAAFAAkAAAADAPD/AAABAAsAAAADAPH/AAAFAAkAAAADAPL/AAAHAAoAAAADAPP/AAAFAAoAAAADAPT/AAAAAAAAAAADAPX/AAAIAAkAAAADAPb/AAAIAAkAAAADAAIAAAABAAUAAAADAAMAAAAFAAkAAAADAAQAAAANABwAAAADAAUAAAAFAAkAAAADAAYAAAAIAAkAAAADAAcAAAANABwAAAADAAgAAAAFAAoAAAADAAkAAAAFAAoAAAADAAoAAAAIAAoAAAADAAsAAAAHAAkAAAADAAwAAAAHAAoAAAADAA0AAAAFAAoAAAADAA4AAAAFAAoAAAADAA8AAAAFAAoAAAADABAAAAAIAAoAAAADABEAAAAHAAkAAAADABIAAAAAAAAAAAADABMAAAAHAAkAAAADABQAAAAIAAoAAAADABUAAAAIAAoAAAADABYAAAAFAAoAAAADABcAAAAFAAoAAAADABgAAAAHAAkAAAADABkAAAAIAAoAAAADABoAAAAFAAkAAAADABsAAAAFAAoAAAADABwAAAAHAAoAAAADAB0AAAAAAAAAAAADAB4AAAAAAAAAAAADAB8AAAABAAMAAAADACAAAAABAAQAAAADACEAAAABAAQAAAADACIAAAAAAAYAAAADACMAAAACAAUAAAADACQAAAAAAAAAAAADACUAAAAHAAoAAAADACYAAAAAAAAAAAADACcAAAAHAAoAAAADACgAAAAIAAkAAAADACkAAAAHAAkAAAADACoAAAAIAAkAAAADACsAAAAHAAoAAAADACwAAAAIAAkAAAADAC0AAAAHAAkAAAADAC4AAAAHAAoAAAADAC8AAAAHAAoAAAADADAAAAAIAAkAAAADADEAAAAIAAoAAAADADIAAAAHAAkAAAADADMAAAAFAAkAAAAEAPD/AAABAAsAAAAEAPH/AAAAAAAAAAAEAPL/AAAHAAkAAAAEAPP/AAAFAAoAAAAEAPT/AAAFAAoAAAAEAPX/AAAIAAkAAAAEAPb/AAAFAAoAAAAEAAIAAAABAAUAAAAEAAMAAAAHAAoAAAAEAAQAAAAIAAkAAAAEAAUAAAAAAAAAAAAEAAYAAAAFAAoAAAAEAAcAAAAHAAkAAAAEAAgAAAAFAAoAAAAEAAkAAAAIAAkAAAAEAAoAAAAAAAAAAAAEAAsAAAAAAAAAAAAEAAwAAAAAAAAAAAAEAA0AAAAAAAAAAAAEAA4AAAAFAAkAAAAEAA8AAAAIAAkAAAAEABAAAAAFAAoAAAAEABEAAAAIAAkAAAAEABIAAAAIAAoAAAAEABMAAAAIAAoAAAAEABQAAAAFAAoAAAAEABUAAAAFAAkAAAAEABYAAAAHAAoAAAAEABcAAAAHAAoAAAAEABgAAAAFAAoAAAAEABkAAAAAAAAAAAAEABoAAAAHAAkAAAAEABsAAAAIAAoAAAAEABwAAAAFAAoAAAAEAB0AAAAFAAoAAAAEAB4AAAAFAAkAAAAEAB8AAAABAAMAAAAEACAAAAABAAQAAAAEACEAAAABAAQAAAAEACIAAAABAAUAAAAEACMAAAAHAAoAAAAEACQAAAAFAAkAAAAEACUAAAAAAAAAAAAEACYAAAAFAAoAAAAEACcAAAAIAAoAAAAEACgAAAAHAAkAAAAEACkAAAAHAAoAAAAEACoAAAAIAAkAAAAEACsAAAAFAAoAAAAEACwAAAAFAAkAAAAEAC0AAAAHAAkAAAAEAC4AAAAHAAkAAAAEAC8AAAAIAAkAAAAEADAAAAAFAAoAAAAEADEAAAAFAAoAAAAEADIAAAAFAAkAAAAEADMAAAAHAAkAAAAFAPD/AAABAAsAAAAFAPH/AAAHAAkAAAAFAPL/AAAHAAoAAAAFAPP/AAAFAAkAAAAFAPT/AAAIAAoAAAAFAPX/AAAHAAkAAAAFAPb/AAAFAAkAAAAFAAIAAAABAAUAAAAFAAMAAAAHAAoAAAAFAAQAAAAIAAoAAAAFAAUAAAAIAAoAAAAFAAYAAAAHAAoAAAAFAAcAAAAFAAoAAAAFAAgAAAAHAAkAAAAFAAkAAAAFAAkAAAAFAAoAAAAAAAAAAAAFAAsAAAAHAAkAAAAFAAwAAAAHAAoAAAAFAA0AAAAHAAkAAAAFAA4AAAAFAAoAAAAFAA8AAAAHAAkAAAAFABAAAAAHAAoAAAAFABEAAAAAAAAAAAAFABIAAAAAAAAAAAAFABMAAAAHAAkAAAAFABQAAAAHAAkAAAAFABUAAAAIAAkAAAAFABYAAAAHAAkAAAAFABcAAAAHAAkAAAAFABgAAAAIAAoAAAAFABkAAAAIAAkAAAAFABoAAAAHAAkAAAAFABsAAAAFAAoAAAAFABwAAAAFAAoAAAAFAB0AAAAIAAoAAAAFAB4AAAAHAAoAAAAFAB8AAAABAAMAAAAFACAAAAABAAQAAAAFACEAAAABAAQAAAAFACIAAAABAAUAAAAFACMAAAAIAAoAAAAFACQAAAAIAAkAAAAFACUAAAAHAAoAAAAFACYAAAAFAAoAAAAFACcAAAAFAAoAAAAFACgAAAAIAAoAAAAFACkAAAAFAAoAAAAFACoAAAAAAAAAAAAFACsAAAAFAAoAAAAFACwAAAAFAAkAAAAFAC0AAAAIAAkAAAAFAC4AAAAAAAAAAAAFAC8AAAAIAAoAAAAFADAAAAAAAAAAAAAFADEAAAAFAAkAAAAFADIAAAAAAAAAAAAFADMAAAAIAAoAAAAGAPD/AAABAAsAAAAGAPH/AAAIAAoAAAAGAPL/AAAHAAkAAAAGAPP/AAAFAAoAAAAGAPT/AAAFAAkAAAAGAPX/AAAHAAoAAAAGAPb/AAAFAAkAAAAGAAIAAAABAAYAAAAGAAQAAAAAAAUAAAAGAAUAAAAAAAAAAAAGAAYAAAAHAAoAAAAGAAcAAAAIAAoAAAAGAAgAAAAHAAkAAAAGAAkAAAAFAAoAAAAGAAoAAAAIAAkAAAAGAAsAAAAAAAAAAAAGAAwAAAAHAAoAAAAGAA0AAAAHAAkAAAAGAA4AAAAHAAoAAAAGAA8AAAAHAAkAAAAGABAAAAAHAAkAAAAGABEAAAAFAAkAAAAGABIAAAAHAAoAAAAGABMAAAAIAAoAAAAGABQAAAAFAAoAAAAGABUAAAAAAAAAAAAGABYAAAAFAAkAAAAGABcAAAAFAAoAAAAGABgAAAAIAAkAAAAGABkAAAAFAAoAAAAGABoAAAAHAAoAAAAGABsAAAAIAAoAAAAGABwAAAAFAAoAAAAGAB0AAAAHAAkAAAAGAB4AAAAIAAoAAAAGAB8AAAABAAMAAAAGACAAAAABAAQAAAAGACEAAAABAAQAAAAGACIAAAABAAUAAAAGACMAAAAIAAkAAAAGACQAAAAHAAkAAAAGACUAAAAFAAoAAAAGACYAAAAIAAoAAAAGACcAAAAFAAoAAAAGACgAAAAIAAkAAAAGACkAAAAFAAkAAAAGACoAAAAAAAAAAAAGACsAAAAIAAkAAAAGACwAAAAIAAoAAAAGAC0AAAAFAAkAAAAGAC4AAAAHAAoAAAAGAC8AAAAFAAoAAAAGADAAAAAHAAoAAAAGADEAAAAHAAkAAAAGADIAAAAAAAAAAAAGADMAAAAAAAAAAAAHAPD/AAABAAsAAAAHAPH/AAAHAAkAAAAHAPL/AAAHAAkAAAAHAPP/AAAAAAAAAAAHAPT/AAAHAAkAAAAHAPX/AAAHAAkAAAAHAPb/AAAHAAkAAAAHAAIAAAABAAQAAAAHAAMAAAABAAQAAAAHAAQAAAAGAAAAAAAHAAUAAAALAAIAAAAHAAYAAAAHAAoAAAAHAAcAAAAIAAoAAAAHAAgAAAAHAAkAAAAHAAkAAAAFAAoAAAAHAAoAAAAFAAoAAAAHAAsAAAAAAAAAAAAHAAwAAAAHAAoAAAAHAA0AAAAAAAAAAAAHAA4AAAAAAAAAAAAHAA8AAAAIAAkAAAAHABAAAAAIAAkAAAAHABEAAAAHAAkAAAAHABIAAAAHAAoAAAAHABMAAAAIAAkAAAAHABQAAAAIAAkAAAAHABUAAAAFAAoAAAAHABYAAAAIAAoAAAAHABcAAAAFAAkAAAAHABgAAAAAAAMAAAAHABkAAAAAAAQAAAAHABoAAAAAAAQAAAAHABsAAAAAAAQAAAAHABwAAAAAAAQAAAAHAB0AAAAAAAUAAAAHAB4AAAAHAAoAAAAHAB8AAAABAAMAAAAHACAAAAABAAQAAAAHACEAAAABAAQAAAAHACIAAAABAAUAAAAHACMAAAAIAAkAAAAHACQAAAAIAAkAAAAHACUAAAAHAAkAAAAHACYAAAAFAAoAAAAHACcAAAAIAAoAAAAHACgAAAAIAAoAAAAHACkAAAAAAAAAAAAHACoAAAAIAAkAAAAHACsAAAAHAAkAAAAHACwAAAAFAAoAAAAHAC0AAAAFAAkAAAAHAC4AAAAHAAkAAAAHAC8AAAAIAAkAAAAHADAAAAAAAAAAAAAHADEAAAAAAAAAAAAHADIAAAAHAAkAAAAHADMAAAAFAAkAAAAIAPD/AAABAAsAAAAIAPH/AAAIAAkAAAAIAPL/AAAFAAkAAAAIAPP/AAAIAAoAAAAIAPT/AAAIAAoAAAAIAPX/AAAAAAAAAAAIAPb/AAAFAAoAAAAIAAIAAAAAAAYAAAAIAAMAAAACAAQAAAAIAAQAAAABAAkAAAAIAAUAAAABAAoAAAAIAAYAAAAIAAoAAAAIAAcAAAAIAAoAAAAIAAgAAAAIAAkAAAAIAAkAAAAHAAoAAAAIAAoAAAAFAAkAAAAIAAsAAAAAAAAAAAAIAAwAAAAAAAAAAAAIAA0AAAAAAAAAAAAIAA4AAAAAAAAAAAAIAA8AAAAIAAkAAAAIABAAAAAHAAoAAAAIABEAAAAFAAkAAAAIABIAAAAFAAkAAAAIABMAAAAFAAoAAAAIABUAAAAHAAkAAAAIABYAAAAFAAoAAAAIABcAAAAAAAMAAAAIABgAAAABAAcAAAAIABkAAAABAAQAAAAIABoAAAABAAQAAAAIABsAAAABAAQAAAAIABwAAAABAAQAAAAIAB0AAAABAAYAAAAIAB4AAAAAAAQAAAAIAB8AAAABAAcAAAAIACAAAAABAAQAAAAIACEAAAABAAQAAAAIACIAAAABAAUAAAAIACMAAAAIAAoAAAAIACQAAAAAAAAAAAAIACUAAAAIAAoAAAAIACYAAAAHAAkAAAAIACcAAAAAAAAAAAAIACgAAAAFAAkAAAAIACkAAAAFAAoAAAAIACoAAAAIAAoAAAAIACsAAAAHAAoAAAAIACwAAAAIAAoAAAAIAC0AAAAHAAkAAAAIAC4AAAAIAAkAAAAIAC8AAAAAAAAAAAAIADAAAAAAAAAAAAAIADEAAAAAAAAAAAAIADIAAAAHAAoAAAAIADMAAAAHAAoAAAAJAPD/AAABAAsAAAAJAPH/AAAIAAoAAAAJAPL/AAAAAAAAAAAJAPP/AAAFAAoAAAAJAPT/AAAFAAkAAAAJAPX/AAAHAAoAAAAJAPb/AAAIAAkAAAAJAAIAAAABAAUAAAAJAAMAAAAFAAkAAAAJAAQAAAAHAAkAAAAJAAUAAAAAAAAAAAAJAAYAAAAIAAoAAAAJAAcAAAAFAAoAAAAJAAgAAAAIAAoAAAAJAAkAAAAIAAkAAAAJAAoAAAAIAAkAAAAJAAsAAAAHAAkAAAAJAAwAAAAFAAkAAAAJAA0AAAAFAAoAAAAJAA4AAAAIAAkAAAAJAA8AAAAFAAkAAAAJABAAAAAIAAoAAAAJABEAAAAIAAkAAAAJABIAAAAFAAoAAAAJABMAAAAHAAkAAAAJABQAAAAAAAAAAAAJABUAAAAIAAkAAAAJABYAAAAAAAMAAAAJABcAAAABAAcAAAAJABgAAAABAAQAAAAJABkAAAABAAQAAAAJABoAAAAAAAYAAAAJABsAAAAAAAcAAAAJABwAAAABAAQAAAAJAB0AAAABAAQAAAAJAB4AAAABAAQAAAAJAB8AAAABAAQAAAAJACAAAAABAAQAAAAJACEAAAABAAQAAAAJACIAAAABAAUAAAAJACMAAAAAAAAAAAAJACQAAAAFAAkAAAAJACUAAAAIAAoAAAAJACYAAAAIAAoAAAAJACcAAAAHAAkAAAAJACgAAAAHAAoAAAAJACkAAAAFAAoAAAAJACoAAAAIAAkAAAAJACsAAAAFAAkAAAAJACwAAAAFAAoAAAAJAC0AAAAFAAoAAAAJAC4AAAAFAAkAAAAJAC8AAAAHAAoAAAAJADAAAAAIAAoAAAAJADEAAAAHAAoAAAAJADIAAAAIAAkAAAAJADMAAAAFAAkAAAAKAPD/AAABAAsAAAAKAPH/AAAIAAkAAAAKAPL/AAAHAAoAAAAKAPP/AAAIAAoAAAAKAPT/AAAIAAkAAAAKAPX/AAAFAAoAAAAKAPb/AAAIAAkAAAAKAAIAAAABAAUAAAAKAAMAAAAIAAkAAAAKAAQAAAAFAAoAAAAKAAUAAAAHAAoAAAAKAAYAAAAIAAkAAAAKAAcAAAAFAAoAAAAKAAgAAAAIAAoAAAAKAAkAAAAIAAoAAAAKAAoAAAAIAAkAAAAKAAsAAAAIAAoAAAAKAAwAAAAIAAkAAAAKAA0AAAAIAAoAAAAKAA4AAAAHAAoAAAAKAA8AAAAFAAkAAAAKABAAAAAIAAkAAAAKABEAAAAFAAoAAAAKABIAAAAHAAoAAAAKABMAAAAIAAoAAAAKABQAAAAHAAkAAAAKABUAAAAAAAMAAAAKABYAAAABAAcAAAAKABcAAAABAAQAAAAKABgAAAABAAQAAAAKABkAAAAAAAYAAAAKABoAAAACAAUAAAAKABsAAAACAAMAAAAKABwAAAACAAQAAAAKAB0AAAACAAQAAAAKAB4AAAACAAQAAAAKAB8AAAAAAAcAAAAKACAAAAABAAQAAAAKACEAAAABAAQAAAAKACIAAAABAAUAAAAKACMAAAAHAAoAAAAKACQAAAAAAAAAAAAKACUAAAAAAAAAAAAKACYAAAAHAAoAAAAKACcAAAAHAAkAAAAKACgAAAAHAAkAAAAKACkAAAAIAAoAAAAKACoAAAAFAAoAAAAKACsAAAAHAAkAAAAKACwAAAAAAAAAAAAKAC0AAAAHAAkAAAAKAC4AAAAIAAkAAAAKAC8AAAAHAAoAAAAKADAAAAAIAAkAAAAKADEAAAAHAAoAAAAKADIAAAAHAAoAAAAKADMAAAAIAAoAAAALAPD/AAABAAsAAAALAPH/AAAIAAkAAAALAPL/AAAHAAoAAAALAPP/AAAHAAkAAAALAPT/AAAIAAoAAAALAPX/AAAHAAkAAAALAPb/AAAAAAAAAAALAAIAAAABAAUAAAALAAMAAAAIAAoAAAALAAQAAAAAAAAAAAALAAUAAAAFAAkAAAALAAYAAAAHAAkAAAALAAcAAAAHAAoAAAALAAgAAAAFAAkAAAALAAkAAAAIAAoAAAALAAoAAAAIAAoAAAALAAsAAAAFAAoAAAALAAwAAAAIAAoAAAALAA0AAAAIAAkAAAALAA4AAAAFAAkAAAALAA8AAAAIAAkAAAALABAAAAAIAAkAAAALABEAAAAFAAkAAAALABIAAAAIAAkAAAALABMAAAAIAAoAAAALABQAAAAAAAMAAAALABUAAAABAAcAAAALABYAAAABAAQAAAALABcAAAAAAAYAAAALABgAAAACAAQAAAALABkAAAACAAUAAAALABoAAAAHAAoAAAALABsAAAAAAAAAAAALABwAAAAAAAAAAAALAB0AAAAFAAkAAAALAB4AAAAFAAkAAAALAB8AAAABAAMAAAALACAAAAABAAQAAAALACEAAAABAAQAAAALACIAAAABAAUAAAALACMAAAAFAAoAAAALACQAAAAHAAoAAAALACUAAAAHAAkAAAALACYAAAAHAAkAAAALACcAAAAAAAAAAAALACgAAAAFAAkAAAALACkAAAAIAAkAAAALACoAAAAFAAoAAAALACsAAAAAAAAAAAALACwAAAAHAAoAAAALAC0AAAAIAAkAAAALAC4AAAAAAAAAAAALAC8AAAAHAAkAAAALADAAAAAIAAoAAAALADEAAAAHAAoAAAALADIAAAAIAAoAAAALADMAAAAFAAoAAAAMAPD/AAABAAsAAAAMAPH/AAAFAAoAAAAMAPL/AAAIAAkAAAAMAPP/AAAAAAAAAAAMAPT/AAAIAAkAAAAMAPX/AAAHAAoAAAAMAPb/AAAAAAAAAAAMAAIAAAABAAUAAAAMAAMAAAAIAAoAAAAMAAQAAAAIAAkAAAAMAAUAAAAIAAkAAAAMAAcAAAAAAAAAAAAMAAgAAAAIAAoAAAAMAAkAAAAIAAkAAAAMAAoAAAAAAAAAAAAMAAsAAAAIAAoAAAAMAAwAAAAAAAAAAAAMAA0AAAAAAAAAAAAMAA4AAAAAAAAAAAAMAA8AAAAHAAoAAAAMABAAAAAAAAAAAAAMABEAAAAFAAkAAAAMABIAAAAFAAkAAAAMABMAAAAFAAkAAAAMABQAAAABAAMAAAAMABUAAAABAAQAAAAMABYAAAABAAQAAAAMABcAAAABAAUAAAAMABgAAAAHAAkAAAAMABkAAAAIAAoAAAAMABoAAAAFAAoAAAAMABsAAAAAAAAAAAAMABwAAAAHAAkAAAAMAB0AAAAIAAoAAAAMAB4AAAAIAAkAAAAMAB8AAAABAAMAAAAMACAAAAABAAQAAAAMACEAAAABAAQAAAAMACIAAAABAAUAAAAMACMAAAAIAAoAAAAMACQAAAAIAAkAAAAMACUAAAAAAAAAAAAMACYAAAAHAAoAAAAMACcAAAAFAAkAAAAMACgAAAAIAAoAAAAMACkAAAAFAAoAAAAMACoAAAAFAAkAAAAMACsAAAAIAAoAAAAMACwAAAAAAAAAAAAMAC0AAAAFAAoAAAAMAC4AAAAHAAoAAAAMAC8AAAAAAAAAAAAMADAAAAAHAAkAAAAMADEAAAAFAAkAAAAMADIAAAAIAAkAAAAMADMAAAAFAAkAAAANAPD/AAABAAsAAAANAPH/AAAFAAkAAAANAPL/AAAFAAoAAAANAPP/AAAAAAAAAAANAPT/AAAIAAoAAAANAPX/AAAIAAoAAAANAPb/AAAAAAAAAAANAAIAAAABAAUAAAANAAMAAAAFAAkAAAANAAQAAAAHAAkAAAANAAUAAAAIAAoAAAANAAYAAAAAAAAAAAANAAcAAAAHAAkAAAANAAgAAAAAAAAAAAANAAkAAAAIAAkAAAANAAoAAAAIAAoAAAANAAsAAAAHAAoAAAANAAwAAAAAAAAAAAANAA0AAAAFAAkAAAANAA4AAAAHAAoAAAANAA8AAAAHAAoAAAANABAAAAAAAAAAAAANABEAAAAAAAAAAAANABIAAAAAAAAAAAANABMAAAAAAAMAAAANABQAAAABAAcAAAANABUAAAABAAQAAAANABYAAAAAAAYAAAANABcAAAACAAUAAAANABgAAAAFAAoAAAANABkAAAAIAAkAAAANABoAAAAIAAkAAAANABsAAAAAAAAAAAANABwAAAAIAAkAAAANAB0AAAAAAAAAAAANAB4AAAAHAAoAAAANAB8AAAABAAMAAAANACAAAAABAAQAAAANACEAAAABAAQAAAANACIAAAABAAUAAAANACMAAAAFAAoAAAANACQAAAAIAAkAAAANACUAAAAIAAkAAAANACYAAAAFAAoAAAANACcAAAAIAAkAAAANACgAAAAHAAoAAAANACkAAAAIAAkAAAANACoAAAAHAAoAAAANACsAAAAHAAkAAAANACwAAAAAAAAAAAANAC0AAAAIAAkAAAANAC4AAAAHAAoAAAANAC8AAAAHAAoAAAANADAAAAAHAAoAAAANADEAAAAFAAoAAAANADIAAAAAAAAAAAANADMAAAAHAAoAAAAOAPD/AAABAAsAAAAOAPH/AAAHAAkAAAAOAPL/AAAIAAkAAAAOAPP/AAAHAAkAAAAOAPT/AAAFAAkAAAAOAPX/AAAAAAAAAAAOAPb/AAAFAAkAAAAOAAIAAAABAAUAAAAOAAMAAAAAAAAAAAAOAAQAAAAHAAoAAAAOAAUAAAAIAAoAAAAOAAcAAAAFAAoAAAAOAAgAAAAIAAoAAAAOAAkAAAAFAAkAAAAOAAoAAAAFAAoAAAAOAAsAAAAFAAkAAAAOAAwAAAAFAAoAAAAOAA0AAAAIAAoAAAAOAA4AAAAFAAkAAAAOAA8AAAAIAAoAAAAOABAAAAAIAAoAAAAOABEAAAAGAAAAAAAOABIAAAAAAAAAAAAOABMAAAABAAQAAAAOABQAAAABAAQAAAAOABUAAAABAAQAAAAOABYAAAABAAUAAAAOABcAAAAFAAkAAAAOABgAAAAHAAkAAAAOABkAAAAHAAoAAAAOABoAAAAFAAoAAAAOABsAAAAIAAkAAAAOABwAAAAHAAkAAAAOAB0AAAAAAAAAAAAOAB4AAAAAAAAAAAAOAB8AAAABAAMAAAAOACAAAAABAAQAAAAOACEAAAABAAQAAAAOACIAAAABAAUAAAAOACMAAAAHAAkAAAAOACQAAAAFAAkAAAAOACUAAAAIAAoAAAAOACYAAAAFAAoAAAAOACcAAAAHAAoAAAAOACgAAAAHAAkAAAAOACkAAAAIAAoAAAAOACoAAAAIAAkAAAAOACsAAAAFAAkAAAAOACwAAAAHAAoAAAAOAC0AAAAIAAkAAAAOAC4AAAAAAAAAAAAOAC8AAAAIAAkAAAAOADAAAAAIAAkAAAAOADEAAAAHAAoAAAAOADIAAAAAAAAAAAAOADMAAAAAAAAAAAAPAPD/AAABAAsAAAAPAPH/AAAFAAkAAAAPAPL/AAAFAAoAAAAPAPP/AAAHAAkAAAAPAPT/AAAFAAoAAAAPAPX/AAAHAAoAAAAPAPb/AAAAAAAAAAAPAAMAAAAIAAkAAAAPAAQAAAAIAAoAAAAPAAUAAAAHAAkAAAAPAAYAAAAFAAkAAAAPAAcAAAAFAAoAAAAPAAgAAAAFAAkAAAAPAAkAAAAFAAoAAAAPAAoAAAAFAAkAAAAPAAsAAAAIAAoAAAAPAAwAAAAIAAkAAAAPAA0AAAAAAAAAAAAPAA4AAAAIAAoAAAAPAA8AAAAIAAkAAAAPABAAAAAOAAAAAAAPABEAAAAFAAoAAAAPABIAAAACAAMAAAAPABMAAAACAAQAAAAPABQAAAAAAAcAAAAPABUAAAABAAQAAAAPABYAAAABAAUAAAAPABcAAAAHAAkAAAAPABgAAAAFAAkAAAAPABkAAAAFAAoAAAAPABoAAAAAAAAAAAAPABsAAAAFAAoAAAAPABwAAAAFAAoAAAAPAB0AAAAIAAkAAAAPAB4AAAAFAAoAAAAPAB8AAAABAAMAAAAPACAAAAABAAQAAAAPACEAAAABAAQAAAAPACIAAAABAAUAAAAPACMAAAAFAAkAAAAPACQAAAAFAAoAAAAPACUAAAAHAAkAAAAPACYAAAAIAAkAAAAPACcAAAAHAAkAAAAPACgAAAAHAAkAAAAPACkAAAAFAAoAAAAPACoAAAAFAAkAAAAPACsAAAAFAAoAAAAPACwAAAAHAAoAAAAPAC0AAAAHAAoAAAAPAC4AAAAHAAoAAAAPAC8AAAAIAAoAAAAPADAAAAAHAAkAAAAPADEAAAAIAAoAAAAPADIAAAAFAAoAAAAPADMAAAAFAAoAAAAQAPD/AAABAAsAAAAQAPH/AAAIAAoAAAAQAPL/AAAFAAkAAAAQAPP/AAAIAAkAAAAQAPT/AAAIAAkAAAAQAPX/AAAAAAAAAAAQAPb/AAAFAAoAAAAQAAMAAAAAAAAAAAAQAAQAAAAHAAkAAAAQAAUAAAAHAAoAAAAQAAYAAAAFAAkAAAAQAAcAAAAIAAoAAAAQAAgAAAAAAAAAAAAQAAkAAAAHAAoAAAAQAAoAAAAAAAAAAAAQAAsAAAAAAAAAAAAQAAwAAAAHAAoAAAAQAA0AAAAIAAoAAAAQAA4AAAAFAAoAAAAQAA8AAAAFAAkAAAAQABAAAAAHAAoAAAAQABEAAAAHAAoAAAAQABIAAAAHAAkAAAAQABMAAAAAAAAAAAAQABQAAAABAAMAAAAQABUAAAABAAQAAAAQABYAAAABAAYAAAAQABcAAAAAAAUAAAAQABgAAAAIAAoAAAAQABkAAAAAAAAAAAAQABoAAAAHAAkAAAAQABsAAAAFAAkAAAAQABwAAAAFAAoAAAAQAB0AAAAIAAkAAAAQAB4AAAAHAAoAAAAQAB8AAAABAAMAAAAQACAAAAABAAQAAAAQACEAAAABAAQAAAAQACIAAAABAAUAAAAQACMAAAAFAAkAAAAQACQAAAAAAAAAAAAQACUAAAAHAAoAAAAQACYAAAAIAAoAAAAQACcAAAAAAAAAAAAQACgAAAAFAAoAAAAQACkAAAAFAAoAAAAQACoAAAAAAAAAAAAQACsAAAAHAAkAAAAQACwAAAAFAAkAAAAQAC0AAAAFAAoAAAAQAC4AAAAIAAkAAAAQAC8AAAAHAAkAAAAQADAAAAAFAAkAAAAQADEAAAAFAAoAAAAQADIAAAAAAAAAAAAQADMAAAAHAAoAAAARAPD/AAABAAsAAAARAPH/AAAIAAoAAAARAPL/AAAFAAoAAAARAPP/AAAIAAkAAAARAPT/AAAAAAAAAAARAPX/AAAAAAAAAAARAPb/AAAIAAoAAAARAAMAAAAAAAAAAAARAAQAAAAAAAAAAAARAAUAAAAFAAoAAAARAAYAAAAAAAAAAAARAAcAAAAAAAAAAAARAAgAAAAHAAkAAAARAAkAAAAAAAAAAAARAAoAAAAHAAkAAAARAAsAAAACAAYAAAARAAwAAAACAAcAAAARAA0AAAACAAgAAAARAA4AAAAAAAAAAAARAA8AAAAAAAAAAAARABAAAAAIAAkAAAARABEAAAAIAAoAAAARABIAAAAAAAAAAAARABMAAAAFAAoAAAARABQAAAABAAMAAAARABUAAAABAAQAAAARABYAAAABAAQAAAARABcAAAABAAYAAAARABgAAAAAAAUAAAARABkAAAAHAAkAAAARABoAAAAAAAAAAAARABsAAAAIAAoAAAARABwAAAAIAAoAAAARAB0AAAAHAAoAAAARAB4AAAAFAAoAAAARAB8AAAABAAMAAAARACAAAAABAAQAAAARACEAAAABAAQAAAARACIAAAABAAUAAAARACMAAAAIAAoAAAARACQAAAAIAAkAAAARACUAAAAFAAoAAAARACYAAAAIAAkAAAARACcAAAAIAAoAAAARACgAAAAIAAoAAAARACkAAAAHAAoAAAARACoAAAAFAAkAAAARACsAAAAFAAoAAAARACwAAAAFAAoAAAARAC0AAAAIAAoAAAARAC4AAAAAAAAAAAARAC8AAAAAAAAAAAARADAAAAAAAAAAAAARADEAAAAFAAoAAAARADIAAAAHAAkAAAARADMAAAAIAAoAAAASAPD/AAABAAsAAAASAPH/AAAHAAoAAAASAPL/AAAHAAoAAAASAPP/AAAFAAoAAAASAPT/AAAFAAoAAAASAPX/AAAFAAkAAAASAPb/AAAIAAkAAAASAAIAAAABAAUAAAASAAMAAAAFAAoAAAASAAQAAAAHAAoAAAASAAUAAAAFAAoAAAASAAYAAAAHAAkAAAASAAcAAAAFAAoAAAASAAgAAAAHAAkAAAASAAkAAAAIAAoAAAASAAoAAAACAAYAAAASAAsAAAADAAoAAAASAAwAAAADAAcAAAASAA0AAAADAAkAAAASAA4AAAACAAcAAAASAA8AAAACAAgAAAASABAAAAAHAAkAAAASABEAAAAFAAkAAAASABIAAAAAAAAAAAASABMAAAAHAAoAAAASABQAAAACAAMAAAASABUAAAAAAAcAAAASABYAAAABAAQAAAASABcAAAABAAQAAAASABgAAAABAAYAAAASABkAAAAAAAUAAAASABoAAAAFAAoAAAASABsAAAAIAAoAAAASABwAAAAFAAoAAAASAB0AAAAFAAkAAAASAB4AAAAFAAkAAAASAB8AAAABAAMAAAASACAAAAABAAQAAAASACEAAAABAAQAAAASACIAAAABAAUAAAASACMAAAAIAAoAAAASACQAAAAFAAoAAAASACUAAAAHAAkAAAASACYAAAAAAAAAAAASACcAAAAIAAkAAAASACgAAAAHAAkAAAASACkAAAAIAAkAAAASACoAAAAHAAkAAAASACsAAAAAAAAAAAASACwAAAAIAAkAAAASAC0AAAAIAAkAAAASAC4AAAAFAAoAAAASAC8AAAAAAAAAAAASADAAAAAAAAAAAAASADEAAAAIAAoAAAASADIAAAAHAAoAAAASADMAAAAIAAkAAAATAPD/AAABAAsAAAATAPH/AAAAAAAAAAATAPL/AAAHAAoAAAATAPP/AAAHAAoAAAATAPT/AAAIAAkAAAATAPX/AAAIAAoAAAATAPb/AAAFAAkAAAATAAIAAAABAAYAAAATAAMAAAAAAAUAAAATAAQAAAAHAAoAAAATAAUAAAAFAAkAAAATAAYAAAAFAAoAAAATAAcAAAAFAAoAAAATAAgAAAAHAAoAAAATAAkAAAACAAYAAAATAAoAAAADAAoAAAATAAsAAAADAAcAAAATAAwAAAAAAAEAAAATAA0AAAADAAcAAAATAA4AAAAAAAEAAAATAA8AAAADAAkAAAATABAAAAACAAgAAAATABEAAAAIAAkAAAATABIAAAAIAAkAAAATABMAAAAAAAAAAAATABQAAAAIAAkAAAATABUAAAACAAMAAAATABYAAAAAAAcAAAATABcAAAABAAQAAAATABgAAAABAAQAAAATABkAAAABAAYAAAATABoAAAAAAAUAAAATABsAAAAFAAoAAAATABwAAAAHAAoAAAATAB0AAAAIAAoAAAATAB4AAAAIAAoAAAATAB8AAAABAAMAAAATACAAAAABAAQAAAATACEAAAABAAQAAAATACIAAAABAAUAAAATACMAAAAAAAAAAAATACQAAAAIAAoAAAATACUAAAAAAAAAAAATACYAAAAHAAoAAAATACcAAAAIAAkAAAATACgAAAAHAAoAAAATACkAAAAAAAAAAAATACoAAAAFAAkAAAATACsAAAAHAAkAAAATACwAAAAHAAoAAAATAC0AAAAIAAkAAAATAC4AAAAAAAAAAAATAC8AAAAAAAAAAAATADAAAAAHAAoAAAATADEAAAAAAAAAAAATADIAAAAAAAAAAAATADMAAAAHAAkAAAAUAPD/AAABAAsAAAAUAPH/AAAAAAAAAAAUAPL/AAAFAAoAAAAUAPP/AAAIAAkAAAAUAPT/AAAFAAoAAAAUAPX/AAAIAAkAAAAUAPb/AAACAAYAAAAUAPf/AAACAAcAAAAUAPj/AAACAAcAAAAUAPn/AAACAAcAAAAUAPr/AAACAAgAAAAUAPv/AAAIAAoAAAAUAPz/AAAHAAkAAAAUAP3/AAAFAAkAAAAUAP7/AAAIAAoAAAAUAP//AAAFAAoAAAAUAAAAAAACAAMAAAAUAAEAAAAAAAcAAAAUAAIAAAABAAQAAAAUAAMAAAABAAYAAAAUAAQAAAAAAAUAAAAUAAUAAAAFAAkAAAAUAAYAAAAHAAoAAAAUAAcAAAAAAAAAAAAUAAgAAAAFAAoAAAAUAAkAAAADAAYAAAAUAAoAAAADAAcAAAAUAAsAAAADAAcAAAAUAAwAAAADAAcAAAAUAA0AAAADAAcAAAAUAA4AAAADAAcAAAAUAA8AAAADAAcAAAAUABAAAAADAAkAAAAUABEAAAACAAgAAAAUABIAAAAFAAoAAAAUABMAAAAHAAkAAAAUABQAAAAAAAAAAAAUABUAAAAHAAoAAAAUABYAAAACAAMAAAAUABcAAAAAAAcAAAAUABgAAAABAAQAAAAUABkAAAABAAQAAAAUABoAAAABAAYAAAAUABsAAAAAAAUAAAAUABwAAAAAAAAAAAAUAB0AAAAFAAkAAAAUAB4AAAAFAAkAAAAUAB8AAAABAAMAAAAUACAAAAABAAQAAAAUACEAAAABAAQAAAAUACIAAAABAAUAAAAUACMAAAAHAAkAAAAUACQAAAAHAAoAAAAUACUAAAAHAAkAAAAUACYAAAAHAAkAAAAUACcAAAAFAAoAAAAUACgAAAAFAAoAAAAUACkAAAAAAAAAAAAUACoAAAAAAAAAAAAUACsAAAAFAAkAAAAUACwAAAAHAAoAAAAUAC0AAAAFAAoAAAAUAC4AAAAIAAkAAAAUAC8AAAAFAAoAAAAUADAAAAAHAAoAAAAUADEAAAAHAAoAAAAUADIAAAAHAAkAAAAUADMAAAAIAAoAAAAVAPD/AAABAAsAAAAVAPH/AAAHAAkAAAAVAPL/AAAIAAoAAAAVAPP/AAAIAAkAAAAVAPT/AAAFAAoAAAAVAPX/AAACAAYAAAAVAPb/AAADAAoAAAAVAPf/AAAAAAEAAAAVAPj/AAAAAAEAAAAVAPn/AAAAAAEAAAAVAPr/AAADAAkAAAAVAPv/AAACAAgAAAAVAPz/AAAHAAoAAAAVAP3/AAAIAAkAAAAVAP7/AAAFAAoAAAAVAP//AAAFAAkAAAAVAAAAAAAHAAoAAAAVAAEAAAACAAMAAAAVAAIAAAAAAAcAAAAVAAMAAAABAAQAAAAVAAQAAAABAAYAAAAVAAUAAAAAAAUAAAAVAAYAAAAFAAoAAAAVAAcAAAAHAAkAAAAVAAgAAAAFAAkAAAAVAAkAAAADAAYAAAAVAAoAAAADAAcAAAAVAAsAAAADAAcAAAAVAAwAAAACAAkAAAAVAA0AAAAEAAcAAAAVAA4AAAACAAoAAAAVAA8AAAADAAcAAAAVABAAAAADAAcAAAAVABEAAAADAAgAAAAVABIAAAAHAAkAAAAVABMAAAAHAAkAAAAVABQAAAAIAAkAAAAVABUAAAAFAAkAAAAVABYAAAAIAAkAAAAVABcAAAACAAMAAAAVABgAAAAAAAcAAAAVABkAAAABAAQAAAAVABoAAAABAAQAAAAVABsAAAABAAYAAAAVABwAAAAAAAUAAAAVAB0AAAAHAAkAAAAVAB4AAAAAAAAAAAAVAB8AAAABAAMAAAAVACAAAAABAAQAAAAVACEAAAABAAQAAAAVACIAAAABAAUAAAAVACMAAAAAAAAAAAAVACQAAAAFAAoAAAAVACUAAAAIAAoAAAAVACYAAAAFAAoAAAAVACcAAAAFAAkAAAAVACgAAAAIAAoAAAAVACkAAAAHAAoAAAAVACoAAAAIAAkAAAAVACsAAAAHAAoAAAAVACwAAAAAAAAAAAAVAC0AAAAIAAoAAAAVAC4AAAAAAAAAAAAVAC8AAAAIAAoAAAAVADAAAAAIAAoAAAAVADEAAAAHAAkAAAAVADIAAAAHAAkAAAAVADMAAAAFAAkAAAAWAPD/AAABAAsAAAAWAPH/AAAHAAoAAAAWAPL/AAAAAAAAAAAWAPP/AAAFAAkAAAAWAPT/AAACAAYAAAAWAPX/AAADAAoAAAAWAPb/AAAAAAEAAAAWAPf/AAADAAcAAAAWAPj/AAAAAAEAAAAWAPn/AAADAAcAAAAWAPr/AAAAAAEAAAAWAPv/AAADAAgAAAAWAPz/AAAIAAkAAAAWAP3/AAAFAAkAAAAWAP7/AAAHAAoAAAAWAP//AAAIAAkAAAAWAAAAAAAIAAkAAAAWAAEAAAAFAAkAAAAWAAIAAAABAAMAAAAWAAMAAAABAAQAAAAWAAQAAAABAAQAAAAWAAUAAAABAAYAAAAWAAYAAAAAAAQAAAAWAAcAAAAAAAUAAAAWAAgAAAAAAAMAAAAWAAkAAAABAAcAAAAWAAoAAAAPAAoAAAAWAAsAAAAAAAEAAAAWAA0AAAACAAcAAAAWAA4AAAADAAoAAAAWAA8AAAADAAcAAAAWABAAAAAAAAEAAAAWABEAAAADAAgAAAAWABIAAAAFAAoAAAAWABMAAAAFAAoAAAAWABQAAAAAAAAAAAAWABUAAAAHAAoAAAAWABYAAAAIAAoAAAAWABcAAAAFAAkAAAAWABgAAAACAAMAAAAWABkAAAAAAAcAAAAWABoAAAABAAQAAAAWABsAAAABAAQAAAAWABwAAAABAAYAAAAWAB0AAAAAAAUAAAAWAB4AAAAFAAkAAAAWAB8AAAABAAMAAAAWACAAAAABAAQAAAAWACEAAAABAAQAAAAWACIAAAABAAUAAAAWACMAAAAIAAoAAAAWACQAAAAHAAkAAAAWACUAAAAAAAAAAAAWACYAAAAFAAkAAAAWACcAAAAAAAAAAAAWACgAAAAHAAoAAAAWACkAAAAHAAkAAAAWACoAAAAFAAoAAAAWACsAAAAIAAkAAAAWACwAAAAFAAkAAAAWAC0AAAAIAAkAAAAWAC4AAAAHAAkAAAAWAC8AAAAAAAAAAAAWADAAAAAIAAkAAAAWADEAAAAIAAkAAAAWADIAAAAHAAkAAAAWADMAAAAFAAkAAAAXAPD/AAABAAsAAAAXAPH/AAAHAAkAAAAXAPL/AAACAAYAAAAXAPP/AAACAAcAAAAXAPT/AAADAAoAAAAXAPX/AAADAAcAAAAXAPb/AAADAAcAAAAXAPf/AAADAAcAAAAXAPj/AAAAAAEAAAAXAPn/AAADAAcAAAAXAPr/AAAAAAEAAAAXAPv/AAADAAkAAAAXAPz/AAACAAgAAAAXAP3/AAAFAAkAAAAXAP7/AAAAAAAAAAAXAP//AAAHAAoAAAAXAAAAAAAHAAkAAAAXAAEAAAAIAAkAAAAXAAIAAAACAAMAAAAXAAMAAAAAAAcAAAAXAAQAAAABAAQAAAAXAAUAAAABAAQAAAAXAAYAAAABAAQAAAAXAAcAAAABAAYAAAAXAAgAAAABAAcAAAAXAAkAAAABAAQAAAAXAAoAAAAQAAYAAAAXAAsAAAADAAcAAAAXAAwAAAADAAcAAAAXAA0AAAAAAAEAAAAXAA4AAAAAAAEAAAAXAA8AAAADAAcAAAAXABAAAAAAAAEAAAAXABEAAAADAAgAAAAXABIAAAAIAAkAAAAXABMAAAAIAAoAAAAXABQAAAAFAAoAAAAXABUAAAAIAAkAAAAXABYAAAAHAAoAAAAXABcAAAAFAAoAAAAXABgAAAAAAAAAAAAXABkAAAACAAMAAAAXABoAAAAAAAcAAAAXABsAAAABAAQAAAAXABwAAAABAAQAAAAXAB0AAAABAAYAAAAXAB4AAAAAAAUAAAAXAB8AAAABAAMAAAAXACAAAAABAAQAAAAXACEAAAABAAQAAAAXACIAAAABAAUAAAAXACMAAAAFAAkAAAAXACQAAAAFAAoAAAAXACUAAAAAAAAAAAAXACYAAAAIAAoAAAAXACcAAAAIAAoAAAAXACgAAAAAAAAAAAAXACkAAAAFAAkAAAAXACoAAAAHAAkAAAAXACsAAAAIAAoAAAAXACwAAAAIAAkAAAAXAC0AAAAHAAkAAAAXAC4AAAAHAAoAAAAXAC8AAAAHAAkAAAAXADAAAAAIAAkAAAAXADEAAAAHAAoAAAAXADIAAAAHAAoAAAAXADMAAAAHAAkAAAAYAPD/AAABAAsAAAAYAPH/AAAIAAkAAAAYAPL/AAADAAYAAAAYAPP/AAADAAcAAAAYAPT/AAADAAcAAAAYAPX/AAADAAcAAAAYAPb/AAADAAcAAAAYAPf/AAADAAcAAAAYAPn/AAADAAcAAAAYAPr/AAADAAcAAAAYAPv/AAADAAcAAAAYAPz/AAADAAgAAAAYAP3/AAAFAAkAAAAYAP7/AAAIAAkAAAAYAP//AAAFAAoAAAAYAAAAAAAIAAoAAAAYAAEAAAAIAAoAAAAYAAIAAAAFAAoAAAAYAAMAAAACAAMAAAAYAAQAAAACAAQAAAAYAAUAAAAAAAcAAAAYAAYAAAABAAQAAAAYAAcAAAABAAQAAAAYAAgAAAABAAQAAAAYAAkAAAABAAQAAAAYAAoAAAARAAYAAAAYAAsAAAAIAA0AAAAYAAwAAAAEAAcAAAAYAA0AAAAEAAcAAAAYAA4AAAACAAoAAAAYAA8AAAADAAcAAAAYABAAAAADAAcAAAAYABEAAAADAAkAAAAYABIAAAACAAgAAAAYABMAAAAFAAoAAAAYABQAAAAHAAoAAAAYABUAAAAFAAoAAAAYABYAAAAHAAoAAAAYABcAAAAFAAkAAAAYABgAAAAHAAkAAAAYABkAAAAHAAoAAAAYABoAAAACAAMAAAAYABsAAAAAAAcAAAAYABwAAAABAAQAAAAYAB0AAAABAAQAAAAYAB4AAAABAAUAAAAYAB8AAAABAAMAAAAYACAAAAABAAQAAAAYACEAAAABAAQAAAAYACIAAAABAAUAAAAYACMAAAAHAAkAAAAYACQAAAAIAAkAAAAYACUAAAAIAAoAAAAYACYAAAAIAAoAAAAYACcAAAAHAAoAAAAYACgAAAAIAAoAAAAYACkAAAAFAAoAAAAYACoAAAAFAAoAAAAYACsAAAAIAAkAAAAYACwAAAAHAAoAAAAYAC0AAAAHAAoAAAAYAC4AAAAIAAkAAAAYAC8AAAAAAAAAAAAYADAAAAAAAAAAAAAYADEAAAAFAAoAAAAYADIAAAAIAAoAAAAYADMAAAAFAAoAAAAZAPD/AAACAAYAAAAZAPH/AAACAAcAAAAZAPL/AAADAAoAAAAZAPP/AAADAAcAAAAZAPT/AAADAAcAAAAZAPX/AAAAAAEAAAAZAPb/AAADAAcAAAAZAPf/AAADAAcAAAAZAPj/AAADAAcAAAAZAPn/AAADAAcAAAAZAPr/AAADAAcAAAAZAPv/AAADAAcAAAAZAPz/AAADAAgAAAAZAP3/AAAIAAkAAAAZAP7/AAAAAAAAAAAZAP//AAAFAAoAAAAZAAAAAAAFAAkAAAAZAAEAAAAAAAAAAAAZAAIAAAAFAAkAAAAZAAMAAAAFAAkAAAAZAAQAAAAHAAoAAAAZAAUAAAACAAMAAAAZAAYAAAACAAQAAAAZAAcAAAACAAQAAAAZAAgAAAAAAAcAAAAZAAkAAAABAAQAAAAZAAoAAAABAAQAAAAZAAsAAAABAAUAAAAZAAwAAAAAAAAAAAAZAA0AAAAAAAAAAAAZAA4AAAADAAYAAAAZAA8AAAADAAcAAAAZABAAAAADAAcAAAAZABEAAAADAAcAAAAZABIAAAADAAgAAAAZABMAAAAHAAoAAAAZABQAAAAHAAoAAAAZABUAAAAIAAoAAAAZABYAAAAHAAoAAAAZABcAAAAIAAoAAAAZABgAAAAAAAAAAAAZABkAAAAIAAkAAAAZABoAAAAIAAoAAAAZABsAAAACAAMAAAAZABwAAAAAAAcAAAAZAB0AAAABAAQAAAAZAB4AAAABAAUAAAAZAB8AAAABAAMAAAAZACAAAAABAAQAAAAZACEAAAABAAQAAAAZACIAAAABAAUAAAAZACMAAAAHAAkAAAAZACQAAAAIAAkAAAAZACUAAAAAAAAAAAAZACYAAAAAAAAAAAAZACcAAAAHAAoAAAAZACgAAAAIAAkAAAAZACkAAAAAAAAAAAAZACoAAAAIAAkAAAAZACsAAAAIAAoAAAAZACwAAAAIAAkAAAAZAC0AAAAIAAoAAAAZAC4AAAAHAAoAAAAZAC8AAAAIAAoAAAAZADAAAAAAAAAAAAAZADEAAAAIAAkAAAAZADIAAAAIAAkAAAAZADMAAAAFAAoAAAAaAPD/AAADAAYAAAAaAPH/AAAAAAEAAAAaAPL/AAADAAcAAAAaAPP/AAADAAcAAAAaAPT/AAADAAcAAAAaAPX/AAAAAAEAAAAaAPb/AAADAAcAAAAaAPf/AAAAAAEAAAAaAPj/AAAAAAEAAAAaAPn/AAAAAAEAAAAaAPr/AAADAAcAAAAaAPv/AAAAAAEAAAAaAPz/AAADAAkAAAAaAP3/AAACAAcAAAAaAP7/AAACAAcAAAAaAP//AAACAAgAAAAaAAAAAAAIAAoAAAAaAAEAAAAHAAoAAAAaAAIAAAAIAAkAAAAaAAMAAAAHAAkAAAAaAAQAAAAIAAkAAAAaAAUAAAAHAAkAAAAaAAYAAAAAAAAAAAAaAAcAAAAFAAoAAAAaAAgAAAABAAMAAAAaAAkAAAABAAQAAAAaAAoAAAAAAAYAAAAaAAsAAAACAAUAAAAaAAwAAAAAAAAAAAAaAA0AAAAAAAAAAAAaAA4AAAAEAAYAAAAaAA8AAAACAAoAAAAaABAAAAAAAAEAAAAaABEAAAADAAcAAAAaABIAAAADAAgAAAAaABMAAAAHAAkAAAAaABQAAAAHAAkAAAAaABUAAAAFAAkAAAAaABYAAAAAAAAAAAAaABcAAAAIAAoAAAAaABgAAAAIAAoAAAAaABkAAAAHAAkAAAAaABoAAAAFAAoAAAAaABsAAAAAAAMAAAAaABwAAAABAAcAAAAaAB0AAAABAAQAAAAaAB4AAAABAAUAAAAaAB8AAAABAAMAAAAaACAAAAABAAQAAAAaACEAAAABAAQAAAAaACIAAAABAAUAAAAaACMAAAAIAAkAAAAaACQAAAAHAAoAAAAaACUAAAAHAAkAAAAaACYAAAAFAAoAAAAaACcAAAAIAAoAAAAaACgAAAAHAAoAAAAaACkAAAAFAAoAAAAaACoAAAAIAAoAAAAaACsAAAAFAAkAAAAaACwAAAAFAAoAAAAaAC0AAAAAAAAAAAAaAC4AAAAHAAkAAAAaAC8AAAAHAAoAAAAaADAAAAAFAAkAAAAaADEAAAAIAAoAAAAaADIAAAAFAAkAAAAaADMAAAAFAAkAAAAbAPD/AAADAAoAAAAbAPH/AAAAAAEAAAAbAPL/AAADAAcAAAAbAPP/AAADAAcAAAAbAPT/AAAAAAEAAAAbAPX/AAADAAcAAAAbAPb/AAADAAcAAAAbAPf/AAADAAcAAAAbAPj/AAADAAcAAAAbAPn/AAADAAcAAAAbAPr/AAADAAcAAAAbAPv/AAADAAcAAAAbAPz/AAAAAAEAAAAbAP3/AAADAAcAAAAbAP7/AAADAAcAAAAbAP//AAADAAkAAAAbAAAAAAACAAgAAAAbAAEAAAAFAAoAAAAbAAIAAAAIAAoAAAAbAAMAAAAHAAoAAAAbAAQAAAAAAAAAAAAbAAUAAAAFAAkAAAAbAAYAAAAAAAMAAAAbAAcAAAAAAAQAAAAbAAgAAAABAAcAAAAbAAkAAAABAAQAAAAbAAoAAAABAAUAAAAbAAsAAAAAAAAAAAAbAAwAAAAAAAAAAAAbAA0AAAAAAAAAAAAbAA4AAAACAAYAAAAbAA8AAAADAAoAAAAbABAAAAADAAcAAAAbABEAAAACAAkAAAAbABIAAAAEAAgAAAAbABMAAAAIAAkAAAAbABQAAAAIAAoAAAAbABUAAAAHAAkAAAAbABYAAAAIAAkAAAAbABcAAAAFAAkAAAAbABgAAAAIAAoAAAAbABkAAAAAAAAAAAAbABoAAAAAAAAAAAAbABsAAAABAAMAAAAbABwAAAABAAQAAAAbAB0AAAAAAAYAAAAbAB4AAAACAAUAAAAbAB8AAAABAAMAAAAbACAAAAABAAQAAAAbACEAAAABAAQAAAAbACIAAAABAAUAAAAbACMAAAAHAAoAAAAbACQAAAAFAAkAAAAbACUAAAAHAAkAAAAbACYAAAAHAAoAAAAbACcAAAAFAAkAAAAbACgAAAAHAAkAAAAbACkAAAAFAAoAAAAbACoAAAAAAAAAAAAbACsAAAAIAAoAAAAbACwAAAAIAAoAAAAbAC0AAAAHAAkAAAAbAC4AAAAIAAkAAAAbAC8AAAAAAAAAAAAbADAAAAAFAAoAAAAbADEAAAAFAAkAAAAbADIAAAAFAAoAAAAbADMAAAAIAAkAAAAcAPD/AAADAAcAAAAcAPH/AAADAAcAAAAcAPL/AAADAAcAAAAcAPP/AAADAAcAAAAcAPT/AAADAAcAAAAcAPX/AAAAAAEAAAAcAPb/AAADAAcAAAAcAPf/AAADAAcAAAAcAPj/AAADAAcAAAAcAPn/AAADAAcAAAAcAPr/AAADAAcAAAAcAPv/AAADAAcAAAAcAPz/AAADAAcAAAAcAP3/AAADAAcAAAAcAP7/AAADAAcAAAAcAP//AAAAAAEAAAAcAAAAAAADAAkAAAAcAAEAAAACAAgAAAAcAAIAAAAFAAoAAAAcAAMAAAAAAAAAAAAcAAQAAAAFAAkAAAAcAAUAAAAIAAkAAAAcAAYAAAABAAMAAAAcAAcAAAABAAQAAAAcAAgAAAABAAQAAAAcAAkAAAAAAAYAAAAcAAoAAAACAAUAAAAcAAsAAAAAAAAAAAAcAAwAAAAAAAAAAAAcAA0AAAACAAYAAAAcAA4AAAADAAoAAAAcAA8AAAADAAcAAAAcABAAAAADAAcAAAAcABEAAAADAAgAAAAcABIAAAAFAAoAAAAcABMAAAAIAAoAAAAcABQAAAAFAAoAAAAcABUAAAAFAAkAAAAcABYAAAAHAAoAAAAcABcAAAAHAAkAAAAcABgAAAAIAAkAAAAcABkAAAAIAAkAAAAcABoAAAAAAAMAAAAcABsAAAABAAcAAAAcABwAAAABAAQAAAAcAB0AAAABAAUAAAAcAB4AAAAFAAoAAAAcAB8AAAABAAMAAAAcACAAAAABAAQAAAAcACEAAAABAAQAAAAcACIAAAABAAUAAAAcACMAAAAFAAkAAAAcACQAAAAIAAkAAAAcACUAAAAIAAkAAAAcACYAAAAHAAkAAAAcACcAAAAIAAkAAAAcACgAAAAIAAkAAAAcACkAAAAHAAkAAAAcACoAAAAAAAAAAAAcACsAAAAHAAkAAAAcACwAAAAFAAkAAAAcAC0AAAAAAAAAAAAcAC4AAAAIAAoAAAAcAC8AAAAHAAkAAAAcADAAAAAHAAoAAAAcADEAAAAIAAoAAAAcADIAAAAHAAoAAAAcADMAAAAIAAoAAAAdAPD/AAADAAcAAAAdAPH/AAADAAcAAAAdAPL/AAAAAAEAAAAdAPP/AAAAAAEAAAAdAPT/AAADAAcAAAAdAPX/AAADAAcAAAAdAPb/AAADAAcAAAAdAPf/AAAAAAEAAAAdAPj/AAAAAAEAAAAdAPn/AAADAAcAAAAdAPr/AAADAAcAAAAdAPv/AAAAAAEAAAAdAPz/AAADAAcAAAAdAP3/AAADAAcAAAAdAP7/AAADAAcAAAAdAP//AAADAAcAAAAdAAAAAAADAAcAAAAdAAEAAAADAAgAAAAdAAIAAAAHAAoAAAAdAAMAAAAHAAkAAAAdAAQAAAAHAAoAAAAdAAUAAAAFAAoAAAAdAAYAAAABAAMAAAAdAAcAAAABAAQAAAAdAAgAAAAAAAYAAAAdAAkAAAACAAUAAAAdAAoAAAAAAAAAAAAdAAsAAAAAAAAAAAAdAAwAAAAAAAAAAAAdAA0AAAADAAYAAAAdAA4AAAADAAcAAAAdAA8AAAADAAcAAAAdABAAAAACAAkAAAAdABEAAAAEAAgAAAAdABIAAAAHAAkAAAAdABMAAAAHAAkAAAAdABQAAAAFAAoAAAAdABUAAAAHAAkAAAAdABYAAAAHAAoAAAAdABcAAAAIAAkAAAAdABgAAAAHAAkAAAAdABkAAAAAAAMAAAAdABoAAAABAAcAAAAdABsAAAABAAQAAAAdABwAAAABAAQAAAAdAB0AAAABAAUAAAAdAB4AAAAAAAAAAAAdAB8AAAABAAMAAAAdACAAAAABAAQAAAAdACEAAAABAAQAAAAdACIAAAABAAUAAAAdACMAAAAFAAkAAAAdACQAAAAIAAkAAAAdACUAAAAAAAAAAAAdACYAAAAHAAoAAAAdACcAAAAFAAkAAAAdACgAAAAIAAoAAAAdACkAAAAHAAoAAAAdACoAAAAFAAoAAAAdACsAAAAHAAoAAAAdACwAAAAIAAoAAAAdAC0AAAAAAAAAAAAdAC4AAAAIAAoAAAAdAC8AAAAHAAoAAAAdADAAAAAHAAkAAAAdADEAAAAIAAkAAAAdADIAAAAIAAoAAAAdADMAAAAFAAoAAAAeAPD/AAAAAAEAAAAeAPH/AAAAAAEAAAAeAPL/AAADAAcAAAAeAPP/AAADAAcAAAAeAPT/AAADAAcAAAAeAPX/AAAAAAEAAAAeAPb/AAADAAcAAAAeAPf/AAAAAAEAAAAeAPj/AAAAAAEAAAAeAPn/AAAAAAEAAAAeAPr/AAADAAcAAAAeAPv/AAADAAcAAAAeAPz/AAAAAAEAAAAeAP3/AAADAAcAAAAeAP7/AAAAAAEAAAAeAP//AAADAAcAAAAeAAAAAAADAAcAAAAeAAEAAAADAAgAAAAeAAIAAAAHAAkAAAAeAAMAAAAHAAkAAAAeAAQAAAAIAAoAAAAeAAUAAAAHAAkAAAAeAAYAAAABAAMAAAAeAAcAAAABAAQAAAAeAAgAAAABAAUAAAAeAAkAAAAAAAAAAAAeAAoAAAAAAAAAAAAeAAsAAAAAAAAAAAAeAAwAAAACAAYAAAAeAA0AAAADAAoAAAAeAA4AAAADAAcAAAAeAA8AAAACAAkAAAAeABAAAAAEAAgAAAAeABEAAAAFAAoAAAAeABIAAAAHAAoAAAAeABMAAAAIAAoAAAAeABQAAAAFAAkAAAAeABUAAAAAAAAAAAAeABYAAAAIAAkAAAAeABcAAAAIAAkAAAAeABgAAAAAAAMAAAAeABkAAAABAAcAAAAeABoAAAABAAQAAAAeABsAAAABAAQAAAAeABwAAAAAAAYAAAAeAB0AAAACAAUAAAAeAB4AAAAFAAoAAAAeAB8AAAABAAMAAAAeACAAAAABAAQAAAAeACEAAAABAAQAAAAeACIAAAABAAUAAAAeACMAAAAFAAkAAAAeACQAAAAIAAoAAAAeACUAAAAIAAkAAAAeACYAAAAHAAkAAAAeACcAAAAIAAoAAAAeACgAAAAHAAkAAAAeACkAAAAFAAkAAAAeACoAAAAFAAkAAAAeACsAAAAHAAkAAAAeACwAAAAHAAoAAAAeAC0AAAAIAAkAAAAeAC4AAAAAAAAAAAAeAC8AAAAHAAoAAAAeADAAAAAFAAkAAAAeADEAAAAIAAoAAAAeADIAAAAIAAoAAAAeADMAAAAHAAkAAAAfAPD/AAADAAcAAAAfAPH/AAAAAAEAAAAfAPL/AAADAAcAAAAfAPP/AAADAAcAAAAfAPT/AAADAAcAAAAfAPX/AAAAAAEAAAAfAPb/AAADAAcAAAAfAPf/AAAAAAEAAAAfAPj/AAADAAcAAAAfAPn/AAAAAAEAAAAfAPr/AAADAAcAAAAfAPv/AAADAAcAAAAfAPz/AAADAAcAAAAfAP3/AAADAAcAAAAfAP7/AAADAAcAAAAfAP//AAAAAAEAAAAfAAAAAAADAAcAAAAfAAEAAAADAAgAAAAfAAIAAAAFAAoAAAAfAAMAAAAFAAoAAAAfAAQAAAAIAAoAAAAfAAUAAAAHAAkAAAAfAAYAAAABAAMAAAAfAAcAAAABAAQAAAAfAAgAAAABAAUAAAAfAAkAAAAAAAAAAAAfAAoAAAAAAAAAAAAfAAsAAAAAAAAAAAAfAAwAAAADAAYAAAAfAA0AAAADAAcAAAAfAA4AAAADAAcAAAAfAA8AAAADAAgAAAAfABAAAAAFAAkAAAAfABEAAAAFAAkAAAAfABIAAAAIAAkAAAAfABMAAAAHAAkAAAAfABQAAAAAAAAAAAAfABUAAAAAAAAAAAAfABYAAAAIAAkAAAAfABcAAAAAAAAAAAAfABgAAAABAAMAAAAfABkAAAABAAQAAAAfABoAAAABAAQAAAAfABsAAAAAAAYAAAAfABwAAAACAAUAAAAfAB0AAAAAAAAAAAAfAB4AAAAFAAoAAAAfAB8AAAABAAMAAAAfACAAAAABAAQAAAAfACEAAAABAAQAAAAfACIAAAABAAUAAAAfACMAAAAFAAkAAAAfACQAAAAAAAAAAAAfACUAAAAAAAAAAAAfACYAAAAHAAkAAAAfACcAAAAHAAoAAAAfACgAAAAIAAkAAAAfACkAAAAIAAoAAAAfACoAAAAIAAoAAAAfACsAAAAHAAkAAAAfACwAAAAHAAoAAAAfAC0AAAAFAAoAAAAfAC4AAAAHAAoAAAAfAC8AAAAIAAkAAAAfADAAAAAIAAoAAAAfADEAAAAHAAkAAAAfADIAAAAFAAkAAAAfADMAAAAHAAkAAAAgAPD/AAADAAcAAAAgAPH/AAAAAAEAAAAgAPL/AAADAAcAAAAgAPP/AAADAAcAAAAgAPT/AAADAAcAAAAgAPX/AAAAAAEAAAAgAPb/AAADAAcAAAAgAPf/AAADAAcAAAAgAPj/AAADAAcAAAAgAPn/AAAAAAEAAAAgAPr/AAAAAAEAAAAgAPv/AAADAAcAAAAgAPz/AAAAAAEAAAAgAP3/AAADAAcAAAAgAP7/AAADAAcAAAAgAP//AAAAAAEAAAAgAAAAAAADAAcAAAAgAAEAAAADAAgAAAAgAAIAAAAFAAkAAAAgAAMAAAAFAAkAAAAgAAQAAAAIAAkAAAAgAAUAAAAIAAkAAAAgAAYAAAABAAMAAAAgAAcAAAABAAQAAAAgAAgAAAABAAYAAAAgAAkAAAAAAAUAAAAgAAoAAAAAAAAAAAAgAAsAAAAAAAAAAAAgAAwAAAADAAYAAAAgAA0AAAADAAcAAAAgAA4AAAACAAkAAAAgAA8AAAAEAAgAAAAgABAAAAAFAAoAAAAgABEAAAAAAAAAAAAgABIAAAAHAAkAAAAgABMAAAAIAAoAAAAgABQAAAAIAAoAAAAgABUAAAAFAAoAAAAgABYAAAAAAAAAAAAgABcAAAAAAAMAAAAgABgAAAABAAcAAAAgABkAAAABAAQAAAAgABoAAAAAAAYAAAAgABsAAAACAAUAAAAgABwAAAAFAAkAAAAgAB0AAAAFAAoAAAAgAB4AAAAHAAoAAAAgAB8AAAABAAMAAAAgACAAAAABAAQAAAAgACEAAAABAAQAAAAgACIAAAABAAUAAAAgACMAAAAHAAkAAAAgACQAAAAIAAkAAAAgACUAAAAFAAkAAAAgACYAAAAFAAkAAAAgACcAAAAFAAoAAAAgACgAAAAHAAoAAAAgACkAAAAHAAoAAAAgACoAAAAFAAkAAAAgACsAAAAIAAkAAAAgACwAAAAFAAkAAAAgAC0AAAAAAAAAAAAgAC4AAAAIAAoAAAAgAC8AAAAIAAoAAAAgADAAAAAFAAkAAAAgADEAAAAFAAoAAAAgADIAAAAIAAoAAAAgADMAAAAFAAoAAAAhAPD/AAADAAcAAAAhAPH/AAADAAcAAAAhAPL/AAADAAcAAAAhAPP/AAAAAAEAAAAhAPT/AAADAAcAAAAhAPX/AAAAAAEAAAAhAPb/AAADAAcAAAAhAPf/AAAAAAEAAAAhAPj/AAADAAcAAAAhAPn/AAADAAcAAAAhAPr/AAADAAcAAAAhAPv/AAADAAcAAAAhAPz/AAADAAcAAAAhAP3/AAADAAcAAAAhAP7/AAADAAcAAAAhAP//AAADAAcAAAAhAAAAAAADAAcAAAAhAAEAAAADAAgAAAAhAAIAAAAFAAkAAAAhAAMAAAAIAAoAAAAhAAQAAAAHAAoAAAAhAAUAAAAAAAAAAAAhAAYAAAABAAMAAAAhAAcAAAABAAQAAAAhAAgAAAABAAQAAAAhAAkAAAABAAUAAAAhAAoAAAAAAAAAAAAhAAsAAAAAAAAAAAAhAAwAAAADAAYAAAAhAA0AAAADAAcAAAAhAA4AAAADAAgAAAAhAA8AAAAIAAoAAAAhABAAAAAHAAkAAAAhABEAAAAIAAoAAAAhABIAAAAHAAoAAAAhABMAAAAFAAoAAAAhABQAAAAHAAoAAAAhABUAAAAFAAkAAAAhABYAAAAAAAMAAAAhABcAAAABAAcAAAAhABgAAAABAAQAAAAhABkAAAAAAAYAAAAhABoAAAACAAUAAAAhABsAAAAIAAkAAAAhABwAAAAIAAoAAAAhAB0AAAAIAAkAAAAhAB4AAAAIAAoAAAAhAB8AAAABAAMAAAAhACAAAAABAAQAAAAhACEAAAABAAQAAAAhACIAAAABAAUAAAAhACMAAAAIAAkAAAAhACQAAAAFAAoAAAAhACUAAAAFAAoAAAAhACYAAAAFAAoAAAAhACcAAAAHAAoAAAAhACgAAAAAAAAAAAAhACkAAAAHAAkAAAAhACoAAAAHAAoAAAAhACsAAAAAAAAAAAAhACwAAAAIAAoAAAAhAC0AAAAHAAoAAAAhAC4AAAAHAAkAAAAhAC8AAAAAAAAAAAAhADAAAAAHAAoAAAAhADEAAAAFAAkAAAAhADIAAAAFAAkAAAAhADMAAAAIAAoAAAAiAPD/AAADAAcAAAAiAPH/AAADAAcAAAAiAPL/AAADAAcAAAAiAPP/AAADAAcAAAAiAPT/AAAAAAEAAAAiAPX/AAADAAcAAAAiAPb/AAADAAcAAAAiAPf/AAAAAAEAAAAiAPj/AAADAAcAAAAiAPn/AAADAAcAAAAiAPr/AAAAAAEAAAAiAPv/AAADAAcAAAAiAPz/AAADAAcAAAAiAP3/AAADAAcAAAAiAP7/AAADAAcAAAAiAP//AAADAAcAAAAiAAAAAAAAAAEAAAAiAAEAAAADAAgAAAAiAAIAAAAIAAoAAAAiAAMAAAAAAAAAAAAiAAQAAAAIAAkAAAAiAAUAAAAFAAoAAAAiAAYAAAABAAMAAAAiAAcAAAABAAQAAAAiAAgAAAABAAQAAAAiAAkAAAABAAUAAAAiAAoAAAAAAAAAAAAiAAsAAAACAAYAAAAiAAwAAAADAAoAAAAiAA0AAAADAAcAAAAiAA4AAAADAAgAAAAiAA8AAAAFAAkAAAAiABAAAAAHAAoAAAAiABEAAAAFAAkAAAAiABIAAAAIAAkAAAAiABMAAAAIAAoAAAAiABQAAAAHAAkAAAAiABUAAAAAAAAAAAAiABYAAAABAAMAAAAiABcAAAABAAQAAAAiABgAAAABAAQAAAAiABkAAAABAAUAAAAiABoAAAAHAAkAAAAiABsAAAAFAAoAAAAiABwAAAAFAAkAAAAiAB0AAAAFAAoAAAAiAB4AAAAIAAoAAAAiAB8AAAABAAMAAAAiACAAAAABAAQAAAAiACEAAAABAAQAAAAiACIAAAABAAUAAAAiACMAAAAHAAoAAAAiACQAAAAHAAoAAAAiACUAAAAHAAoAAAAiACYAAAAFAAoAAAAiACcAAAAFAAkAAAAiACgAAAAIAAoAAAAiACkAAAAFAAkAAAAiACoAAAAAAAAAAAAiACsAAAAIAAoAAAAiACwAAAAAAAAAAAAiAC0AAAAHAAoAAAAiAC4AAAAFAAkAAAAiAC8AAAAFAAoAAAAiADAAAAAFAAkAAAAiADEAAAAHAAkAAAAiADIAAAAFAAoAAAAiADMAAAAFAAkAAAAjAPD/AAADAAcAAAAjAPH/AAADAAcAAAAjAPL/AAAAAAEAAAAjAPP/AAADAAcAAAAjAPT/AAAAAAEAAAAjAPX/AAAAAAEAAAAjAPb/AAADAAcAAAAjAPf/AAADAAcAAAAjAPj/AAADAAcAAAAjAPn/AAADAAcAAAAjAPr/AAADAAcAAAAjAPv/AAAAAAEAAAAjAPz/AAADAAcAAAAjAP3/AAADAAcAAAAjAP7/AAADAAcAAAAjAP//AAADAAcAAAAjAAAAAAADAAcAAAAjAAEAAAADAAgAAAAjAAIAAAAHAAoAAAAjAAMAAAAHAAkAAAAjAAQAAAAIAAkAAAAjAAUAAAAIAAkAAAAjAAYAAAACAAMAAAAjAAcAAAAAAAcAAAAjAAgAAAABAAQAAAAjAAkAAAABAAUAAAAjAAoAAAACAAcAAAAjAAsAAAADAAoAAAAjAAwAAAADAAcAAAAjAA0AAAADAAcAAAAjAA4AAAALAA0AAAAjAA8AAAAAAAQAAAAjABAAAAAAAAQAAAAjABEAAAAAAAUAAAAjABIAAAAFAAkAAAAjABMAAAAIAAkAAAAjABQAAAAIAAkAAAAjABUAAAAHAAkAAAAjABYAAAABAAMAAAAjABcAAAABAAQAAAAjABgAAAAAAAYAAAAjABkAAAACAAUAAAAjABoAAAAFAAkAAAAjABsAAAAHAAkAAAAjABwAAAAFAAkAAAAjAB0AAAAHAAoAAAAjAB4AAAAIAAoAAAAjAB8AAAABAAMAAAAjACAAAAABAAQAAAAjACEAAAABAAQAAAAjACIAAAABAAUAAAAjACMAAAAAAAAAAAAjACQAAAAAAAAAAAAjACUAAAAHAAkAAAAjACYAAAAAAAAAAAAjACcAAAAFAAoAAAAjACgAAAAHAAoAAAAjACkAAAAFAAoAAAAjACoAAAAIAAoAAAAjACsAAAAIAAoAAAAjACwAAAAFAAoAAAAjAC0AAAAFAAkAAAAjAC4AAAAHAAoAAAAjAC8AAAAFAAoAAAAjADAAAAAHAAoAAAAjADEAAAAIAAoAAAAjADIAAAAIAAkAAAAjADMAAAAFAAkAAAAkAPD/AAADAAcAAAAkAPH/AAADAAcAAAAkAPL/AAADAAcAAAAkAPP/AAAAAAEAAAAkAPT/AAAAAAEAAAAkAPX/AAADAAcAAAAkAPb/AAADAAcAAAAkAPf/AAAAAAEAAAAkAPj/AAADAAcAAAAkAPn/AAADAAcAAAAkAPr/AAADAAcAAAAkAPv/AAADAAcAAAAkAPz/AAADAAcAAAAkAP3/AAADAAcAAAAkAP7/AAADAAcAAAAkAP//AAADAAcAAAAkAAAAAAADAAcAAAAkAAEAAAADAAgAAAAkAAIAAAAHAAkAAAAkAAMAAAAAAAAAAAAkAAQAAAAIAAkAAAAkAAUAAAAIAAoAAAAkAAYAAAAIAAkAAAAkAAcAAAABAAMAAAAkAAgAAAABAAQAAAAkAAkAAAAQAAYAAAAkAAwAAAAAAAEAAAAkAA0AAAAAAAEAAAAkAA4AAAAQAAgAAAAkAA8AAAABAAQAAAAkABAAAAABAAQAAAAkABEAAAABAAYAAAAkABIAAAAAAAUAAAAkABMAAAAFAAoAAAAkABQAAAAFAAoAAAAkABUAAAAIAAkAAAAkABYAAAABAAMAAAAkABcAAAABAAQAAAAkABgAAAABAAUAAAAkABkAAAAFAAkAAAAkABoAAAAAAAAAAAAkABsAAAAHAAkAAAAkABwAAAAFAAoAAAAkAB0AAAAIAAoAAAAkAB4AAAAHAAoAAAAkAB8AAAABAAMAAAAkACAAAAABAAQAAAAkACEAAAABAAQAAAAkACIAAAABAAUAAAAkACMAAAAHAAkAAAAkACQAAAAHAAkAAAAkACUAAAAAAAAAAAAkACYAAAAIAAkAAAAkACcAAAAIAAoAAAAkACgAAAAHAAoAAAAkACkAAAAFAAoAAAAkACoAAAAHAAoAAAAkACsAAAAFAAoAAAAkACwAAAAHAAoAAAAkAC0AAAAHAAkAAAAkAC4AAAAFAAkAAAAkAC8AAAAIAAoAAAAkADAAAAAIAAoAAAAkADEAAAAHAAkAAAAkADIAAAAFAAoAAAAkADMAAAAIAAoAAAAlAPD/AAADAAcAAAAlAPH/AAADAAcAAAAlAPL/AAADAAcAAAAlAPP/AAAAAAEAAAAlAPT/AAADAAcAAAAlAPX/AAADAAcAAAAlAPb/AAADAAcAAAAlAPf/AAADAAcAAAAlAPj/AAADAAcAAAAlAPn/AAADAAcAAAAlAPr/AAADAAcAAAAlAPv/AAADAAcAAAAlAPz/AAADAAcAAAAlAP3/AAADAAcAAAAlAP7/AAADAAcAAAAlAP//AAADAAcAAAAlAAAAAAACAAkAAAAlAAEAAAAEAAgAAAAlAAIAAAAHAAoAAAAlAAMAAAAIAAkAAAAlAAQAAAAFAAoAAAAlAAUAAAAFAAkAAAAlAAYAAAAAAAAAAAAlAAcAAAABAAMAAAAlAAgAAAABAAQAAAAlAAkAAAAQAAYAAAAlAA0AAAADAAcAAAAlAA4AAAAQAAgAAAAlAA8AAAABAAQAAAAlABAAAAABAAQAAAAlABEAAAABAAQAAAAlABIAAAABAAYAAAAlABMAAAAAAAQAAAAlABQAAAAAAAUAAAAlABUAAAAAAAMAAAAlABYAAAABAAcAAAAlABcAAAABAAQAAAAlABgAAAABAAUAAAAlABkAAAAHAAkAAAAlABoAAAAFAAoAAAAlABsAAAAIAAoAAAAlABwAAAAIAAkAAAAlAB0AAAAIAAkAAAAlAB4AAAAHAAkAAAAlAB8AAAABAAMAAAAlACAAAAABAAQAAAAlACEAAAABAAQAAAAlACIAAAABAAUAAAAlACMAAAAHAAoAAAAlACQAAAAIAAkAAAAlACUAAAAHAAkAAAAlACYAAAAIAAoAAAAlACcAAAAFAAoAAAAlACgAAAAFAAoAAAAlACkAAAAFAAoAAAAlACoAAAAIAAkAAAAlACsAAAAHAAkAAAAlACwAAAAHAAoAAAAlAC0AAAAFAAoAAAAlAC4AAAAIAAkAAAAlAC8AAAAHAAoAAAAlADAAAAAIAAkAAAAlADEAAAAHAAkAAAAlADIAAAAIAAkAAAAlADMAAAAFAAkAAAAmAPD/AAADAAcAAAAmAPH/AAADAAcAAAAmAPL/AAADAAcAAAAmAPP/AAADAAcAAAAmAPT/AAAAAAEAAAAmAPX/AAADAAcAAAAmAPb/AAAAAAEAAAAmAPf/AAADAAcAAAAmAPj/AAADAAcAAAAmAPn/AAAAAAEAAAAmAPr/AAAAAAEAAAAmAPv/AAADAAcAAAAmAPz/AAADAAcAAAAmAP3/AAADAAcAAAAmAP7/AAADAAcAAAAmAP//AAACAAkAAAAmAAAAAAAEAAgAAAAmAAEAAAAFAAoAAAAmAAIAAAAFAAkAAAAmAAMAAAAFAAkAAAAmAAQAAAAIAAkAAAAmAAUAAAAIAAkAAAAmAAYAAAAHAAkAAAAmAAcAAAABAAMAAAAmAAgAAAABAAQAAAAmAAkAAAAQAAYAAAAmAA0AAAADAAcAAAAmAA4AAAAKAA0AAAAmAA8AAAACAAQAAAAmABAAAAAAAAcAAAAmABEAAAABAAQAAAAmABIAAAABAAQAAAAmABMAAAABAAQAAAAmABQAAAABAAYAAAAmABUAAAABAAcAAAAmABYAAAABAAQAAAAmABcAAAABAAQAAAAmABgAAAABAAUAAAAmABkAAAAFAAoAAAAmABoAAAAHAAkAAAAmABsAAAAIAAoAAAAmABwAAAAFAAoAAAAmAB0AAAAFAAkAAAAmAB4AAAAAAAAAAAAmAB8AAAABAAMAAAAmACAAAAABAAQAAAAmACEAAAABAAQAAAAmACIAAAABAAUAAAAmACMAAAAIAAoAAAAmACQAAAAIAAoAAAAmACUAAAAFAAoAAAAmACYAAAAFAAoAAAAmACcAAAAIAAoAAAAmACgAAAAIAAoAAAAmACkAAAAAAAAAAAAmACoAAAAHAAkAAAAmACsAAAAHAAoAAAAmACwAAAAAAAAAAAAmAC0AAAAFAAkAAAAmAC4AAAAFAAoAAAAmAC8AAAAFAAkAAAAmADAAAAAHAAkAAAAmADEAAAAHAAoAAAAmADIAAAAHAAkAAAAmADMAAAAIAAkAAAAnAPD/AAADAAcAAAAnAPH/AAADAAcAAAAnAPL/AAADAAcAAAAnAPP/AAAAAAEAAAAnAPT/AAAAAAEAAAAnAPX/AAADAAcAAAAnAPb/AAADAAcAAAAnAPf/AAADAAcAAAAnAPj/AAADAAcAAAAnAPn/AAADAAcAAAAnAPr/AAADAAcAAAAnAPv/AAADAAcAAAAnAPz/AAADAAcAAAAnAP3/AAADAAcAAAAnAP7/AAADAAcAAAAnAP//AAADAAgAAAAnAAAAAAAAAAAAAAAnAAEAAAAHAAkAAAAnAAIAAAAAAAAAAAAnAAMAAAAIAAkAAAAnAAQAAAAHAAoAAAAnAAUAAAAAAAAAAAAnAAYAAAAAAAMAAAAnAAcAAAABAAcAAAAnAAgAAAABAAQAAAAnAAkAAAAQAAYAAAAnAAwAAAAAAAEAAAAnAA0AAAACAAkAAAAnAA4AAAAEAAgAAAAnAA8AAAAAAAAAAAAnABAAAAACAAMAAAAnABEAAAACAAQAAAAnABIAAAAAAAcAAAAnABMAAAABAAQAAAAnABQAAAABAAQAAAAnABUAAAABAAQAAAAnABYAAAABAAQAAAAnABcAAAAAAAYAAAAnABgAAAACAAUAAAAnABkAAAAFAAkAAAAnABoAAAAIAAkAAAAnABsAAAAFAAkAAAAnABwAAAAHAAoAAAAnAB0AAAAFAAoAAAAnAB4AAAAIAAkAAAAnAB8AAAABAAMAAAAnACAAAAABAAQAAAAnACEAAAABAAQAAAAnACIAAAABAAUAAAAnACMAAAAAAAAAAAAnACQAAAAHAAkAAAAnACUAAAAFAAoAAAAnACYAAAAHAAkAAAAnACcAAAAAAAAAAAAnACgAAAAFAAkAAAAnACkAAAAFAAoAAAAnACoAAAAHAAkAAAAnACsAAAAIAAoAAAAnACwAAAAAAAAAAAAnAC0AAAAIAAkAAAAnAC4AAAAAAAAAAAAnAC8AAAAIAAkAAAAnADAAAAAIAAkAAAAnADEAAAAFAAoAAAAnADIAAAAHAAoAAAAnADMAAAAAAAAAAAAoAPD/AAADAAcAAAAoAPH/AAAAAAEAAAAoAPL/AAADAAcAAAAoAPP/AAADAAcAAAAoAPT/AAADAAcAAAAoAPX/AAADAAcAAAAoAPb/AAADAAcAAAAoAPf/AAADAAcAAAAoAPj/AAAAAAEAAAAoAPn/AAAAAAEAAAAoAPr/AAAAAAEAAAAoAPv/AAADAAcAAAAoAPz/AAADAAcAAAAoAP3/AAAAAAEAAAAoAP7/AAADAAcAAAAoAP//AAADAAgAAAAoAAAAAAAIAAoAAAAoAAEAAAAHAAkAAAAoAAIAAAAFAAkAAAAoAAMAAAAAAAMAAAAoAAQAAAAAAAQAAAAoAAUAAAAAAAQAAAAoAAYAAAABAAcAAAAoAAcAAAABAAQAAAAoAAgAAAAPAAYAAAAoAAkAAAAQAAoAAAAoAAoAAAAAAAEAAAAoAAwAAAADAAcAAAAoAA0AAAADAAgAAAAoAA4AAAAHAAkAAAAoAA8AAAAFAAkAAAAoABAAAAAFAAoAAAAoABEAAAAFAAoAAAAoABIAAAACAAMAAAAoABMAAAACAAQAAAAoABQAAAACAAQAAAAoABUAAAACAAQAAAAoABYAAAACAAQAAAAoABcAAAACAAUAAAAoABgAAAAFAAkAAAAoABkAAAAIAAkAAAAoABoAAAAFAAkAAAAoABsAAAAFAAkAAAAoABwAAAAIAAoAAAAoAB0AAAAIAAkAAAAoAB4AAAAIAAkAAAAoAB8AAAABAAMAAAAoACAAAAABAAQAAAAoACEAAAABAAQAAAAoACIAAAABAAUAAAAoACMAAAAIAAkAAAAoACQAAAAFAAkAAAAoACUAAAAFAAkAAAAoACYAAAAIAAkAAAAoACcAAAAHAAoAAAAoACgAAAAAAAAAAAAoACkAAAAHAAoAAAAoACoAAAAIAAoAAAAoACsAAAAFAAoAAAAoACwAAAAHAAkAAAAoAC0AAAAIAAkAAAAoAC4AAAAHAAoAAAAoAC8AAAAFAAkAAAAoADAAAAAHAAkAAAAoADEAAAAHAAkAAAAoADIAAAAFAAoAAAAoADMAAAAFAAkAAAApAPD/AAAAAAEAAAApAPH/AAAAAAEAAAApAPL/AAADAAcAAAApAPP/AAADAAcAAAApAPT/AAADAAcAAAApAPX/AAADAAcAAAApAPb/AAADAAcAAAApAPf/AAADAAcAAAApAPr/AAADAAcAAAApAPv/AAADAAcAAAApAPz/AAADAAcAAAApAP3/AAADAAcAAAApAP7/AAADAAcAAAApAP//AAADAAkAAAApAAAAAAACAAgAAAApAAEAAAAFAAoAAAApAAIAAAAAAAAAAAApAAMAAAABAAMAAAApAAQAAAABAAQAAAApAAUAAAABAAQAAAApAAYAAAABAAQAAAApAAcAAAABAAQAAAApAAgAAAAQAAYAAAApAAkAAAAAAAEAAAApAAoAAAADAAcAAAApAAsAAAACAAkAAAApAAwAAAAEAAcAAAApAA0AAAAEAAgAAAApAA4AAAAIAAkAAAApAA8AAAAIAAoAAAApABAAAAAAAAAAAAApABEAAAAIAAkAAAApABIAAAAFAAoAAAApABMAAAAAAAAAAAApABQAAAAIAAkAAAApABUAAAAIAAoAAAApABYAAAAIAAkAAAApABcAAAAIAAoAAAApABgAAAAAAAAAAAApABkAAAAFAAoAAAApABoAAAAIAAkAAAApABsAAAAHAAoAAAApABwAAAAAAAAAAAApAB0AAAAHAAkAAAApAB4AAAAFAAoAAAApAB8AAAABAAMAAAApACAAAAABAAQAAAApACEAAAABAAQAAAApACIAAAABAAUAAAApACMAAAAIAAoAAAApACQAAAAIAAoAAAApACUAAAAFAAkAAAApACYAAAAIAAoAAAApACcAAAAFAAoAAAApACgAAAAHAAoAAAApACkAAAAFAAoAAAApACoAAAAHAAoAAAApACsAAAAHAAkAAAApACwAAAAIAAoAAAApAC0AAAAIAAkAAAApAC4AAAAHAAkAAAApAC8AAAAIAAkAAAApADAAAAAHAAoAAAApADEAAAAIAAoAAAApADIAAAAHAAkAAAApADMAAAAAAAAAAAAqAPD/AAADAAcAAAAqAPH/AAADAAcAAAAqAPL/AAADAAcAAAAqAPP/AAAAAAEAAAAqAPT/AAADAAcAAAAqAPX/AAADAAcAAAAqAPb/AAADAAcAAAAqAPf/AAADAAcAAAAqAPr/AAAAAAEAAAAqAPv/AAADAAcAAAAqAPz/AAADAAcAAAAqAP3/AAADAAcAAAAqAP7/AAADAAcAAAAqAP//AAAAAAEAAAAqAAAAAAADAAgAAAAqAAEAAAAFAAkAAAAqAAIAAAAFAAoAAAAqAAMAAAABAAMAAAAqAAQAAAABAAQAAAAqAAUAAAAAAAYAAAAqAAYAAAAAAAcAAAAqAAcAAAABAAQAAAAqAAgAAAAQAAYAAAAqAAkAAAADAAcAAAAqAAoAAAADAAcAAAAqAAsAAAADAAgAAAAqAAwAAAAAAAAAAAAqAA0AAAAFAAoAAAAqAA4AAAAHAAoAAAAqAA8AAAAFAAoAAAAqABAAAAAHAAoAAAAqABEAAAAAAAAAAAAqABIAAAAHAAkAAAAqABMAAAAIAAkAAAAqABQAAAAIAAkAAAAqABUAAAAFAAkAAAAqABYAAAAAAAAAAAAqABcAAAAHAAoAAAAqABgAAAAIAAkAAAAqABkAAAAHAAkAAAAqABoAAAAFAAkAAAAqABsAAAAFAAoAAAAqABwAAAAHAAkAAAAqAB0AAAAAAAAAAAAqAB4AAAAIAAoAAAAqAB8AAAABAAMAAAAqACAAAAABAAQAAAAqACEAAAABAAQAAAAqACIAAAABAAUAAAAqACMAAAAFAAoAAAAqACQAAAAIAAoAAAAqACUAAAAFAAkAAAAqACYAAAAAAAAAAAAqACcAAAAFAAkAAAAqACgAAAAIAAkAAAAqACkAAAAHAAoAAAAqACoAAAAFAAoAAAAqACsAAAAFAAoAAAAqACwAAAAFAAkAAAAqAC0AAAAHAAkAAAAqAC4AAAAIAAkAAAAqAC8AAAAFAAoAAAAqADAAAAAIAAoAAAAqADEAAAAAAAAAAAAqADIAAAAHAAkAAAAqADMAAAAIAAoAAAArAPD/AAADAAcAAAArAPH/AAADAAcAAAArAPL/AAADAAcAAAArAPP/AAADAAcAAAArAPT/AAAAAAEAAAArAPX/AAADAAcAAAArAPb/AAAAAAEAAAArAPf/AAADAAcAAAArAPj/AAAAAAEAAAArAPn/AAAAAAEAAAArAPr/AAADAAcAAAArAPv/AAAAAAEAAAArAPz/AAADAAcAAAArAP3/AAAAAAEAAAArAP7/AAADAAcAAAArAP//AAADAAcAAAArAAAAAAADAAkAAAArAAEAAAACAAgAAAArAAIAAAAIAAkAAAArAAMAAAABAAMAAAArAAQAAAABAAQAAAArAAUAAAABAAYAAAArAAYAAAABAAcAAAArAAcAAAAPAAYAAAArAAgAAAAQAAoAAAArAAkAAAADAAcAAAArAAoAAAACAAkAAAArAAsAAAAEAAgAAAArAAwAAAAHAAoAAAArAA0AAAAHAAoAAAArAA4AAAAFAAoAAAArAA8AAAAFAAoAAAArABAAAAAHAAkAAAArABEAAAAIAAkAAAArABIAAAAAAAAAAAArABMAAAAAAAAAAAArABQAAAAIAAkAAAArABUAAAAAAAAAAAArABYAAAAAAAAAAAArABcAAAAHAAoAAAArABgAAAAAAAAAAAArABkAAAAHAAkAAAArABoAAAAAAAAAAAArABsAAAAHAAoAAAArABwAAAAFAAkAAAArAB0AAAAFAAoAAAArAB4AAAAIAAkAAAArAB8AAAABAAMAAAArACAAAAABAAQAAAArACEAAAABAAQAAAArACIAAAABAAUAAAArACMAAAAFAAoAAAArACQAAAAFAAoAAAArACUAAAAIAAoAAAArACYAAAAIAAoAAAArACcAAAAHAAkAAAArACgAAAAIAAoAAAArACkAAAAIAAkAAAArACoAAAAFAAoAAAArACsAAAAIAAkAAAArACwAAAAFAAoAAAArAC0AAAAFAAkAAAArAC4AAAAHAAoAAAArAC8AAAAHAAkAAAArADAAAAAHAAkAAAArADEAAAAFAAkAAAArADIAAAAFAAkAAAArADMAAAAFAAoAAAAsAPD/AAADAAcAAAAsAPH/AAADAAcAAAAsAPL/AAADAAcAAAAsAPP/AAAAAAEAAAAsAPT/AAADAAcAAAAsAPX/AAADAAcAAAAsAPb/AAADAAcAAAAsAPf/AAADAAcAAAAsAPj/AAADAAcAAAAsAPn/AAADAAcAAAAsAPr/AAAAAAEAAAAsAPv/AAADAAcAAAAsAPz/AAADAAcAAAAsAP3/AAADAAcAAAAsAP7/AAAAAAEAAAAsAP//AAAAAAEAAAAsAAAAAAADAAcAAAAsAAEAAAADAAgAAAAsAAIAAAAIAAoAAAAsAAMAAAABAAMAAAAsAAQAAAABAAQAAAAsAAUAAAABAAQAAAAsAAYAAAAPAAYAAAAsAAcAAAAQAAoAAAAsAAgAAAADAAcAAAAsAAkAAAADAAcAAAAsAAoAAAADAAgAAAAsAAsAAAAFAAoAAAAsAAwAAAAHAAkAAAAsAA0AAAAFAAkAAAAsAA4AAAAIAAkAAAAsAA8AAAAIAAkAAAAsABAAAAAFAAoAAAAsABEAAAAFAAoAAAAsABIAAAAAAAAAAAAsABMAAAAFAAkAAAAsABQAAAAFAAoAAAAsABUAAAAHAAkAAAAsABYAAAAHAAoAAAAsABcAAAAIAAoAAAAsABgAAAAFAAoAAAAsABkAAAAAAAAAAAAsABoAAAAIAAoAAAAsABsAAAAFAAkAAAAsABwAAAAFAAkAAAAsAB0AAAAHAAoAAAAsAB4AAAAAAAAAAAAsAB8AAAABAAMAAAAsACAAAAABAAQAAAAsACEAAAABAAQAAAAsACIAAAABAAUAAAAsACMAAAAAAAAAAAAsACQAAAAIAAoAAAAsACUAAAAHAAkAAAAsACYAAAAFAAoAAAAsACcAAAAFAAkAAAAsACgAAAAFAAkAAAAsACkAAAAFAAkAAAAsACoAAAAAAAAAAAAsACsAAAAFAAoAAAAsACwAAAAFAAoAAAAsAC0AAAAHAAoAAAAsAC4AAAAIAAoAAAAsAC8AAAAHAAoAAAAsADAAAAAFAAoAAAAsADEAAAAFAAkAAAAsADIAAAAHAAkAAAAsADMAAAAIAAkAAAAtAPD/AAADAAcAAAAtAPH/AAADAAcAAAAtAPL/AAADAAcAAAAtAPP/AAADAAcAAAAtAPT/AAADAAcAAAAtAPX/AAADAAcAAAAtAPb/AAADAAcAAAAtAPf/AAADAAcAAAAtAPj/AAADAAcAAAAtAPn/AAADAAcAAAAtAPr/AAADAAcAAAAtAPv/AAADAAcAAAAtAPz/AAADAAcAAAAtAP3/AAAAAAEAAAAtAP7/AAADAAcAAAAtAP//AAADAAcAAAAtAAAAAAADAAcAAAAtAAEAAAADAAgAAAAtAAIAAAAHAAkAAAAtAAMAAAACAAMAAAAtAAQAAAACAAQAAAAtAAUAAAAAAAcAAAAtAAYAAAAQAAoAAAAtAAcAAAADAAcAAAAtAAgAAAADAAcAAAAtAAkAAAACAAkAAAAtAAoAAAAEAAgAAAAtAAsAAAAIAAkAAAAtAAwAAAAHAAkAAAAtAA0AAAAFAAkAAAAtAA4AAAAIAAoAAAAtAA8AAAAIAAkAAAAtABAAAAAFAAoAAAAtABEAAAAFAAoAAAAtABIAAAAHAAoAAAAtABMAAAAFAAkAAAAtABQAAAAHAAkAAAAtABUAAAAIAAkAAAAtABYAAAAHAAoAAAAtABcAAAAHAAkAAAAtABgAAAAAAAAAAAAtABkAAAAAAAAAAAAtABoAAAAHAAkAAAAtABsAAAAHAAkAAAAtABwAAAAAAAAAAAAtAB0AAAAFAAoAAAAtAB4AAAAHAAkAAAAtAB8AAAABAAMAAAAtACAAAAABAAQAAAAtACEAAAABAAQAAAAtACIAAAABAAUAAAAtACMAAAAFAAkAAAAtACQAAAAIAAkAAAAtACUAAAAFAAoAAAAtACYAAAAHAAoAAAAtACcAAAAFAAoAAAAtACgAAAAIAAoAAAAtACkAAAAHAAoAAAAtACoAAAAHAAoAAAAtACsAAAAAAAAAAAAtACwAAAAFAAkAAAAtAC0AAAAHAAoAAAAtAC4AAAAHAAoAAAAtAC8AAAAHAAkAAAAtADAAAAAFAAkAAAAtADEAAAAIAAoAAAAtADIAAAAIAAoAAAAtADMAAAAIAAkAAAAuAPD/AAADAAcAAAAuAPH/AAADAAcAAAAuAPL/AAADAAcAAAAuAPP/AAADAAcAAAAuAPT/AAAAAAEAAAAuAPX/AAADAAcAAAAuAPb/AAAAAAEAAAAuAPf/AAADAAcAAAAuAPj/AAADAAcAAAAuAPn/AAAAAAEAAAAuAPr/AAADAAcAAAAuAPv/AAAAAAEAAAAuAPz/AAADAAcAAAAuAP3/AAADAAcAAAAuAP7/AAADAAcAAAAuAP//AAADAAcAAAAuAAAAAAADAAcAAAAuAAEAAAADAAgAAAAuAAIAAAAIAAoAAAAuAAMAAAACAAYAAAAuAAQAAAACAAcAAAAuAAUAAAAAAAEAAAAuAAYAAAADAAcAAAAuAAcAAAADAAcAAAAuAAgAAAACAAkAAAAuAAkAAAAEAAgAAAAuAAoAAAAIAAoAAAAuAAsAAAAIAAkAAAAuAAwAAAAFAAoAAAAuAA0AAAAHAAoAAAAuAA4AAAAHAAoAAAAuAA8AAAAIAAoAAAAuABAAAAAFAAkAAAAuABEAAAAIAAoAAAAuABIAAAAIAAoAAAAuABMAAAAFAAkAAAAuABQAAAAIAAkAAAAuABUAAAAIAAkAAAAuABYAAAAIAAoAAAAuABcAAAAHAAkAAAAuABgAAAAFAAoAAAAuABkAAAAIAAoAAAAuABoAAAAAAAAAAAAuABsAAAAFAAkAAAAuABwAAAAIAAoAAAAuAB0AAAAHAAoAAAAuAB4AAAAFAAkAAAAuAB8AAAABAAMAAAAuACAAAAABAAQAAAAuACEAAAABAAQAAAAuACIAAAABAAYAAAAuACMAAAAAAAQAAAAuACQAAAAAAAQAAAAuACUAAAAAAAQAAAAuACYAAAAAAAQAAAAuACcAAAAAAAQAAAAuACgAAAAAAAQAAAAuACkAAAAAAAQAAAAuACoAAAAAAAQAAAAuACsAAAAAAAQAAAAuACwAAAAAAAQAAAAuAC0AAAAAAAQAAAAuAC4AAAAAAAQAAAAuAC8AAAAAAAQAAAAuADAAAAAAAAQAAAAuADEAAAAAAAQAAAAuADIAAAAAAAQAAAAuADMAAAALAA4AAAAvAPD/AAADAAcAAAAvAPH/AAADAAcAAAAvAPL/AAAAAAEAAAAvAPP/AAAAAAEAAAAvAPT/AAADAAcAAAAvAPX/AAADAAcAAAAvAPb/AAADAAcAAAAvAPf/AAADAAcAAAAvAPj/AAADAAcAAAAvAPn/AAADAAcAAAAvAPr/AAADAAcAAAAvAPv/AAAAAAEAAAAvAPz/AAAAAAEAAAAvAP3/AAADAAcAAAAvAP7/AAADAAcAAAAvAP//AAADAAcAAAAvAAAAAAAAAAEAAAAvAAEAAAADAAkAAAAvAAIAAAACAAcAAAAvAAMAAAADAAoAAAAvAAQAAAADAAcAAAAvAAUAAAADAAcAAAAvAAYAAAACAAkAAAAvAAcAAAAEAAcAAAAvAAgAAAAEAAgAAAAvAAkAAAAFAAkAAAAvAAoAAAAHAAkAAAAvAAsAAAAIAAkAAAAvAAwAAAAIAAoAAAAvAA0AAAAAAAAAAAAvAA4AAAAFAAkAAAAvAA8AAAAFAAkAAAAvABAAAAAFAAkAAAAvABEAAAAFAAoAAAAvABIAAAAHAAoAAAAvABMAAAAHAAoAAAAvABQAAAAFAAkAAAAvABUAAAAIAAkAAAAvABYAAAAIAAkAAAAvABcAAAAFAAoAAAAvABgAAAAFAAoAAAAvABkAAAAHAAkAAAAvABoAAAAIAAoAAAAvABsAAAAIAAkAAAAvABwAAAAHAAkAAAAvAB0AAAAIAAkAAAAvAB4AAAAIAAoAAAAvAB8AAAABAAMAAAAvACAAAAABAAQAAAAvACEAAAABAAQAAAAvACIAAAABAAQAAAAvACMAAAABAAQAAAAvACQAAAABAAQAAAAvACUAAAABAAQAAAAvACYAAAABAAQAAAAvACcAAAABAAQAAAAvACgAAAABAAQAAAAvACkAAAABAAQAAAAvACoAAAABAAQAAAAvACsAAAABAAQAAAAvACwAAAABAAQAAAAvAC0AAAABAAQAAAAvAC4AAAABAAQAAAAvAC8AAAABAAQAAAAvADAAAAABAAQAAAAvADEAAAABAAQAAAAvADIAAAABAAQAAAAvADMAAAAQAAYAAAAwAPD/AAADAAcAAAAwAPH/AAADAAcAAAAwAPL/AAAAAAEAAAAwAPP/AAAAAAEAAAAwAPT/AAAAAAEAAAAwAPX/AAADAAcAAAAwAPb/AAADAAcAAAAwAPf/AAADAAcAAAAwAPj/AAADAAcAAAAwAPn/AAAAAAEAAAAwAPr/AAADAAcAAAAwAPv/AAAAAAEAAAAwAPz/AAAAAAEAAAAwAP3/AAADAAcAAAAwAP7/AAADAAcAAAAwAP//AAADAAcAAAAwAAAAAAADAAcAAAAwAAEAAAADAAcAAAAwAAIAAAAAAAEAAAAwAAMAAAADAAcAAAAwAAQAAAADAAcAAAAwAAUAAAACAAkAAAAwAAYAAAAEAAgAAAAwAAcAAAAIAAoAAAAwAAgAAAAFAAoAAAAwAAkAAAAAAAAAAAAwAAoAAAAIAAkAAAAwAAsAAAAIAAkAAAAwAAwAAAAIAAoAAAAwAA0AAAAHAAoAAAAwAA4AAAAFAAkAAAAwAA8AAAAIAAkAAAAwABAAAAAIAAkAAAAwABEAAAAFAAkAAAAwABIAAAAFAAkAAAAwABMAAAAHAAkAAAAwABQAAAAIAAkAAAAwABUAAAAFAAkAAAAwABYAAAAFAAoAAAAwABcAAAAHAAoAAAAwABgAAAAIAAoAAAAwABkAAAAAAAAAAAAwABoAAAAHAAkAAAAwABsAAAAFAAoAAAAwABwAAAAAAAAAAAAwAB0AAAAIAAoAAAAwAB4AAAAIAAkAAAAwAB8AAAABAAMAAAAwACAAAAABAAQAAAAwACEAAAABAAQAAAAwACIAAAABAAQAAAAwACMAAAABAAQAAAAwACQAAAABAAQAAAAwACUAAAABAAQAAAAwACYAAAABAAQAAAAwACcAAAABAAQAAAAwACgAAAABAAQAAAAwACkAAAABAAQAAAAwACoAAAABAAQAAAAwACsAAAABAAQAAAAwACwAAAABAAQAAAAwAC0AAAABAAQAAAAwAC4AAAABAAQAAAAwAC8AAAABAAQAAAAwADAAAAABAAQAAAAwADEAAAABAAQAAAAwADIAAAABAAQAAAAwADMAAAAQAAYAAAAxAPD/AAADAAcAAAAxAPH/AAADAAcAAAAxAPL/AAADAAcAAAAxAPP/AAADAAcAAAAxAPT/AAADAAcAAAAxAPX/AAADAAcAAAAxAPb/AAADAAcAAAAxAPf/AAADAAcAAAAxAPj/AAADAAcAAAAxAPn/AAADAAcAAAAxAPr/AAADAAcAAAAxAPv/AAADAAcAAAAxAPz/AAADAAcAAAAxAP3/AAADAAcAAAAxAP7/AAADAAcAAAAxAP//AAAAAAEAAAAxAAAAAAAAAAEAAAAxAAEAAAADAAcAAAAxAAIAAAAAAAEAAAAxAAMAAAADAAcAAAAxAAQAAAACAAkAAAAxAAUAAAAEAAgAAAAxAAYAAAAFAAoAAAAxAAcAAAAIAAoAAAAxAAgAAAAFAAoAAAAxAAkAAAAAAAAAAAAxAAoAAAAAAAAAAAAxAAsAAAAAAAAAAAAxAAwAAAAIAAoAAAAxAA0AAAAIAAkAAAAxAA4AAAAIAAkAAAAxAA8AAAAIAAkAAAAxABAAAAAFAAoAAAAxABEAAAAAAAAAAAAxABIAAAAFAAkAAAAxABMAAAAFAAoAAAAxABQAAAAFAAkAAAAxABUAAAAFAAoAAAAxABYAAAAHAAkAAAAxABcAAAAFAAoAAAAxABgAAAAFAAoAAAAxABkAAAAFAAoAAAAxABoAAAAHAAkAAAAxABsAAAAIAAoAAAAxABwAAAAIAAoAAAAxAB0AAAAIAAkAAAAxAB4AAAAFAAoAAAAxAB8AAAABAAMAAAAxACAAAAABAAQAAAAxACEAAAABAAQAAAAxACIAAAABAAQAAAAxACMAAAABAAQAAAAxACQAAAABAAQAAAAxACUAAAABAAQAAAAxACYAAAABAAQAAAAxACcAAAABAAQAAAAxACgAAAABAAQAAAAxACkAAAABAAQAAAAxACoAAAABAAQAAAAxACsAAAABAAQAAAAxACwAAAABAAQAAAAxAC0AAAABAAQAAAAxAC4AAAABAAQAAAAxAC8AAAABAAQAAAAxADAAAAABAAQAAAAxADEAAAABAAQAAAAxADIAAAABAAQAAAAxADMAAAAQAAYAAAAyAPD/AAADAAcAAAAyAPH/AAADAAcAAAAyAPL/AAAAAAEAAAAyAPP/AAAAAAEAAAAyAPT/AAADAAcAAAAyAPX/AAADAAcAAAAyAPb/AAADAAcAAAAyAPf/AAADAAcAAAAyAPj/AAAAAAEAAAAyAPn/AAAAAAEAAAAyAPr/AAAAAAEAAAAyAPv/AAAAAAEAAAAyAPz/AAADAAcAAAAyAP3/AAADAAcAAAAyAP7/AAADAAcAAAAyAP//AAADAAcAAAAyAAAAAAADAAcAAAAyAAEAAAADAAcAAAAyAAIAAAADAAcAAAAyAAMAAAACAAkAAAAyAAQAAAAEAAgAAAAyAAUAAAAAAAAAAAAyAAYAAAAFAAoAAAAyAAcAAAAIAAoAAAAyAAgAAAAIAAkAAAAyAAkAAAAIAAoAAAAyAAoAAAAIAAoAAAAyAAsAAAAIAAkAAAAyAAwAAAAFAAkAAAAyAA0AAAAAAAAAAAAyAA4AAAAHAAoAAAAyAA8AAAAIAAkAAAAyABAAAAAFAAkAAAAyABEAAAAHAAoAAAAyABIAAAAHAAoAAAAyABMAAAAFAAkAAAAyABQAAAAAAAAAAAAyABUAAAAIAAoAAAAyABYAAAAHAAoAAAAyABcAAAAAAAAAAAAyABgAAAAHAAoAAAAyABkAAAAAAAAAAAAyABoAAAAHAAoAAAAyABsAAAAHAAoAAAAyABwAAAAHAAkAAAAyAB0AAAAFAAkAAAAyAB4AAAAAAAMAAAAyAB8AAAABAAcAAAAyACAAAAABAAQAAAAyACEAAAABAAQAAAAyACIAAAABAAQAAAAyACMAAAAAAAYAAAAyACQAAAACAAQAAAAyACUAAAACAAQAAAAyACYAAAACAAQAAAAyACcAAAACAAQAAAAyACgAAAACAAQAAAAyACkAAAACAAQAAAAyACoAAAACAAQAAAAyACsAAAACAAQAAAAyACwAAAACAAQAAAAyAC0AAAACAAQAAAAyAC4AAAACAAQAAAAyAC8AAAACAAQAAAAyADAAAAACAAQAAAAyADEAAAACAAQAAAAyADIAAAACAAQAAAAyADMAAAAKAA4AAAAzAPD/AAADAAcAAAAzAPH/AAADAAcAAAAzAPL/AAAAAAEAAAAzAPP/AAADAAcAAAAzAPT/AAADAAcAAAAzAPX/AAAAAAEAAAAzAPb/AAAAAAEAAAAzAPf/AAADAAcAAAAzAPj/AAAAAAEAAAAzAPn/AAADAAcAAAAzAPr/AAADAAcAAAAzAPv/AAADAAcAAAAzAPz/AAADAAcAAAAzAP3/AAADAAcAAAAzAP7/AAADAAcAAAAzAP//AAADAAcAAAAzAAAAAAADAAcAAAAzAAEAAAAAAAEAAAAzAAIAAAACAAkAAAAzAAMAAAAEAAgAAAAzAAQAAAAIAAkAAAAzAAUAAAAFAAkAAAAzAAYAAAAHAAkAAAAzAAcAAAAHAAoAAAAzAAgAAAAFAAoAAAAzAAkAAAAHAAoAAAAzAAoAAAAHAAoAAAAzAAsAAAAFAAoAAAAzAAwAAAAFAAoAAAAzAA0AAAAIAAoAAAAzAA4AAAAHAAoAAAAzAA8AAAAHAAkAAAAzABAAAAAFAAkAAAAzABEAAAAHAAoAAAAzABIAAAAIAAoAAAAzABMAAAAFAAoAAAAzABQAAAAFAAkAAAAzABUAAAAHAAoAAAAzABYAAAAHAAkAAAAzABcAAAAIAAkAAAAzABgAAAAIAAkAAAAzABkAAAAIAAoAAAAzABoAAAAIAAoAAAAzABsAAAAFAAoAAAAzABwAAAAIAAoAAAAzAB0AAAAAAAMAAAAzAB4AAAABAAcAAAAzAB8AAAABAAQAAAAzACAAAAABAAQAAAAzACEAAAABAAQAAAAzACIAAAABAAQAAAAzACMAAAABAAUAAAAzACQAAAAIAAkAAAAzACUAAAAAAAAAAAAzACYAAAAIAAkAAAAzACcAAAAIAAoAAAAzACgAAAAHAAoAAAAzACkAAAAHAAoAAAAzACoAAAAAAAAAAAAzACsAAAAIAAoAAAAzACwAAAAHAAkAAAAzAC0AAAAIAAoAAAAzAC4AAAAIAAkAAAAzAC8AAAAFAAkAAAAzADAAAAAHAAoAAAAzADEAAAAIAAkAAAAzADIAAAAIAAkAAAAzADMAAAAAAAAAAAA0APD/AAADAAcAAAA0APH/AAADAAcAAAA0APL/AAADAAcAAAA0APP/AAADAAcAAAA0APT/AAADAAcAAAA0APX/AAAAAAEAAAA0APb/AAADAAcAAAA0APf/AAADAAcAAAA0APj/AAADAAcAAAA0APn/AAADAAcAAAA0APr/AAAAAAEAAAA0APv/AAADAAcAAAA0APz/AAADAAcAAAA0AP3/AAADAAcAAAA0AP7/AAADAAcAAAA0AP//AAADAAcAAAA0AAAAAAADAAcAAAA0AAEAAAADAAcAAAA0AAIAAAADAAgAAAA0AAMAAAAFAAoAAAA0AAQAAAAHAAoAAAA0AAUAAAAAAAAAAAA0AAYAAAAHAAkAAAA0AAcAAAAHAAoAAAA0AAgAAAAIAAkAAAA0AAkAAAAFAAoAAAA0AAoAAAAFAAkAAAA0AAsAAAAHAAoAAAA0AAwAAAAFAAoAAAA0AA0AAAAFAAkAAAA0AA4AAAAHAAkAAAA0AA8AAAAHAAkAAAA0ABAAAAAHAAoAAAA0ABEAAAAIAAoAAAA0ABIAAAAHAAoAAAA0ABMAAAAHAAoAAAA0ABQAAAAHAAoAAAA0ABUAAAAFAAoAAAA0ABYAAAAIAAkAAAA0ABcAAAAFAAkAAAA0ABgAAAAHAAoAAAA0ABkAAAAIAAoAAAA0ABoAAAAFAAoAAAA0ABsAAAAFAAkAAAA0ABwAAAAHAAoAAAA0AB0AAAABAAMAAAA0AB4AAAABAAQAAAA0AB8AAAABAAQAAAA0ACAAAAABAAQAAAA0ACEAAAABAAQAAAA0ACIAAAABAAQAAAA0ACMAAAABAAUAAAA0ACQAAAAFAAkAAAA0ACUAAAAIAAoAAAA0ACYAAAAAAAAAAAA0ACcAAAAIAAkAAAA0ACgAAAAHAAkAAAA0ACkAAAAHAAkAAAA0ACoAAAAHAAkAAAA0ACsAAAAIAAoAAAA0ACwAAAAIAAkAAAA0AC0AAAAFAAoAAAA0AC4AAAAFAAkAAAA0AC8AAAAHAAoAAAA0ADAAAAAHAAkAAAA0ADEAAAAIAAkAAAA0ADIAAAAIAAoAAAA0ADMAAAAAAAAAAAA1APD/AAADAAcAAAA1APH/AAADAAcAAAA1APL/AAADAAcAAAA1APP/AAADAAcAAAA1APT/AAAAAAEAAAA1APX/AAADAAcAAAA1APb/AAAAAAEAAAA1APf/AAAAAAEAAAA1APj/AAADAAcAAAA1APn/AAADAAcAAAA1APr/AAADAAcAAAA1APv/AAAAAAEAAAA1APz/AAADAAcAAAA1AP3/AAADAAcAAAA1AP7/AAADAAcAAAA1AP//AAAAAAEAAAA1AAAAAAAAAAEAAAA1AAEAAAADAAcAAAA1AAIAAAADAAgAAAA1AAMAAAAFAAoAAAA1AAQAAAAFAAkAAAA1AAUAAAAFAAoAAAA1AAYAAAAIAAoAAAA1AAcAAAAHAAoAAAA1AAgAAAAIAAoAAAA1AAkAAAAFAAkAAAA1AAoAAAAHAAkAAAA1AAsAAAAIAAkAAAA1AAwAAAAFAAkAAAA1AA0AAAAIAAkAAAA1AA4AAAAIAAkAAAA1AA8AAAAIAAoAAAA1ABAAAAAHAAoAAAA1ABEAAAAHAAkAAAA1ABIAAAAIAAkAAAA1ABMAAAAHAAoAAAA1ABQAAAAHAAoAAAA1ABUAAAAIAAkAAAA1ABYAAAAIAAkAAAA1ABcAAAAIAAoAAAA1ABgAAAAAAAAAAAA1ABkAAAAIAAkAAAA1ABoAAAAFAAkAAAA1ABsAAAAHAAoAAAA1ABwAAAAAAAMAAAA1AB0AAAABAAcAAAA1AB4AAAABAAQAAAA1AB8AAAABAAQAAAA1ACAAAAAAAAYAAAA1ACEAAAABAAQAAAA1ACIAAAABAAQAAAA1ACMAAAABAAUAAAA1ACQAAAAFAAkAAAA1ACUAAAAHAAkAAAA1ACYAAAAIAAkAAAA1ACcAAAAIAAoAAAA1ACgAAAAFAAkAAAA1ACkAAAAIAAkAAAA1ACoAAAAHAAkAAAA1ACsAAAAHAAkAAAA1ACwAAAAFAAkAAAA1AC0AAAAFAAkAAAA1AC4AAAAFAAoAAAA1AC8AAAAFAAkAAAA1ADAAAAAFAAkAAAA1ADEAAAAFAAkAAAA1ADIAAAAFAAkAAAA1ADMAAAAHAAkAAAA2APD/AAADAAcAAAA2APH/AAADAAcAAAA2APL/AAADAAcAAAA2APP/AAADAAcAAAA2APT/AAADAAcAAAA2APX/AAAAAAEAAAA2APb/AAADAAcAAAA2APf/AAAAAAEAAAA2APj/AAADAAcAAAA2APn/AAADAAcAAAA2APr/AAADAAcAAAA2APv/AAADAAcAAAA2APz/AAAAAAEAAAA2AP3/AAADAAcAAAA2AP7/AAADAAcAAAA2AP//AAADAAcAAAA2AAAAAAADAAcAAAA2AAEAAAADAAcAAAA2AAIAAAADAAgAAAA2AAMAAAAHAAoAAAA2AAQAAAAIAAkAAAA2AAUAAAAFAAoAAAA2AAYAAAAHAAoAAAA2AAcAAAAIAAoAAAA2AAgAAAAIAAoAAAA2AAkAAAAFAAkAAAA2AAoAAAAHAAoAAAA2AAsAAAAHAAoAAAA2AAwAAAAIAAoAAAA2AA0AAAAHAAoAAAA2AA4AAAAIAAoAAAA2AA8AAAAHAAoAAAA2ABAAAAAIAAkAAAA2ABEAAAAHAAkAAAA2ABIAAAAIAAkAAAA2ABMAAAAHAAkAAAA2ABQAAAAIAAkAAAA2ABUAAAAHAAkAAAA2ABYAAAAFAAoAAAA2ABcAAAAFAAoAAAA2ABgAAAAHAAkAAAA2ABkAAAAHAAoAAAA2ABoAAAAHAAkAAAA2ABsAAAAAAAMAAAA2ABwAAAABAAcAAAA2AB0AAAABAAQAAAA2AB4AAAABAAQAAAA2AB8AAAABAAQAAAA2ACAAAAABAAUAAAA2ACEAAAABAAQAAAA2ACIAAAABAAQAAAA2ACMAAAABAAUAAAA2ACQAAAAIAAoAAAA2ACUAAAAHAAkAAAA2ACYAAAAIAAkAAAA2ACcAAAAAAAAAAAA2ACgAAAAFAAoAAAA2ACkAAAAIAAoAAAA2ACoAAAAFAAkAAAA2ACsAAAAFAAkAAAA2ACwAAAAIAAoAAAA2AC0AAAAFAAoAAAA2AC4AAAAHAAkAAAA2AC8AAAAFAAkAAAA2ADAAAAAHAAoAAAA2ADEAAAAHAAoAAAA2ADIAAAAFAAoAAAA2ADMAAAAFAAoAAAA3APD/AAADAAcAAAA3APH/AAADAAcAAAA3APL/AAADAAcAAAA3APP/AAADAAcAAAA3APT/AAADAAcAAAA3APX/AAAAAAEAAAA3APb/AAADAAcAAAA3APf/AAADAAcAAAA3APj/AAADAAcAAAA3APn/AAADAAcAAAA3APr/AAADAAcAAAA3APv/AAAAAAEAAAA3APz/AAADAAcAAAA3AP3/AAADAAcAAAA3AP7/AAADAAcAAAA3AP//AAADAAcAAAA3AAAAAAADAAcAAAA3AAEAAAACAAkAAAA3AAIAAAAEAAgAAAA3AAMAAAAHAAoAAAA3AAQAAAAIAAkAAAA3AAUAAAAHAAkAAAA3AAYAAAAIAAkAAAA3AAcAAAAIAAkAAAA3AAgAAAAAAAAAAAA3AAkAAAAFAAoAAAA3AAoAAAAAAAAAAAA3AAsAAAAHAAkAAAA3AAwAAAAFAAkAAAA3AA0AAAAIAAkAAAA3AA4AAAAAAAAAAAA3AA8AAAAIAAoAAAA3ABAAAAAHAAkAAAA3ABEAAAAFAAoAAAA3ABIAAAAAAAAAAAA3ABMAAAAHAAoAAAA3ABQAAAAAAAAAAAA3ABUAAAAHAAoAAAA3ABYAAAAHAAkAAAA3ABcAAAAIAAkAAAA3ABgAAAAAAAAAAAA3ABkAAAAFAAkAAAA3ABoAAAAHAAkAAAA3ABsAAAABAAMAAAA3ABwAAAABAAQAAAA3AB0AAAABAAQAAAA3AB4AAAABAAQAAAA3AB8AAAAAAAYAAAA3ACAAAAACAAUAAAA3ACEAAAABAAQAAAA3ACIAAAABAAQAAAA3ACMAAAABAAUAAAA3ACQAAAAFAAoAAAA3ACUAAAAIAAkAAAA3ACYAAAAIAAkAAAA3ACcAAAAHAAkAAAA3ACgAAAAIAAoAAAA3ACkAAAAFAAkAAAA3ACoAAAAHAAkAAAA3ACsAAAAFAAoAAAA3ACwAAAAIAAkAAAA3AC0AAAAAAAAAAAA3AC4AAAAHAAkAAAA3AC8AAAAAAAAAAAA3ADAAAAAFAAkAAAA3ADEAAAAFAAkAAAA3ADIAAAAAAAAAAAA3ADMAAAAFAAkAAAA4APD/AAADAAcAAAA4APH/AAADAAcAAAA4APL/AAAAAAEAAAA4APP/AAAAAAEAAAA4APT/AAADAAcAAAA4APX/AAACAAkAAAA4APb/AAAEAAcAAAA4APf/AAAEAAcAAAA4APj/AAAEAAcAAAA4APn/AAAEAAcAAAA4APr/AAACAAoAAAA4APv/AAADAAcAAAA4APz/AAADAAcAAAA4AP3/AAADAAcAAAA4AP7/AAAAAAEAAAA4AP//AAACAAkAAAA4AAAAAAAEAAcAAAA4AAEAAAAEAAgAAAA4AAIAAAAFAAoAAAA4AAMAAAAIAAkAAAA4AAQAAAAFAAkAAAA4AAUAAAAFAAoAAAA4AAYAAAAIAAoAAAA4AAcAAAAHAAkAAAA4AAgAAAAHAAkAAAA4AAkAAAAFAAkAAAA4AAoAAAAFAAoAAAA4AAsAAAAFAAkAAAA4AAwAAAAIAAoAAAA4AA0AAAAIAAkAAAA4AA4AAAAFAAoAAAA4AA8AAAAFAAoAAAA4ABAAAAAHAAoAAAA4ABEAAAAIAAkAAAA4ABIAAAAIAAoAAAA4ABMAAAAIAAkAAAA4ABQAAAAAAAAAAAA4ABUAAAAHAAkAAAA4ABYAAAAAAAAAAAA4ABcAAAAHAAkAAAA4ABgAAAAIAAkAAAA4ABkAAAAIAAoAAAA4ABoAAAAAAAMAAAA4ABsAAAABAAcAAAA4ABwAAAABAAQAAAA4AB0AAAABAAQAAAA4AB4AAAAAAAYAAAA4AB8AAAACAAUAAAA4ACAAAAABAAMAAAA4ACEAAAABAAQAAAA4ACIAAAABAAQAAAA4ACMAAAABAAUAAAA4ACQAAAAHAAkAAAA4ACUAAAAIAAoAAAA4ACYAAAAFAAoAAAA4ACcAAAAHAAoAAAA4ACgAAAAHAAkAAAA4ACkAAAAFAAkAAAA4ACoAAAAFAAoAAAA4ACsAAAAAAAAAAAA4ACwAAAAIAAkAAAA4AC0AAAAIAAoAAAA4AC4AAAAIAAkAAAA4AC8AAAAFAAkAAAA4ADAAAAAFAAkAAAA4ADEAAAAHAAkAAAA4ADIAAAAHAAoAAAA4ADMAAAAFAAkAAAA5APD/AAADAAcAAAA5APH/AAADAAcAAAA5APL/AAADAAcAAAA5APP/AAADAAcAAAA5APT/AAACAAkAAAA5APX/AAAEAAgAAAA5APb/AAAFAAkAAAA5APf/AAAAAAAAAAA5APj/AAAIAAkAAAA5APn/AAAFAAkAAAA5APr/AAAEAAYAAAA5APv/AAAEAAcAAAA5APz/AAAEAAcAAAA5AP3/AAAEAAcAAAA5AP7/AAAEAAcAAAA5AP//AAAEAAgAAAA5AAAAAAAIAAkAAAA5AAEAAAAFAAkAAAA5AAIAAAAHAAkAAAA5AAMAAAAFAAkAAAA5AAQAAAAFAAkAAAA5AAUAAAAFAAoAAAA5AAYAAAAIAAoAAAA5AAcAAAAHAAoAAAA5AAgAAAAFAAoAAAA5AAkAAAAIAAoAAAA5AAoAAAAFAAkAAAA5AAsAAAAFAAoAAAA5AAwAAAAFAAkAAAA5AA0AAAAIAAoAAAA5AA4AAAAFAAkAAAA5AA8AAAAIAAoAAAA5ABAAAAAFAAoAAAA5ABEAAAAFAAkAAAA5ABIAAAAAAAAAAAA5ABMAAAAHAAoAAAA5ABQAAAAAAAAAAAA5ABUAAAAIAAoAAAA5ABYAAAAIAAoAAAA5ABcAAAAHAAkAAAA5ABgAAAAHAAkAAAA5ABkAAAAHAAkAAAA5ABoAAAABAAMAAAA5ABsAAAABAAQAAAA5ABwAAAABAAQAAAA5AB0AAAABAAQAAAA5AB4AAAABAAUAAAA5AB8AAAAIAAkAAAA5ACAAAAABAAMAAAA5ACEAAAABAAQAAAA5ACIAAAABAAQAAAA5ACMAAAABAAUAAAA5ACQAAAAAAAAAAAA5ACUAAAAFAAoAAAA5ACYAAAAFAAoAAAA5ACcAAAAIAAoAAAA5ACgAAAAIAAoAAAA5ACkAAAAHAAoAAAA5ACoAAAAFAAkAAAA5ACsAAAAHAAoAAAA5ACwAAAAFAAoAAAA5AC0AAAAHAAoAAAA5AC4AAAAIAAkAAAA5AC8AAAAFAAoAAAA5ADAAAAAFAAkAAAA5ADEAAAAFAAoAAAA5ADIAAAAHAAoAAAA5ADMAAAAIAAkAAAA6APD/AAAAAAEAAAA6APH/AAADAAcAAAA6APL/AAACAAkAAAA6APP/AAAEAAcAAAA6APT/AAAEAAgAAAA6APX/AAAHAAkAAAA6APb/AAAIAAoAAAA6APf/AAAIAAoAAAA6APj/AAAFAAkAAAA6APn/AAAAAAAAAAA6APr/AAAHAAkAAAA6APv/AAAHAAkAAAA6APz/AAAFAAoAAAA6AP3/AAAIAAoAAAA6AP7/AAAAAAAAAAA6AP//AAAIAAkAAAA6AAAAAAAHAAoAAAA6AAEAAAAFAAoAAAA6AAIAAAAHAAoAAAA6AAMAAAAAAAAAAAA6AAQAAAAHAAkAAAA6AAUAAAAIAAoAAAA6AAYAAAAFAAoAAAA6AAcAAAAHAAkAAAA6AAgAAAAFAAkAAAA6AAkAAAAHAAoAAAA6AAoAAAAHAAoAAAA6AAsAAAAIAAoAAAA6AAwAAAAAAAAAAAA6AA0AAAAIAAoAAAA6AA4AAAAFAAkAAAA6AA8AAAAIAAoAAAA6ABAAAAAAAAAAAAA6ABEAAAAIAAoAAAA6ABIAAAAHAAkAAAA6ABMAAAAFAAkAAAA6ABQAAAAFAAkAAAA6ABUAAAAIAAkAAAA6ABYAAAAIAAkAAAA6ABcAAAAIAAkAAAA6ABgAAAAHAAkAAAA6ABkAAAAAAAMAAAA6ABoAAAABAAcAAAA6ABsAAAABAAQAAAA6ABwAAAABAAQAAAA6AB0AAAAAAAYAAAA6AB4AAAACAAUAAAA6AB8AAAAIAAkAAAA6ACAAAAABAAMAAAA6ACEAAAABAAQAAAA6ACIAAAABAAQAAAA6ACMAAAABAAUAAAA6ACQAAAAIAAoAAAA6ACUAAAAIAAoAAAA6ACYAAAAIAAoAAAA6ACcAAAAAAAAAAAA6ACgAAAAIAAkAAAA6ACkAAAAFAAkAAAA6ACoAAAAAAAAAAAA6ACsAAAAHAAoAAAA6ACwAAAAIAAkAAAA6AC0AAAAIAAoAAAA6AC4AAAAHAAoAAAA6AC8AAAAFAAoAAAA6ADAAAAAIAAoAAAA6ADEAAAAAAAAAAAA6ADIAAAAAAAAAAAA6ADMAAAAFAAkAAAA7APD/AAAEAAcAAAA7APH/AAAEAAcAAAA7APL/AAAEAAgAAAA7APP/AAAHAAkAAAA7APT/AAAHAAoAAAA7APX/AAAIAAoAAAA7APb/AAAHAAoAAAA7APf/AAAHAAoAAAA7APj/AAAHAAoAAAA7APn/AAAAAAAAAAA7APr/AAAAAAAAAAA7APv/AAAFAAoAAAA7APz/AAAAAAAAAAA7AP3/AAAFAAoAAAA7AP7/AAAIAAkAAAA7AP//AAAFAAkAAAA7AAAAAAAIAAoAAAA7AAEAAAAIAAoAAAA7AAIAAAAIAAkAAAA7AAMAAAAFAAkAAAA7AAQAAAAAAAAAAAA7AAUAAAAHAAkAAAA7AAYAAAAFAAoAAAA7AAcAAAAFAAkAAAA7AAgAAAAIAAkAAAA7AAkAAAAFAAoAAAA7AAoAAAAHAAkAAAA7AAsAAAAHAAkAAAA7AAwAAAAHAAoAAAA7AA0AAAAHAAkAAAA7AA4AAAAHAAkAAAA7AA8AAAAHAAkAAAA7ABAAAAAHAAoAAAA7ABEAAAAFAAkAAAA7ABIAAAAIAAkAAAA7ABMAAAAFAAoAAAA7ABQAAAAIAAoAAAA7ABUAAAAAAAAAAAA7ABYAAAAFAAoAAAA7ABcAAAAIAAoAAAA7ABgAAAAAAAMAAAA7ABkAAAABAAcAAAA7ABoAAAABAAQAAAA7ABsAAAABAAQAAAA7ABwAAAAAAAYAAAA7AB0AAAACAAUAAAA7AB4AAAAIAAoAAAA7AB8AAAAIAAkAAAA7ACAAAAABAAMAAAA7ACEAAAABAAQAAAA7ACIAAAABAAQAAAA7ACMAAAABAAUAAAA7ACQAAAAFAAkAAAA7ACUAAAAIAAoAAAA7ACYAAAAFAAkAAAA7ACcAAAAHAAoAAAA7ACgAAAAHAAoAAAA7ACkAAAAHAAoAAAA7ACoAAAAAAAAAAAA7ACsAAAAAAAAAAAA7ACwAAAAFAAkAAAA7AC0AAAAIAAoAAAA7AC4AAAAHAAoAAAA7AC8AAAAAAAAAAAA7ADAAAAAFAAkAAAA7ADEAAAAHAAoAAAA7ADIAAAAHAAoAAAA7ADMAAAAAAAkAAAA8APD/AAABAAsAAAA8APH/AAAFAAoAAAA8APL/AAAHAAoAAAA8APP/AAAFAAkAAAA8APT/AAAFAAoAAAA8APX/AAAHAAoAAAA8APb/AAAAAAAAAAA8APf/AAAFAAkAAAA8APj/AAAHAAkAAAA8APn/AAAHAAoAAAA8APr/AAAFAAkAAAA8APv/AAAIAAoAAAA8APz/AAAIAAkAAAA8AP3/AAAFAAkAAAA8AP7/AAAIAAkAAAA8AP//AAAHAAoAAAA8AAAAAAAIAAoAAAA8AAEAAAAIAAkAAAA8AAIAAAAIAAoAAAA8AAMAAAAIAAkAAAA8AAQAAAAAAAAAAAA8AAUAAAAHAAkAAAA8AAYAAAAFAAoAAAA8AAcAAAAHAAoAAAA8AAgAAAAAAAAAAAA8AAkAAAAIAAkAAAA8AAoAAAAHAAoAAAA8AAsAAAAFAAoAAAA8AAwAAAAAAAAAAAA8AA0AAAAHAAoAAAA8AA4AAAAIAAkAAAA8AA8AAAAIAAoAAAA8ABAAAAAAAAAAAAA8ABEAAAAHAAkAAAA8ABIAAAAHAAoAAAA8ABMAAAAHAAoAAAA8ABQAAAAAAAAAAAA8ABUAAAAFAAkAAAA8ABYAAAAHAAoAAAA8ABcAAAAAAAMAAAA8ABgAAAABAAcAAAA8ABkAAAABAAQAAAA8ABoAAAABAAQAAAA8ABsAAAAAAAYAAAA8ABwAAAACAAUAAAA8AB0AAAAFAAkAAAA8AB4AAAAIAAkAAAA8AB8AAAAIAAkAAAA8ACAAAAABAAMAAAA8ACEAAAABAAQAAAA8ACIAAAABAAQAAAA8ACMAAAABAAUAAAA8ACQAAAAFAAoAAAA8ACUAAAAAAAAAAAA8ACYAAAAHAAoAAAA8ACcAAAAFAAoAAAA8ACgAAAAFAAoAAAA8ACkAAAAFAAkAAAA8ACoAAAAIAAoAAAA8ACsAAAAIAAkAAAA8ACwAAAAIAAoAAAA8AC0AAAAFAAoAAAA8AC4AAAAFAAoAAAA8AC8AAAAFAAkAAAA8ADAAAAAFAAoAAAA8ADEAAAAFAAoAAAA8ADIAAAAHAAoAAAA8ADMAAAABAAkAAAA9APD/AAABAAsAAAA9APH/AAAFAAkAAAA9APL/AAAIAAkAAAA9APP/AAAIAAkAAAA9APT/AAAHAAoAAAA9APX/AAAHAAkAAAA9APb/AAAFAAoAAAA9APf/AAAIAAkAAAA9APj/AAAHAAoAAAA9APn/AAAHAAkAAAA9APr/AAAFAAkAAAA9APv/AAAHAAoAAAA9APz/AAAAAAAAAAA9AP3/AAAHAAkAAAA9AP7/AAAFAAoAAAA9AP//AAAAAAAAAAA9AAAAAAAHAAkAAAA9AAEAAAAAAAAAAAA9AAIAAAAAAAAAAAA9AAMAAAAFAAkAAAA9AAQAAAAIAAkAAAA9AAUAAAAFAAkAAAA9AAYAAAAHAAkAAAA9AAcAAAAFAAoAAAA9AAgAAAAAAAAAAAA9AAkAAAAHAAkAAAA9AAoAAAAHAAkAAAA9AAsAAAAFAAoAAAA9AAwAAAAFAAoAAAA9AA0AAAAAAAAAAAA9AA4AAAAIAAoAAAA9AA8AAAAIAAkAAAA9ABAAAAAFAAkAAAA9ABEAAAAHAAoAAAA9ABIAAAAIAAoAAAA9ABMAAAAHAAkAAAA9ABQAAAAHAAoAAAA9ABUAAAAHAAkAAAA9ABYAAAAAAAMAAAA9ABcAAAABAAcAAAA9ABgAAAABAAQAAAA9ABkAAAABAAQAAAA9ABoAAAAAAAYAAAA9ABsAAAACAAUAAAA9ABwAAAAFAAoAAAA9AB0AAAAFAAkAAAA9AB4AAAAFAAoAAAA9AB8AAAAIAAoAAAA9ACAAAAABAAMAAAA9ACEAAAABAAQAAAA9ACIAAAABAAQAAAA9ACMAAAABAAUAAAA9ACQAAAAIAAkAAAA9ACUAAAAFAAkAAAA9ACYAAAAHAAkAAAA9ACcAAAAAAAAAAAA9ACgAAAAHAAkAAAA9ACkAAAAHAAoAAAA9ACoAAAAIAAkAAAA9ACsAAAAAAAAAAAA9ACwAAAAFAAoAAAA9AC0AAAAIAAkAAAA9AC4AAAAHAAkAAAA9AC8AAAAFAAoAAAA9ADAAAAAIAAoAAAA9ADEAAAAIAAoAAAA9ADIAAAAAAAAAAAA9ADMAAAAHAAoAAAA+APD/AAABAAsAAAA+APH/AAAAAAAAAAA+APL/AAAAAAAAAAA+APP/AAAFAAoAAAA+APT/AAAFAAkAAAA+APX/AAAAAAAAAAA+APb/AAAAAAAAAAA+APf/AAAFAAoAAAA+APj/AAAHAAoAAAA+APn/AAAIAAkAAAA+APr/AAAHAAkAAAA+APv/AAAFAAoAAAA+APz/AAAIAAoAAAA+AP3/AAAHAAkAAAA+AP7/AAAIAAoAAAA+AP//AAAAAAAAAAA+AAAAAAAHAAoAAAA+AAEAAAAFAAkAAAA+AAIAAAAIAAkAAAA+AAMAAAAHAAoAAAA+AAQAAAAFAAkAAAA+AAUAAAAIAAkAAAA+AAYAAAAHAAoAAAA+AAcAAAAFAAoAAAA+AAgAAAAIAAkAAAA+AAkAAAAAAAAAAAA+AAoAAAAIAAoAAAA+AAsAAAAAAAAAAAA+AAwAAAAAAAAAAAA+AA0AAAAHAAoAAAA+AA4AAAAHAAkAAAA+AA8AAAAFAAoAAAA+ABAAAAAAAAAAAAA+ABEAAAAFAAkAAAA+ABIAAAAAAAAAAAA+ABMAAAAHAAoAAAA+ABQAAAAAAAAAAAA+ABUAAAAAAAMAAAA+ABYAAAABAAcAAAA+ABcAAAABAAQAAAA+ABgAAAABAAQAAAA+ABkAAAAAAAYAAAA+ABoAAAACAAUAAAA+ABsAAAAHAAkAAAA+ABwAAAAHAAoAAAA+AB0AAAAHAAoAAAA+AB4AAAAIAAoAAAA+AB8AAAAFAAkAAAA+ACAAAAABAAMAAAA+ACEAAAABAAQAAAA+ACIAAAABAAQAAAA+ACMAAAABAAUAAAA+ACQAAAAHAAoAAAA+ACUAAAAFAAkAAAA+ACYAAAAHAAoAAAA+ACcAAAAHAAkAAAA+ACgAAAAIAAkAAAA+ACkAAAAIAAkAAAA+ACoAAAAIAAoAAAA+ACsAAAAFAAoAAAA+ACwAAAAFAAkAAAA+AC0AAAAFAAoAAAA+AC4AAAAFAAoAAAA+AC8AAAAHAAkAAAA+ADAAAAAFAAkAAAA+ADEAAAAHAAkAAAA+ADIAAAAIAAkAAAA+ADMAAAAAAAAAAAA/APD/AAABAAsAAAA/APH/AAAFAAkAAAA/APL/AAAIAAkAAAA/APP/AAAIAAkAAAA/APT/AAAHAAoAAAA/APX/AAAFAAoAAAA/APb/AAAHAAkAAAA/APf/AAAHAAoAAAA/APj/AAAFAAkAAAA/APn/AAAHAAkAAAA/APr/AAAFAAkAAAA/APv/AAAFAAoAAAA/APz/AAAIAAoAAAA/AP3/AAAFAAkAAAA/AP7/AAAAAAAAAAA/AP//AAAIAAkAAAA/AAAAAAAFAAoAAAA/AAEAAAAHAAkAAAA/AAIAAAAFAAkAAAA/AAMAAAAAAAAAAAA/AAQAAAAFAAoAAAA/AAUAAAAFAAkAAAA/AAYAAAAAAAAAAAA/AAcAAAAAAAAAAAA/AAgAAAAIAAoAAAA/AAkAAAAHAAoAAAA/AAoAAAAHAAoAAAA/AAsAAAAHAAkAAAA/AAwAAAAIAAoAAAA/AA0AAAAFAAkAAAA/AA4AAAAHAAkAAAA/AA8AAAAFAAkAAAA/ABAAAAAHAAoAAAA/ABEAAAAIAAkAAAA/ABIAAAAIAAoAAAA/ABMAAAAHAAkAAAA/ABQAAAAIAAkAAAA/ABUAAAABAAMAAAA/ABYAAAABAAQAAAA/ABcAAAABAAQAAAA/ABgAAAAAAAYAAAA/ABkAAAACAAUAAAA/ABoAAAAFAAoAAAA/ABsAAAAIAAoAAAA/ABwAAAAIAAoAAAA/AB0AAAAHAAkAAAA/AB4AAAAAAAAAAAA/AB8AAAAIAAkAAAA/ACAAAAABAAMAAAA/ACEAAAABAAQAAAA/ACIAAAABAAQAAAA/ACMAAAABAAUAAAA/ACQAAAAIAAkAAAA/ACUAAAAIAAoAAAA/ACYAAAAAAAAAAAA/ACcAAAAIAAkAAAA/ACgAAAAIAAoAAAA/ACkAAAAIAAoAAAA/ACoAAAAIAAoAAAA/ACsAAAAHAAkAAAA/ACwAAAAIAAoAAAA/AC0AAAAHAAoAAAA/AC4AAAAHAAkAAAA/AC8AAAAFAAkAAAA/ADAAAAAFAAoAAAA/ADEAAAAHAAoAAAA/ADIAAAAFAAkAAAA/ADMAAAAFAAkAAABAAPD/AAABAAsAAABAAPH/AAAIAAkAAABAAPL/AAAFAAkAAABAAPP/AAAHAAkAAABAAPT/AAAAAAAAAABAAPX/AAAFAAkAAABAAPb/AAAIAAoAAABAAPf/AAAIAAoAAABAAPj/AAAHAAkAAABAAPn/AAAAAAAAAABAAPr/AAAFAAkAAABAAPv/AAAIAAkAAABAAPz/AAAHAAkAAABAAP3/AAAHAAoAAABAAP7/AAAAAAAAAABAAP//AAAIAAkAAABAAAAAAAAFAAoAAABAAAEAAAAIAAoAAABAAAIAAAAAAAAAAABAAAMAAAAHAAkAAABAAAQAAAAIAAoAAABAAAUAAAAAAAAAAABAAAYAAAAFAAoAAABAAAcAAAAIAAkAAABAAAgAAAAHAAoAAABAAAkAAAAAAAAAAABAAAoAAAAHAAkAAABAAAsAAAAAAAAAAABAAAwAAAAHAAkAAABAAA0AAAAIAAkAAABAAA4AAAAIAAoAAABAAA8AAAAFAAkAAABAABAAAAAHAAkAAABAABEAAAAIAAoAAABAABIAAAAHAAkAAABAABMAAAAIAAkAAABAABQAAAAAAAMAAABAABUAAAABAAcAAABAABYAAAABAAQAAABAABcAAAABAAQAAABAABgAAAABAAUAAABAABkAAAAHAAoAAABAABoAAAAIAAoAAABAABsAAAAFAAkAAABAABwAAAAAAAAAAABAAB0AAAAIAAoAAABAAB4AAAAAAAAAAABAAB8AAAAHAAkAAABAACAAAAABAAMAAABAACEAAAABAAQAAABAACIAAAABAAQAAABAACMAAAABAAUAAABAACQAAAAHAAkAAABAACUAAAAIAAoAAABAACYAAAAHAAoAAABAACcAAAAHAAoAAABAACgAAAAIAAkAAABAACkAAAAFAAoAAABAACoAAAAIAAkAAABAACsAAAAIAAoAAABAACwAAAAIAAkAAABAAC0AAAAIAAoAAABAAC4AAAAAAAAAAABAAC8AAAAFAAkAAABAADAAAAAHAAoAAABAADEAAAAHAAoAAABAADIAAAAFAAkAAABAADMAAAAFAAoAAABBAPD/AAABAAsAAABBAPH/AAAFAAoAAABBAPL/AAAIAAoAAABBAPP/AAAHAAkAAABBAPT/AAAIAAkAAABBAPX/AAAAAAAAAABBAPb/AAAIAAkAAABBAPf/AAAAAAAAAABBAPj/AAAAAAAAAABBAPn/AAAFAAkAAABBAPr/AAAFAAkAAABBAPv/AAAFAAoAAABBAPz/AAAIAAoAAABBAP3/AAAIAAoAAABBAP7/AAAIAAoAAABBAP//AAAFAAoAAABBAAAAAAAFAAkAAABBAAEAAAAHAAkAAABBAAIAAAAFAAkAAABBAAMAAAAHAAkAAABBAAQAAAAIAAkAAABBAAUAAAAIAAoAAABBAAYAAAAHAAoAAABBAAcAAAAHAAkAAABBAAgAAAAFAAkAAABBAAkAAAAFAAoAAABBAAoAAAAIAAkAAABBAAsAAAAFAAoAAABBAAwAAAAHAAoAAABBAA0AAAAHAAoAAABBAA4AAAAFAAkAAABBAA8AAAAFAAoAAABBABAAAAAFAAkAAABBABEAAAAHAAoAAABBABIAAAAFAAkAAABBABMAAAAAAAMAAABBABQAAAABAAcAAABBABUAAAABAAQAAABBABYAAAABAAQAAABBABcAAAAAAAYAAABBABgAAAACAAUAAABBABkAAAAHAAoAAABBABoAAAAHAAkAAABBABsAAAAFAAoAAABBABwAAAAIAAkAAABBAB0AAAAIAAoAAABBAB4AAAAAAAAAAABBAB8AAAAHAAkAAABBACAAAAABAAMAAABBACEAAAABAAQAAABBACIAAAABAAQAAABBACMAAAABAAUAAABBACQAAAAFAAkAAABBACUAAAAFAAoAAABBACYAAAAAAAAAAABBACcAAAAIAAkAAABBACgAAAAAAAAAAABBACkAAAAHAAkAAABBACoAAAAFAAoAAABBACsAAAAAAAAAAABBACwAAAAFAAoAAABBAC0AAAAAAAAAAABBAC4AAAAIAAkAAABBAC8AAAAFAAkAAABBADAAAAAAAAAAAABBADEAAAAHAAoAAABBADIAAAAAAAAAAABBADMAAAAIAAkAAABCAPD/AAACAAsAAABCAPH/AAAAAAQAAABCAPL/AAAAAAUAAABCAPP/AAAIAAoAAABCAPT/AAAIAAkAAABCAPX/AAAHAAoAAABCAPb/AAAFAAoAAABCAPf/AAAIAAoAAABCAPj/AAAFAAoAAABCAPn/AAAAAAAAAABCAPr/AAAFAAoAAABCAPv/AAAHAAkAAABCAPz/AAAFAAoAAABCAP3/AAAHAAkAAABCAP7/AAAHAAkAAABCAP//AAAAAAAAAABCAAAAAAAFAAkAAABCAAEAAAAAAAAAAABCAAIAAAAAAAAAAABCAAMAAAAFAAkAAABCAAQAAAAIAAoAAABCAAUAAAAFAAkAAABCAAYAAAAFAAoAAABCAAcAAAAHAAkAAABCAAgAAAAFAAoAAABCAAkAAAAFAAkAAABCAAoAAAAHAAkAAABCAAsAAAAFAAoAAABCAAwAAAAIAAoAAABCAA0AAAAIAAoAAABCAA4AAAAIAAkAAABCAA8AAAAIAAkAAABCABAAAAAHAAkAAABCABEAAAAIAAoAAABCABIAAAAAAAMAAABCABMAAAABAAcAAABCABQAAAABAAQAAABCABUAAAABAAQAAABCABYAAAAAAAYAAABCABcAAAACAAUAAABCABgAAAAIAAoAAABCABkAAAAFAAkAAABCABoAAAAFAAkAAABCABsAAAAIAAoAAABCABwAAAAHAAkAAABCAB0AAAAHAAoAAABCAB4AAAAFAAkAAABCAB8AAAAAAAAAAABCACAAAAABAAMAAABCACEAAAABAAQAAABCACIAAAABAAQAAABCACMAAAABAAUAAABCACQAAAAHAAoAAABCACUAAAAFAAkAAABCACYAAAAHAAoAAABCACcAAAAAAAAAAABCACgAAAAIAAkAAABCACkAAAAIAAkAAABCACoAAAAHAAkAAABCACsAAAAFAAkAAABCACwAAAAIAAkAAABCAC0AAAAHAAkAAABCAC4AAAAFAAoAAABCAC8AAAAHAAoAAABCADAAAAAAAAAAAABCADEAAAAIAAoAAABCADIAAAAFAAkAAABCADMAAAAIAAkAAABDAPD/AAARAAcAAABDAPH/AAABAAQAAABDAPL/AAABAAYAAABDAPP/AAAAAAUAAABDAPT/AAAFAAkAAABDAPX/AAAIAAkAAABDAPb/AAAFAAkAAABDAPf/AAAIAAkAAABDAPj/AAAFAAkAAABDAPn/AAAAAAAAAABDAPr/AAAHAAkAAABDAPv/AAAHAAkAAABDAPz/AAAHAAkAAABDAP3/AAAFAAkAAABDAP7/AAAHAAkAAABDAP//AAAIAAkAAABDAAAAAAAIAAoAAABDAAEAAAAAAAAAAABDAAIAAAAIAAoAAABDAAMAAAAIAAkAAABDAAQAAAAHAAoAAABDAAUAAAAIAAkAAABDAAYAAAAHAAkAAABDAAcAAAAFAAkAAABDAAgAAAAHAAkAAABDAAkAAAAIAAoAAABDAAoAAAAHAAoAAABDAAsAAAAFAAkAAABDAAwAAAAFAAoAAABDAA0AAAAAAAAAAABDAA4AAAAFAAkAAABDAA8AAAAIAAoAAABDABAAAAAHAAoAAABDABEAAAAAAAMAAABDABIAAAABAAcAAABDABMAAAABAAQAAABDABQAAAABAAQAAABDABUAAAAAAAYAAABDABYAAAACAAUAAABDABcAAAAIAAkAAABDABgAAAAHAAoAAABDABkAAAAAAAAAAABDABoAAAAIAAkAAABDABsAAAAAAAAAAABDABwAAAAIAAoAAABDAB0AAAAHAAkAAABDAB4AAAAFAAoAAABDAB8AAAAAAAAAAABDACAAAAABAAMAAABDACEAAAABAAQAAABDACIAAAABAAQAAABDACMAAAABAAUAAABDACQAAAAFAAkAAABDACUAAAAHAAkAAABDACYAAAAFAAoAAABDACcAAAAFAAoAAABDACgAAAAIAAkAAABDACkAAAAHAAoAAABDACoAAAAIAAoAAABDACsAAAAHAAoAAABDACwAAAAIAAoAAABDAC0AAAAAAAAAAABDAC4AAAAFAAoAAABDAC8AAAAIAAkAAABDADAAAAAAAAAAAABDADEAAAAHAAkAAABDADIAAAAIAAkAAABDADMAAAAFAAoAAABEAPD/AAABAAQAAABEAPH/AAABAAQAAABEAPL/AAABAAQAAABEAPP/AAABAAYAAABEAPT/AAAAAAQAAABEAPX/AAAAAAUAAABEAPb/AAAFAAoAAABEAPf/AAAHAAkAAABEAPj/AAAIAAoAAABEAPn/AAAIAAoAAABEAPr/AAAAAAAAAABEAPv/AAAIAAkAAABEAPz/AAAFAAoAAABEAP3/AAAAAAAAAABEAP7/AAAIAAkAAABEAP//AAAFAAoAAABEAAAAAAAIAAoAAABEAAEAAAAIAAoAAABEAAIAAAAFAAkAAABEAAMAAAAIAAkAAABEAAQAAAAAAAAAAABEAAUAAAAHAAkAAABEAAYAAAAIAAkAAABEAAcAAAAHAAoAAABEAAgAAAAFAAoAAABEAAkAAAAIAAkAAABEAAoAAAAFAAoAAABEAAsAAAAAAAAAAABEAAwAAAAAAAAAAABEAA0AAAAFAAkAAABEAA4AAAAHAAoAAABEAA8AAAAAAAMAAABEABAAAAAAAAQAAABEABEAAAABAAcAAABEABIAAAABAAQAAABEABMAAAABAAQAAABEABQAAAAAAAYAAABEABUAAAACAAUAAABEABYAAAAFAAkAAABEABcAAAAAAAAAAABEABgAAAAAAAAAAABEABkAAAAFAAoAAABEABoAAAAHAAkAAABEABsAAAAFAAkAAABEABwAAAAHAAkAAABEAB0AAAAIAAoAAABEAB4AAAAHAAoAAABEAB8AAAAHAAkAAABEACAAAAABAAMAAABEACEAAAABAAQAAABEACIAAAABAAQAAABEACMAAAABAAUAAABEACQAAAAIAAkAAABEACUAAAAFAAoAAABEACYAAAAIAAkAAABEACcAAAAAAAAAAABEACgAAAAFAAoAAABEACkAAAAFAAkAAABEACoAAAAAAAAAAABEACsAAAAHAAoAAABEACwAAAAIAAkAAABEAC0AAAAIAAoAAABEAC4AAAAAAAAAAABEAC8AAAAIAAkAAABEADAAAAAIAAkAAABEADEAAAAFAAkAAABEADIAAAAFAAkAAABEADMAAAAHAAoAAABFAPD/AAABAAQAAABFAPH/AAABAAQAAABFAPL/AAABAAQAAABFAPP/AAABAAQAAABFAPT/AAABAAQAAABFAPX/AAABAAYAAABFAPb/AAAAAAUAAABFAPf/AAAIAAoAAABFAPj/AAAAAAAAAABFAPn/AAAHAAoAAABFAPr/AAAAAAAAAABFAPv/AAAHAAkAAABFAPz/AAAIAAkAAABFAP3/AAAIAAoAAABFAP7/AAAFAAkAAABFAP//AAAAAAAAAABFAAAAAAAHAAkAAABFAAEAAAAFAAkAAABFAAIAAAAIAAoAAABFAAMAAAAAAAAAAABFAAQAAAAFAAkAAABFAAUAAAAFAAoAAABFAAYAAAAFAAoAAABFAAcAAAAFAAoAAABFAAgAAAAIAAkAAABFAAkAAAAAAAAAAABFAAoAAAAHAAkAAABFAAsAAAAIAAoAAABFAAwAAAAIAAkAAABFAA0AAAAHAAoAAABFAA4AAAAAAAMAAABFAA8AAAABAAcAAABFABAAAAABAAQAAABFABEAAAABAAQAAABFABIAAAABAAQAAABFABMAAAABAAQAAABFABQAAAABAAUAAABFABUAAAAFAAkAAABFABYAAAAFAAoAAABFABcAAAAIAAkAAABFABgAAAAAAAAAAABFABkAAAAHAAkAAABFABoAAAAIAAkAAABFABsAAAAAAAAAAABFABwAAAAFAAkAAABFAB0AAAAAAAAAAABFAB4AAAAAAAAAAABFAB8AAAAAAAAAAABFACAAAAABAAMAAABFACEAAAABAAQAAABFACIAAAABAAQAAABFACMAAAABAAUAAABFACQAAAAIAAkAAABFACUAAAAHAAoAAABFACYAAAAHAAoAAABFACcAAAAIAAkAAABFACgAAAAHAAoAAABFACkAAAAHAAoAAABFACoAAAAAAAAAAABFACsAAAAFAAkAAABFACwAAAAFAAkAAABFAC0AAAAAAAAAAABFAC4AAAAFAAoAAABFAC8AAAAHAAoAAABFADAAAAAFAAoAAABFADEAAAAFAAkAAABFADIAAAAAAAAAAABFADMAAAAHAAkAAABGAPD/AAAAAAsAAABGAPH/AAACAAQAAABGAPL/AAAAAAcAAABGAPP/AAABAAQAAABGAPT/AAABAAQAAABGAPX/AAABAAQAAABGAPb/AAABAAYAAABGAPf/AAAAAAUAAABGAPj/AAAHAAoAAABGAPn/AAAFAAoAAABGAPr/AAAIAAoAAABGAPv/AAAHAAkAAABGAPz/AAAHAAoAAABGAP3/AAAFAAkAAABGAP7/AAAIAAoAAABGAP//AAAAAAAAAABGAAAAAAAHAAoAAABGAAEAAAAFAAkAAABGAAIAAAAAAAAAAABGAAMAAAAFAAoAAABGAAQAAAAIAAoAAABGAAUAAAAFAAoAAABGAAYAAAAAAAAAAABGAAcAAAAAAAAAAABGAAgAAAAIAAoAAABGAAkAAAAIAAkAAABGAAoAAAAIAAkAAABGAAsAAAAAAAAAAABGAAwAAAAAAAAAAABGAA0AAAAAAAMAAABGAA4AAAABAAcAAABGAA8AAAABAAQAAABGABAAAAABAAQAAABGABEAAAABAAQAAABGABIAAAABAAQAAABGABMAAAAAAAYAAABGABQAAAACAAUAAABGABUAAAAHAAkAAABGABYAAAAHAAoAAABGABcAAAAFAAoAAABGABgAAAAAAAAAAABGABkAAAAAAAAAAABGABoAAAAIAAkAAABGABsAAAAIAAkAAABGABwAAAAHAAoAAABGAB0AAAAHAAkAAABGAB4AAAAAAAAAAABGAB8AAAAFAAkAAABGACAAAAABAAMAAABGACEAAAABAAQAAABGACIAAAABAAQAAABGACMAAAABAAUAAABGACQAAAAIAAkAAABGACUAAAAAAAAAAABGACYAAAAAAAAAAABGACcAAAAFAAkAAABGACgAAAAFAAoAAABGACkAAAAIAAkAAABGACoAAAAFAAoAAABGACsAAAAIAAoAAABGACwAAAAFAAoAAABGAC0AAAAIAAoAAABGAC4AAAAFAAkAAABGAC8AAAAFAAkAAABGADAAAAAAAAAAAABGADEAAAAIAAoAAABGADIAAAAIAAkAAABGADMAAAAIAAkAAABHAPD/AAABAAsAAABHAPH/AAAAAAAAAABHAPL/AAACAAMAAABHAPP/AAACAAQAAABHAPT/AAAAAAcAAABHAPX/AAABAAQAAABHAPb/AAABAAQAAABHAPf/AAABAAYAAABHAPj/AAAAAAUAAABHAPn/AAAIAAoAAABHAPr/AAAFAAkAAABHAPv/AAAHAAoAAABHAPz/AAAIAAkAAABHAP3/AAAFAAkAAABHAP7/AAAIAAkAAABHAP//AAAFAAkAAABHAAAAAAAAAAAAAABHAAEAAAAIAAkAAABHAAIAAAAHAAoAAABHAAMAAAAFAAkAAABHAAQAAAAIAAkAAABHAAUAAAAAAAAAAABHAAYAAAAIAAkAAABHAAcAAAAHAAoAAABHAAgAAAAFAAkAAABHAAkAAAAFAAkAAABHAAoAAAAIAAoAAABHAAsAAAAIAAkAAABHAAwAAAAAAAMAAABHAA0AAAABAAcAAABHAA4AAAABAAQAAABHAA8AAAABAAQAAABHABAAAAABAAQAAABHABEAAAAAAAYAAABHABIAAAACAAQAAABHABMAAAACAAUAAABHABQAAAAIAAoAAABHABUAAAAHAAkAAABHABYAAAAFAAkAAABHABcAAAAIAAoAAABHABgAAAAIAAoAAABHABkAAAAHAAkAAABHABoAAAAHAAoAAABHABsAAAAFAAoAAABHABwAAAAHAAoAAABHAB0AAAAHAAoAAABHAB4AAAAHAAoAAABHAB8AAAAHAAkAAABHACAAAAABAAMAAABHACEAAAABAAQAAABHACIAAAABAAQAAABHACMAAAABAAUAAABHACQAAAAIAAkAAABHACUAAAAFAAkAAABHACYAAAAFAAoAAABHACcAAAAHAAoAAABHACgAAAAFAAoAAABHACkAAAAAAAAAAABHACoAAAAAAAAAAABHACsAAAAHAAoAAABHACwAAAAIAAkAAABHAC0AAAAFAAoAAABHAC4AAAAFAAkAAABHAC8AAAAHAAkAAABHADAAAAAIAAkAAABHADEAAAAHAAkAAABHADIAAAAFAAoAAABHADMAAAAHAAkAAABIAPD/AAABAAsAAABIAPH/AAAIAAkAAABIAPL/AAAIAAoAAABIAPP/AAAAAAAAAABIAPT/AAACAAMAAABIAPX/AAAAAAcAAABIAPb/AAABAAQAAABIAPf/AAABAAQAAABIAPj/AAABAAYAAABIAPn/AAAAAAQAAABIAPr/AAAAAAUAAABIAPv/AAAHAAkAAABIAPz/AAAHAAkAAABIAP3/AAAHAAoAAABIAP7/AAAFAAkAAABIAP//AAAFAAoAAABIAAAAAAAHAAkAAABIAAEAAAAHAAkAAABIAAIAAAAIAAkAAABIAAMAAAAIAAoAAABIAAQAAAAHAAkAAABIAAUAAAAFAAoAAABIAAYAAAAIAAkAAABIAAcAAAAIAAoAAABIAAgAAAAAAAAAAABIAAkAAAAHAAkAAABIAAoAAAAAAAMAAABIAAsAAAAAAAQAAABIAAwAAAABAAcAAABIAA0AAAABAAQAAABIAA4AAAABAAQAAABIAA8AAAABAAQAAABIABAAAAAAAAYAAABIABEAAAACAAUAAABIABIAAAAHAAoAAABIABMAAAAIAAkAAABIABQAAAAFAAkAAABIABUAAAAIAAkAAABIABYAAAAHAAkAAABIABcAAAAFAAkAAABIABgAAAAIAAkAAABIABkAAAAFAAkAAABIABoAAAAIAAoAAABIABsAAAAFAAoAAABIABwAAAAFAAoAAABIAB0AAAAAAAAAAABIAB4AAAAIAAoAAABIAB8AAAAIAAoAAABIACAAAAABAAMAAABIACEAAAABAAQAAABIACIAAAABAAQAAABIACMAAAABAAUAAABIACQAAAAHAAkAAABIACUAAAAHAAoAAABIACYAAAAIAAkAAABIACcAAAAHAAoAAABIACgAAAAHAAkAAABIACkAAAAHAAkAAABIACoAAAAFAAkAAABIACsAAAAIAAkAAABIACwAAAAIAAkAAABIAC0AAAAHAAkAAABIAC4AAAAIAAoAAABIAC8AAAAFAAkAAABIADAAAAAFAAoAAABIADEAAAAHAAkAAABIADIAAAAAAAAAAABIADMAAAAHAAoAAABJAPD/AAABAAsAAABJAPH/AAAFAAoAAABJAPL/AAAIAAkAAABJAPP/AAAFAAoAAABJAPT/AAAIAAkAAABJAPX/AAABAAMAAABJAPb/AAABAAQAAABJAPf/AAABAAQAAABJAPj/AAABAAQAAABJAPn/AAABAAQAAABJAPr/AAABAAUAAABJAPv/AAAAAAAAAABJAPz/AAAIAAkAAABJAP3/AAAIAAkAAABJAP7/AAAFAAoAAABJAP//AAAHAAoAAABJAAAAAAAHAAkAAABJAAEAAAAFAAkAAABJAAIAAAAHAAkAAABJAAMAAAAAAAAAAABJAAQAAAAAAAAAAABJAAUAAAAHAAkAAABJAAYAAAAIAAoAAABJAAcAAAAFAAkAAABJAAgAAAAIAAkAAABJAAkAAAAAAAMAAABJAAoAAAABAAcAAABJAAsAAAABAAQAAABJAAwAAAABAAQAAABJAA0AAAABAAQAAABJAA4AAAABAAQAAABJAA8AAAAAAAYAAABJABAAAAACAAUAAABJABEAAAAFAAkAAABJABIAAAAIAAkAAABJABMAAAAIAAkAAABJABQAAAAHAAkAAABJABUAAAAFAAoAAABJABYAAAAFAAkAAABJABcAAAAAAAAAAABJABgAAAAAAAAAAABJABkAAAAHAAkAAABJABoAAAAAAAAAAABJABsAAAAHAAkAAABJABwAAAAFAAoAAABJAB0AAAAHAAoAAABJAB4AAAAHAAkAAABJAB8AAAAHAAoAAABJACAAAAABAAMAAABJACEAAAABAAQAAABJACIAAAABAAQAAABJACMAAAABAAUAAABJACQAAAAIAAkAAABJACUAAAAAAAAAAABJACYAAAAIAAkAAABJACcAAAAIAAkAAABJACgAAAAFAAkAAABJACkAAAAHAAkAAABJACoAAAAIAAkAAABJACsAAAAFAAoAAABJACwAAAAFAAoAAABJAC0AAAAAAAAAAABJAC4AAAAIAAoAAABJAC8AAAAFAAkAAABJADAAAAAHAAkAAABJADEAAAAFAAoAAABJADIAAAAHAAoAAABJADMAAAAIAAoAAABKAPD/AAABAAsAAABKAPH/AAAFAAoAAABKAPL/AAAIAAkAAABKAPP/AAAIAAkAAABKAPT/AAAIAAkAAABKAPX/AAACAAMAAABKAPb/AAAAAAcAAABKAPf/AAABAAQAAABKAPj/AAABAAQAAABKAPn/AAABAAQAAABKAPr/AAABAAYAAABKAPv/AAAAAAUAAABKAPz/AAAHAAkAAABKAP3/AAAIAAoAAABKAP7/AAAFAAoAAABKAP//AAAFAAoAAABKAAAAAAAFAAkAAABKAAEAAAAAAAAAAABKAAIAAAAHAAkAAABKAAMAAAAIAAkAAABKAAQAAAAFAAkAAABKAAUAAAAHAAoAAABKAAYAAAAAAAAAAABKAAcAAAAIAAoAAABKAAgAAAAAAAMAAABKAAkAAAABAAcAAABKAAoAAAABAAQAAABKAAsAAAABAAQAAABKAAwAAAABAAQAAABKAA0AAAABAAQAAABKAA4AAAAAAAYAAABKAA8AAAACAAUAAABKABAAAAAAAAAAAABKABEAAAAHAAoAAABKABIAAAAAAAAAAABKABMAAAAIAAoAAABKABQAAAAHAAoAAABKABUAAAAHAAkAAABKABYAAAAAAAAAAABKABcAAAAFAAkAAABKABgAAAAFAAkAAABKABkAAAAHAAoAAABKABoAAAAAAAAAAABKABsAAAAFAAkAAABKABwAAAAIAAkAAABKAB0AAAAFAAoAAABKAB4AAAAHAAoAAABKAB8AAAAHAAoAAABKACAAAAABAAMAAABKACEAAAABAAQAAABKACIAAAABAAQAAABKACMAAAABAAUAAABKACQAAAAFAAkAAABKACUAAAAFAAkAAABKACYAAAAAAAAAAABKACcAAAAFAAoAAABKACgAAAAFAAoAAABKACkAAAAHAAoAAABKACoAAAAFAAkAAABKACsAAAAHAAoAAABKACwAAAAIAAoAAABKAC0AAAAFAAoAAABKAC4AAAAFAAkAAABKAC8AAAAFAAkAAABKADAAAAAHAAoAAABKADEAAAAHAAkAAABKADIAAAAFAAoAAABKADMAAAAHAAoAAABLAPD/AAABAAsAAABLAPH/AAAHAAkAAABLAPL/AAAHAAoAAABLAPP/AAAHAAkAAABLAPT/AAAFAAkAAABLAPX/AAAFAAoAAABLAPb/AAACAAMAAABLAPf/AAAAAAcAAABLAPj/AAABAAQAAABLAPn/AAABAAQAAABLAPr/AAABAAQAAABLAPv/AAABAAYAAABLAPz/AAAAAAUAAABLAP3/AAAIAAkAAABLAP7/AAAFAAkAAABLAP//AAAHAAkAAABLAAAAAAAFAAkAAABLAAEAAAAAAAAAAABLAAIAAAAIAAoAAABLAAMAAAAIAAkAAABLAAQAAAAIAAkAAABLAAUAAAAAAAAAAABLAAYAAAAAAAMAAABLAAcAAAAAAAQAAABLAAgAAAABAAcAAABLAAkAAAABAAQAAABLAAoAAAABAAQAAABLAAsAAAABAAQAAABLAAwAAAABAAQAAABLAA0AAAAAAAYAAABLAA4AAAACAAUAAABLAA8AAAAFAAoAAABLABAAAAAHAAkAAABLABEAAAAHAAoAAABLABIAAAAHAAkAAABLABMAAAAHAAkAAABLABQAAAAAAAAAAABLABUAAAAHAAoAAABLABYAAAAHAAkAAABLABcAAAAFAAkAAABLABgAAAAAAAAAAABLABkAAAAHAAoAAABLABoAAAAFAAkAAABLABsAAAAIAAoAAABLABwAAAAFAAkAAABLAB0AAAAAAAAAAABLAB4AAAAFAAoAAABLAB8AAAAIAAoAAABLACAAAAABAAMAAABLACEAAAABAAQAAABLACIAAAABAAQAAABLACMAAAABAAUAAABLACQAAAAFAAoAAABLACUAAAAHAAoAAABLACYAAAAFAAkAAABLACcAAAAHAAoAAABLACgAAAAHAAoAAABLACkAAAAIAAkAAABLACoAAAAFAAkAAABLACsAAAAHAAkAAABLACwAAAAAAAAAAABLAC0AAAAFAAoAAABLAC4AAAAAAAAAAABLAC8AAAAAAAAAAABLADAAAAAHAAkAAABLADEAAAAIAAoAAABLADIAAAAHAAoAAABLADMAAAAFAAoAAABMAPD/AAABAAsAAABMAPH/AAAIAAkAAABMAPL/AAAIAAkAAABMAPP/AAAFAAoAAABMAPT/AAAFAAoAAABMAPX/AAAHAAoAAABMAPb/AAAIAAoAAABMAPf/AAABAAMAAABMAPj/AAABAAQAAABMAPn/AAABAAQAAABMAPr/AAABAAQAAABMAPv/AAABAAQAAABMAPz/AAABAAYAAABMAP3/AAAAAAUAAABMAP7/AAAFAAoAAABMAP//AAAIAAkAAABMAAAAAAAHAAoAAABMAAEAAAAIAAkAAABMAAIAAAAFAAkAAABMAAMAAAAHAAkAAABMAAQAAAAAAAMAAABMAAUAAAAAAAQAAABMAAYAAAABAAcAAABMAAcAAAABAAQAAABMAAgAAAABAAQAAABMAAkAAAABAAQAAABMAAoAAAABAAQAAABMAAsAAAABAAQAAABMAAwAAAAAAAYAAABMAA0AAAACAAUAAABMAA4AAAAHAAoAAABMAA8AAAAHAAoAAABMABAAAAAIAAoAAABMABEAAAAHAAoAAABMABIAAAAIAAoAAABMABMAAAAIAAoAAABMABQAAAAFAAoAAABMABUAAAAFAAoAAABMABYAAAAFAAoAAABMABcAAAAHAAoAAABMABgAAAAFAAkAAABMABkAAAAHAAoAAABMABoAAAAIAAkAAABMABsAAAAIAAkAAABMABwAAAAIAAkAAABMAB0AAAAHAAoAAABMAB4AAAAIAAkAAABMAB8AAAAAAAAAAABMACAAAAABAAMAAABMACEAAAABAAQAAABMACIAAAABAAQAAABMACMAAAABAAUAAABMACQAAAAFAAoAAABMACUAAAAFAAkAAABMACYAAAAIAAkAAABMACcAAAAFAAoAAABMACgAAAAIAAoAAABMACkAAAAIAAoAAABMACoAAAAHAAoAAABMACsAAAAFAAkAAABMACwAAAAFAAoAAABMAC0AAAAHAAoAAABMAC4AAAAFAAoAAABMAC8AAAAIAAkAAABMADAAAAAFAAoAAABMADEAAAAHAAoAAABMADIAAAAIAAoAAABMADMAAAAHAAoAAABNAPD/AAABAAsAAABNAPH/AAAIAAoAAABNAPL/AAAFAAkAAABNAPP/AAAAAAAAAABNAPT/AAAFAAoAAABNAPX/AAAFAAkAAABNAPb/AAAHAAoAAABNAPf/AAACAAMAAABNAPj/AAAAAAcAAABNAPn/AAABAAQAAABNAPr/AAABAAQAAABNAPv/AAABAAQAAABNAPz/AAABAAQAAABNAP3/AAABAAUAAABNAP7/AAAFAAkAAABNAP//AAAHAAoAAABNAAAAAAAFAAkAAABNAAEAAAAFAAoAAABNAAIAAAAHAAkAAABNAAMAAAAAAAMAAABNAAQAAAABAAcAAABNAAUAAAABAAQAAABNAAYAAAABAAQAAABNAAcAAAABAAQAAABNAAgAAAABAAQAAABNAAkAAAABAAQAAABNAAoAAAAAAAYAAABNAAsAAAACAAQAAABNAAwAAAACAAUAAABNAA0AAAAAAAAAAABNAA4AAAAHAAkAAABNAA8AAAAIAAkAAABNABAAAAAHAAoAAABNABEAAAAFAAoAAABNABIAAAAFAAoAAABNABMAAAAFAAoAAABNABQAAAAHAAkAAABNABUAAAAFAAkAAABNABYAAAAFAAkAAABNABcAAAAFAAoAAABNABgAAAAHAAoAAABNABkAAAAHAAkAAABNABoAAAAIAAkAAABNABsAAAAIAAoAAABNABwAAAAFAAkAAABNAB0AAAAAAAAAAABNAB4AAAAFAAkAAABNAB8AAAAHAAoAAABNACAAAAABAAMAAABNACEAAAABAAQAAABNACIAAAABAAQAAABNACMAAAABAAUAAABNACQAAAAFAAoAAABNACUAAAAHAAkAAABNACYAAAAFAAoAAABNACcAAAAHAAkAAABNACgAAAAHAAkAAABNACkAAAAFAAoAAABNACoAAAAHAAkAAABNACsAAAAHAAkAAABNACwAAAAHAAoAAABNAC0AAAAFAAoAAABNAC4AAAAHAAoAAABNAC8AAAAIAAkAAABNADAAAAAFAAkAAABNADEAAAAFAAoAAABNADIAAAAHAAkAAABNADMAAAAFAAoAAABOAPD/AAABAAsAAABOAPH/AAAIAAoAAABOAPL/AAAIAAkAAABOAPP/AAAFAAkAAABOAPT/AAAFAAoAAABOAPX/AAAIAAoAAABOAPb/AAAFAAkAAABOAPf/AAAFAAoAAABOAPj/AAACAAMAAABOAPn/AAAAAAcAAABOAPr/AAABAAQAAABOAPv/AAABAAQAAABOAPz/AAABAAQAAABOAP3/AAABAAYAAABOAP7/AAAAAAQAAABOAP//AAAAAAQAAABOAAAAAAAAAAQAAABOAAEAAAAAAAQAAABOAAIAAAAAAAQAAABOAAMAAAABAAcAAABOAAQAAAABAAQAAABOAAUAAAABAAQAAABOAAYAAAABAAQAAABOAAcAAAABAAQAAABOAAgAAAAAAAYAAABOAAkAAAACAAQAAABOAAoAAAACAAUAAABOAAsAAAAIAAoAAABOAAwAAAAFAAkAAABOAA0AAAAAAAAAAABOAA4AAAAIAAoAAABOAA8AAAAFAAoAAABOABAAAAAHAAkAAABOABEAAAAHAAoAAABOABIAAAAHAAoAAABOABMAAAAFAAoAAABOABQAAAAIAAoAAABOABUAAAAFAAoAAABOABYAAAAAAAAAAABOABcAAAAAAAAAAABOABgAAAAHAAkAAABOABkAAAAIAAoAAABOABoAAAAFAAoAAABOABsAAAAIAAkAAABOABwAAAAAAAAAAABOAB0AAAAAAAAAAABOAB4AAAAHAAkAAABOAB8AAAAIAAoAAABOACAAAAABAAMAAABOACEAAAABAAQAAABOACMAAAABAAUAAABOACQAAAAIAAkAAABOACUAAAAFAAoAAABOACYAAAAFAAoAAABOACcAAAAHAAoAAABOACgAAAAIAAoAAABOACkAAAAIAAkAAABOACoAAAAIAAkAAABOACsAAAAIAAoAAABOACwAAAAAAAAAAABOAC0AAAAIAAoAAABOAC4AAAAAAAAAAABOAC8AAAAIAAkAAABOADAAAAAFAAoAAABOADEAAAAHAAoAAABOADIAAAAFAAoAAABOADMAAAAAAAAAAABPAPD/AAABAAsAAABPAPH/AAAHAAoAAABPAPL/AAAAAAAAAABPAPP/AAAFAAoAAABPAPT/AAAHAAkAAABPAPX/AAAHAAoAAABPAPb/AAAFAAkAAABPAPf/AAAIAAkAAABPAPj/AAAIAAkAAABPAPn/AAACAAMAAABPAPr/AAACAAQAAABPAPv/AAAAAAcAAABPAPz/AAABAAQAAABPAP3/AAABAAQAAABPAP7/AAABAAQAAABPAP//AAABAAQAAABPAAAAAAABAAQAAABPAAEAAAABAAQAAABPAAIAAAABAAQAAABPAAMAAAABAAQAAABPAAQAAAABAAQAAABPAAUAAAABAAQAAABPAAYAAAAAAAYAAABPAAcAAAACAAQAAABPAAgAAAACAAUAAABPAAkAAAAIAAoAAABPAAoAAAAHAAoAAABPAAsAAAAFAAkAAABPAAwAAAAIAAoAAABPAA0AAAAFAAoAAABPAA4AAAAIAAoAAABPAA8AAAAHAAkAAABPABAAAAAIAAkAAABPABEAAAAAAAAAAABPABIAAAAHAAkAAABPABMAAAAFAAkAAABPABQAAAAFAAkAAABPABUAAAAFAAkAAABPABYAAAAIAAoAAABPABcAAAAFAAkAAABPABgAAAAHAAoAAABPABkAAAAFAAoAAABPABoAAAAHAAoAAABPABsAAAAFAAoAAABPABwAAAAHAAoAAABPAB0AAAAHAAoAAABPAB4AAAAIAAoAAABPAB8AAAAFAAoAAABPACAAAAABAAMAAABPACEAAAABAAQAAABPACQAAAAAAAoAAABPACUAAAAFAAkAAABPACYAAAAHAAkAAABPACcAAAAFAAkAAABPACgAAAAAAAAAAABPACkAAAAHAAkAAABPACoAAAAFAAoAAABPACsAAAAFAAoAAABPACwAAAAHAAkAAABPAC0AAAAIAAoAAABPAC4AAAAHAAoAAABPAC8AAAAFAAoAAABPADAAAAAFAAkAAABPADEAAAAAAAAAAABPADIAAAAHAAkAAABPADMAAAAAAAkAAABQAPD/AAABAAsAAABQAPH/AAAAAAkAAABQAPL/AAAAAAoAAABQAPP/AAAIAAkAAABQAPT/AAAIAAkAAABQAPX/AAAFAAoAAABQAPb/AAAFAAkAAABQAPf/AAAIAAoAAABQAPj/AAAIAAkAAABQAPn/AAAFAAkAAABQAPr/AAAAAAAAAABQAPv/AAABAAMAAABQAPz/AAABAAQAAABQAP3/AAAPAAYAAABQAP7/AAAPAAgAAABQAP//AAAPAAcAAABQAAAAAAAPAAYAAABQAAEAAAAPAAcAAABQAAIAAAAPAAcAAABQAAMAAAAAAAYAAABQAAQAAAACAAQAAABQAAUAAAACAAQAAABQAAYAAAACAAUAAABQAAcAAAAIAAoAAABQAAgAAAAHAAkAAABQAAkAAAAFAAoAAABQAAoAAAAFAAoAAABQAAsAAAAIAAoAAABQAAwAAAAHAAoAAABQAA0AAAAIAAkAAABQAA4AAAAFAAoAAABQAA8AAAAIAAoAAABQABAAAAAIAAkAAABQABEAAAAHAAkAAABQABIAAAAHAAkAAABQABMAAAAHAAoAAABQABQAAAAIAAkAAABQABUAAAAAAAkAAABQABYAAAAAAAkAAABQABcAAAAAAAkAAABQABgAAAAAAAkAAABQABkAAAAAAAkAAABQABoAAAAAAAkAAABQABsAAAAAAAkAAABQABwAAAAAAAkAAABQAB0AAAAAAAkAAABQAB4AAAAAAAkAAABQAB8AAAAAAAkAAABQACAAAAABAAMAAABQACEAAAABAAQAAABQACQAAAACAAsAAABQACUAAAAAAAkAAABQACYAAAAAAAoAAABQACcAAAAAAAkAAABQACgAAAAAAAoAAABQACkAAAAAAAkAAABQACoAAAAAAAoAAABQACsAAAAAAAkAAABQACwAAAAAAAoAAABQAC0AAAAAAAkAAABQAC4AAAAAAAoAAABQAC8AAAAAAAoAAABQADAAAAAAAAoAAABQADEAAAAAAAoAAABQADIAAAAAAAoAAABQADMAAAAAAAkAAAAMAAYAAAAHAAoAAAAOAAYAAAAFAAoAAAAYAPj/AAADAAcAAAApAPj/AAADAAcAAAApAPn/AAADAAcAAAAqAPj/AAADAAcAAAAqAPn/AAADAAcAAAAPAAAAAAABAAMAAAAPAAEAAAABAAQAAAAPAAIAAAABAAUAAAAQAAAAAAABAAMAAAAQAAEAAAABAAQAAAAQAAIAAAABAAUAAAARAAAAAAABAAMAAAARAAEAAAABAAQAAAARAAIAAAABAAUAAAAlAAoAAAADAAcAAAAkAAoAAAADAAcAAAAkAAsAAAADAAcAAAAlAAwAAAADAAcAAAAlAAsAAAAAAAEAAAAmAAsAAAAAAAEAAAAmAAwAAAAAAAEAAAAnAAsAAAAAAAEAAAAoAAsAAAADAAcAAAAnAAoAAAAAAAEAAAAmAAoAAAAAAAEAAAAWAAwAAAADAAkAAAAEAP7/AAAAAAAAAAAIAPv/AAAIAAkAAAAKAP3/AAAIAAkAAAAHAP7/AAAAAAAAAAAHAP3/AAAGAAAAAAAIAPz/AAAOAAAAAAAGAPz/AAAAAAAAAAAKAP7/AAAIAAkAAAAHAP//AAABAAQAAAAGAAMAAAALAAAAAABOACIAAAABAAQAAABPACIAAAABAAQAAABQACIAAAAPAAcAAABPACMAAAABAAUAAABQACMAAAACAAsAAAD+/wcAAAAIAAkAAAD8////AAARACEAAAAIABQAAAAIAAkAAAA=") +position = Vector2(-154, 113) +tile_map_data = PackedByteArray("AAAAAP//AAASACEAAAD/////AAARACEAAAD+////AAARACEAAAD9////AAARACEAAAD7////AAAQACEAAAD6////AAAHAAoAAAD5////AAAHAAkAAAD4////AAAHAAkAAAD5/wAAAAAFAAoAAAD6/wAAAAAAAAMAAAD7/wAAAAABAAMAAAD8/wAAAAABAAMAAAD9/wAAAAABAAMAAAD+/wAAAAABAAMAAAD//wAAAAABAAMAAAAAAAAAAAABAAMAAAABAAAAAAABAAMAAAACAAEAAAABAAQAAAADAAEAAAABAAQAAAAEAAEAAAABAAQAAAD4/wAAAAANABwAAAD3/wAAAAAIAAoAAAACAAAAAAABAAMAAAADAAAAAAABAAMAAAAEAAAAAAABAAMAAAAFAAAAAAABAAMAAAAGAAAAAAABAAcAAAAHAAAAAAABAAQAAAAIAAAAAAAAAAcAAAABAP//AAAIAAoAAAACAP//AAAIAAoAAAADAP//AAAFAAkAAAAEAP//AAAHAAoAAAAFAP//AAAFAAkAAAAGAP//AAAAAAMAAAD2/wAAAAAMABwAAAD1/wAAAAALABwAAAD9/wEAAAABAAQAAAD+/wEAAAABAAQAAAD//wEAAAABAAQAAAAAAAEAAAABAAQAAAABAAEAAAABAAQAAAAFAAEAAAABAAQAAAAGAAEAAAABAAQAAAAHAAEAAAABAAQAAAAIAAEAAAABAAQAAAAJAAEAAAABAAQAAAD8/wEAAAABAAQAAAD7/wEAAAABAAQAAAD6/wEAAAABAAcAAAD5/wEAAAABAAMAAAD4/wEAAAAAAAMAAAD3/wEAAAAHAAkAAAD2/wEAAAAFAAoAAAD1/wEAAAAFAAkAAAD0/wEAAAAHAAoAAAD5//7/AAAFAAkAAAD6//7/AAAIAAoAAAD7//7/AAAQACAAAAD8//7/AAARACAAAAD9//7/AAARACAAAAD+//7/AAARACAAAAD///7/AAARACAAAAAAAP7/AAASACAAAAABAP7/AAAFAAoAAAACAP7/AAAIAAoAAAADAP7/AAAFAAoAAAAFAP7/AAAFAAkAAAAGAP7/AAAAAAAAAAAIAP7/AAACAAMAAAAJAP7/AAAHAAkAAAALAP7/AAAFAAoAAAAMAP7/AAAAAAAAAAD4//7/AAAFAAoAAAD3//7/AAAAAAAAAAD3//3/AAANABwAAAD4//3/AAAHAAoAAAD5//3/AAAFAAoAAAD6//3/AAAHAAoAAAD7//3/AAAHAAoAAAD8//3/AAAIAAkAAAD9//3/AAAFAAkAAAD+//3/AAAAAAAAAAD///3/AAAIAAoAAAAAAP3/AAAIAAkAAAABAP3/AAAIAAoAAAACAP3/AAAHAAkAAAADAP3/AAANABwAAAAEAPz/AAAHAAkAAAAFAPz/AAAAAAAAAAAHAPz/AAAIAAoAAAADAPz/AAAFAAkAAAACAPz/AAAIAAoAAAABAPz/AAAIAAkAAAAAAPz/AAAHAAoAAAD///z/AAAHAAoAAAD+//z/AAAIAAoAAAD9//z/AAAFAAoAAAD8//z/AAAAAAAAAAD7//z/AAAFAAoAAAD6//z/AAAAAAAAAAD5//z/AAANABwAAAD4//z/AAAIAAkAAAD3//z/AAAFAAkAAAAEAP3/AAAAAAAAAAAFAP3/AAAFAAkAAAAGAP3/AAAAAAAAAAAIAP3/AAAFAAoAAAAJAP3/AAAHAAoAAAALAP3/AAAIAAkAAAAMAP3/AAAFAAoAAAANAP7/AAAHAAoAAAAJAPz/AAAHAAoAAAAKAPz/AAAIAAoAAAALAPz/AAAFAAoAAAD+//v/AAAHAAoAAAD9//v/AAAFAAkAAAD8//v/AAAHAAoAAAD7//v/AAAIAAoAAAD6//v/AAAAAAAAAAD5//v/AAAIAAkAAAD4//v/AAAFAAkAAAD3//v/AAAIAAkAAAD2//v/AAAAAAAAAAD///v/AAANABwAAAAAAPv/AAAHAAkAAAABAPv/AAAIAAkAAAACAPv/AAAHAAkAAAADAPv/AAAAAAAAAAAEAPv/AAAFAAoAAAAFAPv/AAAHAAoAAAAGAPv/AAAHAAoAAAAHAPv/AAAIAAoAAAAJAPv/AAAFAAkAAAAKAPv/AAAFAAoAAAALAPv/AAAFAAoAAAAMAPv/AAAAAAAAAAD1//v/AAAFAAkAAAD0//v/AAAIAAkAAADz//r/AAAFAAkAAADy//r/AAAFAAkAAADy//v/AAAHAAoAAADz//v/AAAAAAAAAAAAAPr/AAAFAAoAAAD///r/AAAFAAoAAAD+//r/AAAFAAoAAAD9//r/AAAHAAoAAAD8//r/AAAHAAkAAAD7//r/AAAAAAAAAAD6//r/AAAHAAoAAAD5//r/AAAAAAAAAAD4//r/AAAIAAkAAAD3//r/AAAHAAoAAAD2//r/AAAFAAkAAAD1//r/AAAIAAkAAAD0//r/AAAFAAkAAAABAPr/AAAIAAkAAAACAPr/AAAFAAoAAAADAPr/AAAHAAkAAAAEAPr/AAAFAAoAAAAFAPr/AAAIAAoAAAAGAPr/AAAIAAkAAAAHAPr/AAAIAAkAAAAIAPr/AAAFAAoAAAAJAPr/AAAFAAoAAAAKAPr/AAAIAAoAAAALAPr/AAAHAAkAAAD6//n/AAAHAAkAAAD5//n/AAAIAAkAAAD4//n/AAAAAAAAAAD3//n/AAAIAAkAAAD2//n/AAAFAAoAAAD1//n/AAAFAAoAAAD0//n/AAAHAAoAAAAMAPr/AAAFAAkAAAANAPr/AAAHAAoAAAAOAPr/AAAIAAoAAAAPAPr/AAAAAAAAAAAQAPr/AAAFAAkAAAAIAPn/AAAFAAkAAAAHAPn/AAAHAAkAAAAGAPn/AAAAAAAAAAAFAPn/AAAAAAAAAAAEAPn/AAAFAAkAAAADAPn/AAAFAAoAAAACAPn/AAAAAAAAAAABAPn/AAAFAAkAAAAAAPn/AAAIAAkAAAD///n/AAAHAAoAAAD+//n/AAAFAAkAAAD9//n/AAAHAAkAAAD8//n/AAAFAAkAAAD7//n/AAAFAAoAAAD2//j/AAAHAAoAAAD1//j/AAAHAAkAAAD0//j/AAAHAAoAAADz//j/AAAFAAoAAADy//j/AAAFAAkAAADx//j/AAAFAAoAAAAJAPn/AAAFAAkAAAD///j/AAAFAAkAAAD+//j/AAAIAAkAAAD9//j/AAAFAAkAAAD8//j/AAAIAAkAAAD7//j/AAAFAAoAAAD6//j/AAAFAAoAAAD5//j/AAAIAAoAAAD4//j/AAAIAAkAAAD3//j/AAAFAAkAAAAAAPj/AAAIAAoAAAABAPj/AAAHAAoAAAACAPj/AAAFAAoAAAADAPj/AAAHAAoAAAAEAPj/AAAIAAkAAAAFAPj/AAAHAAoAAAAGAPj/AAAAAAAAAAAHAPj/AAAIAAoAAAAIAPj/AAAHAAkAAAAJAPj/AAAFAAoAAAAKAPj/AAAAAAAAAAAEAPf/AAAHAAkAAAADAPf/AAAFAAkAAAACAPf/AAAHAAkAAAABAPf/AAAIAAoAAAAAAPf/AAAFAAkAAAD///f/AAAIAAoAAAD+//f/AAAHAAoAAAD9//f/AAAIAAoAAAD8//f/AAAIAAkAAAD7//f/AAAIAAoAAAD6//f/AAAIAAkAAAD5//f/AAAHAAoAAAD4//f/AAAIAAkAAAD3//f/AAAIAAoAAAD2//f/AAAIAAkAAAD1//f/AAAHAAkAAAD0//f/AAAFAAoAAADz//f/AAAFAAkAAAALAPj/AAAFAAoAAAAMAPj/AAAHAAoAAAANAPj/AAAFAAoAAAAOAPj/AAAHAAoAAAAPAPj/AAAHAAoAAAAQAPn/AAAIAAkAAAARAPn/AAAIAAkAAAASAPn/AAAFAAkAAAATAPn/AAAFAAoAAAAPAPn/AAAHAAoAAAAOAPn/AAAHAAoAAADx//7/AAADAAcAAADx//3/AAADAAcAAADx//z/AAADAAYAAADx//v/AAAFAAkAAADx//r/AAAFAAoAAADx//n/AAAAAAAAAADy//n/AAAFAAoAAADz//n/AAAAAAAAAADy//z/AAAEAAYAAADy//3/AAACAAoAAADy//7/AAAAAAEAAADy////AAADAAcAAADx////AAADAAcAAADx/wAAAAADAAcAAADx/wEAAAAAAAEAAADy/wEAAAACAAkAAADy/wAAAAADAAcAAADz/wAAAAACAAkAAADz////AAADAAcAAADz//7/AAADAAcAAADz//3/AAADAAYAAADz//z/AAAFAAoAAAD0//z/AAAIAAkAAAD0//3/AAAEAAYAAAD0//7/AAAEAAcAAAD0////AAAEAAcAAAD0/wAAAAAEAAgAAAD1////AAAAAAAAAAD1//7/AAAFAAoAAAD1//3/AAAFAAoAAAD1//z/AAAAAAAAAAD2//z/AAAIAAoAAAD2//3/AAAAAAAAAAD2//7/AAAHAAkAAAD2////AAAIAAkAAAD3////AAAHAAoAAADz/wEAAAAEAAgAAADy//f/AAAHAAoAAADx//f/AAAFAAoAAAAIAPf/AAAIAAoAAAAHAPf/AAAIAAoAAAAGAPf/AAAIAAkAAAAFAPf/AAAFAAkAAAAJAPf/AAAIAAoAAAAKAPf/AAAIAAkAAAALAPf/AAAHAAoAAAAMAPf/AAAHAAoAAAANAPf/AAAAAAAAAAAOAPf/AAAAAAAAAAAPAPf/AAAHAAkAAAAQAPf/AAAAAAAAAAAQAPj/AAAHAAkAAAARAPj/AAAHAAoAAAARAPf/AAAIAAkAAAASAPf/AAAAAAAAAAASAPj/AAAIAAoAAAATAPj/AAAFAAoAAAATAPf/AAAIAAoAAAAMAPn/AAAHAAkAAAALAPn/AAAIAAkAAAAKAPn/AAAFAAoAAAANAPn/AAAIAAkAAAASAPv/AAAFAAkAAAASAPr/AAAFAAoAAAARAPr/AAAHAAkAAAARAPv/AAAAAAAAAAAQAPv/AAAFAAkAAAAPAPv/AAAFAAkAAAAOAPv/AAAAAAAAAAANAPv/AAAAAAAAAAANAPz/AAAHAAkAAAAMAPz/AAAFAAkAAAANAP3/AAAFAAoAAAAOAP3/AAANABwAAAAOAPz/AAAAAAAAAAAPAPz/AAAFAAkAAAAPAP3/AAAFAAoAAAAPAP7/AAAHAAkAAAAOAP7/AAAIAAkAAAAOAP//AAAHAAkAAAANAP//AAAIAAoAAAAMAP//AAAIAAoAAAALAP//AAAHAAkAAAAKAP//AAAIAAoAAAAJAP//AAAAAAAAAAAIAP//AAACAAQAAAAJAAAAAAABAAMAAAAKAAAAAAABAAMAAAAKAAEAAAABAAQAAAALAAEAAAABAAQAAAALAAAAAAABAAMAAAAMAAAAAAABAAMAAAAMAAEAAAABAAQAAAANAAEAAAABAAQAAAANAAAAAAABAAMAAAAOAAAAAAABAAMAAAAOAAEAAAABAAQAAAAPAP//AAAIAAkAAAAQAP//AAAIAAoAAAAQAP7/AAAIAAoAAAAQAP3/AAAHAAkAAAAQAPz/AAAHAAoAAAARAPz/AAAIAAoAAAARAP3/AAAHAAoAAAARAP7/AAAAAAAAAAARAP//AAAAAAAAAAASAAEAAAABAAQAAAASAAAAAAABAAMAAAASAP//AAAFAAoAAAASAP7/AAAIAAkAAAASAP3/AAAAAAAAAAASAPz/AAAFAAoAAAATAPz/AAAAAAAAAAATAPv/AAAHAAoAAAATAPr/AAAIAAkAAAATAP3/AAAFAAoAAAATAP7/AAAAAAAAAAATAP//AAAHAAkAAAATAAAAAAABAAMAAAATAAEAAAABAAQAAADi//D/AAAAAAsAAADi//H/AAABAAoAAADi//L/AAABAAkAAADi//P/AAABAAoAAADi//T/AAABAAkAAADi//X/AAABAAoAAADi//b/AAABAAkAAADi//f/AAABAAoAAADi//j/AAABAAkAAADi//n/AAABAAoAAADi//r/AAABAAkAAADi//v/AAABAAoAAADi//z/AAABAAkAAADi//3/AAABAAkAAADi//7/AAABAAkAAADi////AAABAAkAAADi/wAAAAABAAMAAADi/wEAAAABAAQAAADi/wIAAAABAAUAAADi/wMAAAAHAAkAAADi/wQAAAABAAkAAADi/wUAAAABAAkAAADi/wYAAAABAAoAAADi/wcAAAABAAkAAADi/wgAAAABAAoAAADi/wkAAAABAAkAAADi/woAAAABAAoAAADi/wsAAAABAAkAAADi/wwAAAABAAoAAADi/w0AAAABAAkAAADi/w4AAAABAAoAAADi/w8AAAABAAkAAADi/xAAAAABAAoAAADi/xEAAAABAAkAAADi/xIAAAABAAoAAADi/xMAAAABAAkAAADi/xQAAAABAAoAAADi/xUAAAABAAkAAADi/xYAAAABAAoAAADi/xcAAAABAAkAAADi/xgAAAABAAoAAADi/xkAAAABAAkAAADi/xoAAAABAAoAAADi/xsAAAABAAkAAADi/xwAAAABAAoAAADi/x0AAAABAAkAAADi/x4AAAABAAoAAADi/x8AAAABAAkAAADi/yAAAAABAAoAAADi/yEAAAABAAkAAADi/yIAAAABAAoAAADi/yMAAAABAAkAAADi/yQAAAABAAoAAADi/yUAAAABAAkAAADi/yYAAAABAAoAAADi/ycAAAABAAkAAADi/ygAAAABAAoAAADi/ykAAAAIAA4AAADi/yoAAAARAAcAAADi/ysAAAABAAQAAADi/ywAAAABAAUAAADi/y0AAAABAAkAAADi/y4AAAABAAoAAADi/y8AAAABAAkAAADi/zAAAAABAAoAAADi/zEAAAABAAkAAADi/zIAAAABAAoAAADi/zMAAAABAAkAAADj//D/AAABAAsAAADj//H/AAAIAAoAAADj//L/AAAIAAoAAADj//P/AAAHAAoAAADj//T/AAAIAAkAAADj//X/AAAIAAoAAADj//b/AAAFAAkAAADj//f/AAAIAAoAAADj//j/AAAFAAkAAADj//n/AAAHAAoAAADj//r/AAAHAAkAAADj//v/AAAIAAkAAADj//z/AAAHAAkAAADj//3/AAAFAAoAAADj//7/AAAIAAoAAADj////AAAIAAoAAADj/wAAAAABAAMAAADj/wEAAAABAAQAAADj/wIAAAABAAUAAADj/wMAAAAHAAoAAADj/wQAAAAIAAoAAADj/wUAAAAAAAAAAADj/wYAAAAFAAoAAADj/wcAAAAFAAoAAADj/wgAAAAHAAoAAADj/wkAAAAAAAAAAADj/woAAAAFAAkAAADj/wsAAAAFAAoAAADj/wwAAAAFAAkAAADj/w0AAAAFAAoAAADj/w4AAAAHAAoAAADj/w8AAAAAAAAAAADj/xAAAAAHAAkAAADj/xEAAAAIAAoAAADj/xIAAAAAAAAAAADj/xMAAAAIAAoAAADj/xQAAAAFAAoAAADj/xUAAAAIAAkAAADj/xYAAAAFAAoAAADj/xcAAAAFAAoAAADj/xgAAAAAAAAAAADj/xkAAAAIAAkAAADj/xoAAAAIAAkAAADj/xsAAAAHAAoAAADj/xwAAAAHAAkAAADj/x0AAAAFAAkAAADj/x4AAAAHAAoAAADj/x8AAAAHAAoAAADj/yAAAAAHAAkAAADj/yEAAAAIAAoAAADj/yIAAAAIAAkAAADj/yMAAAAFAAkAAADj/yQAAAAHAAoAAADj/yUAAAAAAAAAAADj/yYAAAAFAAoAAADj/ycAAAAIAAoAAADj/ygAAAAFAAkAAADj/ykAAAABAAMAAADj/yoAAAABAAQAAADj/ysAAAABAAQAAADj/ywAAAABAAUAAADj/y0AAAAFAAkAAADj/y4AAAAIAAkAAADj/y8AAAAHAAoAAADj/zAAAAAIAAkAAADj/zEAAAAHAAkAAADj/zIAAAAIAAkAAADj/zMAAAAFAAkAAADk//D/AAABAAsAAADk//H/AAAHAAkAAADk//L/AAAHAAoAAADk//P/AAAIAAkAAADk//T/AAAFAAoAAADk//X/AAAIAAkAAADk//b/AAAHAAoAAADk//f/AAAFAAoAAADk//j/AAAIAAoAAADk//n/AAAHAAkAAADk//r/AAAIAAkAAADk//v/AAAFAAoAAADk//z/AAAFAAoAAADk//3/AAAIAAkAAADk//7/AAAIAAoAAADk////AAAAAAAAAADk/wAAAAABAAMAAADk/wEAAAABAAQAAADk/wIAAAABAAUAAADk/wMAAAAIAAkAAADk/wQAAAAAAAAAAADk/wUAAAAAAAAAAADk/wYAAAAIAAoAAADk/wcAAAAAAAAAAADk/wgAAAAAAAAAAADk/wkAAAAAAAAAAADk/woAAAAIAAkAAADk/wsAAAAHAAoAAADk/wwAAAAHAAoAAADk/w0AAAAFAAoAAADk/w4AAAAAAAAAAADk/w8AAAAAAAAAAADk/xAAAAAFAAoAAADk/xEAAAAFAAoAAADk/xIAAAAHAAoAAADk/xMAAAAAAAAAAADk/xQAAAAFAAoAAADk/xUAAAAIAAoAAADk/xYAAAAIAAoAAADk/xcAAAAFAAkAAADk/xgAAAAFAAoAAADk/xkAAAAAAAAAAADk/xoAAAAHAAoAAADk/xsAAAAHAAkAAADk/xwAAAAHAAkAAADk/x0AAAAFAAoAAADk/x4AAAAAAAAAAADk/x8AAAAFAAkAAADk/yAAAAAIAAkAAADk/yEAAAAHAAkAAADk/yIAAAAIAAoAAADk/yMAAAAFAAkAAADk/yQAAAAHAAkAAADk/yUAAAAIAAoAAADk/yYAAAAIAAoAAADk/ycAAAAFAAoAAADk/ygAAAAFAAoAAADk/ykAAAABAAMAAADk/yoAAAABAAQAAADk/ysAAAABAAQAAADk/ywAAAABAAUAAADk/y0AAAAHAAkAAADk/y4AAAAHAAoAAADk/y8AAAAHAAkAAADk/zAAAAAHAAkAAADk/zEAAAAHAAoAAADk/zIAAAAAAAAAAADk/zMAAAAHAAkAAADl//D/AAABAAsAAADl//H/AAAIAAkAAADl//L/AAAIAAoAAADl//P/AAAHAAkAAADl//T/AAAFAAoAAADl//X/AAAAAAAAAADl//b/AAAHAAoAAADl//f/AAAFAAoAAADl//j/AAAHAAoAAADl//n/AAAFAAkAAADl//r/AAAFAAkAAADl//v/AAAHAAkAAADl//z/AAAIAAkAAADl//3/AAAIAAoAAADl//7/AAAHAAoAAADl////AAAFAAoAAADl/wAAAAABAAMAAADl/wEAAAABAAQAAADl/wIAAAABAAUAAADl/wMAAAAFAAkAAADl/wQAAAAHAAoAAADl/wUAAAAHAAkAAADl/wYAAAAIAAoAAADl/wcAAAAIAAkAAADl/wgAAAAIAAoAAADl/wkAAAAIAAoAAADl/woAAAAHAAoAAADl/wsAAAAHAAkAAADl/wwAAAAIAAkAAADl/w0AAAAAAAAAAADl/w4AAAAIAAoAAADl/w8AAAAFAAoAAADl/xAAAAAIAAkAAADl/xEAAAAFAAoAAADl/xIAAAAFAAoAAADl/xMAAAAFAAoAAADl/xQAAAAFAAoAAADl/xUAAAAFAAkAAADl/xYAAAAHAAoAAADl/xcAAAAIAAkAAADl/xgAAAAIAAoAAADl/xkAAAAIAAoAAADl/xoAAAAFAAoAAADl/xsAAAAHAAkAAADl/xwAAAAHAAoAAADl/x0AAAAAAAAAAADl/x4AAAAIAAkAAADl/x8AAAAIAAoAAADl/yAAAAAIAAoAAADl/yEAAAAIAAkAAADl/yIAAAAHAAkAAADl/yMAAAAIAAoAAADl/yQAAAAFAAkAAADl/yUAAAAAAAAAAADl/yYAAAAHAAoAAADl/ycAAAAFAAkAAADl/ygAAAAAAAAAAADl/ykAAAABAAMAAADl/yoAAAABAAQAAADl/ysAAAABAAQAAADl/ywAAAABAAUAAADl/y0AAAAIAAkAAADl/y4AAAAAAAAAAADl/y8AAAAAAAAAAADl/zAAAAAHAAkAAADl/zEAAAAHAAkAAADl/zIAAAAFAAkAAADl/zMAAAAAAAAAAADm//D/AAABAAsAAADm//H/AAAIAAoAAADm//L/AAAFAAoAAADm//P/AAAHAAkAAADm//T/AAAIAAkAAADm//X/AAAHAAoAAADm//b/AAAFAAkAAADm//f/AAAFAAkAAADm//j/AAAHAAoAAADm//n/AAAHAAkAAADm//r/AAAAAAAAAADm//v/AAAHAAkAAADm//z/AAAAAAAAAADm//3/AAAIAAkAAADm//7/AAAAAAAAAADm////AAAIAAkAAADm/wAAAAABAAMAAADm/wEAAAABAAQAAADm/wIAAAABAAUAAADm/wMAAAAIAAkAAADm/wQAAAAHAAoAAADm/wUAAAAIAAoAAADm/wYAAAAHAAoAAADm/wcAAAAHAAkAAADm/wgAAAAIAAoAAADm/wkAAAAHAAoAAADm/woAAAAFAAoAAADm/wsAAAAIAAkAAADm/wwAAAAHAAkAAADm/w0AAAAIAAkAAADm/w4AAAAAAAAAAADm/w8AAAAIAAoAAADm/xAAAAAFAAkAAADm/xEAAAAFAAkAAADm/xIAAAAFAAoAAADm/xMAAAAIAAoAAADm/xQAAAAFAAkAAADm/xUAAAAFAAoAAADm/xYAAAAIAAoAAADm/xcAAAAFAAkAAADm/xgAAAAHAAoAAADm/xkAAAAIAAoAAADm/xoAAAAFAAkAAADm/xsAAAAFAAoAAADm/xwAAAAHAAoAAADm/x0AAAAIAAoAAADm/x4AAAAIAAoAAADm/x8AAAAIAAoAAADm/yAAAAAAAAAAAADm/yEAAAAFAAkAAADm/yIAAAAFAAoAAADm/yMAAAAHAAoAAADm/yQAAAAIAAoAAADm/yUAAAAFAAoAAADm/yYAAAAFAAoAAADm/ycAAAAAAAAAAADm/ygAAAAHAAkAAADm/ykAAAABAAMAAADm/yoAAAABAAQAAADm/ysAAAABAAQAAADm/ywAAAABAAYAAADm/y0AAAAAAAUAAADm/y4AAAAIAAoAAADm/y8AAAAIAAkAAADm/zAAAAAIAAoAAADm/zEAAAAHAAoAAADm/zIAAAAHAAkAAADm/zMAAAAIAAkAAADn//D/AAABAAsAAADn//H/AAAFAAoAAADn//L/AAAIAAoAAADn//P/AAAHAAkAAADn//T/AAAIAAkAAADn//X/AAAFAAoAAADn//b/AAAAAAAAAADn//f/AAAFAAoAAADn//j/AAAHAAkAAADn//n/AAAIAAkAAADn//r/AAAHAAoAAADn//v/AAAAAAAAAADn//z/AAAFAAkAAADn//3/AAAFAAkAAADn//7/AAAFAAoAAADn////AAAHAAoAAADn/wAAAAABAAMAAADn/wEAAAABAAQAAADn/wIAAAABAAUAAADn/wMAAAAFAAoAAADn/wQAAAAHAAoAAADn/wUAAAAHAAoAAADn/wYAAAAIAAoAAADn/wcAAAAAAAAAAADn/wgAAAAIAAoAAADn/wkAAAAHAAkAAADn/woAAAAHAAoAAADn/wsAAAAIAAoAAADn/wwAAAAHAAoAAADn/w0AAAAIAAoAAADn/w4AAAAFAAkAAADn/w8AAAAFAAoAAADn/xAAAAAFAAoAAADn/xEAAAAIAAoAAADn/xIAAAAHAAkAAADn/xMAAAAIAAoAAADn/xQAAAAAAAAAAADn/xUAAAAIAAkAAADn/xYAAAAFAAkAAADn/xcAAAAIAAoAAADn/xgAAAAHAAoAAADn/xkAAAAFAAkAAADn/xoAAAAHAAoAAADn/xsAAAAIAAkAAADn/xwAAAAFAAkAAADn/x0AAAAIAAoAAADn/x4AAAAHAAoAAADn/x8AAAAIAAoAAADn/yAAAAAHAAoAAADn/yEAAAAIAAoAAADn/yIAAAAIAAoAAADn/yMAAAAFAAoAAADn/yQAAAAIAAoAAADn/yUAAAAFAAoAAADn/yYAAAAHAAoAAADn/ycAAAAFAAoAAADn/ygAAAAIAAkAAADn/ykAAAABAAMAAADn/yoAAAABAAQAAADn/ysAAAABAAQAAADn/ywAAAABAAQAAADn/y0AAAABAAUAAADn/y4AAAAFAAkAAADn/y8AAAAHAAkAAADn/zAAAAAAAAAAAADn/zEAAAAFAAkAAADn/zIAAAAFAAoAAADn/zMAAAAFAAkAAADo//D/AAABAAsAAADo//H/AAAFAAkAAADo//L/AAAFAAkAAADo//P/AAAAAAAAAADo//T/AAAFAAoAAADo//X/AAAFAAoAAADo//b/AAAHAAkAAADo//f/AAAIAAkAAADo//j/AAAHAAkAAADo//n/AAAAAAAAAADo//r/AAAFAAkAAADo//v/AAAIAAkAAADo//z/AAAFAAkAAADo//3/AAAFAAoAAADo//7/AAAHAAkAAADo////AAAAAAAAAADo/wAAAAABAAMAAADo/wEAAAABAAQAAADo/wIAAAABAAYAAADo/wMAAAAAAAQAAADo/wQAAAAAAAQAAADo/wUAAAAAAAUAAADo/wYAAAAIAAkAAADo/wcAAAAFAAkAAADo/wgAAAAHAAkAAADo/wkAAAAFAAoAAADo/woAAAAHAAkAAADo/wsAAAAAAAAAAADo/wwAAAAFAAkAAADo/w0AAAAIAAoAAADo/w4AAAAIAAkAAADo/w8AAAAAAAAAAADo/xAAAAAAAAAAAADo/xEAAAAHAAoAAADo/xIAAAAHAAkAAADo/xMAAAAIAAoAAADo/xQAAAAFAAoAAADo/xUAAAAAAAAAAADo/xYAAAAIAAoAAADo/xcAAAAHAAkAAADo/xgAAAAFAAkAAADo/xkAAAAAAAAAAADo/xoAAAAFAAoAAADo/xsAAAAHAAoAAADo/xwAAAAAAAAAAADo/x0AAAAHAAoAAADo/x4AAAAFAAkAAADo/x8AAAAFAAkAAADo/yAAAAAIAAoAAADo/yEAAAAHAAoAAADo/yIAAAAFAAkAAADo/yMAAAAFAAkAAADo/yQAAAAIAAkAAADo/yUAAAAFAAoAAADo/yYAAAAAAAAAAADo/ycAAAAFAAkAAADo/ygAAAAHAAkAAADo/ykAAAABAAMAAADo/yoAAAABAAQAAADo/ysAAAABAAQAAADo/ywAAAABAAQAAADo/y0AAAABAAYAAADo/y4AAAAAAAUAAADo/y8AAAAHAAoAAADo/zAAAAAHAAoAAADo/zEAAAAAAAAAAADo/zIAAAAIAAoAAADo/zMAAAAAAAAAAADp//D/AAABAAsAAADp//H/AAAFAAoAAADp//L/AAAFAAkAAADp//P/AAAAAAAAAADp//T/AAAHAAkAAADp//X/AAAFAAoAAADp//b/AAAFAAoAAADp//f/AAAFAAkAAADp//j/AAAHAAoAAADp//n/AAAFAAkAAADp//r/AAAFAAoAAADp//v/AAAFAAoAAADp//z/AAAAAAAAAADp//3/AAAAAAAAAADp//7/AAAFAAkAAADp////AAAHAAoAAADp/wAAAAABAAMAAADp/wEAAAABAAQAAADp/wIAAAABAAQAAADp/wMAAAABAAQAAADp/wQAAAABAAQAAADp/wUAAAABAAYAAADp/wYAAAAAAAQAAADp/wcAAAAAAAUAAADp/wgAAAAFAAoAAADp/wkAAAAAAAAAAADp/woAAAAHAAkAAADp/wsAAAAFAAoAAADp/wwAAAAFAAoAAADp/w0AAAAFAAoAAADp/w4AAAAAAAAAAADp/w8AAAAIAAoAAADp/xAAAAAHAAoAAADp/xEAAAAFAAoAAADp/xIAAAAIAAkAAADp/xMAAAAFAAoAAADp/xQAAAAFAAkAAADp/xUAAAAFAAoAAADp/xYAAAAIAAoAAADp/xcAAAAHAAoAAADp/xgAAAAAAAAAAADp/xkAAAAFAAoAAADp/xoAAAAFAAkAAADp/xsAAAAAAAAAAADp/xwAAAAHAAkAAADp/x0AAAAFAAoAAADp/x4AAAAHAAkAAADp/x8AAAAIAAoAAADp/yAAAAAIAAkAAADp/yEAAAAAAAAAAADp/yIAAAAIAAkAAADp/yMAAAAIAAkAAADp/yQAAAAFAAoAAADp/yUAAAAAAAAAAADp/yYAAAAFAAkAAADp/ycAAAAIAAoAAADp/ygAAAAFAAoAAADp/ykAAAACAAMAAADp/yoAAAAAAAcAAADp/ysAAAABAAQAAADp/ywAAAABAAQAAADp/y0AAAABAAQAAADp/y4AAAABAAUAAADp/y8AAAAIAAoAAADp/zAAAAAFAAkAAADp/zEAAAAHAAkAAADp/zIAAAAFAAoAAADp/zMAAAAAAAAAAADq//D/AAABAAsAAADq//H/AAAFAAoAAADq//L/AAAIAAoAAADq//P/AAAAAAAAAADq//T/AAAIAAoAAADq//X/AAAHAAoAAADq//b/AAAFAAkAAADq//f/AAAHAAkAAADq//j/AAAAAAAAAADq//n/AAAHAAkAAADq//r/AAAAAAAAAADq//v/AAAFAAkAAADq//z/AAAFAAkAAADq//3/AAAFAAkAAADq//7/AAAFAAoAAADq////AAAIAAkAAADq/wAAAAACAAMAAADq/wEAAAACAAQAAADq/wIAAAACAAQAAADq/wMAAAACAAQAAADq/wQAAAAAAAcAAADq/wUAAAABAAQAAADq/wYAAAABAAQAAADq/wcAAAABAAYAAADq/wgAAAAAAAUAAADq/wkAAAAIAAoAAADq/woAAAAAAAAAAADq/wsAAAAIAAoAAADq/wwAAAAHAAoAAADq/w0AAAAIAAkAAADq/w4AAAAFAAoAAADq/w8AAAAIAAkAAADq/xAAAAAHAAoAAADq/xEAAAAHAAkAAADq/xIAAAAFAAkAAADq/xMAAAAHAAoAAADq/xQAAAAHAAoAAADq/xUAAAAFAAoAAADq/xYAAAAHAAoAAADq/xcAAAAIAAkAAADq/xgAAAAAAAAAAADq/xkAAAAHAAkAAADq/xoAAAAHAAkAAADq/xsAAAAHAAoAAADq/xwAAAAAAAAAAADq/x0AAAAHAAkAAADq/x4AAAAFAAoAAADq/x8AAAAIAAkAAADq/yAAAAAAAAAAAADq/yEAAAAAAAAAAADq/yIAAAAFAAoAAADq/yMAAAAIAAkAAADq/yQAAAAIAAkAAADq/yUAAAAIAAoAAADq/yYAAAAFAAkAAADq/ycAAAAIAAkAAADq/ygAAAAHAAoAAADq/ykAAAAFAAoAAADq/yoAAAACAAMAAADq/ysAAAAAAAcAAADq/ywAAAABAAQAAADq/y0AAAABAAQAAADq/y4AAAABAAYAAADq/y8AAAAAAAUAAADq/zAAAAAIAAoAAADq/zEAAAAHAAkAAADq/zIAAAAFAAkAAADq/zMAAAAAAAAAAADr//D/AAABAAsAAADr//H/AAAAAAAAAADr//L/AAAIAAkAAADr//P/AAAIAAkAAADr//T/AAAHAAoAAADr//X/AAAFAAkAAADr//b/AAAHAAkAAADr//f/AAAIAAoAAADr//j/AAAIAAkAAADr//n/AAAFAAoAAADr//r/AAAIAAkAAADr//v/AAAIAAoAAADr//z/AAAIAAoAAADr//3/AAAFAAkAAADr//7/AAAFAAkAAADr////AAAAAAAAAADr/wAAAAAHAAkAAADr/wEAAAAFAAoAAADr/wIAAAAIAAoAAADr/wMAAAAFAAoAAADr/wQAAAACAAMAAADr/wUAAAAAAAcAAADr/wYAAAABAAQAAADr/wcAAAABAAQAAADr/wgAAAABAAYAAADr/wkAAAAAAAUAAADr/woAAAAIAAoAAADr/wsAAAAIAAoAAADr/wwAAAAIAAkAAADr/w0AAAAFAAoAAADr/w4AAAAFAAoAAADr/w8AAAAIAAkAAADr/xAAAAAFAAkAAADr/xEAAAAFAAkAAADr/xIAAAAIAAoAAADr/xMAAAAFAAkAAADr/xQAAAAHAAoAAADr/xUAAAAHAAoAAADr/xYAAAAIAAkAAADr/xcAAAAIAAkAAADr/xgAAAAHAAoAAADr/xkAAAAIAAoAAADr/xoAAAAFAAoAAADr/xsAAAAIAAoAAADr/xwAAAAHAAkAAADr/x0AAAAAAAAAAADr/x4AAAAFAAoAAADr/x8AAAAAAAAAAADr/yAAAAAAAAAAAADr/yEAAAAHAAkAAADr/yIAAAAFAAkAAADr/yMAAAAAAAAAAADr/yQAAAAIAAkAAADr/yUAAAAIAAkAAADr/yYAAAAFAAkAAADr/ycAAAAAAAAAAADr/ygAAAAFAAkAAADr/ykAAAAHAAoAAADr/yoAAAAIAAoAAADr/ysAAAACAAMAAADr/ywAAAAAAAcAAADr/y0AAAABAAQAAADr/y4AAAABAAQAAADr/y8AAAABAAUAAADr/zAAAAAHAAoAAADr/zEAAAAFAAoAAADr/zIAAAAFAAoAAADr/zMAAAAAAAAAAADs//D/AAABAAsAAADs//H/AAAFAAkAAADs//L/AAAAAAAAAADs//P/AAAIAAkAAADs//T/AAAIAAoAAADs//X/AAAHAAoAAADs//b/AAAHAAoAAADs//f/AAAIAAoAAADs//j/AAAFAAkAAADs//n/AAAIAAoAAADs//r/AAAAAAAAAADs//v/AAAAAAAAAADs//z/AAAIAAkAAADs//3/AAAIAAkAAADs//7/AAAFAAkAAADs////AAAFAAkAAADs/wAAAAAFAAoAAADs/wEAAAAIAAoAAADs/wIAAAAIAAkAAADs/wMAAAAFAAoAAADs/wQAAAAIAAoAAADs/wUAAAACAAMAAADs/wYAAAAAAAcAAADs/wcAAAABAAQAAADs/wgAAAABAAQAAADs/wkAAAABAAYAAADs/woAAAAAAAUAAADs/wsAAAAFAAoAAADs/wwAAAAIAAoAAADs/w0AAAAIAAkAAADs/w4AAAAIAAoAAADs/w8AAAAHAAoAAADs/xAAAAAIAAoAAADs/xEAAAAHAAkAAADs/xIAAAAAAAAAAADs/xMAAAAHAAoAAADs/xQAAAAHAAkAAADs/xUAAAAHAAkAAADs/xYAAAAIAAkAAADs/xcAAAAAAAAAAADs/xgAAAAFAAoAAADs/xkAAAAHAAoAAADs/xoAAAAHAAkAAADs/xsAAAAHAAkAAADs/xwAAAAFAAoAAADs/x0AAAAHAAkAAADs/x4AAAAHAAoAAADs/x8AAAAHAAoAAADs/yAAAAAHAAkAAADs/yEAAAAIAAoAAADs/yIAAAAIAAoAAADs/yMAAAAFAAoAAADs/yQAAAAHAAkAAADs/yUAAAAHAAoAAADs/yYAAAAHAAkAAADs/ycAAAAIAAkAAADs/ygAAAAAAAAAAADs/ykAAAAIAAkAAADs/yoAAAAHAAoAAADs/ysAAAAHAAoAAADs/ywAAAABAAMAAADs/y0AAAABAAQAAADs/y4AAAABAAQAAADs/y8AAAABAAYAAADs/zAAAAAAAAUAAADs/zEAAAAIAAkAAADs/zIAAAAHAAkAAADs/zMAAAAIAAoAAADt//D/AAABAAsAAADt//H/AAAIAAoAAADt//L/AAAIAAoAAADt//P/AAAHAAoAAADt//T/AAAAAAAAAADt//X/AAAAAAAAAADt//b/AAAAAAAAAADt//f/AAAIAAkAAADt//j/AAAIAAkAAADt//n/AAAIAAkAAADt//r/AAAAAAAAAADt//v/AAAHAAoAAADt//z/AAAAAAAAAADt//3/AAAFAAkAAADt//7/AAAFAAkAAADt////AAAIAAoAAADt/wAAAAAFAAoAAADt/wEAAAAIAAoAAADt/wIAAAAIAAoAAADt/wMAAAAFAAoAAADt/wQAAAAIAAoAAADt/wUAAAAFAAoAAADt/wYAAAACAAMAAADt/wcAAAAAAAcAAADt/wgAAAABAAQAAADt/wkAAAABAAQAAADt/woAAAABAAYAAADt/wsAAAAAAAUAAADt/wwAAAAIAAoAAADt/w0AAAAIAAkAAADt/w4AAAAFAAoAAADt/w8AAAAIAAoAAADt/xAAAAAAAAAAAADt/xEAAAAHAAoAAADt/xIAAAAHAAkAAADt/xMAAAAFAAoAAADt/xQAAAAAAAAAAADt/xUAAAAFAAoAAADt/xYAAAAHAAoAAADt/xcAAAAAAAAAAADt/xgAAAAIAAoAAADt/xkAAAAIAAkAAADt/xoAAAAIAAoAAADt/xsAAAAHAAkAAADt/xwAAAAHAAkAAADt/x0AAAAHAAoAAADt/x4AAAAFAAoAAADt/x8AAAAAAAAAAADt/yAAAAAFAAoAAADt/yEAAAAHAAkAAADt/yIAAAAAAAAAAADt/yMAAAAIAAkAAADt/yQAAAAIAAoAAADt/yUAAAAFAAoAAADt/yYAAAAFAAoAAADt/ycAAAAFAAkAAADt/ygAAAAFAAoAAADt/ykAAAAFAAkAAADt/yoAAAAHAAkAAADt/ysAAAAIAAoAAADt/ywAAAABAAMAAADt/y0AAAABAAQAAADt/y4AAAABAAQAAADt/y8AAAABAAQAAADt/zAAAAABAAUAAADt/zEAAAAHAAoAAADt/zIAAAAIAAkAAADt/zMAAAAHAAoAAADu//D/AAABAAsAAADu//H/AAAIAAoAAADu//L/AAAIAAoAAADu//P/AAAFAAoAAADu//T/AAAHAAoAAADu//X/AAAIAAkAAADu//b/AAAIAAoAAADu//f/AAAFAAoAAADu//j/AAAFAAkAAADu//n/AAAHAAoAAADu//r/AAAFAAkAAADu//v/AAAHAAkAAADu//z/AAAIAAoAAADu//3/AAACAAYAAADu//7/AAACAAcAAADu////AAACAAcAAADu/wAAAAACAAgAAADu/wEAAAAAAAAAAADu/wIAAAAFAAkAAADu/wMAAAAIAAkAAADu/wQAAAAFAAkAAADu/wUAAAAFAAoAAADu/wYAAAAIAAoAAADu/wcAAAACAAMAAADu/wgAAAAAAAcAAADu/wkAAAABAAQAAADu/woAAAABAAQAAADu/wsAAAABAAUAAADu/wwAAAAFAAkAAADu/w0AAAAFAAkAAADu/w4AAAAIAAoAAADu/w8AAAAIAAoAAADu/xAAAAAHAAkAAADu/xEAAAAAAAAAAADu/xIAAAAAAAAAAADu/xMAAAAAAAAAAADu/xQAAAAFAAkAAADu/xUAAAAHAAkAAADu/xYAAAAHAAkAAADu/xcAAAAFAAkAAADu/xgAAAAIAAoAAADu/xkAAAAIAAoAAADu/xoAAAAFAAoAAADu/xsAAAAIAAkAAADu/xwAAAAHAAkAAADu/x0AAAAHAAkAAADu/x4AAAAFAAoAAADu/x8AAAAFAAkAAADu/yAAAAAFAAoAAADu/yEAAAAIAAoAAADu/yIAAAAAAAAAAADu/yMAAAAFAAoAAADu/yQAAAAFAAoAAADu/yUAAAAFAAoAAADu/yYAAAAFAAkAAADu/ycAAAAAAAAAAADu/ygAAAAHAAkAAADu/ykAAAAHAAoAAADu/yoAAAAIAAkAAADu/ysAAAAIAAkAAADu/ywAAAACAAMAAADu/y0AAAAAAAcAAADu/y4AAAABAAQAAADu/y8AAAABAAQAAADu/zAAAAABAAUAAADu/zEAAAAAAAAAAADu/zIAAAAAAAAAAADu/zMAAAAFAAoAAADv//D/AAABAAsAAADv//H/AAAFAAoAAADv//L/AAAHAAkAAADv//P/AAAIAAkAAADv//T/AAAIAAkAAADv//X/AAAAAAAAAADv//b/AAAFAAkAAADv//f/AAAHAAoAAADv//j/AAAFAAoAAADv//n/AAAIAAoAAADv//r/AAAAAAAAAADv//v/AAAFAAkAAADv//z/AAACAAYAAADv//3/AAADAAoAAADv//7/AAADAAcAAADv////AAAAAAEAAADv/wAAAAADAAkAAADv/wEAAAACAAgAAADv/wIAAAAIAAoAAADv/wMAAAAHAAkAAADv/wQAAAAFAAkAAADv/wUAAAAHAAoAAADv/wYAAAAFAAkAAADv/wcAAAAHAAoAAADv/wgAAAACAAMAAADv/wkAAAAAAAcAAADv/woAAAABAAQAAADv/wsAAAABAAYAAADv/wwAAAAAAAUAAADv/w0AAAAIAAkAAADv/w4AAAAFAAkAAADv/w8AAAAFAAoAAADv/xAAAAAFAAoAAADv/xEAAAAIAAoAAADv/xIAAAAAAAAAAADv/xMAAAAAAAAAAADv/xQAAAAFAAkAAADv/xUAAAAHAAoAAADv/xYAAAAHAAoAAADv/xcAAAAHAAkAAADv/xgAAAAHAAoAAADv/xkAAAAHAAoAAADv/xoAAAAFAAkAAADv/xsAAAAAAAAAAADv/xwAAAAFAAkAAADv/x0AAAAIAAkAAADv/x4AAAAHAAoAAADv/x8AAAAHAAoAAADv/yAAAAAIAAkAAADv/yEAAAAFAAkAAADv/yIAAAAAAAAAAADv/yMAAAAFAAoAAADv/yQAAAAAAAAAAADv/yUAAAAHAAoAAADv/yYAAAAIAAkAAADv/ycAAAAIAAoAAADv/ygAAAAHAAkAAADv/ykAAAAIAAkAAADv/yoAAAAFAAoAAADv/ysAAAAFAAoAAADv/ywAAAAAAAMAAADv/y0AAAABAAcAAADv/y4AAAABAAQAAADv/y8AAAABAAQAAADv/zAAAAABAAUAAADv/zEAAAAHAAoAAADv/zIAAAAIAAoAAADv/zMAAAAHAAoAAADw//D/AAABAAsAAADw//H/AAAIAAoAAADw//L/AAAHAAoAAADw//P/AAAHAAoAAADw//T/AAAHAAoAAADw//X/AAAIAAoAAADw//b/AAAHAAkAAADw//f/AAAFAAkAAADw//j/AAAAAAAAAADw//n/AAAHAAkAAADw//r/AAAIAAkAAADw//v/AAAIAAkAAADw//z/AAADAAYAAADw//3/AAAAAAEAAADw//7/AAADAAcAAADw////AAADAAcAAADw/wAAAAADAAcAAADw/wEAAAADAAkAAADw/wIAAAACAAgAAADw/wMAAAAHAAoAAADw/wQAAAAAAAAAAADw/wUAAAAHAAoAAADw/wYAAAAFAAkAAADw/wcAAAAHAAkAAADw/wgAAAAHAAkAAADw/wkAAAABAAMAAADw/woAAAABAAQAAADw/wsAAAABAAQAAADw/wwAAAABAAYAAADw/w0AAAAAAAQAAADw/w4AAAAAAAUAAADw/w8AAAAAAAAAAADw/xAAAAAFAAoAAADw/xEAAAAAAAAAAADw/xIAAAAAAAAAAADw/xMAAAAHAAoAAADw/xQAAAAFAAoAAADw/xUAAAAHAAkAAADw/xYAAAAFAAoAAADw/xcAAAAAAAAAAADw/xgAAAAIAAkAAADw/xkAAAAHAAkAAADw/xoAAAAAAAAAAADw/xsAAAAHAAoAAADw/xwAAAAAAAAAAADw/x0AAAAFAAkAAADw/x4AAAAIAAkAAADw/x8AAAAHAAoAAADw/yAAAAAIAAoAAADw/yEAAAAAAAAAAADw/yIAAAAFAAoAAADw/yMAAAAAAAAAAADw/yQAAAAHAAkAAADw/yUAAAAIAAkAAADw/yYAAAAFAAoAAADw/ycAAAAIAAoAAADw/ygAAAAIAAoAAADw/ykAAAAIAAkAAADw/yoAAAAHAAkAAADw/ysAAAAIAAkAAADw/ywAAAABAAMAAADw/y0AAAABAAQAAADw/y4AAAABAAQAAADw/y8AAAABAAQAAADw/zAAAAABAAUAAADw/zEAAAAIAAoAAADw/zIAAAAAAAAAAADw/zMAAAAIAAoAAADx//D/AAABAAsAAADx//H/AAAHAAkAAADx//L/AAAFAAkAAADx//P/AAAHAAoAAADx//T/AAAHAAkAAADx//X/AAAHAAkAAADx//b/AAAAAAAAAADx/wIAAAADAAgAAADx/wMAAAAIAAoAAADx/wQAAAAHAAoAAADx/wUAAAAHAAoAAADx/wYAAAAHAAkAAADx/wcAAAAHAAkAAADx/wgAAAAFAAkAAADx/wkAAAABAAMAAADx/woAAAABAAQAAADx/wsAAAABAAQAAADx/wwAAAABAAQAAADx/w0AAAABAAQAAADx/w4AAAABAAYAAADx/w8AAAAAAAQAAADx/xAAAAAAAAQAAADx/xEAAAAAAAUAAADx/xIAAAAIAAkAAADx/xMAAAAFAAkAAADx/xQAAAAIAAoAAADx/xUAAAAFAAkAAADx/xYAAAAIAAoAAADx/xcAAAAIAAkAAADx/xgAAAAAAAAAAADx/xkAAAAAAAAAAADx/xoAAAAAAAAAAADx/xsAAAAHAAkAAADx/xwAAAAIAAkAAADx/x0AAAAIAAkAAADx/x4AAAAIAAoAAADx/x8AAAAHAAkAAADx/yAAAAAIAAkAAADx/yEAAAAAAAAAAADx/yIAAAAIAAoAAADx/yMAAAAHAAoAAADx/yQAAAAIAAkAAADx/yUAAAAHAAoAAADx/yYAAAAIAAoAAADx/ycAAAAFAAkAAADx/ygAAAAHAAoAAADx/ykAAAAAAAAAAADx/yoAAAAFAAkAAADx/ysAAAAIAAoAAADx/ywAAAABAAMAAADx/y0AAAABAAQAAADx/y4AAAABAAQAAADx/y8AAAABAAQAAADx/zAAAAABAAUAAADx/zEAAAAIAAkAAADx/zIAAAAHAAoAAADx/zMAAAAAAAAAAADy//D/AAABAAsAAADy//H/AAAFAAoAAADy//L/AAAFAAkAAADy//P/AAAIAAkAAADy//T/AAAFAAoAAADy//X/AAAHAAkAAADy//b/AAAIAAkAAADy/wIAAAAEAAgAAADy/wMAAAAFAAoAAADy/wQAAAAIAAoAAADy/wUAAAAHAAoAAADy/wYAAAAHAAkAAADy/wcAAAAHAAoAAADy/wgAAAAAAAMAAADy/wkAAAABAAcAAADy/woAAAABAAQAAADy/wsAAAABAAQAAADy/wwAAAABAAQAAADy/w0AAAABAAQAAADy/w4AAAABAAQAAADy/w8AAAABAAQAAADy/xAAAAABAAQAAADy/xEAAAABAAYAAADy/xIAAAAAAAQAAADy/xMAAAAAAAQAAADy/xQAAAAAAAUAAADy/xUAAAAHAAkAAADy/xYAAAAHAAkAAADy/xcAAAAIAAkAAADy/xgAAAAIAAkAAADy/xkAAAAHAAkAAADy/xoAAAAIAAoAAADy/xsAAAAAAAAAAADy/xwAAAAFAAkAAADy/x0AAAAFAAkAAADy/x4AAAAAAAAAAADy/x8AAAAFAAoAAADy/yAAAAAFAAoAAADy/yEAAAAAAAAAAADy/yIAAAAFAAoAAADy/yMAAAAAAAAAAADy/yQAAAAIAAkAAADy/yUAAAAHAAoAAADy/yYAAAAAAAAAAADy/ycAAAAHAAkAAADy/ygAAAAIAAoAAADy/ykAAAAFAAkAAADy/yoAAAAIAAoAAADy/ysAAAAAAAAAAADy/ywAAAABAAMAAADy/y0AAAABAAQAAADy/y4AAAABAAQAAADy/y8AAAABAAQAAADy/zAAAAABAAUAAADy/zEAAAAIAAkAAADy/zIAAAAFAAoAAADy/zMAAAAIAAoAAADz//D/AAABAAsAAADz//H/AAAIAAoAAADz//L/AAAHAAoAAADz//P/AAAFAAkAAADz//T/AAAFAAoAAADz//X/AAAFAAoAAADz//b/AAAHAAoAAADz/wIAAAAAAAAAAADz/wMAAAAHAAoAAADz/wQAAAAIAAkAAADz/wUAAAAHAAkAAADz/wYAAAAIAAkAAADz/wcAAAAIAAkAAADz/wgAAAABAAMAAADz/wkAAAABAAQAAADz/woAAAABAAQAAADz/wsAAAAAAAYAAADz/wwAAAACAAQAAADz/w0AAAAAAAcAAADz/w4AAAABAAQAAADz/w8AAAABAAQAAADz/xAAAAABAAQAAADz/xEAAAABAAQAAADz/xIAAAABAAQAAADz/xMAAAABAAQAAADz/xQAAAABAAYAAADz/xUAAAAAAAQAAADz/xYAAAAAAAUAAADz/xcAAAAAAAAAAADz/xgAAAAHAAoAAADz/xkAAAAAAAAAAADz/xoAAAAFAAkAAADz/xsAAAAFAAkAAADz/xwAAAAHAAkAAADz/x0AAAAAAAAAAADz/x4AAAAFAAoAAADz/x8AAAAFAAkAAADz/yAAAAAIAAkAAADz/yEAAAAIAAkAAADz/yIAAAAAAAAAAADz/yMAAAAFAAoAAADz/yQAAAAFAAoAAADz/yUAAAAIAAkAAADz/yYAAAAIAAoAAADz/ycAAAAIAAkAAADz/ygAAAAIAAkAAADz/ykAAAAHAAoAAADz/yoAAAAIAAkAAADz/ysAAAAAAAMAAADz/ywAAAABAAcAAADz/y0AAAABAAQAAADz/y4AAAABAAQAAADz/y8AAAABAAQAAADz/zAAAAABAAUAAADz/zEAAAAHAAoAAADz/zIAAAAIAAkAAADz/zMAAAAHAAoAAAD0//D/AAABAAsAAAD0//H/AAAFAAoAAAD0//L/AAAFAAkAAAD0//P/AAAFAAkAAAD0//T/AAAAAAAAAAD0//X/AAAFAAkAAAD0//b/AAAHAAoAAAD0/wIAAAAFAAkAAAD0/wMAAAAHAAoAAAD0/wQAAAANABwAAAD0/wUAAAAHAAkAAAD0/wYAAAAFAAkAAAD0/wcAAAAAAAMAAAD0/wgAAAABAAcAAAD0/wkAAAABAAQAAAD0/woAAAAAAAYAAAD0/wsAAAACAAUAAAD0/wwAAAAHAAkAAAD0/w0AAAACAAMAAAD0/w4AAAACAAQAAAD0/w8AAAAAAAcAAAD0/xAAAAABAAQAAAD0/xEAAAABAAQAAAD0/xIAAAABAAQAAAD0/xMAAAABAAQAAAD0/xQAAAABAAQAAAD0/xUAAAABAAQAAAD0/xYAAAABAAYAAAD0/xcAAAAAAAQAAAD0/xgAAAAAAAUAAAD0/xkAAAAHAAkAAAD0/xoAAAAAAAAAAAD0/xsAAAAIAAkAAAD0/xwAAAAFAAoAAAD0/x0AAAAIAAoAAAD0/x4AAAAHAAkAAAD0/x8AAAAIAAkAAAD0/yAAAAAIAAkAAAD0/yEAAAAHAAoAAAD0/yIAAAAFAAkAAAD0/yMAAAAIAAkAAAD0/yQAAAAAAAAAAAD0/yUAAAAIAAoAAAD0/yYAAAAAAAAAAAD0/ycAAAAFAAkAAAD0/ygAAAAIAAoAAAD0/ykAAAAHAAkAAAD0/yoAAAAHAAoAAAD0/ysAAAABAAMAAAD0/ywAAAABAAQAAAD0/y0AAAABAAQAAAD0/y4AAAABAAQAAAD0/y8AAAAAAAYAAAD0/zAAAAACAAUAAAD0/zEAAAAFAAkAAAD0/zIAAAAIAAoAAAD0/zMAAAAIAAoAAAD1//D/AAABAAsAAAD1//H/AAAFAAkAAAD1//L/AAAIAAkAAAD1//P/AAAFAAkAAAD1//T/AAAHAAkAAAD1//X/AAAAAAAAAAD1//b/AAAHAAkAAAD1/wIAAAAFAAoAAAD1/wMAAAAHAAoAAAD1/wQAAAAFAAkAAAD1/wUAAAAIAAkAAAD1/wYAAAAAAAMAAAD1/wcAAAABAAcAAAD1/wgAAAABAAQAAAD1/wkAAAABAAQAAAD1/woAAAABAAUAAAD1/wsAAAAAAAAAAAD1/wwAAAAIAAoAAAD1/w0AAAAIAAoAAAD1/w4AAAAIAAoAAAD1/w8AAAACAAMAAAD1/xAAAAAAAAcAAAD1/xEAAAABAAQAAAD1/xIAAAABAAQAAAD1/xMAAAABAAQAAAD1/xQAAAABAAQAAAD1/xUAAAABAAQAAAD1/xYAAAABAAQAAAD1/xcAAAABAAQAAAD1/xgAAAABAAYAAAD1/xkAAAAAAAQAAAD1/xoAAAAAAAUAAAD1/xsAAAAFAAkAAAD1/xwAAAAFAAoAAAD1/x0AAAAFAAkAAAD1/x4AAAAIAAkAAAD1/x8AAAAAAAAAAAD1/yAAAAAHAAoAAAD1/yEAAAAAAAAAAAD1/yIAAAAIAAoAAAD1/yMAAAAIAAkAAAD1/yQAAAAFAAoAAAD1/yUAAAAFAAkAAAD1/yYAAAAHAAoAAAD1/ycAAAAAAAAAAAD1/ygAAAAIAAkAAAD1/ykAAAAFAAkAAAD1/yoAAAAAAAMAAAD1/ysAAAABAAcAAAD1/ywAAAABAAQAAAD1/y0AAAABAAQAAAD1/y4AAAAAAAYAAAD1/y8AAAACAAUAAAD1/zAAAAAAAAAAAAD1/zEAAAAHAAoAAAD1/zIAAAAFAAoAAAD1/zMAAAAHAAoAAAD2//D/AAABAAsAAAD2//H/AAAAAAAAAAD2//L/AAAHAAoAAAD2//P/AAAAAAAAAAD2//T/AAAAAAAAAAD2//X/AAAHAAoAAAD2//b/AAAAAAAAAAD2/wIAAAAAAAAAAAD2/wMAAAAAAAAAAAD2/wQAAAAAAAMAAAD2/wUAAAAAAAQAAAD2/wYAAAABAAcAAAD2/wcAAAABAAQAAAD2/wgAAAABAAQAAAD2/wkAAAAAAAYAAAD2/woAAAACAAUAAAD2/wsAAAAAAAAAAAD2/wwAAAAIAAkAAAD2/w0AAAAFAAoAAAD2/w4AAAAFAAoAAAD2/w8AAAAFAAoAAAD2/xAAAAACAAMAAAD2/xEAAAACAAQAAAD2/xIAAAACAAQAAAD2/xMAAAACAAQAAAD2/xQAAAAAAAcAAAD2/xUAAAABAAQAAAD2/xYAAAABAAQAAAD2/xcAAAABAAQAAAD2/xgAAAABAAQAAAD2/xkAAAABAAQAAAD2/xoAAAABAAYAAAD2/xsAAAAAAAUAAAD2/xwAAAAFAAkAAAD2/x0AAAAFAAkAAAD2/x4AAAAHAAkAAAD2/x8AAAAFAAkAAAD2/yAAAAAFAAkAAAD2/yEAAAAFAAkAAAD2/yIAAAAIAAkAAAD2/yMAAAAFAAkAAAD2/yQAAAAFAAkAAAD2/yUAAAAFAAkAAAD2/yYAAAAAAAAAAAD2/ycAAAAIAAkAAAD2/ygAAAAHAAoAAAD2/ykAAAAAAAMAAAD2/yoAAAABAAcAAAD2/ysAAAABAAQAAAD2/ywAAAABAAQAAAD2/y0AAAAAAAYAAAD2/y4AAAACAAUAAAD2/y8AAAAFAAoAAAD2/zAAAAAFAAkAAAD2/zEAAAAFAAoAAAD2/zIAAAAFAAkAAAD2/zMAAAAHAAkAAAD3//D/AAABAAsAAAD3//H/AAAFAAoAAAD3//L/AAAFAAkAAAD3//P/AAAFAAkAAAD3//T/AAAIAAoAAAD3//X/AAAIAAoAAAD3//b/AAAIAAkAAAD3/wIAAAAAAAMAAAD3/wMAAAAAAAQAAAD3/wQAAAABAAcAAAD3/wUAAAABAAQAAAD3/wYAAAABAAQAAAD3/wcAAAABAAQAAAD3/wgAAAAAAAYAAAD3/wkAAAACAAUAAAD3/woAAAAHAAkAAAD3/wsAAAAIAAkAAAD3/wwAAAAIAAkAAAD3/w0AAAAIAAkAAAD3/w4AAAAHAAkAAAD3/w8AAAAHAAoAAAD3/xAAAAAIAAkAAAD3/xEAAAAIAAkAAAD3/xIAAAAAAAAAAAD3/xMAAAAHAAoAAAD3/xQAAAACAAMAAAD3/xUAAAACAAQAAAD3/xYAAAAAAAcAAAD3/xcAAAABAAQAAAD3/xgAAAABAAQAAAD3/xkAAAABAAQAAAD3/xoAAAABAAQAAAD3/xsAAAABAAYAAAD3/xwAAAAAAAUAAAD3/x0AAAAHAAoAAAD3/x4AAAAHAAkAAAD3/x8AAAAHAAoAAAD3/yAAAAAFAAoAAAD3/yEAAAAFAAoAAAD3/yIAAAAIAAkAAAD3/yMAAAAHAAkAAAD3/yQAAAAFAAkAAAD3/yUAAAAFAAkAAAD3/yYAAAAHAAoAAAD3/ycAAAAHAAkAAAD3/ygAAAAHAAoAAAD3/ykAAAABAAMAAAD3/yoAAAABAAQAAAD3/ysAAAABAAQAAAD3/ywAAAABAAQAAAD3/y0AAAABAAUAAAD3/y4AAAAHAAkAAAD3/y8AAAAFAAkAAAD3/zAAAAAHAAoAAAD3/zEAAAAIAAoAAAD3/zIAAAAIAAkAAAD3/zMAAAAAAAAAAAD4//D/AAABAAsAAAD4//H/AAAIAAoAAAD4//L/AAAIAAkAAAD4//P/AAAFAAkAAAD4//T/AAAFAAoAAAD4//X/AAAFAAkAAAD4//b/AAAHAAoAAAD4/wIAAAABAAcAAAD4/wMAAAABAAQAAAD4/wQAAAABAAQAAAD4/wUAAAAAAAYAAAD4/wYAAAACAAQAAAD4/wcAAAACAAQAAAD4/wgAAAACAAUAAAD4/wkAAAAHAAoAAAD4/woAAAAHAAkAAAD4/wsAAAAHAAoAAAD4/wwAAAAIAAkAAAD4/w0AAAAIAAkAAAD4/w4AAAAHAAkAAAD4/w8AAAAHAAoAAAD4/xAAAAAAAAAAAAD4/xEAAAAHAAkAAAD4/xIAAAAAAAAAAAD4/xMAAAAIAAkAAAD4/xQAAAAAAAAAAAD4/xUAAAAIAAkAAAD4/xYAAAACAAMAAAD4/xcAAAACAAQAAAD4/xgAAAAAAAcAAAD4/xkAAAABAAQAAAD4/xoAAAABAAQAAAD4/xsAAAABAAQAAAD4/xwAAAABAAYAAAD4/x0AAAAAAAUAAAD4/x4AAAAFAAkAAAD4/x8AAAAFAAkAAAD4/yAAAAAHAAkAAAD4/yEAAAAHAAkAAAD4/yIAAAAIAAkAAAD4/yMAAAAHAAkAAAD4/yQAAAAHAAkAAAD4/yUAAAAFAAkAAAD4/yYAAAAHAAoAAAD4/ycAAAAIAAkAAAD4/ygAAAAAAAMAAAD4/ykAAAABAAcAAAD4/yoAAAABAAQAAAD4/ysAAAABAAQAAAD4/ywAAAABAAQAAAD4/y0AAAABAAUAAAD4/y4AAAAIAAoAAAD4/y8AAAAIAAoAAAD4/zAAAAAHAAkAAAD4/zEAAAAFAAoAAAD4/zIAAAAFAAoAAAD4/zMAAAAAAAAAAAD5//D/AAABAAsAAAD5//H/AAAIAAkAAAD5//L/AAAFAAoAAAD5//P/AAAIAAkAAAD5//T/AAAFAAoAAAD5//X/AAAFAAkAAAD5//b/AAAFAAoAAAD5/wIAAAABAAQAAAD5/wMAAAAAAAYAAAD5/wQAAAACAAQAAAD5/wUAAAACAAUAAAD5/wYAAAAFAAkAAAD5/wcAAAAHAAkAAAD5/wgAAAAFAAkAAAD5/wkAAAAFAAkAAAD5/woAAAAIAAoAAAD5/wsAAAAFAAkAAAD5/wwAAAAFAAoAAAD5/w0AAAAHAAkAAAD5/w4AAAAHAAoAAAD5/w8AAAAAAAAAAAD5/xAAAAAIAAoAAAD5/xEAAAAIAAoAAAD5/xIAAAAHAAkAAAD5/xMAAAAHAAoAAAD5/xQAAAAFAAkAAAD5/xUAAAAHAAoAAAD5/xYAAAAIAAkAAAD5/xcAAAAIAAoAAAD5/xgAAAACAAMAAAD5/xkAAAAAAAcAAAD5/xoAAAABAAQAAAD5/xsAAAABAAQAAAD5/xwAAAABAAQAAAD5/x0AAAABAAYAAAD5/x4AAAAAAAUAAAD5/x8AAAAFAAkAAAD5/yAAAAAFAAkAAAD5/yEAAAAHAAkAAAD5/yIAAAAHAAoAAAD5/yMAAAAHAAkAAAD5/yQAAAAHAAkAAAD5/yUAAAAHAAoAAAD5/yYAAAAAAAAAAAD5/ycAAAAFAAkAAAD5/ygAAAABAAMAAAD5/ykAAAABAAQAAAD5/yoAAAABAAQAAAD5/ysAAAABAAQAAAD5/ywAAAAAAAYAAAD5/y0AAAACAAUAAAD5/y4AAAAHAAkAAAD5/y8AAAAHAAoAAAD5/zAAAAAFAAkAAAD5/zEAAAAAAAAAAAD5/zIAAAAFAAkAAAD5/zMAAAAHAAkAAAD6//D/AAABAAsAAAD6//H/AAAHAAoAAAD6//L/AAAIAAoAAAD6//P/AAAFAAkAAAD6//T/AAAHAAkAAAD6//X/AAAIAAoAAAD6//b/AAAIAAkAAAD6/wIAAAABAAQAAAD6/wMAAAABAAUAAAD6/wQAAAAIAAoAAAD6/wUAAAAIAAoAAAD6/wYAAAAFAAkAAAD6/wcAAAAIAAoAAAD6/wgAAAAHAAkAAAD6/wkAAAAFAAoAAAD6/woAAAAHAAoAAAD6/wsAAAAHAAkAAAD6/wwAAAAIAAoAAAD6/w0AAAAHAAoAAAD6/w4AAAAFAAoAAAD6/w8AAAAHAAkAAAD6/xAAAAAHAAoAAAD6/xEAAAAFAAkAAAD6/xIAAAAFAAkAAAD6/xMAAAAHAAkAAAD6/xQAAAAIAAkAAAD6/xUAAAAHAAkAAAD6/xYAAAAIAAoAAAD6/xcAAAAHAAkAAAD6/xgAAAAIAAkAAAD6/xkAAAACAAMAAAD6/xoAAAAAAAcAAAD6/xsAAAABAAQAAAD6/xwAAAABAAQAAAD6/x0AAAABAAQAAAD6/x4AAAABAAYAAAD6/x8AAAAAAAUAAAD6/yAAAAAIAAkAAAD6/yEAAAAFAAoAAAD6/yIAAAAIAAkAAAD6/yMAAAAHAAkAAAD6/yQAAAAFAAkAAAD6/yUAAAAFAAkAAAD6/yYAAAAAAAMAAAD6/ycAAAAAAAQAAAD6/ygAAAABAAcAAAD6/ykAAAABAAQAAAD6/yoAAAABAAQAAAD6/ysAAAAAAAYAAAD6/ywAAAACAAUAAAD6/y0AAAAFAAkAAAD6/y4AAAAIAAoAAAD6/y8AAAAHAAkAAAD6/zAAAAAIAAoAAAD6/zEAAAAIAAoAAAD6/zIAAAAIAAoAAAD6/zMAAAAHAAkAAAD7//D/AAABAAsAAAD7//H/AAAIAAkAAAD7//L/AAAFAAoAAAD7//P/AAAFAAkAAAD7//T/AAAFAAoAAAD7//X/AAAFAAkAAAD7//b/AAAIAAoAAAD7/wIAAAABAAQAAAD7/wMAAAABAAUAAAD7/wQAAAAHAAkAAAD7/wUAAAAFAAoAAAD7/wYAAAAIAAoAAAD7/wcAAAAAAAAAAAD7/wgAAAAHAAoAAAD7/wkAAAAIAAkAAAD7/woAAAAIAAkAAAD7/wsAAAAIAAoAAAD7/wwAAAAIAAkAAAD7/w0AAAAAAAAAAAD7/w4AAAAAAAAAAAD7/w8AAAAFAAkAAAD7/xAAAAAIAAkAAAD7/xEAAAAFAAoAAAD7/xIAAAAAAAAAAAD7/xMAAAAIAAoAAAD7/xQAAAAAAAAAAAD7/xUAAAAIAAoAAAD7/xYAAAAHAAoAAAD7/xcAAAAAAAAAAAD7/xgAAAAIAAkAAAD7/xkAAAAFAAkAAAD7/xoAAAACAAMAAAD7/xsAAAAAAAcAAAD7/xwAAAABAAQAAAD7/x0AAAABAAQAAAD7/x4AAAABAAQAAAD7/x8AAAABAAUAAAD7/yAAAAAFAAoAAAD7/yEAAAAFAAkAAAD7/yIAAAAIAAoAAAD7/yMAAAAFAAoAAAD7/yQAAAAHAAkAAAD7/yUAAAAAAAMAAAD7/yYAAAABAAcAAAD7/ycAAAABAAQAAAD7/ygAAAABAAQAAAD7/ykAAAABAAQAAAD7/yoAAAAAAAYAAAD7/ysAAAACAAUAAAD7/ywAAAAIAAkAAAD7/y0AAAAIAAkAAAD7/y4AAAAHAAoAAAD7/y8AAAAIAAoAAAD7/zAAAAAFAAoAAAD7/zEAAAAHAAkAAAD7/zIAAAAHAAkAAAD7/zMAAAAHAAoAAAD8//D/AAABAAsAAAD8//H/AAAHAAoAAAD8//L/AAAHAAoAAAD8//P/AAAFAAkAAAD8//T/AAAFAAkAAAD8//X/AAAIAAkAAAD8//b/AAAAAAAAAAD8/wIAAAAAAAYAAAD8/wMAAAACAAUAAAD8/wQAAAANABwAAAD8/wUAAAAFAAkAAAD8/wYAAAAFAAkAAAD8/wcAAAAIAAoAAAD8/wgAAAAHAAoAAAD8/wkAAAAHAAoAAAD8/woAAAAAAAAAAAD8/wsAAAAHAAkAAAD8/wwAAAAAAAAAAAD8/w0AAAAIAAkAAAD8/w4AAAAHAAkAAAD8/w8AAAAAAAAAAAD8/xAAAAAFAAkAAAD8/xEAAAAFAAkAAAD8/xIAAAAFAAoAAAD8/xMAAAAHAAoAAAD8/xQAAAAFAAkAAAD8/xUAAAAFAAkAAAD8/xYAAAAIAAkAAAD8/xcAAAAIAAkAAAD8/xgAAAAIAAoAAAD8/xkAAAAHAAoAAAD8/xoAAAAIAAkAAAD8/xsAAAABAAMAAAD8/xwAAAABAAQAAAD8/x0AAAABAAQAAAD8/x4AAAABAAQAAAD8/x8AAAABAAYAAAD8/yAAAAAAAAUAAAD8/yEAAAAFAAoAAAD8/yIAAAAFAAoAAAD8/yMAAAAFAAkAAAD8/yQAAAAAAAMAAAD8/yUAAAABAAcAAAD8/yYAAAABAAQAAAD8/ycAAAABAAQAAAD8/ygAAAABAAQAAAD8/ykAAAAAAAYAAAD8/yoAAAACAAUAAAD8/ysAAAAHAAkAAAD8/ywAAAAAAAAAAAD8/y0AAAAFAAoAAAD8/y4AAAAAAAAAAAD8/y8AAAAIAAkAAAD8/zAAAAAHAAoAAAD8/zEAAAAIAAkAAAD8/zIAAAAHAAkAAAD8/zMAAAAFAAoAAAD9//D/AAABAAsAAAD9//H/AAAIAAoAAAD9//L/AAAIAAkAAAD9//P/AAAAAAAAAAD9//T/AAAAAAAAAAD9//X/AAAIAAkAAAD9//b/AAAAAAAAAAD9/wIAAAABAAUAAAD9/wMAAAAAAAAAAAD9/wQAAAAHAAoAAAD9/wUAAAAHAAkAAAD9/wYAAAALABwAAAD9/wcAAAAIAAkAAAD9/wgAAAAIAAoAAAD9/wkAAAAIAAoAAAD9/woAAAAIAAoAAAD9/wsAAAAHAAoAAAD9/wwAAAAFAAkAAAD9/w0AAAAFAAoAAAD9/w4AAAAAAAAAAAD9/w8AAAAIAAkAAAD9/xAAAAAIAAoAAAD9/xEAAAAFAAkAAAD9/xIAAAAAAAAAAAD9/xMAAAAFAAkAAAD9/xQAAAAFAAkAAAD9/xUAAAAHAAkAAAD9/xYAAAAFAAoAAAD9/xcAAAAFAAoAAAD9/xgAAAAHAAkAAAD9/xkAAAAFAAoAAAD9/xoAAAAAAAAAAAD9/xsAAAACAAMAAAD9/xwAAAAAAAcAAAD9/x0AAAABAAQAAAD9/x4AAAABAAQAAAD9/x8AAAABAAQAAAD9/yAAAAABAAUAAAD9/yEAAAAHAAoAAAD9/yIAAAAFAAkAAAD9/yMAAAAIAAoAAAD9/yQAAAABAAMAAAD9/yUAAAABAAQAAAD9/yYAAAABAAQAAAD9/ycAAAABAAQAAAD9/ygAAAABAAQAAAD9/ykAAAABAAUAAAD9/yoAAAAIAAoAAAD9/ysAAAAHAAoAAAD9/ywAAAAHAAoAAAD9/y0AAAAHAAkAAAD9/y4AAAAHAAkAAAD9/y8AAAAAAAAAAAD9/zAAAAAIAAoAAAD9/zEAAAAIAAkAAAD9/zIAAAAAAAAAAAD9/zMAAAAFAAkAAAD+//D/AAABAAsAAAD+//H/AAAHAAoAAAD+//L/AAAHAAoAAAD+//P/AAAIAAkAAAD+//T/AAAFAAkAAAD+//X/AAAIAAkAAAD+//b/AAAIAAoAAAD+/wIAAAABAAUAAAD+/wMAAAANABwAAAD+/wQAAAAFAAkAAAD+/wUAAAAIAAkAAAD+/wYAAAAMABwAAAD+/wgAAAAHAAkAAAD+/wkAAAAIAAoAAAD+/woAAAAHAAoAAAD+/wsAAAAHAAkAAAD+/wwAAAAHAAoAAAD+/w0AAAAFAAoAAAD+/w4AAAAIAAoAAAD+/w8AAAAIAAkAAAD+/xAAAAAIAAkAAAD+/xEAAAAHAAkAAAD+/xIAAAAFAAoAAAD+/xMAAAAAAAAAAAD+/xQAAAAFAAoAAAD+/xUAAAAIAAkAAAD+/xYAAAAHAAkAAAD+/xcAAAAHAAkAAAD+/xgAAAAIAAkAAAD+/xkAAAAAAAAAAAD+/xoAAAAHAAkAAAD+/xsAAAAAAAAAAAD+/xwAAAABAAMAAAD+/x0AAAABAAQAAAD+/x4AAAABAAQAAAD+/x8AAAABAAQAAAD+/yAAAAABAAUAAAD+/yEAAAAAAAAAAAD+/yIAAAAFAAkAAAD+/yMAAAAAAAMAAAD+/yQAAAABAAcAAAD+/yUAAAABAAQAAAD+/yYAAAABAAQAAAD+/ycAAAAAAAYAAAD+/ygAAAACAAQAAAD+/ykAAAACAAUAAAD+/yoAAAAHAAoAAAD+/ysAAAAIAAoAAAD+/ywAAAAIAAkAAAD+/y0AAAAHAAkAAAD+/y4AAAAFAAoAAAD+/y8AAAAIAAoAAAD+/zAAAAAHAAkAAAD+/zEAAAAHAAkAAAD+/zIAAAAHAAkAAAD+/zMAAAAFAAoAAAD///D/AAABAAsAAAD///H/AAAFAAkAAAD///L/AAAFAAoAAAD///P/AAAIAAoAAAD///T/AAAAAAAAAAD///X/AAAIAAkAAAD///b/AAAHAAkAAAD//wIAAAABAAUAAAD//wMAAAAIAAoAAAD//wQAAAAIAAkAAAD//wUAAAAFAAoAAAD//wYAAAAHAAoAAAD//wcAAAAIAAoAAAD//wgAAAAFAAkAAAD//wkAAAAHAAoAAAD//woAAAAAAAAAAAD//wsAAAAHAAkAAAD//wwAAAAFAAkAAAD//w0AAAAIAAkAAAD//w4AAAAHAAkAAAD//w8AAAAFAAkAAAD//xAAAAAHAAoAAAD//xEAAAAHAAoAAAD//xIAAAAIAAkAAAD//xMAAAAFAAkAAAD//xQAAAAIAAoAAAD//xUAAAAAAAAAAAD//xYAAAAFAAkAAAD//xcAAAAAAAAAAAD//xgAAAAIAAoAAAD//xkAAAAHAAkAAAD//xoAAAAFAAoAAAD//xsAAAAFAAkAAAD//xwAAAACAAMAAAD//x0AAAACAAQAAAD//x4AAAAAAAcAAAD//x8AAAABAAQAAAD//yAAAAABAAYAAAD//yEAAAAAAAQAAAD//yIAAAAAAAQAAAD//yMAAAABAAcAAAD//yQAAAABAAQAAAD//yUAAAABAAQAAAD//yYAAAAAAAYAAAD//ycAAAACAAUAAAD//ygAAAAFAAkAAAD//ykAAAAAAAAAAAD//yoAAAAHAAoAAAD//ysAAAAAAAAAAAD//ywAAAAHAAkAAAD//y0AAAAFAAoAAAD//y4AAAAFAAoAAAD//y8AAAAIAAoAAAD//zAAAAAIAAkAAAD//zEAAAAIAAkAAAD//zIAAAAIAAkAAAD//zMAAAAHAAoAAAAAAPD/AAABAAsAAAAAAPH/AAAIAAoAAAAAAPL/AAAIAAkAAAAAAPP/AAAHAAoAAAAAAPT/AAAIAAoAAAAAAPX/AAAAAAAAAAAAAPb/AAAIAAoAAAAAAAIAAAABAAUAAAAAAAMAAAAHAAoAAAAAAAQAAAALABwAAAAAAAUAAAAIAAkAAAAAAAYAAAANABwAAAAAAAcAAAAAAAAAAAAAAAgAAAAHAAkAAAAAAAkAAAAAAAAAAAAAAAoAAAAFAAkAAAAAAAsAAAAHAAkAAAAAAAwAAAAIAAoAAAAAAA0AAAAIAAkAAAAAAA4AAAAIAAkAAAAAAA8AAAAFAAoAAAAAABAAAAAHAAkAAAAAABEAAAAIAAkAAAAAABIAAAAHAAoAAAAAABMAAAAFAAoAAAAAABQAAAAAAAAAAAAAABUAAAAHAAkAAAAAABYAAAAAAAAAAAAAABcAAAAFAAkAAAAAABgAAAAIAAkAAAAAABkAAAAIAAoAAAAAABoAAAAIAAkAAAAAABsAAAAFAAoAAAAAABwAAAAIAAoAAAAAAB0AAAAFAAkAAAAAAB4AAAABAAMAAAAAAB8AAAABAAQAAAAAACAAAAABAAQAAAAAACEAAAABAAQAAAAAACIAAAABAAQAAAAAACMAAAABAAQAAAAAACQAAAABAAQAAAAAACUAAAABAAQAAAAAACYAAAABAAUAAAAAACcAAAAFAAoAAAAAACgAAAAFAAoAAAAAACkAAAAIAAoAAAAAACoAAAAFAAkAAAAAACsAAAAIAAkAAAAAACwAAAAFAAkAAAAAAC0AAAAAAAAAAAAAAC4AAAAAAAAAAAAAAC8AAAAIAAkAAAAAADAAAAAHAAkAAAAAADEAAAAIAAoAAAAAADIAAAAAAAAAAAAAADMAAAAFAAkAAAABAPD/AAABAAsAAAABAPH/AAAFAAkAAAABAPL/AAAHAAoAAAABAPP/AAAAAAAAAAABAPT/AAAAAAAAAAABAPX/AAAHAAkAAAABAPb/AAAFAAkAAAABAAIAAAABAAUAAAABAAMAAAAAAAAAAAABAAQAAAAMABwAAAABAAUAAAAAAAAAAAABAAYAAAAFAAoAAAABAAcAAAAHAAoAAAABAAgAAAAAAAAAAAABAAkAAAAHAAoAAAABAAoAAAAIAAoAAAABAAsAAAAIAAkAAAABAAwAAAAIAAkAAAABAA0AAAAIAAoAAAABAA4AAAAHAAkAAAABAA8AAAAIAAoAAAABABAAAAAIAAkAAAABABEAAAAAAAAAAAABABIAAAAFAAkAAAABABMAAAAAAAAAAAABABQAAAAHAAoAAAABABUAAAAFAAkAAAABABYAAAAFAAkAAAABABcAAAAHAAkAAAABABgAAAAAAAAAAAABABkAAAAFAAoAAAABABoAAAAFAAkAAAABABsAAAAIAAoAAAABABwAAAAHAAkAAAABAB0AAAAIAAoAAAABAB4AAAABAAMAAAABAB8AAAABAAQAAAABACAAAAABAAQAAAABACEAAAABAAQAAAABACIAAAABAAQAAAABACMAAAABAAQAAAABACQAAAAAAAYAAAABACUAAAACAAQAAAABACYAAAACAAUAAAABACcAAAAFAAkAAAABACgAAAAIAAkAAAABACkAAAAIAAoAAAABACoAAAAFAAoAAAABACsAAAAFAAkAAAABACwAAAAFAAoAAAABAC0AAAAHAAoAAAABAC4AAAAFAAoAAAABAC8AAAAFAAoAAAABADAAAAAIAAoAAAABADEAAAAIAAkAAAABADIAAAAAAAAAAAABADMAAAAFAAoAAAACAPD/AAABAAsAAAACAPH/AAAAAAAAAAACAPL/AAAFAAkAAAACAPP/AAAIAAoAAAACAPT/AAAFAAoAAAACAPX/AAAFAAoAAAACAPb/AAAFAAkAAAACAAIAAAABAAUAAAACAAMAAAAIAAoAAAACAAQAAAAFAAoAAAACAAUAAAAIAAkAAAACAAYAAAAFAAkAAAACAAcAAAAIAAoAAAACAAgAAAAAAAAAAAACAAkAAAAIAAkAAAACAAoAAAAFAAkAAAACAAsAAAAIAAkAAAACAAwAAAAAAAAAAAACAA0AAAAFAAkAAAACAA4AAAAFAAkAAAACAA8AAAAFAAkAAAACABAAAAAFAAkAAAACABEAAAAIAAoAAAACABIAAAAAAAAAAAACABMAAAAHAAoAAAACABQAAAAAAAAAAAACABUAAAAFAAoAAAACABYAAAAIAAoAAAACABcAAAAHAAoAAAACABgAAAAFAAoAAAACABkAAAAHAAoAAAACABoAAAAFAAkAAAACABsAAAAIAAkAAAACABwAAAAIAAkAAAACAB0AAAAHAAkAAAACAB4AAAACAAMAAAACAB8AAAAAAAcAAAACACAAAAABAAQAAAACACEAAAABAAQAAAACACIAAAABAAQAAAACACMAAAAAAAYAAAACACQAAAACAAUAAAACACUAAAAFAAkAAAACACYAAAAHAAkAAAACACcAAAAAAAAAAAACACgAAAAFAAoAAAACACkAAAAIAAkAAAACACoAAAAFAAoAAAACACsAAAAAAAAAAAACACwAAAAAAAAAAAACAC0AAAAFAAkAAAACAC4AAAAHAAkAAAACAC8AAAAIAAoAAAACADAAAAAFAAoAAAACADEAAAAAAAAAAAACADIAAAAHAAkAAAACADMAAAAFAAkAAAADAPD/AAABAAsAAAADAPH/AAAFAAkAAAADAPL/AAAHAAoAAAADAPP/AAAFAAoAAAADAPT/AAAAAAAAAAADAPX/AAAIAAkAAAADAPb/AAAIAAkAAAADAAIAAAABAAUAAAADAAMAAAAFAAkAAAADAAQAAAANABwAAAADAAUAAAAFAAkAAAADAAYAAAAIAAkAAAADAAcAAAANABwAAAADAAgAAAAFAAoAAAADAAkAAAAFAAoAAAADAAoAAAAIAAoAAAADAAsAAAAHAAkAAAADAAwAAAAHAAoAAAADAA0AAAAFAAoAAAADAA4AAAAFAAoAAAADAA8AAAAFAAoAAAADABAAAAAIAAoAAAADABEAAAAHAAkAAAADABIAAAAAAAAAAAADABMAAAAHAAkAAAADABQAAAAIAAoAAAADABUAAAAIAAoAAAADABYAAAAFAAoAAAADABcAAAAFAAoAAAADABgAAAAHAAkAAAADABkAAAAIAAoAAAADABoAAAAFAAkAAAADABsAAAAFAAoAAAADABwAAAAHAAoAAAADAB0AAAAAAAAAAAADAB4AAAAAAAAAAAADAB8AAAABAAMAAAADACAAAAABAAQAAAADACEAAAABAAQAAAADACIAAAAAAAYAAAADACMAAAACAAUAAAADACQAAAAAAAAAAAADACUAAAAHAAoAAAADACYAAAAAAAAAAAADACcAAAAHAAoAAAADACgAAAAIAAkAAAADACkAAAAHAAkAAAADACoAAAAIAAkAAAADACsAAAAHAAoAAAADACwAAAAIAAkAAAADAC0AAAAHAAkAAAADAC4AAAAHAAoAAAADAC8AAAAHAAoAAAADADAAAAAIAAkAAAADADEAAAAIAAoAAAADADIAAAAHAAkAAAADADMAAAAFAAkAAAAEAPD/AAABAAsAAAAEAPH/AAAAAAAAAAAEAPL/AAAHAAkAAAAEAPP/AAAFAAoAAAAEAPT/AAAFAAoAAAAEAPX/AAAIAAkAAAAEAPb/AAAFAAoAAAAEAAIAAAABAAUAAAAEAAMAAAAHAAoAAAAEAAQAAAAIAAkAAAAEAAUAAAAAAAAAAAAEAAYAAAAFAAoAAAAEAAcAAAAHAAkAAAAEAAgAAAAFAAoAAAAEAAkAAAAIAAkAAAAEAAoAAAAAAAAAAAAEAAsAAAAAAAAAAAAEAAwAAAAAAAAAAAAEAA0AAAAAAAAAAAAEAA4AAAAFAAkAAAAEAA8AAAAIAAkAAAAEABAAAAAFAAoAAAAEABEAAAAIAAkAAAAEABIAAAAIAAoAAAAEABMAAAAIAAoAAAAEABQAAAAFAAoAAAAEABUAAAAFAAkAAAAEABYAAAAHAAoAAAAEABcAAAAHAAoAAAAEABgAAAAFAAoAAAAEABkAAAAAAAAAAAAEABoAAAAHAAkAAAAEABsAAAAIAAoAAAAEABwAAAAFAAoAAAAEAB0AAAAFAAoAAAAEAB4AAAAFAAkAAAAEAB8AAAABAAMAAAAEACAAAAABAAQAAAAEACEAAAABAAQAAAAEACIAAAABAAUAAAAEACMAAAAHAAoAAAAEACQAAAAFAAkAAAAEACUAAAAAAAAAAAAEACYAAAAFAAoAAAAEACcAAAAIAAoAAAAEACgAAAAHAAkAAAAEACkAAAAHAAoAAAAEACoAAAAIAAkAAAAEACsAAAAFAAoAAAAEACwAAAAFAAkAAAAEAC0AAAAHAAkAAAAEAC4AAAAHAAkAAAAEAC8AAAAIAAkAAAAEADAAAAAFAAoAAAAEADEAAAAFAAoAAAAEADIAAAAFAAkAAAAEADMAAAAHAAkAAAAFAPD/AAABAAsAAAAFAPH/AAAHAAkAAAAFAPL/AAAHAAoAAAAFAPP/AAAFAAkAAAAFAPT/AAAIAAoAAAAFAPX/AAAHAAkAAAAFAPb/AAAFAAkAAAAFAAIAAAABAAUAAAAFAAMAAAAHAAoAAAAFAAQAAAAIAAoAAAAFAAUAAAAIAAoAAAAFAAYAAAAHAAoAAAAFAAcAAAAFAAoAAAAFAAgAAAAHAAkAAAAFAAkAAAAFAAkAAAAFAAoAAAAAAAAAAAAFAAsAAAAHAAkAAAAFAAwAAAAHAAoAAAAFAA0AAAAHAAkAAAAFAA4AAAAFAAoAAAAFAA8AAAAHAAkAAAAFABAAAAAHAAoAAAAFABEAAAAAAAAAAAAFABIAAAAAAAAAAAAFABMAAAAHAAkAAAAFABQAAAAHAAkAAAAFABUAAAAIAAkAAAAFABYAAAAHAAkAAAAFABcAAAAHAAkAAAAFABgAAAAIAAoAAAAFABkAAAAIAAkAAAAFABoAAAAHAAkAAAAFABsAAAAFAAoAAAAFABwAAAAFAAoAAAAFAB0AAAAIAAoAAAAFAB4AAAAHAAoAAAAFAB8AAAABAAMAAAAFACAAAAABAAQAAAAFACEAAAABAAQAAAAFACIAAAABAAUAAAAFACMAAAAIAAoAAAAFACQAAAAIAAkAAAAFACUAAAAHAAoAAAAFACYAAAAFAAoAAAAFACcAAAAFAAoAAAAFACgAAAAIAAoAAAAFACkAAAAFAAoAAAAFACoAAAAAAAAAAAAFACsAAAAFAAoAAAAFACwAAAAFAAkAAAAFAC0AAAAIAAkAAAAFAC4AAAAAAAAAAAAFAC8AAAAIAAoAAAAFADAAAAAAAAAAAAAFADEAAAAFAAkAAAAFADIAAAAAAAAAAAAFADMAAAAIAAoAAAAGAPD/AAABAAsAAAAGAPH/AAAIAAoAAAAGAPL/AAAHAAkAAAAGAPP/AAAFAAoAAAAGAPT/AAAFAAkAAAAGAPX/AAAHAAoAAAAGAPb/AAAFAAkAAAAGAAIAAAABAAYAAAAGAAQAAAAAAAUAAAAGAAUAAAAAAAAAAAAGAAYAAAAHAAoAAAAGAAcAAAAIAAoAAAAGAAgAAAAHAAkAAAAGAAkAAAAFAAoAAAAGAAoAAAAIAAkAAAAGAAsAAAAAAAAAAAAGAAwAAAAHAAoAAAAGAA0AAAAHAAkAAAAGAA4AAAAHAAoAAAAGAA8AAAAHAAkAAAAGABAAAAAHAAkAAAAGABEAAAAFAAkAAAAGABIAAAAHAAoAAAAGABMAAAAIAAoAAAAGABQAAAAFAAoAAAAGABUAAAAAAAAAAAAGABYAAAAFAAkAAAAGABcAAAAFAAoAAAAGABgAAAAIAAkAAAAGABkAAAAFAAoAAAAGABoAAAAHAAoAAAAGABsAAAAIAAoAAAAGABwAAAAFAAoAAAAGAB0AAAAHAAkAAAAGAB4AAAAIAAoAAAAGAB8AAAABAAMAAAAGACAAAAABAAQAAAAGACEAAAABAAQAAAAGACIAAAABAAUAAAAGACMAAAAIAAkAAAAGACQAAAAHAAkAAAAGACUAAAAFAAoAAAAGACYAAAAIAAoAAAAGACcAAAAFAAoAAAAGACgAAAAIAAkAAAAGACkAAAAFAAkAAAAGACoAAAAAAAAAAAAGACsAAAAIAAkAAAAGACwAAAAIAAoAAAAGAC0AAAAFAAkAAAAGAC4AAAAHAAoAAAAGAC8AAAAFAAoAAAAGADAAAAAHAAoAAAAGADEAAAAHAAkAAAAGADIAAAAAAAAAAAAGADMAAAAAAAAAAAAHAPD/AAABAAsAAAAHAPH/AAAHAAkAAAAHAPL/AAAHAAkAAAAHAPP/AAAAAAAAAAAHAPT/AAAHAAkAAAAHAPX/AAAHAAkAAAAHAPb/AAAHAAkAAAAHAAIAAAABAAQAAAAHAAMAAAABAAQAAAAHAAQAAAAGAAAAAAAHAAUAAAALAAIAAAAHAAYAAAAHAAoAAAAHAAcAAAAIAAoAAAAHAAgAAAAHAAkAAAAHAAkAAAAFAAoAAAAHAAoAAAAFAAoAAAAHAAsAAAAAAAAAAAAHAAwAAAAHAAoAAAAHAA0AAAAAAAAAAAAHAA4AAAAAAAAAAAAHAA8AAAAIAAkAAAAHABAAAAAIAAkAAAAHABEAAAAHAAkAAAAHABIAAAAHAAoAAAAHABMAAAAIAAkAAAAHABQAAAAIAAkAAAAHABUAAAAFAAoAAAAHABYAAAAIAAoAAAAHABcAAAAFAAkAAAAHABgAAAAAAAMAAAAHABkAAAAAAAQAAAAHABoAAAAAAAQAAAAHABsAAAAAAAQAAAAHABwAAAAAAAQAAAAHAB0AAAAAAAUAAAAHAB4AAAAHAAoAAAAHAB8AAAABAAMAAAAHACAAAAABAAQAAAAHACEAAAABAAQAAAAHACIAAAABAAUAAAAHACMAAAAIAAkAAAAHACQAAAAIAAkAAAAHACUAAAAHAAkAAAAHACYAAAAFAAoAAAAHACcAAAAIAAoAAAAHACgAAAAIAAoAAAAHACkAAAAAAAAAAAAHACoAAAAIAAkAAAAHACsAAAAHAAkAAAAHACwAAAAFAAoAAAAHAC0AAAAFAAkAAAAHAC4AAAAHAAkAAAAHAC8AAAAIAAkAAAAHADAAAAAAAAAAAAAHADEAAAAAAAAAAAAHADIAAAAHAAkAAAAHADMAAAAFAAkAAAAIAPD/AAABAAsAAAAIAPH/AAAIAAkAAAAIAPL/AAAFAAkAAAAIAPP/AAAIAAoAAAAIAPT/AAAIAAoAAAAIAPX/AAAAAAAAAAAIAPb/AAAFAAoAAAAIAAIAAAAAAAYAAAAIAAMAAAACAAQAAAAIAAQAAAABAAkAAAAIAAUAAAABAAoAAAAIAAYAAAAIAAoAAAAIAAcAAAAIAAoAAAAIAAgAAAAIAAkAAAAIAAkAAAAHAAoAAAAIAAoAAAAFAAkAAAAIAAsAAAAAAAAAAAAIAAwAAAAAAAAAAAAIAA0AAAAAAAAAAAAIAA4AAAAAAAAAAAAIAA8AAAAIAAkAAAAIABAAAAAHAAoAAAAIABEAAAAFAAkAAAAIABIAAAAFAAkAAAAIABMAAAAFAAoAAAAIABUAAAAHAAkAAAAIABYAAAAFAAoAAAAIABcAAAAAAAMAAAAIABgAAAABAAcAAAAIABkAAAABAAQAAAAIABoAAAABAAQAAAAIABsAAAABAAQAAAAIABwAAAABAAQAAAAIAB0AAAABAAYAAAAIAB4AAAAAAAQAAAAIAB8AAAABAAcAAAAIACAAAAABAAQAAAAIACEAAAABAAQAAAAIACIAAAABAAUAAAAIACMAAAAIAAoAAAAIACQAAAAAAAAAAAAIACUAAAAIAAoAAAAIACYAAAAHAAkAAAAIACcAAAAAAAAAAAAIACgAAAAFAAkAAAAIACkAAAAFAAoAAAAIACoAAAAIAAoAAAAIACsAAAAHAAoAAAAIACwAAAAIAAoAAAAIAC0AAAAHAAkAAAAIAC4AAAAIAAkAAAAIAC8AAAAAAAAAAAAIADAAAAAAAAAAAAAIADEAAAAAAAAAAAAIADIAAAAHAAoAAAAIADMAAAAHAAoAAAAJAPD/AAABAAsAAAAJAPH/AAAIAAoAAAAJAPL/AAAAAAAAAAAJAPP/AAAFAAoAAAAJAPT/AAAFAAkAAAAJAPX/AAAHAAoAAAAJAPb/AAAIAAkAAAAJAAIAAAABAAUAAAAJAAMAAAAFAAkAAAAJAAQAAAAHAAkAAAAJAAUAAAAAAAAAAAAJAAYAAAAIAAoAAAAJAAcAAAAFAAoAAAAJAAgAAAAIAAoAAAAJAAkAAAAIAAkAAAAJAAoAAAAIAAkAAAAJAAsAAAAHAAkAAAAJAAwAAAAFAAkAAAAJAA0AAAAFAAoAAAAJAA4AAAAIAAkAAAAJAA8AAAAFAAkAAAAJABAAAAAIAAoAAAAJABEAAAAIAAkAAAAJABIAAAAFAAoAAAAJABMAAAAHAAkAAAAJABQAAAAAAAAAAAAJABUAAAAIAAkAAAAJABYAAAAAAAMAAAAJABcAAAABAAcAAAAJABgAAAABAAQAAAAJABkAAAABAAQAAAAJABoAAAAAAAYAAAAJABsAAAAAAAcAAAAJABwAAAABAAQAAAAJAB0AAAABAAQAAAAJAB4AAAABAAQAAAAJAB8AAAABAAQAAAAJACAAAAABAAQAAAAJACEAAAABAAQAAAAJACIAAAABAAUAAAAJACMAAAAAAAAAAAAJACQAAAAFAAkAAAAJACUAAAAIAAoAAAAJACYAAAAIAAoAAAAJACcAAAAHAAkAAAAJACgAAAAHAAoAAAAJACkAAAAFAAoAAAAJACoAAAAIAAkAAAAJACsAAAAFAAkAAAAJACwAAAAFAAoAAAAJAC0AAAAFAAoAAAAJAC4AAAAFAAkAAAAJAC8AAAAHAAoAAAAJADAAAAAIAAoAAAAJADEAAAAHAAoAAAAJADIAAAAIAAkAAAAJADMAAAAFAAkAAAAKAPD/AAABAAsAAAAKAPH/AAAIAAkAAAAKAPL/AAAHAAoAAAAKAPP/AAAIAAoAAAAKAPT/AAAIAAkAAAAKAPX/AAAFAAoAAAAKAPb/AAAIAAkAAAAKAAIAAAABAAUAAAAKAAMAAAAIAAkAAAAKAAQAAAAFAAoAAAAKAAUAAAAHAAoAAAAKAAYAAAAIAAkAAAAKAAcAAAAFAAoAAAAKAAgAAAAIAAoAAAAKAAkAAAAIAAoAAAAKAAoAAAAIAAkAAAAKAAsAAAAIAAoAAAAKAAwAAAAIAAkAAAAKAA0AAAAIAAoAAAAKAA4AAAAHAAoAAAAKAA8AAAAFAAkAAAAKABAAAAAIAAkAAAAKABEAAAAFAAoAAAAKABIAAAAHAAoAAAAKABMAAAAIAAoAAAAKABQAAAAHAAkAAAAKABUAAAAAAAMAAAAKABYAAAABAAcAAAAKABcAAAABAAQAAAAKABgAAAABAAQAAAAKABkAAAAAAAYAAAAKABoAAAACAAUAAAAKABsAAAACAAMAAAAKABwAAAACAAQAAAAKAB0AAAACAAQAAAAKAB4AAAACAAQAAAAKAB8AAAAAAAcAAAAKACAAAAABAAQAAAAKACEAAAABAAQAAAAKACIAAAABAAUAAAAKACMAAAAHAAoAAAAKACQAAAAAAAAAAAAKACUAAAAAAAAAAAAKACYAAAAHAAoAAAAKACcAAAAHAAkAAAAKACgAAAAHAAkAAAAKACkAAAAIAAoAAAAKACoAAAAFAAoAAAAKACsAAAAHAAkAAAAKACwAAAAAAAAAAAAKAC0AAAAHAAkAAAAKAC4AAAAIAAkAAAAKAC8AAAAHAAoAAAAKADAAAAAIAAkAAAAKADEAAAAHAAoAAAAKADIAAAAHAAoAAAAKADMAAAAIAAoAAAALAPD/AAABAAsAAAALAPH/AAAIAAkAAAALAPL/AAAHAAoAAAALAPP/AAAHAAkAAAALAPT/AAAIAAoAAAALAPX/AAAHAAkAAAALAPb/AAAAAAAAAAALAAIAAAABAAUAAAALAAMAAAAIAAoAAAALAAQAAAAAAAAAAAALAAUAAAAFAAkAAAALAAYAAAAHAAkAAAALAAcAAAAHAAoAAAALAAgAAAAFAAkAAAALAAkAAAAIAAoAAAALAAoAAAAIAAoAAAALAAsAAAAFAAoAAAALAAwAAAAIAAoAAAALAA0AAAAIAAkAAAALAA4AAAAFAAkAAAALAA8AAAAIAAkAAAALABAAAAAIAAkAAAALABEAAAAFAAkAAAALABIAAAAIAAkAAAALABMAAAAIAAoAAAALABQAAAAAAAMAAAALABUAAAABAAcAAAALABYAAAABAAQAAAALABcAAAAAAAYAAAALABgAAAACAAQAAAALABkAAAACAAUAAAALABoAAAAHAAoAAAALABsAAAAAAAAAAAALABwAAAAAAAAAAAALAB0AAAAFAAkAAAALAB4AAAAFAAkAAAALAB8AAAABAAMAAAALACAAAAABAAQAAAALACEAAAABAAQAAAALACIAAAABAAUAAAALACMAAAAFAAoAAAALACQAAAAHAAoAAAALACUAAAAHAAkAAAALACYAAAAHAAkAAAALACcAAAAAAAAAAAALACgAAAAFAAkAAAALACkAAAAIAAkAAAALACoAAAAFAAoAAAALACsAAAAAAAAAAAALACwAAAAHAAoAAAALAC0AAAAIAAkAAAALAC4AAAAAAAAAAAALAC8AAAAHAAkAAAALADAAAAAIAAoAAAALADEAAAAHAAoAAAALADIAAAAIAAoAAAALADMAAAAFAAoAAAAMAPD/AAABAAsAAAAMAPH/AAAFAAoAAAAMAPL/AAAIAAkAAAAMAPP/AAAAAAAAAAAMAPT/AAAIAAkAAAAMAPX/AAAHAAoAAAAMAPb/AAAAAAAAAAAMAAIAAAABAAUAAAAMAAMAAAAIAAoAAAAMAAQAAAAIAAkAAAAMAAUAAAAIAAkAAAAMAAcAAAAAAAAAAAAMAAgAAAAIAAoAAAAMAAkAAAAIAAkAAAAMAAoAAAAAAAAAAAAMAAsAAAAIAAoAAAAMAAwAAAAAAAAAAAAMAA0AAAAAAAAAAAAMAA4AAAAAAAAAAAAMAA8AAAAHAAoAAAAMABAAAAAAAAAAAAAMABEAAAAFAAkAAAAMABIAAAAFAAkAAAAMABMAAAAFAAkAAAAMABQAAAABAAMAAAAMABUAAAABAAQAAAAMABYAAAABAAQAAAAMABcAAAABAAUAAAAMABgAAAAHAAkAAAAMABkAAAAIAAoAAAAMABoAAAAFAAoAAAAMABsAAAAAAAAAAAAMABwAAAAHAAkAAAAMAB0AAAAIAAoAAAAMAB4AAAAIAAkAAAAMAB8AAAABAAMAAAAMACAAAAABAAQAAAAMACEAAAABAAQAAAAMACIAAAABAAUAAAAMACMAAAAIAAoAAAAMACQAAAAIAAkAAAAMACUAAAAAAAAAAAAMACYAAAAHAAoAAAAMACcAAAAFAAkAAAAMACgAAAAIAAoAAAAMACkAAAAFAAoAAAAMACoAAAAFAAkAAAAMACsAAAAIAAoAAAAMACwAAAAAAAAAAAAMAC0AAAAFAAoAAAAMAC4AAAAHAAoAAAAMAC8AAAAAAAAAAAAMADAAAAAHAAkAAAAMADEAAAAFAAkAAAAMADIAAAAIAAkAAAAMADMAAAAFAAkAAAANAPD/AAABAAsAAAANAPH/AAAFAAkAAAANAPL/AAAFAAoAAAANAPP/AAAAAAAAAAANAPT/AAAIAAoAAAANAPX/AAAIAAoAAAANAPb/AAAAAAAAAAANAAIAAAABAAUAAAANAAMAAAAFAAkAAAANAAQAAAAHAAkAAAANAAUAAAAIAAoAAAANAAYAAAAAAAAAAAANAAcAAAAHAAkAAAANAAgAAAAAAAAAAAANAAkAAAAIAAkAAAANAAoAAAAIAAoAAAANAAsAAAAHAAoAAAANAAwAAAAAAAAAAAANAA0AAAAFAAkAAAANAA4AAAAHAAoAAAANAA8AAAAHAAoAAAANABAAAAAAAAAAAAANABEAAAAAAAAAAAANABIAAAAAAAAAAAANABMAAAAAAAMAAAANABQAAAABAAcAAAANABUAAAABAAQAAAANABYAAAAAAAYAAAANABcAAAACAAUAAAANABgAAAAFAAoAAAANABkAAAAIAAkAAAANABoAAAAIAAkAAAANABsAAAAAAAAAAAANABwAAAAIAAkAAAANAB0AAAAAAAAAAAANAB4AAAAHAAoAAAANAB8AAAABAAMAAAANACAAAAABAAQAAAANACEAAAABAAQAAAANACIAAAABAAUAAAANACMAAAAFAAoAAAANACQAAAAIAAkAAAANACUAAAAHAAkAAAANACYAAAAIAAkAAAANACcAAAAHAAoAAAANACgAAAAHAAoAAAANACkAAAAAAAAAAAANACoAAAAFAAkAAAANACsAAAAFAAkAAAANACwAAAAAAAAAAAANAC0AAAAIAAkAAAANAC4AAAAHAAoAAAANAC8AAAAHAAoAAAANADAAAAAHAAoAAAANADEAAAAFAAoAAAANADIAAAAAAAAAAAANADMAAAAHAAoAAAAOAPD/AAABAAsAAAAOAPH/AAAHAAkAAAAOAPL/AAAIAAkAAAAOAPP/AAAHAAkAAAAOAPT/AAAFAAkAAAAOAPX/AAAAAAAAAAAOAPb/AAAFAAkAAAAOAAIAAAABAAUAAAAOAAMAAAAAAAAAAAAOAAQAAAAHAAoAAAAOAAUAAAAIAAoAAAAOAAcAAAAFAAoAAAAOAAgAAAAIAAoAAAAOAAkAAAAFAAkAAAAOAAoAAAAFAAoAAAAOAAsAAAAFAAkAAAAOAAwAAAAFAAoAAAAOAA0AAAAIAAoAAAAOAA4AAAAFAAkAAAAOAA8AAAAIAAoAAAAOABAAAAAIAAoAAAAOABEAAAAGAAAAAAAOABIAAAAAAAAAAAAOABMAAAABAAQAAAAOABQAAAABAAQAAAAOABUAAAABAAQAAAAOABYAAAABAAUAAAAOABcAAAAFAAkAAAAOABgAAAAHAAkAAAAOABkAAAAHAAoAAAAOABoAAAAFAAoAAAAOABsAAAAIAAkAAAAOABwAAAAHAAkAAAAOAB0AAAAAAAAAAAAOAB4AAAAAAAAAAAAOAB8AAAABAAMAAAAOACAAAAABAAQAAAAOACEAAAABAAQAAAAOACIAAAABAAUAAAAOACMAAAAHAAkAAAAOACQAAAAFAAkAAAAOACUAAAAFAAkAAAAOACYAAAAIAAkAAAAOACcAAAAAAAAAAAAOACgAAAAFAAoAAAAOACkAAAAFAAkAAAAOACoAAAAIAAoAAAAOACsAAAAFAAoAAAAOACwAAAAHAAkAAAAOAC0AAAAAAAAAAAAOAC4AAAAAAAAAAAAOAC8AAAAIAAkAAAAOADAAAAAIAAkAAAAOADEAAAAHAAoAAAAOADIAAAAAAAAAAAAOADMAAAAAAAAAAAAPAPD/AAABAAsAAAAPAPH/AAAFAAkAAAAPAPL/AAAFAAoAAAAPAPP/AAAHAAkAAAAPAPT/AAAFAAoAAAAPAPX/AAAHAAoAAAAPAPb/AAAAAAAAAAAPAAMAAAAIAAkAAAAPAAQAAAAIAAoAAAAPAAUAAAAHAAkAAAAPAAYAAAAFAAkAAAAPAAcAAAAFAAoAAAAPAAgAAAAFAAkAAAAPAAkAAAAFAAoAAAAPAAoAAAAFAAkAAAAPAAsAAAAIAAoAAAAPAAwAAAAIAAkAAAAPAA0AAAAAAAAAAAAPAA4AAAAIAAoAAAAPAA8AAAAIAAkAAAAPABAAAAAOAAAAAAAPABEAAAAFAAoAAAAPABIAAAACAAMAAAAPABMAAAACAAQAAAAPABQAAAAAAAcAAAAPABUAAAABAAQAAAAPABYAAAABAAUAAAAPABcAAAAHAAkAAAAPABgAAAAFAAkAAAAPABkAAAAFAAoAAAAPABoAAAAAAAAAAAAPABsAAAAFAAoAAAAPABwAAAAFAAoAAAAPAB0AAAAIAAkAAAAPAB4AAAAFAAoAAAAPAB8AAAABAAMAAAAPACAAAAABAAQAAAAPACEAAAABAAQAAAAPACIAAAABAAUAAAAPACMAAAAFAAkAAAAPACQAAAAFAAoAAAAPACUAAAAIAAoAAAAPACYAAAAFAAoAAAAPACcAAAAAAAAAAAAPACgAAAAHAAoAAAAPACkAAAAAAAAAAAAPACoAAAAIAAoAAAAPACsAAAAIAAkAAAAPACwAAAAIAAoAAAAPAC0AAAAFAAoAAAAPAC4AAAAHAAoAAAAPAC8AAAAIAAoAAAAPADAAAAAHAAkAAAAPADEAAAAIAAoAAAAPADIAAAAFAAoAAAAPADMAAAAFAAoAAAAQAPD/AAABAAsAAAAQAPH/AAAIAAoAAAAQAPL/AAAFAAkAAAAQAPP/AAAIAAkAAAAQAPT/AAAIAAkAAAAQAPX/AAAAAAAAAAAQAPb/AAAFAAoAAAAQAAMAAAAAAAAAAAAQAAQAAAAHAAkAAAAQAAUAAAAHAAoAAAAQAAYAAAAFAAkAAAAQAAcAAAAIAAoAAAAQAAgAAAAAAAAAAAAQAAkAAAAHAAoAAAAQAAoAAAAAAAAAAAAQAAsAAAAAAAAAAAAQAAwAAAAHAAoAAAAQAA0AAAAIAAoAAAAQAA4AAAAFAAoAAAAQAA8AAAAFAAkAAAAQABAAAAAHAAoAAAAQABEAAAAHAAoAAAAQABIAAAAHAAkAAAAQABMAAAAAAAAAAAAQABQAAAABAAMAAAAQABUAAAABAAQAAAAQABYAAAABAAYAAAAQABcAAAAAAAUAAAAQABgAAAAIAAoAAAAQABkAAAAAAAAAAAAQABoAAAAHAAkAAAAQABsAAAAFAAkAAAAQABwAAAAFAAoAAAAQAB0AAAAIAAkAAAAQAB4AAAAHAAoAAAAQAB8AAAABAAMAAAAQACAAAAABAAQAAAAQACEAAAABAAQAAAAQACIAAAABAAUAAAAQACMAAAAFAAkAAAAQACQAAAAAAAAAAAAQACUAAAAFAAoAAAAQACYAAAAHAAkAAAAQACcAAAAIAAkAAAAQACgAAAAAAAAAAAAQACkAAAAAAAAAAAAQACoAAAAIAAoAAAAQACsAAAAAAAAAAAAQACwAAAAFAAoAAAAQAC0AAAAIAAoAAAAQAC4AAAAIAAkAAAAQAC8AAAAHAAkAAAAQADAAAAAFAAkAAAAQADEAAAAFAAoAAAAQADIAAAAAAAAAAAAQADMAAAAHAAoAAAARAPD/AAABAAsAAAARAPH/AAAIAAoAAAARAPL/AAAFAAoAAAARAPP/AAAIAAkAAAARAPT/AAAAAAAAAAARAPX/AAAAAAAAAAARAPb/AAAIAAoAAAARAAMAAAAAAAAAAAARAAQAAAAAAAAAAAARAAUAAAAFAAoAAAARAAYAAAAAAAAAAAARAAcAAAAAAAAAAAARAAgAAAAHAAkAAAARAAkAAAAAAAAAAAARAAoAAAAHAAkAAAARAAsAAAACAAYAAAARAAwAAAACAAcAAAARAA0AAAACAAgAAAARAA4AAAAAAAAAAAARAA8AAAAAAAAAAAARABAAAAAIAAkAAAARABEAAAAIAAoAAAARABIAAAAAAAAAAAARABMAAAAFAAoAAAARABQAAAABAAMAAAARABUAAAABAAQAAAARABYAAAABAAQAAAARABcAAAABAAYAAAARABgAAAAAAAUAAAARABkAAAAHAAkAAAARABoAAAAAAAAAAAARABsAAAAIAAoAAAARABwAAAAIAAoAAAARAB0AAAAHAAoAAAARAB4AAAAFAAoAAAARAB8AAAABAAMAAAARACAAAAABAAQAAAARACEAAAABAAQAAAARACIAAAABAAUAAAARACMAAAAIAAoAAAARACQAAAAIAAkAAAARACUAAAAFAAoAAAARACYAAAAFAAkAAAARACcAAAAFAAkAAAARACgAAAAFAAkAAAARACkAAAAFAAkAAAARACoAAAAAAAAAAAARACsAAAAHAAoAAAARACwAAAAIAAkAAAARAC0AAAAIAAkAAAARAC4AAAAAAAAAAAARAC8AAAAAAAAAAAARADAAAAAAAAAAAAARADEAAAAFAAoAAAARADIAAAAHAAkAAAARADMAAAAIAAoAAAASAPD/AAABAAsAAAASAPH/AAAHAAoAAAASAPL/AAAHAAoAAAASAPP/AAAFAAoAAAASAPT/AAAFAAoAAAASAPX/AAAFAAkAAAASAPb/AAAIAAkAAAASAAIAAAABAAUAAAASAAMAAAAFAAoAAAASAAQAAAAHAAoAAAASAAUAAAAFAAoAAAASAAYAAAAHAAkAAAASAAcAAAAFAAoAAAASAAgAAAAHAAkAAAASAAkAAAAIAAoAAAASAAoAAAACAAYAAAASAAsAAAADAAoAAAASAAwAAAADAAcAAAASAA0AAAADAAkAAAASAA4AAAACAAcAAAASAA8AAAACAAgAAAASABAAAAAHAAkAAAASABEAAAAFAAkAAAASABIAAAAAAAAAAAASABMAAAAHAAoAAAASABQAAAACAAMAAAASABUAAAAAAAcAAAASABYAAAABAAQAAAASABcAAAABAAQAAAASABgAAAABAAYAAAASABkAAAAAAAUAAAASABoAAAAFAAoAAAASABsAAAAIAAoAAAASABwAAAAFAAoAAAASAB0AAAAFAAkAAAASAB4AAAAFAAkAAAASAB8AAAABAAMAAAASACAAAAABAAQAAAASACEAAAABAAQAAAASACIAAAABAAUAAAASACMAAAAIAAoAAAASACQAAAAFAAoAAAASACUAAAAHAAoAAAASACYAAAAIAAkAAAASACcAAAAFAAkAAAASACgAAAAHAAkAAAASACkAAAAAAAAAAAASACoAAAAHAAoAAAASACsAAAAAAAAAAAASACwAAAAAAAAAAAASAC0AAAAFAAkAAAASAC4AAAAFAAoAAAASAC8AAAAAAAAAAAASADAAAAAAAAAAAAASADEAAAAIAAoAAAASADIAAAAHAAoAAAASADMAAAAIAAkAAAATAPD/AAABAAsAAAATAPH/AAAAAAAAAAATAPL/AAAHAAoAAAATAPP/AAAHAAoAAAATAPT/AAAIAAkAAAATAPX/AAAIAAoAAAATAPb/AAAFAAkAAAATAAIAAAABAAYAAAATAAMAAAAAAAUAAAATAAQAAAAHAAoAAAATAAUAAAAFAAkAAAATAAYAAAAFAAoAAAATAAcAAAAFAAoAAAATAAgAAAAHAAoAAAATAAkAAAACAAYAAAATAAoAAAADAAoAAAATAAsAAAADAAcAAAATAAwAAAAAAAEAAAATAA0AAAADAAcAAAATAA4AAAAAAAEAAAATAA8AAAADAAkAAAATABAAAAACAAgAAAATABEAAAAIAAkAAAATABIAAAAIAAkAAAATABMAAAAAAAAAAAATABQAAAAIAAkAAAATABUAAAACAAMAAAATABYAAAAAAAcAAAATABcAAAABAAQAAAATABgAAAABAAQAAAATABkAAAABAAYAAAATABoAAAAAAAUAAAATABsAAAAFAAoAAAATABwAAAAHAAoAAAATAB0AAAAIAAoAAAATAB4AAAAIAAoAAAATAB8AAAABAAMAAAATACAAAAABAAQAAAATACEAAAABAAQAAAATACIAAAABAAUAAAATACMAAAAAAAAAAAATACQAAAAIAAoAAAATACUAAAAAAAAAAAATACYAAAAHAAoAAAATACcAAAAHAAoAAAATACgAAAAIAAoAAAATACkAAAAHAAkAAAATACoAAAAIAAkAAAATACsAAAAIAAkAAAATACwAAAAAAAAAAAATAC0AAAAFAAkAAAATAC4AAAAAAAAAAAATAC8AAAAAAAAAAAATADAAAAAHAAoAAAATADEAAAAAAAAAAAATADIAAAAAAAAAAAATADMAAAAHAAkAAAAUAPD/AAABAAsAAAAUAPH/AAAAAAAAAAAUAPL/AAAFAAoAAAAUAPP/AAAIAAkAAAAUAPT/AAAFAAoAAAAUAPX/AAAIAAkAAAAUAPb/AAACAAYAAAAUAPf/AAACAAcAAAAUAPj/AAACAAcAAAAUAPn/AAACAAcAAAAUAPr/AAACAAgAAAAUAPv/AAAIAAoAAAAUAPz/AAAHAAkAAAAUAP3/AAAFAAkAAAAUAP7/AAAIAAoAAAAUAP//AAAFAAoAAAAUAAAAAAACAAMAAAAUAAEAAAAAAAcAAAAUAAIAAAABAAQAAAAUAAMAAAABAAYAAAAUAAQAAAAAAAUAAAAUAAUAAAAFAAkAAAAUAAYAAAAHAAoAAAAUAAcAAAAAAAAAAAAUAAgAAAAFAAoAAAAUAAkAAAADAAYAAAAUAAoAAAADAAcAAAAUAAsAAAADAAcAAAAUAAwAAAADAAcAAAAUAA0AAAADAAcAAAAUAA4AAAADAAcAAAAUAA8AAAADAAcAAAAUABAAAAADAAkAAAAUABEAAAACAAgAAAAUABIAAAAFAAoAAAAUABMAAAAHAAkAAAAUABQAAAAAAAAAAAAUABUAAAAHAAoAAAAUABYAAAACAAMAAAAUABcAAAAAAAcAAAAUABgAAAABAAQAAAAUABkAAAABAAQAAAAUABoAAAABAAYAAAAUABsAAAAAAAUAAAAUABwAAAAAAAAAAAAUAB0AAAAFAAkAAAAUAB4AAAAFAAkAAAAUAB8AAAABAAMAAAAUACAAAAABAAQAAAAUACEAAAABAAQAAAAUACIAAAABAAUAAAAUACMAAAAHAAkAAAAUACQAAAAHAAoAAAAUACUAAAAAAAMAAAAUACYAAAAAAAQAAAAUACcAAAAAAAQAAAAUACgAAAAAAAQAAAAUACkAAAAAAAQAAAAUACoAAAAAAAUAAAAUACsAAAAIAAkAAAAUACwAAAAHAAkAAAAUAC0AAAAFAAoAAAAUAC4AAAAIAAkAAAAUAC8AAAAFAAoAAAAUADAAAAAHAAoAAAAUADEAAAAHAAoAAAAUADIAAAAHAAkAAAAUADMAAAAIAAoAAAAVAPD/AAABAAsAAAAVAPH/AAAHAAkAAAAVAPL/AAAIAAoAAAAVAPP/AAAIAAkAAAAVAPT/AAAFAAoAAAAVAPX/AAACAAYAAAAVAPb/AAADAAoAAAAVAPf/AAAAAAEAAAAVAPj/AAAAAAEAAAAVAPn/AAAAAAEAAAAVAPr/AAADAAkAAAAVAPv/AAACAAgAAAAVAPz/AAAHAAoAAAAVAP3/AAAIAAkAAAAVAP7/AAAFAAoAAAAVAP//AAAFAAkAAAAVAAAAAAAHAAoAAAAVAAEAAAACAAMAAAAVAAIAAAAAAAcAAAAVAAMAAAABAAQAAAAVAAQAAAABAAYAAAAVAAUAAAAAAAUAAAAVAAYAAAAFAAoAAAAVAAcAAAAHAAkAAAAVAAgAAAAFAAkAAAAVAAkAAAADAAYAAAAVAAoAAAADAAcAAAAVAAsAAAADAAcAAAAVAAwAAAACAAkAAAAVAA0AAAAEAAcAAAAVAA4AAAACAAoAAAAVAA8AAAADAAcAAAAVABAAAAADAAcAAAAVABEAAAADAAgAAAAVABIAAAAHAAkAAAAVABMAAAAHAAkAAAAVABQAAAAIAAkAAAAVABUAAAAFAAkAAAAVABYAAAAIAAkAAAAVABcAAAACAAMAAAAVABgAAAAAAAcAAAAVABkAAAABAAQAAAAVABoAAAABAAQAAAAVABsAAAABAAYAAAAVABwAAAAAAAUAAAAVAB0AAAAHAAkAAAAVAB4AAAAAAAAAAAAVAB8AAAABAAMAAAAVACAAAAABAAQAAAAVACEAAAABAAQAAAAVACIAAAABAAUAAAAVACMAAAAAAAAAAAAVACQAAAAFAAoAAAAVACUAAAABAAMAAAAVACYAAAABAAQAAAAVACcAAAABAAQAAAAVACgAAAABAAQAAAAVACkAAAABAAQAAAAVACoAAAABAAUAAAAVACsAAAAHAAoAAAAVACwAAAAAAAAAAAAVAC0AAAAIAAoAAAAVAC4AAAAAAAAAAAAVAC8AAAAIAAoAAAAVADAAAAAIAAoAAAAVADEAAAAHAAkAAAAVADIAAAAHAAkAAAAVADMAAAAFAAkAAAAWAPD/AAABAAsAAAAWAPH/AAAHAAoAAAAWAPL/AAAAAAAAAAAWAPP/AAAFAAkAAAAWAPT/AAACAAYAAAAWAPX/AAADAAoAAAAWAPb/AAAAAAEAAAAWAPf/AAADAAcAAAAWAPj/AAAAAAEAAAAWAPn/AAADAAcAAAAWAPr/AAAAAAEAAAAWAPv/AAADAAgAAAAWAPz/AAAIAAkAAAAWAP3/AAAFAAkAAAAWAP7/AAAHAAoAAAAWAP//AAAIAAkAAAAWAAAAAAAIAAkAAAAWAAEAAAAFAAkAAAAWAAIAAAABAAMAAAAWAAMAAAABAAQAAAAWAAQAAAABAAQAAAAWAAUAAAABAAYAAAAWAAYAAAAAAAQAAAAWAAcAAAAAAAUAAAAWAAgAAAAAAAMAAAAWAAkAAAABAAcAAAAWAAoAAAAPAAoAAAAWAAsAAAAAAAEAAAAWAA0AAAACAAcAAAAWAA4AAAADAAoAAAAWAA8AAAADAAcAAAAWABAAAAAAAAEAAAAWABEAAAADAAgAAAAWABIAAAAFAAoAAAAWABMAAAAFAAoAAAAWABQAAAAAAAAAAAAWABUAAAAHAAoAAAAWABYAAAAIAAoAAAAWABcAAAAFAAkAAAAWABgAAAACAAMAAAAWABkAAAAAAAcAAAAWABoAAAABAAQAAAAWABsAAAABAAQAAAAWABwAAAABAAYAAAAWAB0AAAAAAAUAAAAWAB4AAAAFAAkAAAAWAB8AAAABAAMAAAAWACAAAAABAAQAAAAWACEAAAABAAQAAAAWACIAAAABAAUAAAAWACMAAAAIAAoAAAAWACQAAAAHAAkAAAAWACUAAAABAAMAAAAWACYAAAABAAQAAAAWACcAAAABAAQAAAAWACgAAAABAAQAAAAWACkAAAABAAQAAAAWACoAAAABAAUAAAAWACsAAAAIAAkAAAAWACwAAAAFAAkAAAAWAC0AAAAIAAkAAAAWAC4AAAAHAAkAAAAWAC8AAAAAAAAAAAAWADAAAAAIAAkAAAAWADEAAAAIAAkAAAAWADIAAAAHAAkAAAAWADMAAAAFAAkAAAAXAPD/AAABAAsAAAAXAPH/AAAHAAkAAAAXAPL/AAACAAYAAAAXAPP/AAACAAcAAAAXAPT/AAADAAoAAAAXAPX/AAADAAcAAAAXAPb/AAADAAcAAAAXAPf/AAADAAcAAAAXAPj/AAAAAAEAAAAXAPn/AAADAAcAAAAXAPr/AAAAAAEAAAAXAPv/AAADAAkAAAAXAPz/AAACAAgAAAAXAP3/AAAFAAkAAAAXAP7/AAAAAAAAAAAXAP//AAAHAAoAAAAXAAAAAAAHAAkAAAAXAAEAAAAIAAkAAAAXAAIAAAACAAMAAAAXAAMAAAAAAAcAAAAXAAQAAAABAAQAAAAXAAUAAAABAAQAAAAXAAYAAAABAAQAAAAXAAcAAAABAAYAAAAXAAgAAAABAAcAAAAXAAkAAAABAAQAAAAXAAoAAAAQAAYAAAAXAAsAAAADAAcAAAAXAAwAAAADAAcAAAAXAA0AAAAAAAEAAAAXAA4AAAAAAAEAAAAXAA8AAAADAAcAAAAXABAAAAAAAAEAAAAXABEAAAADAAgAAAAXABIAAAAIAAkAAAAXABMAAAAIAAoAAAAXABQAAAAFAAoAAAAXABUAAAAIAAkAAAAXABYAAAAHAAoAAAAXABcAAAAFAAoAAAAXABgAAAAAAAAAAAAXABkAAAACAAMAAAAXABoAAAAAAAcAAAAXABsAAAABAAQAAAAXABwAAAABAAQAAAAXAB0AAAABAAYAAAAXAB4AAAAAAAUAAAAXAB8AAAABAAMAAAAXACAAAAABAAQAAAAXACEAAAABAAQAAAAXACIAAAABAAUAAAAXACMAAAAFAAkAAAAXACQAAAAFAAoAAAAXACUAAAABAAMAAAAXACYAAAABAAQAAAAXACcAAAABAAQAAAAXACgAAAABAAQAAAAXACkAAAABAAQAAAAXACoAAAABAAUAAAAXACsAAAAIAAoAAAAXACwAAAAIAAkAAAAXAC0AAAAHAAkAAAAXAC4AAAAHAAoAAAAXAC8AAAAHAAkAAAAXADAAAAAIAAkAAAAXADEAAAAHAAoAAAAXADIAAAAHAAoAAAAXADMAAAAHAAkAAAAYAPD/AAABAAsAAAAYAPH/AAAIAAkAAAAYAPL/AAADAAYAAAAYAPP/AAADAAcAAAAYAPT/AAADAAcAAAAYAPX/AAADAAcAAAAYAPb/AAADAAcAAAAYAPf/AAADAAcAAAAYAPn/AAADAAcAAAAYAPr/AAADAAcAAAAYAPv/AAADAAcAAAAYAPz/AAADAAgAAAAYAP3/AAAFAAkAAAAYAP7/AAAIAAkAAAAYAP//AAAFAAoAAAAYAAAAAAAIAAoAAAAYAAEAAAAIAAoAAAAYAAIAAAAFAAoAAAAYAAMAAAACAAMAAAAYAAQAAAACAAQAAAAYAAUAAAAAAAcAAAAYAAYAAAABAAQAAAAYAAcAAAABAAQAAAAYAAgAAAABAAQAAAAYAAkAAAABAAQAAAAYAAoAAAARAAYAAAAYAAsAAAAIAA0AAAAYAAwAAAAEAAcAAAAYAA0AAAAEAAcAAAAYAA4AAAACAAoAAAAYAA8AAAADAAcAAAAYABAAAAADAAcAAAAYABEAAAADAAkAAAAYABIAAAACAAgAAAAYABMAAAAFAAoAAAAYABQAAAAHAAoAAAAYABUAAAAFAAoAAAAYABYAAAAHAAoAAAAYABcAAAAFAAkAAAAYABgAAAAHAAkAAAAYABkAAAAHAAoAAAAYABoAAAACAAMAAAAYABsAAAAAAAcAAAAYABwAAAABAAQAAAAYAB0AAAABAAQAAAAYAB4AAAABAAUAAAAYAB8AAAABAAMAAAAYACAAAAABAAQAAAAYACEAAAABAAQAAAAYACIAAAABAAUAAAAYACMAAAAHAAkAAAAYACQAAAAIAAkAAAAYACUAAAABAAMAAAAYACYAAAABAAQAAAAYACcAAAABAAQAAAAYACgAAAABAAQAAAAYACkAAAABAAQAAAAYACoAAAABAAUAAAAYACsAAAAIAAkAAAAYACwAAAAHAAoAAAAYAC0AAAAHAAoAAAAYAC4AAAAIAAkAAAAYAC8AAAAAAAAAAAAYADAAAAAAAAAAAAAYADEAAAAFAAoAAAAYADIAAAAIAAoAAAAYADMAAAAFAAoAAAAZAPD/AAACAAYAAAAZAPH/AAACAAcAAAAZAPL/AAADAAoAAAAZAPP/AAADAAcAAAAZAPT/AAADAAcAAAAZAPX/AAAAAAEAAAAZAPb/AAADAAcAAAAZAPf/AAADAAcAAAAZAPj/AAADAAcAAAAZAPn/AAADAAcAAAAZAPr/AAADAAcAAAAZAPv/AAADAAcAAAAZAPz/AAADAAgAAAAZAP3/AAAIAAkAAAAZAP7/AAAAAAAAAAAZAP//AAAFAAoAAAAZAAAAAAAFAAkAAAAZAAEAAAAAAAAAAAAZAAIAAAAFAAkAAAAZAAMAAAAFAAkAAAAZAAQAAAAHAAoAAAAZAAUAAAACAAMAAAAZAAYAAAACAAQAAAAZAAcAAAACAAQAAAAZAAgAAAAAAAcAAAAZAAkAAAABAAQAAAAZAAoAAAABAAQAAAAZAAsAAAABAAUAAAAZAAwAAAAAAAAAAAAZAA0AAAAAAAAAAAAZAA4AAAADAAYAAAAZAA8AAAADAAcAAAAZABAAAAADAAcAAAAZABEAAAADAAcAAAAZABIAAAADAAgAAAAZABMAAAAHAAoAAAAZABQAAAAHAAoAAAAZABUAAAAIAAoAAAAZABYAAAAHAAoAAAAZABcAAAAIAAoAAAAZABgAAAAAAAAAAAAZABkAAAAIAAkAAAAZABoAAAAIAAoAAAAZABsAAAACAAMAAAAZABwAAAAAAAcAAAAZAB0AAAABAAQAAAAZAB4AAAABAAUAAAAZAB8AAAABAAMAAAAZACAAAAABAAQAAAAZACEAAAABAAQAAAAZACIAAAABAAUAAAAZACMAAAAHAAkAAAAZACQAAAAIAAkAAAAZACUAAAABAAMAAAAZACYAAAABAAQAAAAZACcAAAABAAQAAAAZACgAAAABAAQAAAAZACkAAAABAAQAAAAZACoAAAABAAUAAAAZACsAAAAIAAoAAAAZACwAAAAIAAkAAAAZAC0AAAAIAAoAAAAZAC4AAAAHAAoAAAAZAC8AAAAIAAoAAAAZADAAAAAAAAAAAAAZADEAAAAIAAkAAAAZADIAAAAIAAkAAAAZADMAAAAFAAoAAAAaAPD/AAADAAYAAAAaAPH/AAAAAAEAAAAaAPL/AAADAAcAAAAaAPP/AAADAAcAAAAaAPT/AAADAAcAAAAaAPX/AAAAAAEAAAAaAPb/AAADAAcAAAAaAPf/AAAAAAEAAAAaAPj/AAAAAAEAAAAaAPn/AAAAAAEAAAAaAPr/AAADAAcAAAAaAPv/AAAAAAEAAAAaAPz/AAADAAkAAAAaAP3/AAACAAcAAAAaAP7/AAACAAcAAAAaAP//AAACAAgAAAAaAAAAAAAIAAoAAAAaAAEAAAAHAAoAAAAaAAIAAAAIAAkAAAAaAAMAAAAHAAkAAAAaAAQAAAAIAAkAAAAaAAUAAAAHAAkAAAAaAAYAAAAAAAAAAAAaAAcAAAAFAAoAAAAaAAgAAAABAAMAAAAaAAkAAAABAAQAAAAaAAoAAAAAAAYAAAAaAAsAAAACAAUAAAAaAAwAAAAAAAAAAAAaAA0AAAAAAAAAAAAaAA4AAAAEAAYAAAAaAA8AAAACAAoAAAAaABAAAAAAAAEAAAAaABEAAAADAAcAAAAaABIAAAADAAgAAAAaABMAAAAHAAkAAAAaABQAAAAHAAkAAAAaABUAAAAFAAkAAAAaABYAAAAAAAAAAAAaABcAAAAIAAoAAAAaABgAAAAIAAoAAAAaABkAAAAHAAkAAAAaABoAAAAFAAoAAAAaABsAAAAAAAMAAAAaABwAAAABAAcAAAAaAB0AAAABAAQAAAAaAB4AAAABAAUAAAAaAB8AAAABAAMAAAAaACAAAAABAAQAAAAaACEAAAABAAQAAAAaACIAAAABAAUAAAAaACMAAAAIAAkAAAAaACQAAAAHAAoAAAAaACUAAAABAAMAAAAaACYAAAABAAQAAAAaACcAAAABAAQAAAAaACgAAAABAAQAAAAaACkAAAABAAQAAAAaACoAAAABAAUAAAAaACsAAAAFAAkAAAAaACwAAAAFAAoAAAAaAC0AAAAAAAAAAAAaAC4AAAAHAAkAAAAaAC8AAAAHAAoAAAAaADAAAAAFAAkAAAAaADEAAAAIAAoAAAAaADIAAAAFAAkAAAAaADMAAAAAAAkAAAAbAPD/AAADAAoAAAAbAPH/AAAAAAEAAAAbAPL/AAADAAcAAAAbAPP/AAADAAcAAAAbAPT/AAAAAAEAAAAbAPX/AAADAAcAAAAbAPb/AAADAAcAAAAbAPf/AAADAAcAAAAbAPj/AAADAAcAAAAbAPn/AAADAAcAAAAbAPr/AAADAAcAAAAbAPv/AAADAAcAAAAbAPz/AAAAAAEAAAAbAP3/AAADAAcAAAAbAP7/AAADAAcAAAAbAP//AAADAAkAAAAbAAAAAAACAAgAAAAbAAEAAAAFAAoAAAAbAAIAAAAIAAoAAAAbAAMAAAAHAAoAAAAbAAQAAAAAAAAAAAAbAAUAAAAFAAkAAAAbAAYAAAAAAAMAAAAbAAcAAAAAAAQAAAAbAAgAAAABAAcAAAAbAAkAAAABAAQAAAAbAAoAAAABAAUAAAAbAAsAAAAAAAAAAAAbAAwAAAAAAAAAAAAbAA0AAAAAAAAAAAAbAA4AAAACAAYAAAAbAA8AAAADAAoAAAAbABAAAAADAAcAAAAbABEAAAACAAkAAAAbABIAAAAEAAgAAAAbABMAAAAIAAkAAAAbABQAAAAIAAoAAAAbABUAAAAHAAkAAAAbABYAAAAIAAkAAAAbABcAAAAFAAkAAAAbABgAAAAIAAoAAAAbABkAAAAAAAAAAAAbABoAAAAAAAAAAAAbABsAAAABAAMAAAAbABwAAAABAAQAAAAbAB0AAAAAAAYAAAAbAB4AAAACAAUAAAAbAB8AAAABAAMAAAAbACAAAAABAAQAAAAbACEAAAABAAQAAAAbACIAAAABAAUAAAAbACMAAAAHAAoAAAAbACQAAAAFAAkAAAAbACUAAAABAAMAAAAbACYAAAABAAQAAAAbACcAAAABAAQAAAAbACgAAAABAAQAAAAbACkAAAABAAQAAAAbACoAAAABAAUAAAAbACsAAAAIAAoAAAAbACwAAAAIAAoAAAAbAC0AAAAHAAkAAAAbAC4AAAAIAAkAAAAbAC8AAAAAAAAAAAAbADAAAAACAAYAAAAbADEAAAACAAcAAAAbADIAAAACAAcAAAAbADMAAAADAAoAAAAcAPD/AAADAAcAAAAcAPH/AAADAAcAAAAcAPL/AAADAAcAAAAcAPP/AAADAAcAAAAcAPT/AAADAAcAAAAcAPX/AAAAAAEAAAAcAPb/AAADAAcAAAAcAPf/AAADAAcAAAAcAPj/AAADAAcAAAAcAPn/AAADAAcAAAAcAPr/AAADAAcAAAAcAPv/AAADAAcAAAAcAPz/AAADAAcAAAAcAP3/AAADAAcAAAAcAP7/AAADAAcAAAAcAP//AAAAAAEAAAAcAAAAAAADAAkAAAAcAAEAAAACAAgAAAAcAAIAAAAFAAoAAAAcAAMAAAAAAAAAAAAcAAQAAAAFAAkAAAAcAAUAAAAIAAkAAAAcAAYAAAABAAMAAAAcAAcAAAABAAQAAAAcAAgAAAABAAQAAAAcAAkAAAAAAAYAAAAcAAoAAAACAAUAAAAcAAsAAAAAAAAAAAAcAAwAAAAAAAAAAAAcAA0AAAACAAYAAAAcAA4AAAADAAoAAAAcAA8AAAADAAcAAAAcABAAAAADAAcAAAAcABEAAAADAAgAAAAcABIAAAAFAAoAAAAcABMAAAAIAAoAAAAcABQAAAAFAAoAAAAcABUAAAAFAAkAAAAcABYAAAAHAAoAAAAcABcAAAAHAAkAAAAcABgAAAAIAAkAAAAcABkAAAAIAAkAAAAcABoAAAAAAAMAAAAcABsAAAABAAcAAAAcABwAAAABAAQAAAAcAB0AAAABAAUAAAAcAB4AAAAFAAoAAAAcAB8AAAABAAMAAAAcACAAAAABAAQAAAAcACEAAAABAAQAAAAcACIAAAABAAUAAAAcACMAAAAFAAkAAAAcACQAAAAIAAkAAAAcACUAAAABAAMAAAAcACYAAAABAAQAAAAcACcAAAABAAQAAAAcACgAAAABAAQAAAAcACkAAAABAAQAAAAcACoAAAABAAUAAAAcACsAAAAHAAkAAAAcACwAAAAFAAkAAAAcAC0AAAAAAAAAAAAcAC4AAAAIAAoAAAAcAC8AAAACAAYAAAAcADAAAAADAAoAAAAcADEAAAADAAcAAAAcADIAAAADAAcAAAAcADMAAAADAAcAAAAdAPD/AAADAAcAAAAdAPH/AAADAAcAAAAdAPL/AAAAAAEAAAAdAPP/AAAAAAEAAAAdAPT/AAADAAcAAAAdAPX/AAADAAcAAAAdAPb/AAADAAcAAAAdAPf/AAAAAAEAAAAdAPj/AAAAAAEAAAAdAPn/AAADAAcAAAAdAPr/AAADAAcAAAAdAPv/AAAAAAEAAAAdAPz/AAADAAcAAAAdAP3/AAADAAcAAAAdAP7/AAADAAcAAAAdAP//AAADAAcAAAAdAAAAAAADAAcAAAAdAAEAAAADAAgAAAAdAAIAAAAHAAoAAAAdAAMAAAAHAAkAAAAdAAQAAAAHAAoAAAAdAAUAAAAFAAoAAAAdAAYAAAABAAMAAAAdAAcAAAABAAQAAAAdAAgAAAAAAAYAAAAdAAkAAAACAAUAAAAdAAoAAAAAAAAAAAAdAAsAAAAAAAAAAAAdAAwAAAAAAAAAAAAdAA0AAAADAAYAAAAdAA4AAAADAAcAAAAdAA8AAAADAAcAAAAdABAAAAACAAkAAAAdABEAAAAEAAgAAAAdABIAAAAHAAkAAAAdABMAAAAHAAkAAAAdABQAAAAFAAoAAAAdABUAAAAHAAkAAAAdABYAAAAHAAoAAAAdABcAAAAIAAkAAAAdABgAAAAHAAkAAAAdABkAAAAAAAMAAAAdABoAAAABAAcAAAAdABsAAAABAAQAAAAdABwAAAABAAQAAAAdAB0AAAABAAUAAAAdAB4AAAAAAAAAAAAdAB8AAAABAAMAAAAdACAAAAABAAQAAAAdACEAAAABAAQAAAAdACIAAAABAAUAAAAdACMAAAAFAAkAAAAdACQAAAAIAAkAAAAdACUAAAACAAMAAAAdACYAAAACAAQAAAAdACcAAAACAAQAAAAdACgAAAACAAQAAAAdACkAAAACAAQAAAAdACoAAAACAAUAAAAdACsAAAAHAAoAAAAdACwAAAAIAAoAAAAdAC0AAAAAAAAAAAAdAC4AAAACAAYAAAAdAC8AAAADAAoAAAAdADAAAAADAAcAAAAdADEAAAADAAcAAAAdADIAAAADAAcAAAAdADMAAAADAAcAAAAeAPD/AAAAAAEAAAAeAPH/AAAAAAEAAAAeAPL/AAADAAcAAAAeAPP/AAADAAcAAAAeAPT/AAADAAcAAAAeAPX/AAAAAAEAAAAeAPb/AAADAAcAAAAeAPf/AAAAAAEAAAAeAPj/AAAAAAEAAAAeAPn/AAAAAAEAAAAeAPr/AAADAAcAAAAeAPv/AAADAAcAAAAeAPz/AAAAAAEAAAAeAP3/AAADAAcAAAAeAP7/AAAAAAEAAAAeAP//AAADAAcAAAAeAAAAAAADAAcAAAAeAAEAAAADAAgAAAAeAAIAAAAHAAkAAAAeAAMAAAAHAAkAAAAeAAQAAAAIAAoAAAAeAAUAAAAHAAkAAAAeAAYAAAABAAMAAAAeAAcAAAABAAQAAAAeAAgAAAABAAUAAAAeAAkAAAAAAAAAAAAeAAoAAAAAAAAAAAAeAAsAAAAAAAAAAAAeAAwAAAACAAYAAAAeAA0AAAADAAoAAAAeAA4AAAADAAcAAAAeAA8AAAACAAkAAAAeABAAAAAEAAgAAAAeABEAAAAFAAoAAAAeABIAAAAHAAoAAAAeABMAAAAIAAoAAAAeABQAAAAFAAkAAAAeABUAAAAAAAAAAAAeABYAAAAIAAkAAAAeABcAAAAIAAkAAAAeABgAAAAAAAMAAAAeABkAAAABAAcAAAAeABoAAAABAAQAAAAeABsAAAABAAQAAAAeABwAAAAAAAYAAAAeAB0AAAACAAUAAAAeAB4AAAAFAAoAAAAeAB8AAAABAAMAAAAeACAAAAABAAQAAAAeACEAAAABAAQAAAAeACIAAAABAAUAAAAeACMAAAAFAAkAAAAeACQAAAAIAAoAAAAeACUAAAAIAAkAAAAeACYAAAAHAAkAAAAeACcAAAAIAAoAAAAeACgAAAAHAAkAAAAeACkAAAAFAAkAAAAeACoAAAAFAAkAAAAeACsAAAAHAAkAAAAeACwAAAAHAAoAAAAeAC0AAAACAAYAAAAeAC4AAAADAAoAAAAeAC8AAAADAAcAAAAeADAAAAADAAcAAAAeADEAAAADAAcAAAAeADIAAAADAAcAAAAeADMAAAADAAcAAAAfAPD/AAADAAcAAAAfAPH/AAAAAAEAAAAfAPL/AAADAAcAAAAfAPP/AAADAAcAAAAfAPT/AAADAAcAAAAfAPX/AAAAAAEAAAAfAPb/AAADAAcAAAAfAPf/AAAAAAEAAAAfAPj/AAADAAcAAAAfAPn/AAAAAAEAAAAfAPr/AAADAAcAAAAfAPv/AAADAAcAAAAfAPz/AAADAAcAAAAfAP3/AAADAAcAAAAfAP7/AAADAAcAAAAfAP//AAAAAAEAAAAfAAAAAAADAAcAAAAfAAEAAAADAAgAAAAfAAIAAAAFAAoAAAAfAAMAAAAFAAoAAAAfAAQAAAAIAAoAAAAfAAUAAAAHAAkAAAAfAAYAAAABAAMAAAAfAAcAAAABAAQAAAAfAAgAAAABAAUAAAAfAAkAAAAAAAAAAAAfAAoAAAAAAAAAAAAfAAsAAAAAAAAAAAAfAAwAAAADAAYAAAAfAA0AAAADAAcAAAAfAA4AAAADAAcAAAAfAA8AAAADAAgAAAAfABAAAAAFAAkAAAAfABEAAAAFAAkAAAAfABIAAAAIAAkAAAAfABMAAAAHAAkAAAAfABQAAAAAAAAAAAAfABUAAAAAAAAAAAAfABYAAAAIAAkAAAAfABcAAAAAAAAAAAAfABgAAAABAAMAAAAfABkAAAABAAQAAAAfABoAAAABAAQAAAAfABsAAAAAAAYAAAAfABwAAAACAAUAAAAfAB0AAAAAAAAAAAAfAB4AAAAFAAoAAAAfAB8AAAABAAMAAAAfACAAAAABAAQAAAAfACEAAAABAAQAAAAfACIAAAABAAUAAAAfACMAAAAFAAkAAAAfACQAAAAAAAAAAAAfACUAAAAAAAAAAAAfACYAAAAHAAkAAAAfACcAAAAHAAoAAAAfACgAAAAIAAkAAAAfACkAAAAIAAoAAAAfACoAAAAIAAoAAAAfACsAAAACAAYAAAAfACwAAAACAAcAAAAfAC0AAAADAAoAAAAfAC4AAAADAAcAAAAfAC8AAAADAAcAAAAfADAAAAADAAcAAAAfADEAAAADAAcAAAAfADIAAAAAAAEAAAAfADMAAAACAAkAAAAgAPD/AAADAAcAAAAgAPH/AAAAAAEAAAAgAPL/AAADAAcAAAAgAPP/AAADAAcAAAAgAPT/AAADAAcAAAAgAPX/AAAAAAEAAAAgAPb/AAADAAcAAAAgAPf/AAADAAcAAAAgAPj/AAADAAcAAAAgAPn/AAAAAAEAAAAgAPr/AAAAAAEAAAAgAPv/AAADAAcAAAAgAPz/AAAAAAEAAAAgAP3/AAADAAcAAAAgAP7/AAADAAcAAAAgAP//AAAAAAEAAAAgAAAAAAADAAcAAAAgAAEAAAADAAgAAAAgAAIAAAAFAAkAAAAgAAMAAAAFAAkAAAAgAAQAAAAIAAkAAAAgAAUAAAAIAAkAAAAgAAYAAAABAAMAAAAgAAcAAAABAAQAAAAgAAgAAAABAAYAAAAgAAkAAAAAAAUAAAAgAAoAAAAAAAAAAAAgAAsAAAAAAAAAAAAgAAwAAAADAAYAAAAgAA0AAAADAAcAAAAgAA4AAAACAAkAAAAgAA8AAAAEAAgAAAAgABAAAAAFAAoAAAAgABEAAAAAAAAAAAAgABIAAAAHAAkAAAAgABMAAAAIAAoAAAAgABQAAAAIAAoAAAAgABUAAAAFAAoAAAAgABYAAAAAAAAAAAAgABcAAAAAAAMAAAAgABgAAAABAAcAAAAgABkAAAABAAQAAAAgABoAAAAAAAYAAAAgABsAAAACAAUAAAAgABwAAAAFAAkAAAAgAB0AAAAFAAoAAAAgAB4AAAAHAAoAAAAgAB8AAAABAAMAAAAgACAAAAABAAQAAAAgACEAAAABAAQAAAAgACIAAAABAAUAAAAgACMAAAAHAAkAAAAgACQAAAAIAAkAAAAgACUAAAAFAAkAAAAgACYAAAAFAAkAAAAgACcAAAAFAAoAAAAgACgAAAAHAAoAAAAgACkAAAAHAAoAAAAgACoAAAACAAYAAAAgACsAAAADAAoAAAAgACwAAAAAAAEAAAAgAC0AAAADAAcAAAAgAC4AAAAAAAEAAAAgAC8AAAAAAAEAAAAgADAAAAADAAcAAAAgADEAAAADAAcAAAAgADIAAAACAAkAAAAgADMAAAAEAAgAAAAhAPD/AAADAAcAAAAhAPH/AAADAAcAAAAhAPL/AAADAAcAAAAhAPP/AAAAAAEAAAAhAPT/AAADAAcAAAAhAPX/AAAAAAEAAAAhAPb/AAADAAcAAAAhAPf/AAAAAAEAAAAhAPj/AAADAAcAAAAhAPn/AAADAAcAAAAhAPr/AAADAAcAAAAhAPv/AAADAAcAAAAhAPz/AAADAAcAAAAhAP3/AAADAAcAAAAhAP7/AAADAAcAAAAhAP//AAADAAcAAAAhAAAAAAADAAcAAAAhAAEAAAADAAgAAAAhAAIAAAAFAAkAAAAhAAMAAAAIAAoAAAAhAAQAAAAHAAoAAAAhAAUAAAAAAAAAAAAhAAYAAAABAAMAAAAhAAcAAAABAAQAAAAhAAgAAAABAAQAAAAhAAkAAAABAAUAAAAhAAoAAAAAAAAAAAAhAAsAAAAAAAAAAAAhAAwAAAADAAYAAAAhAA0AAAADAAcAAAAhAA4AAAADAAgAAAAhAA8AAAAIAAoAAAAhABAAAAAHAAkAAAAhABEAAAAIAAoAAAAhABIAAAAHAAoAAAAhABMAAAAFAAoAAAAhABQAAAAHAAoAAAAhABUAAAAFAAkAAAAhABYAAAAAAAMAAAAhABcAAAABAAcAAAAhABgAAAABAAQAAAAhABkAAAAAAAYAAAAhABoAAAACAAUAAAAhABsAAAAIAAkAAAAhABwAAAAIAAoAAAAhAB0AAAAIAAkAAAAhAB4AAAAIAAoAAAAhAB8AAAABAAMAAAAhACAAAAABAAQAAAAhACEAAAABAAQAAAAhACIAAAABAAUAAAAhACMAAAAIAAkAAAAhACQAAAAFAAoAAAAhACUAAAAFAAoAAAAhACYAAAAFAAoAAAAhACcAAAAHAAoAAAAhACgAAAAAAAAAAAAhACkAAAACAAYAAAAhACoAAAADAAoAAAAhACsAAAADAAcAAAAhACwAAAAAAAEAAAAhAC0AAAADAAcAAAAhAC4AAAAAAAEAAAAhAC8AAAADAAcAAAAhADAAAAADAAcAAAAhADEAAAACAAkAAAAhADIAAAAEAAgAAAAhADMAAAAIAAoAAAAiAPD/AAADAAcAAAAiAPH/AAADAAcAAAAiAPL/AAADAAcAAAAiAPP/AAADAAcAAAAiAPT/AAAAAAEAAAAiAPX/AAADAAcAAAAiAPb/AAADAAcAAAAiAPf/AAAAAAEAAAAiAPj/AAADAAcAAAAiAPn/AAADAAcAAAAiAPr/AAAAAAEAAAAiAPv/AAADAAcAAAAiAPz/AAADAAcAAAAiAP3/AAADAAcAAAAiAP7/AAADAAcAAAAiAP//AAADAAcAAAAiAAAAAAAAAAEAAAAiAAEAAAADAAgAAAAiAAIAAAAIAAoAAAAiAAMAAAAAAAAAAAAiAAQAAAAIAAkAAAAiAAUAAAAFAAoAAAAiAAYAAAABAAMAAAAiAAcAAAABAAQAAAAiAAgAAAABAAQAAAAiAAkAAAABAAUAAAAiAAoAAAAAAAAAAAAiAAsAAAACAAYAAAAiAAwAAAADAAoAAAAiAA0AAAADAAcAAAAiAA4AAAADAAgAAAAiAA8AAAAFAAkAAAAiABAAAAAHAAoAAAAiABEAAAAFAAkAAAAiABIAAAAIAAkAAAAiABMAAAAIAAoAAAAiABQAAAAHAAkAAAAiABUAAAAAAAAAAAAiABYAAAABAAMAAAAiABcAAAABAAQAAAAiABgAAAABAAQAAAAiABkAAAABAAUAAAAiABoAAAAHAAkAAAAiABsAAAAFAAoAAAAiABwAAAAFAAkAAAAiAB0AAAAFAAoAAAAiAB4AAAAIAAoAAAAiAB8AAAABAAMAAAAiACAAAAABAAQAAAAiACEAAAABAAQAAAAiACIAAAABAAUAAAAiACMAAAAHAAoAAAAiACQAAAAHAAoAAAAiACUAAAAHAAoAAAAiACYAAAAFAAoAAAAiACcAAAAFAAkAAAAiACgAAAACAAYAAAAiACkAAAADAAoAAAAiACoAAAAAAAEAAAAiACsAAAADAAcAAAAiACwAAAAAAAEAAAAiAC0AAAADAAcAAAAiAC4AAAADAAcAAAAiAC8AAAACAAkAAAAiADAAAAAEAAcAAAAiADEAAAAEAAgAAAAiADIAAAAFAAoAAAAiADMAAAAFAAkAAAAjAPD/AAADAAcAAAAjAPH/AAADAAcAAAAjAPL/AAAAAAEAAAAjAPP/AAADAAcAAAAjAPT/AAAAAAEAAAAjAPX/AAAAAAEAAAAjAPb/AAADAAcAAAAjAPf/AAADAAcAAAAjAPj/AAADAAcAAAAjAPn/AAADAAcAAAAjAPr/AAADAAcAAAAjAPv/AAAAAAEAAAAjAPz/AAADAAcAAAAjAP3/AAADAAcAAAAjAP7/AAADAAcAAAAjAP//AAADAAcAAAAjAAAAAAADAAcAAAAjAAEAAAADAAgAAAAjAAIAAAAHAAoAAAAjAAMAAAAHAAkAAAAjAAQAAAAIAAkAAAAjAAUAAAAIAAkAAAAjAAYAAAACAAMAAAAjAAcAAAAAAAcAAAAjAAgAAAABAAQAAAAjAAkAAAABAAUAAAAjAAoAAAACAAcAAAAjAAsAAAADAAoAAAAjAAwAAAADAAcAAAAjAA0AAAADAAcAAAAjAA4AAAALAA0AAAAjAA8AAAAAAAQAAAAjABAAAAAAAAQAAAAjABEAAAAAAAUAAAAjABIAAAAFAAkAAAAjABMAAAAIAAkAAAAjABQAAAAIAAkAAAAjABUAAAAHAAkAAAAjABYAAAABAAMAAAAjABcAAAABAAQAAAAjABgAAAAAAAYAAAAjABkAAAACAAUAAAAjABoAAAAFAAkAAAAjABsAAAAHAAkAAAAjABwAAAAFAAkAAAAjAB0AAAAHAAoAAAAjAB4AAAAIAAoAAAAjAB8AAAABAAMAAAAjACAAAAABAAQAAAAjACEAAAABAAQAAAAjACIAAAABAAUAAAAjACMAAAAAAAAAAAAjACQAAAAAAAAAAAAjACUAAAAHAAkAAAAjACYAAAAAAAAAAAAjACcAAAAFAAoAAAAjACgAAAADAAYAAAAjACkAAAADAAcAAAAjACoAAAAAAAEAAAAjACsAAAADAAcAAAAjACwAAAADAAcAAAAjAC0AAAADAAcAAAAjAC4AAAACAAkAAAAjAC8AAAAEAAgAAAAjADAAAAAHAAoAAAAjADEAAAAIAAoAAAAjADIAAAAIAAkAAAAjADMAAAAFAAkAAAAkAPD/AAADAAcAAAAkAPH/AAADAAcAAAAkAPL/AAADAAcAAAAkAPP/AAAAAAEAAAAkAPT/AAAAAAEAAAAkAPX/AAADAAcAAAAkAPb/AAADAAcAAAAkAPf/AAAAAAEAAAAkAPj/AAADAAcAAAAkAPn/AAADAAcAAAAkAPr/AAADAAcAAAAkAPv/AAADAAcAAAAkAPz/AAADAAcAAAAkAP3/AAADAAcAAAAkAP7/AAADAAcAAAAkAP//AAADAAcAAAAkAAAAAAADAAcAAAAkAAEAAAADAAgAAAAkAAIAAAAHAAkAAAAkAAMAAAAAAAAAAAAkAAQAAAAIAAkAAAAkAAUAAAAIAAoAAAAkAAYAAAAIAAkAAAAkAAcAAAABAAMAAAAkAAgAAAABAAQAAAAkAAkAAAAQAAYAAAAkAAwAAAAAAAEAAAAkAA0AAAAAAAEAAAAkAA4AAAAQAAgAAAAkAA8AAAABAAQAAAAkABAAAAABAAQAAAAkABEAAAABAAYAAAAkABIAAAAAAAUAAAAkABMAAAAFAAoAAAAkABQAAAAFAAoAAAAkABUAAAAIAAkAAAAkABYAAAABAAMAAAAkABcAAAABAAQAAAAkABgAAAABAAUAAAAkABkAAAAFAAkAAAAkABoAAAAAAAAAAAAkABsAAAAHAAkAAAAkABwAAAAFAAoAAAAkAB0AAAAIAAoAAAAkAB4AAAAHAAoAAAAkAB8AAAABAAMAAAAkACAAAAABAAQAAAAkACEAAAABAAQAAAAkACIAAAABAAUAAAAkACMAAAAHAAkAAAAkACQAAAAHAAkAAAAkACUAAAAAAAAAAAAkACYAAAACAAYAAAAkACcAAAACAAcAAAAkACgAAAADAAoAAAAkACkAAAADAAcAAAAkACoAAAADAAcAAAAkACsAAAADAAcAAAAkACwAAAADAAcAAAAkAC0AAAADAAcAAAAkAC4AAAADAAgAAAAkAC8AAAAIAAoAAAAkADAAAAAIAAoAAAAkADEAAAAHAAkAAAAkADIAAAAFAAoAAAAkADMAAAAIAAoAAAAlAPD/AAADAAcAAAAlAPH/AAADAAcAAAAlAPL/AAADAAcAAAAlAPP/AAAAAAEAAAAlAPT/AAADAAcAAAAlAPX/AAADAAcAAAAlAPb/AAADAAcAAAAlAPf/AAADAAcAAAAlAPj/AAADAAcAAAAlAPn/AAADAAcAAAAlAPr/AAADAAcAAAAlAPv/AAADAAcAAAAlAPz/AAADAAcAAAAlAP3/AAADAAcAAAAlAP7/AAADAAcAAAAlAP//AAADAAcAAAAlAAAAAAACAAkAAAAlAAEAAAAEAAgAAAAlAAIAAAAHAAoAAAAlAAMAAAAIAAkAAAAlAAQAAAAFAAoAAAAlAAUAAAAFAAkAAAAlAAYAAAAAAAAAAAAlAAcAAAABAAMAAAAlAAgAAAABAAQAAAAlAAkAAAAQAAYAAAAlAA0AAAADAAcAAAAlAA4AAAAQAAgAAAAlAA8AAAABAAQAAAAlABAAAAABAAQAAAAlABEAAAABAAQAAAAlABIAAAABAAYAAAAlABMAAAAAAAQAAAAlABQAAAAAAAUAAAAlABUAAAAAAAMAAAAlABYAAAABAAcAAAAlABcAAAABAAQAAAAlABgAAAABAAUAAAAlABkAAAAHAAkAAAAlABoAAAAFAAoAAAAlABsAAAAIAAoAAAAlABwAAAAIAAkAAAAlAB0AAAAIAAkAAAAlAB4AAAAHAAkAAAAlAB8AAAABAAMAAAAlACAAAAABAAQAAAAlACEAAAABAAQAAAAlACIAAAABAAUAAAAlACMAAAAHAAoAAAAlACQAAAAIAAkAAAAlACUAAAACAAYAAAAlACYAAAADAAoAAAAlACcAAAAAAAEAAAAlACgAAAAAAAEAAAAlACkAAAADAAcAAAAlACoAAAADAAcAAAAlACsAAAADAAcAAAAlACwAAAADAAcAAAAlAC0AAAADAAcAAAAlAC4AAAADAAgAAAAlAC8AAAAHAAoAAAAlADAAAAAIAAkAAAAlADEAAAAHAAkAAAAlADIAAAAIAAkAAAAlADMAAAAFAAkAAAAmAPD/AAADAAcAAAAmAPH/AAADAAcAAAAmAPL/AAADAAcAAAAmAPP/AAADAAcAAAAmAPT/AAAAAAEAAAAmAPX/AAADAAcAAAAmAPb/AAAAAAEAAAAmAPf/AAADAAcAAAAmAPj/AAADAAcAAAAmAPn/AAAAAAEAAAAmAPr/AAAAAAEAAAAmAPv/AAADAAcAAAAmAPz/AAADAAcAAAAmAP3/AAADAAcAAAAmAP7/AAADAAcAAAAmAP//AAACAAkAAAAmAAAAAAAEAAgAAAAmAAEAAAAFAAoAAAAmAAIAAAAFAAkAAAAmAAMAAAAFAAkAAAAmAAQAAAAIAAkAAAAmAAUAAAAIAAkAAAAmAAYAAAAHAAkAAAAmAAcAAAABAAMAAAAmAAgAAAABAAQAAAAmAAkAAAAQAAYAAAAmAA0AAAADAAcAAAAmAA4AAAAKAA0AAAAmAA8AAAACAAQAAAAmABAAAAAAAAcAAAAmABEAAAABAAQAAAAmABIAAAABAAQAAAAmABMAAAABAAQAAAAmABQAAAABAAYAAAAmABUAAAABAAcAAAAmABYAAAABAAQAAAAmABcAAAABAAQAAAAmABgAAAABAAUAAAAmABkAAAAFAAoAAAAmABoAAAAHAAkAAAAmABsAAAAIAAoAAAAmABwAAAAFAAoAAAAmAB0AAAAFAAkAAAAmAB4AAAAAAAAAAAAmAB8AAAABAAMAAAAmACAAAAABAAQAAAAmACEAAAABAAQAAAAmACIAAAABAAUAAAAmACMAAAAIAAoAAAAmACQAAAACAAYAAAAmACUAAAADAAoAAAAmACYAAAAAAAEAAAAmACcAAAADAAcAAAAmACgAAAADAAcAAAAmACkAAAADAAcAAAAmACoAAAADAAcAAAAmACsAAAADAAcAAAAmACwAAAADAAcAAAAmAC0AAAACAAkAAAAmAC4AAAAEAAgAAAAmAC8AAAAFAAkAAAAmADAAAAAHAAkAAAAmADEAAAAHAAoAAAAmADIAAAAHAAkAAAAmADMAAAAIAAkAAAAnAPD/AAADAAcAAAAnAPH/AAADAAcAAAAnAPL/AAADAAcAAAAnAPP/AAAAAAEAAAAnAPT/AAAAAAEAAAAnAPX/AAADAAcAAAAnAPb/AAADAAcAAAAnAPf/AAADAAcAAAAnAPj/AAADAAcAAAAnAPn/AAADAAcAAAAnAPr/AAADAAcAAAAnAPv/AAADAAcAAAAnAPz/AAADAAcAAAAnAP3/AAADAAcAAAAnAP7/AAADAAcAAAAnAP//AAADAAgAAAAnAAAAAAAAAAAAAAAnAAEAAAAHAAkAAAAnAAIAAAAAAAAAAAAnAAMAAAAIAAkAAAAnAAQAAAAHAAoAAAAnAAUAAAAAAAAAAAAnAAYAAAAAAAMAAAAnAAcAAAABAAcAAAAnAAgAAAABAAQAAAAnAAkAAAAQAAYAAAAnAAwAAAAAAAEAAAAnAA0AAAACAAkAAAAnAA4AAAAEAAgAAAAnAA8AAAAAAAAAAAAnABAAAAACAAMAAAAnABEAAAACAAQAAAAnABIAAAAAAAcAAAAnABMAAAABAAQAAAAnABQAAAABAAQAAAAnABUAAAABAAQAAAAnABYAAAABAAQAAAAnABcAAAAAAAYAAAAnABgAAAACAAUAAAAnABkAAAAFAAkAAAAnABoAAAAIAAkAAAAnABsAAAAFAAkAAAAnABwAAAAHAAoAAAAnAB0AAAAFAAoAAAAnAB4AAAAIAAkAAAAnAB8AAAABAAMAAAAnACAAAAABAAQAAAAnACEAAAABAAQAAAAnACIAAAABAAUAAAAnACMAAAACAAcAAAAnACQAAAADAAoAAAAnACUAAAAAAAEAAAAnACYAAAADAAcAAAAnACcAAAADAAcAAAAnACgAAAADAAcAAAAnACkAAAADAAcAAAAnACoAAAADAAcAAAAnACsAAAADAAcAAAAnACwAAAAAAAEAAAAnAC0AAAADAAgAAAAnAC4AAAAAAAAAAAAnAC8AAAAIAAkAAAAnADAAAAAIAAkAAAAnADEAAAAFAAoAAAAnADIAAAAHAAoAAAAnADMAAAAAAAAAAAAoAPD/AAADAAcAAAAoAPH/AAAAAAEAAAAoAPL/AAADAAcAAAAoAPP/AAADAAcAAAAoAPT/AAADAAcAAAAoAPX/AAADAAcAAAAoAPb/AAADAAcAAAAoAPf/AAADAAcAAAAoAPj/AAAAAAEAAAAoAPn/AAAAAAEAAAAoAPr/AAAAAAEAAAAoAPv/AAADAAcAAAAoAPz/AAADAAcAAAAoAP3/AAAAAAEAAAAoAP7/AAADAAcAAAAoAP//AAADAAgAAAAoAAAAAAAIAAoAAAAoAAEAAAAHAAkAAAAoAAIAAAAFAAkAAAAoAAMAAAAAAAMAAAAoAAQAAAAAAAQAAAAoAAUAAAAAAAQAAAAoAAYAAAABAAcAAAAoAAcAAAABAAQAAAAoAAgAAAAPAAYAAAAoAAkAAAAQAAoAAAAoAAoAAAAAAAEAAAAoAAwAAAADAAcAAAAoAA0AAAADAAgAAAAoAA4AAAAHAAkAAAAoAA8AAAAFAAkAAAAoABAAAAAFAAoAAAAoABEAAAAFAAoAAAAoABIAAAACAAMAAAAoABMAAAACAAQAAAAoABQAAAACAAQAAAAoABUAAAACAAQAAAAoABYAAAACAAQAAAAoABcAAAACAAUAAAAoABgAAAAFAAkAAAAoABkAAAAIAAkAAAAoABoAAAAFAAkAAAAoABsAAAAFAAkAAAAoABwAAAAIAAoAAAAoAB0AAAAIAAkAAAAoAB4AAAAIAAkAAAAoAB8AAAABAAMAAAAoACAAAAABAAQAAAAoACEAAAAPAAYAAAAoACIAAAAJAA0AAAAoACMAAAADAAcAAAAoACQAAAAAAAEAAAAoACUAAAADAAcAAAAoACYAAAADAAcAAAAoACcAAAADAAcAAAAoACgAAAAAAAEAAAAoACkAAAADAAcAAAAoACoAAAADAAcAAAAoACsAAAADAAcAAAAoACwAAAACAAkAAAAoAC0AAAAEAAgAAAAoAC4AAAAHAAoAAAAoAC8AAAAFAAkAAAAoADAAAAAHAAkAAAAoADEAAAAHAAkAAAAoADIAAAAFAAoAAAAoADMAAAAFAAkAAAApAPD/AAAAAAEAAAApAPH/AAAAAAEAAAApAPL/AAADAAcAAAApAPP/AAADAAcAAAApAPT/AAADAAcAAAApAPX/AAADAAcAAAApAPb/AAADAAcAAAApAPf/AAADAAcAAAApAPr/AAADAAcAAAApAPv/AAADAAcAAAApAPz/AAADAAcAAAApAP3/AAADAAcAAAApAP7/AAADAAcAAAApAP//AAADAAkAAAApAAAAAAACAAgAAAApAAEAAAAFAAoAAAApAAIAAAAAAAAAAAApAAMAAAABAAMAAAApAAQAAAABAAQAAAApAAUAAAABAAQAAAApAAYAAAABAAQAAAApAAcAAAABAAQAAAApAAgAAAAQAAYAAAApAAkAAAAAAAEAAAApAAoAAAADAAcAAAApAAsAAAACAAkAAAApAAwAAAAEAAcAAAApAA0AAAAEAAgAAAApAA4AAAAIAAkAAAApAA8AAAAIAAoAAAApABAAAAAAAAAAAAApABEAAAAIAAkAAAApABIAAAAFAAoAAAApABMAAAAAAAAAAAApABQAAAAIAAkAAAApABUAAAAIAAoAAAApABYAAAAIAAkAAAApABcAAAAIAAoAAAApABgAAAAAAAAAAAApABkAAAAFAAoAAAApABoAAAAIAAkAAAApABsAAAAHAAoAAAApABwAAAAAAAAAAAApAB0AAAAHAAkAAAApAB4AAAAFAAoAAAApAB8AAAABAAMAAAApACAAAAABAAQAAAApACEAAAAQAAYAAAApACIAAAADAAcAAAApACMAAAADAAcAAAApACQAAAADAAcAAAApACUAAAADAAcAAAApACYAAAACAAkAAAApACcAAAACAAoAAAApACgAAAADAAcAAAApACkAAAADAAcAAAApACoAAAACAAkAAAApACsAAAAEAAcAAAApACwAAAAEAAgAAAApAC0AAAAIAAkAAAApAC4AAAAHAAkAAAApAC8AAAAIAAkAAAApADAAAAAHAAoAAAApADEAAAAIAAoAAAApADIAAAAHAAkAAAApADMAAAAAAAAAAAAqAPD/AAADAAcAAAAqAPH/AAADAAcAAAAqAPL/AAADAAcAAAAqAPP/AAAAAAEAAAAqAPT/AAADAAcAAAAqAPX/AAADAAcAAAAqAPb/AAADAAcAAAAqAPf/AAADAAcAAAAqAPr/AAAAAAEAAAAqAPv/AAADAAcAAAAqAPz/AAADAAcAAAAqAP3/AAADAAcAAAAqAP7/AAADAAcAAAAqAP//AAAAAAEAAAAqAAAAAAADAAgAAAAqAAEAAAAFAAkAAAAqAAIAAAAFAAoAAAAqAAMAAAABAAMAAAAqAAQAAAABAAQAAAAqAAUAAAAAAAYAAAAqAAYAAAAAAAcAAAAqAAcAAAABAAQAAAAqAAgAAAAQAAYAAAAqAAkAAAADAAcAAAAqAAoAAAADAAcAAAAqAAsAAAADAAgAAAAqAAwAAAAAAAAAAAAqAA0AAAAFAAoAAAAqAA4AAAAHAAoAAAAqAA8AAAAFAAoAAAAqABAAAAAHAAoAAAAqABEAAAAAAAAAAAAqABIAAAAHAAkAAAAqABMAAAAIAAkAAAAqABQAAAAIAAkAAAAqABUAAAAFAAkAAAAqABYAAAAAAAAAAAAqABcAAAAHAAoAAAAqABgAAAAIAAkAAAAqABkAAAAHAAkAAAAqABoAAAAFAAkAAAAqABsAAAAFAAoAAAAqABwAAAAHAAkAAAAqAB0AAAAAAAAAAAAqAB4AAAAIAAoAAAAqAB8AAAABAAMAAAAqACAAAAABAAQAAAAqACEAAAAQAAYAAAAqACIAAAADAAcAAAAqACMAAAADAAcAAAAqACQAAAAAAAEAAAAqACUAAAADAAcAAAAqACYAAAADAAgAAAAqACcAAAAEAAYAAAAqACgAAAAEAAcAAAAqACkAAAAEAAcAAAAqACoAAAAEAAgAAAAqACsAAAAFAAoAAAAqACwAAAAFAAkAAAAqAC0AAAAHAAkAAAAqAC4AAAAIAAkAAAAqAC8AAAAFAAoAAAAqADAAAAAIAAoAAAAqADEAAAAAAAAAAAAqADIAAAAHAAkAAAAqADMAAAAIAAoAAAArAPD/AAADAAcAAAArAPH/AAADAAcAAAArAPL/AAADAAcAAAArAPP/AAADAAcAAAArAPT/AAAAAAEAAAArAPX/AAADAAcAAAArAPb/AAAAAAEAAAArAPf/AAADAAcAAAArAPj/AAAAAAEAAAArAPn/AAAAAAEAAAArAPr/AAADAAcAAAArAPv/AAAAAAEAAAArAPz/AAADAAcAAAArAP3/AAAAAAEAAAArAP7/AAADAAcAAAArAP//AAADAAcAAAArAAAAAAADAAkAAAArAAEAAAACAAgAAAArAAIAAAAIAAkAAAArAAMAAAABAAMAAAArAAQAAAABAAQAAAArAAUAAAABAAYAAAArAAYAAAABAAcAAAArAAcAAAAPAAYAAAArAAgAAAAQAAoAAAArAAkAAAADAAcAAAArAAoAAAACAAkAAAArAAsAAAAEAAgAAAArAAwAAAAHAAoAAAArAA0AAAAHAAoAAAArAA4AAAAFAAoAAAArAA8AAAAFAAoAAAArABAAAAAHAAkAAAArABEAAAAIAAkAAAArABIAAAAAAAAAAAArABMAAAAAAAAAAAArABQAAAAIAAkAAAArABUAAAAAAAAAAAArABYAAAAAAAAAAAArABcAAAAHAAoAAAArABgAAAAAAAAAAAArABkAAAAHAAkAAAArABoAAAAAAAAAAAArABsAAAAHAAoAAAArABwAAAAFAAkAAAArAB0AAAAFAAoAAAArAB4AAAAIAAkAAAArAB8AAAABAAMAAAArACAAAAABAAQAAAArACEAAAAQAAYAAAArACIAAAADAAcAAAArACMAAAADAAcAAAArACQAAAACAAkAAAArACUAAAAEAAcAAAArACYAAAAEAAgAAAArACcAAAAHAAkAAAArACgAAAAIAAoAAAArACkAAAAIAAkAAAArACoAAAAFAAoAAAArACsAAAAIAAkAAAArACwAAAAFAAoAAAArAC0AAAAFAAkAAAArAC4AAAAHAAoAAAArAC8AAAAHAAkAAAArADAAAAAHAAkAAAArADEAAAAFAAkAAAArADIAAAAFAAkAAAArADMAAAAFAAoAAAAsAPD/AAADAAcAAAAsAPH/AAADAAcAAAAsAPL/AAADAAcAAAAsAPP/AAAAAAEAAAAsAPT/AAADAAcAAAAsAPX/AAADAAcAAAAsAPb/AAADAAcAAAAsAPf/AAADAAcAAAAsAPj/AAADAAcAAAAsAPn/AAADAAcAAAAsAPr/AAAAAAEAAAAsAPv/AAADAAcAAAAsAPz/AAADAAcAAAAsAP3/AAADAAcAAAAsAP7/AAAAAAEAAAAsAP//AAAAAAEAAAAsAAAAAAADAAcAAAAsAAEAAAADAAgAAAAsAAIAAAAIAAoAAAAsAAMAAAABAAMAAAAsAAQAAAABAAQAAAAsAAUAAAABAAQAAAAsAAYAAAAPAAYAAAAsAAcAAAAQAAoAAAAsAAgAAAADAAcAAAAsAAkAAAADAAcAAAAsAAoAAAADAAgAAAAsAAsAAAAFAAoAAAAsAAwAAAAHAAkAAAAsAA0AAAAFAAkAAAAsAA4AAAAIAAkAAAAsAA8AAAAIAAkAAAAsABAAAAAFAAoAAAAsABEAAAAFAAoAAAAsABIAAAAAAAAAAAAsABMAAAAFAAkAAAAsABQAAAAFAAoAAAAsABUAAAAHAAkAAAAsABYAAAAHAAoAAAAsABcAAAAIAAoAAAAsABgAAAAFAAoAAAAsABkAAAAAAAAAAAAsABoAAAAIAAoAAAAsABsAAAAFAAkAAAAsABwAAAAFAAkAAAAsAB0AAAAHAAoAAAAsAB4AAAAAAAAAAAAsAB8AAAABAAMAAAAsACAAAAABAAQAAAAsACEAAAARAAYAAAAsACIAAAAIAA0AAAAsACMAAAAEAAcAAAAsACQAAAAEAAgAAAAsACUAAAAHAAkAAAAsACYAAAAFAAoAAAAsACcAAAAFAAkAAAAsACgAAAAFAAkAAAAsACkAAAAFAAkAAAAsACoAAAAAAAAAAAAsACsAAAAFAAoAAAAsACwAAAAFAAoAAAAsAC0AAAAHAAoAAAAsAC4AAAAIAAoAAAAsAC8AAAAHAAoAAAAsADAAAAAFAAoAAAAsADEAAAAFAAkAAAAsADIAAAAHAAkAAAAsADMAAAAIAAkAAAAtAPD/AAADAAcAAAAtAPH/AAADAAcAAAAtAPL/AAADAAcAAAAtAPP/AAADAAcAAAAtAPT/AAADAAcAAAAtAPX/AAADAAcAAAAtAPb/AAADAAcAAAAtAPf/AAADAAcAAAAtAPj/AAADAAcAAAAtAPn/AAADAAcAAAAtAPr/AAADAAcAAAAtAPv/AAADAAcAAAAtAPz/AAADAAcAAAAtAP3/AAAAAAEAAAAtAP7/AAADAAcAAAAtAP//AAADAAcAAAAtAAAAAAADAAcAAAAtAAEAAAADAAgAAAAtAAIAAAAHAAkAAAAtAAMAAAACAAMAAAAtAAQAAAACAAQAAAAtAAUAAAAAAAcAAAAtAAYAAAAQAAoAAAAtAAcAAAADAAcAAAAtAAgAAAADAAcAAAAtAAkAAAACAAkAAAAtAAoAAAAEAAgAAAAtAAsAAAAIAAkAAAAtAAwAAAAHAAkAAAAtAA0AAAAFAAkAAAAtAA4AAAAIAAoAAAAtAA8AAAAIAAkAAAAtABAAAAAFAAoAAAAtABEAAAAFAAoAAAAtABIAAAAHAAoAAAAtABMAAAAFAAkAAAAtABQAAAAHAAkAAAAtABUAAAAIAAkAAAAtABYAAAAHAAoAAAAtABcAAAAHAAkAAAAtABgAAAAAAAAAAAAtABkAAAAAAAAAAAAtABoAAAAHAAkAAAAtABsAAAAHAAkAAAAtABwAAAAAAAAAAAAtAB0AAAAFAAoAAAAtAB4AAAAHAAkAAAAtAB8AAAABAAMAAAAtACAAAAABAAQAAAAtACEAAAABAAQAAAAtACIAAAABAAUAAAAtACMAAAAFAAkAAAAtACQAAAAIAAkAAAAtACUAAAAFAAoAAAAtACYAAAAHAAoAAAAtACcAAAAFAAoAAAAtACgAAAAIAAoAAAAtACkAAAAHAAoAAAAtACoAAAAHAAoAAAAtACsAAAAAAAAAAAAtACwAAAAFAAkAAAAtAC0AAAAHAAoAAAAtAC4AAAAHAAoAAAAtAC8AAAAHAAkAAAAtADAAAAAFAAkAAAAtADEAAAAIAAoAAAAtADIAAAAIAAoAAAAtADMAAAAIAAkAAAAuAPD/AAADAAcAAAAuAPH/AAADAAcAAAAuAPL/AAADAAcAAAAuAPP/AAADAAcAAAAuAPT/AAAAAAEAAAAuAPX/AAADAAcAAAAuAPb/AAAAAAEAAAAuAPf/AAADAAcAAAAuAPj/AAADAAcAAAAuAPn/AAAAAAEAAAAuAPr/AAADAAcAAAAuAPv/AAAAAAEAAAAuAPz/AAADAAcAAAAuAP3/AAADAAcAAAAuAP7/AAADAAcAAAAuAP//AAADAAcAAAAuAAAAAAADAAcAAAAuAAEAAAADAAgAAAAuAAIAAAAIAAoAAAAuAAMAAAACAAYAAAAuAAQAAAACAAcAAAAuAAUAAAAAAAEAAAAuAAYAAAADAAcAAAAuAAcAAAADAAcAAAAuAAgAAAACAAkAAAAuAAkAAAAEAAgAAAAuAAoAAAAIAAoAAAAuAAsAAAAIAAkAAAAuAAwAAAAFAAoAAAAuAA0AAAAHAAoAAAAuAA4AAAAHAAoAAAAuAA8AAAAIAAoAAAAuABAAAAAFAAkAAAAuABEAAAAIAAoAAAAuABIAAAAIAAoAAAAuABMAAAAFAAkAAAAuABQAAAAIAAkAAAAuABUAAAAIAAkAAAAuABYAAAAIAAoAAAAuABcAAAAHAAkAAAAuABgAAAAFAAoAAAAuABkAAAAIAAoAAAAuABoAAAAAAAAAAAAuABsAAAAFAAkAAAAuABwAAAAIAAoAAAAuAB0AAAAHAAoAAAAuAB4AAAAFAAkAAAAuAB8AAAABAAMAAAAuACAAAAABAAQAAAAuACEAAAABAAQAAAAuACIAAAABAAYAAAAuACMAAAAAAAQAAAAuACQAAAAAAAQAAAAuACUAAAAAAAQAAAAuACYAAAAAAAQAAAAuACcAAAAAAAQAAAAuACgAAAAAAAQAAAAuACkAAAAAAAQAAAAuACoAAAAAAAQAAAAuACsAAAAAAAQAAAAuACwAAAAAAAQAAAAuAC0AAAAAAAQAAAAuAC4AAAAAAAQAAAAuAC8AAAAAAAQAAAAuADAAAAAAAAQAAAAuADEAAAAAAAQAAAAuADIAAAAAAAQAAAAuADMAAAALAA4AAAAvAPD/AAADAAcAAAAvAPH/AAADAAcAAAAvAPL/AAAAAAEAAAAvAPP/AAAAAAEAAAAvAPT/AAADAAcAAAAvAPX/AAADAAcAAAAvAPb/AAADAAcAAAAvAPf/AAADAAcAAAAvAPj/AAADAAcAAAAvAPn/AAADAAcAAAAvAPr/AAADAAcAAAAvAPv/AAAAAAEAAAAvAPz/AAAAAAEAAAAvAP3/AAADAAcAAAAvAP7/AAADAAcAAAAvAP//AAADAAcAAAAvAAAAAAAAAAEAAAAvAAEAAAADAAkAAAAvAAIAAAACAAcAAAAvAAMAAAADAAoAAAAvAAQAAAADAAcAAAAvAAUAAAADAAcAAAAvAAYAAAACAAkAAAAvAAcAAAAEAAcAAAAvAAgAAAAEAAgAAAAvAAkAAAAFAAkAAAAvAAoAAAAHAAkAAAAvAAsAAAAIAAkAAAAvAAwAAAAIAAoAAAAvAA0AAAAAAAAAAAAvAA4AAAAFAAkAAAAvAA8AAAAFAAkAAAAvABAAAAAFAAkAAAAvABEAAAAFAAoAAAAvABIAAAAHAAoAAAAvABMAAAAHAAoAAAAvABQAAAAFAAkAAAAvABUAAAAIAAkAAAAvABYAAAAFAAoAAAAvABcAAAAFAAoAAAAvABgAAAAFAAoAAAAvABkAAAAHAAkAAAAvABoAAAAIAAoAAAAvABsAAAAIAAkAAAAvABwAAAAHAAkAAAAvAB0AAAAIAAkAAAAvAB4AAAAIAAoAAAAvAB8AAAABAAMAAAAvACAAAAABAAQAAAAvACEAAAABAAQAAAAvACIAAAABAAQAAAAvACMAAAABAAQAAAAvACQAAAABAAQAAAAvACUAAAABAAQAAAAvACYAAAABAAQAAAAvACcAAAABAAQAAAAvACgAAAABAAQAAAAvACkAAAABAAQAAAAvACoAAAABAAQAAAAvACsAAAABAAQAAAAvACwAAAABAAQAAAAvAC0AAAABAAQAAAAvAC4AAAABAAQAAAAvAC8AAAABAAQAAAAvADAAAAABAAQAAAAvADEAAAABAAQAAAAvADIAAAABAAQAAAAvADMAAAAQAAYAAAAwAPD/AAADAAcAAAAwAPH/AAADAAcAAAAwAPL/AAAAAAEAAAAwAPP/AAAAAAEAAAAwAPT/AAAAAAEAAAAwAPX/AAADAAcAAAAwAPb/AAADAAcAAAAwAPf/AAADAAcAAAAwAPj/AAADAAcAAAAwAPn/AAAAAAEAAAAwAPr/AAADAAcAAAAwAPv/AAAAAAEAAAAwAPz/AAAAAAEAAAAwAP3/AAADAAcAAAAwAP7/AAADAAcAAAAwAP//AAADAAcAAAAwAAAAAAADAAcAAAAwAAEAAAADAAcAAAAwAAIAAAAAAAEAAAAwAAMAAAADAAcAAAAwAAQAAAADAAcAAAAwAAUAAAACAAkAAAAwAAYAAAAEAAgAAAAwAAcAAAAIAAoAAAAwAAgAAAAFAAoAAAAwAAkAAAAAAAAAAAAwAAoAAAAIAAkAAAAwAAsAAAAIAAkAAAAwAAwAAAAIAAoAAAAwAA0AAAAHAAoAAAAwAA4AAAAFAAkAAAAwAA8AAAAIAAkAAAAwABAAAAAIAAkAAAAwABEAAAAFAAkAAAAwABIAAAAFAAkAAAAwABMAAAAHAAkAAAAwABQAAAAIAAkAAAAwABUAAAAFAAkAAAAwABYAAAAFAAoAAAAwABcAAAAFAAkAAAAwABgAAAAIAAoAAAAwABkAAAAAAAAAAAAwABoAAAAHAAkAAAAwABsAAAAFAAoAAAAwABwAAAAAAAAAAAAwAB0AAAAIAAoAAAAwAB4AAAAIAAkAAAAwAB8AAAABAAMAAAAwACAAAAABAAQAAAAwACEAAAABAAQAAAAwACIAAAABAAQAAAAwACMAAAABAAQAAAAwACQAAAABAAQAAAAwACUAAAABAAQAAAAwACYAAAABAAQAAAAwACcAAAABAAQAAAAwACgAAAABAAQAAAAwACkAAAABAAQAAAAwACoAAAABAAQAAAAwACsAAAABAAQAAAAwACwAAAABAAQAAAAwAC0AAAABAAQAAAAwAC4AAAABAAQAAAAwAC8AAAABAAQAAAAwADAAAAABAAQAAAAwADEAAAABAAQAAAAwADIAAAABAAQAAAAwADMAAAAQAAYAAAAxAPD/AAADAAcAAAAxAPH/AAADAAcAAAAxAPL/AAADAAcAAAAxAPP/AAADAAcAAAAxAPT/AAADAAcAAAAxAPX/AAADAAcAAAAxAPb/AAADAAcAAAAxAPf/AAADAAcAAAAxAPj/AAADAAcAAAAxAPn/AAADAAcAAAAxAPr/AAADAAcAAAAxAPv/AAADAAcAAAAxAPz/AAADAAcAAAAxAP3/AAADAAcAAAAxAP7/AAADAAcAAAAxAP//AAAAAAEAAAAxAAAAAAAAAAEAAAAxAAEAAAADAAcAAAAxAAIAAAAAAAEAAAAxAAMAAAADAAcAAAAxAAQAAAACAAkAAAAxAAUAAAAEAAgAAAAxAAYAAAAFAAoAAAAxAAcAAAAIAAoAAAAxAAgAAAAFAAoAAAAxAAkAAAAAAAAAAAAxAAoAAAAAAAAAAAAxAAsAAAAAAAAAAAAxAAwAAAAIAAoAAAAxAA0AAAAIAAkAAAAxAA4AAAAIAAkAAAAxAA8AAAAIAAkAAAAxABAAAAAFAAoAAAAxABEAAAAAAAAAAAAxABIAAAAFAAkAAAAxABMAAAAFAAoAAAAxABQAAAAFAAkAAAAxABUAAAAFAAoAAAAxABYAAAAHAAkAAAAxABcAAAAFAAoAAAAxABgAAAAHAAkAAAAxABkAAAAFAAoAAAAxABoAAAAHAAkAAAAxABsAAAAIAAoAAAAxABwAAAAIAAoAAAAxAB0AAAAIAAkAAAAxAB4AAAAFAAoAAAAxAB8AAAABAAMAAAAxACAAAAABAAQAAAAxACEAAAABAAQAAAAxACIAAAABAAQAAAAxACMAAAABAAQAAAAxACQAAAABAAQAAAAxACUAAAABAAQAAAAxACYAAAABAAQAAAAxACcAAAABAAQAAAAxACgAAAABAAQAAAAxACkAAAABAAQAAAAxACoAAAABAAQAAAAxACsAAAABAAQAAAAxACwAAAABAAQAAAAxAC0AAAABAAQAAAAxAC4AAAABAAQAAAAxAC8AAAABAAQAAAAxADAAAAABAAQAAAAxADEAAAABAAQAAAAxADIAAAABAAQAAAAxADMAAAAQAAYAAAAyAPD/AAADAAcAAAAyAPH/AAADAAcAAAAyAPL/AAAAAAEAAAAyAPP/AAAAAAEAAAAyAPT/AAADAAcAAAAyAPX/AAADAAcAAAAyAPb/AAADAAcAAAAyAPf/AAADAAcAAAAyAPj/AAAAAAEAAAAyAPn/AAAAAAEAAAAyAPr/AAAAAAEAAAAyAPv/AAAAAAEAAAAyAPz/AAADAAcAAAAyAP3/AAADAAcAAAAyAP7/AAADAAcAAAAyAP//AAADAAcAAAAyAAAAAAADAAcAAAAyAAEAAAADAAcAAAAyAAIAAAADAAcAAAAyAAMAAAACAAkAAAAyAAQAAAAEAAgAAAAyAAUAAAAAAAAAAAAyAAYAAAAFAAoAAAAyAAcAAAAIAAoAAAAyAAgAAAAIAAkAAAAyAAkAAAAIAAoAAAAyAAoAAAAIAAoAAAAyAAsAAAAIAAkAAAAyAAwAAAAFAAkAAAAyAA0AAAAAAAAAAAAyAA4AAAAHAAoAAAAyAA8AAAAIAAkAAAAyABAAAAAFAAkAAAAyABEAAAAHAAoAAAAyABIAAAAHAAoAAAAyABMAAAAFAAkAAAAyABQAAAAAAAAAAAAyABUAAAAIAAoAAAAyABYAAAAHAAoAAAAyABcAAAAAAAAAAAAyABgAAAAIAAoAAAAyABkAAAAHAAkAAAAyABoAAAAHAAoAAAAyABsAAAAHAAoAAAAyABwAAAAHAAkAAAAyAB0AAAAFAAkAAAAyAB4AAAAAAAMAAAAyAB8AAAABAAcAAAAyACAAAAABAAQAAAAyACEAAAABAAQAAAAyACIAAAABAAQAAAAyACMAAAAAAAYAAAAyACQAAAACAAQAAAAyACUAAAACAAQAAAAyACYAAAACAAQAAAAyACcAAAACAAQAAAAyACgAAAACAAQAAAAyACkAAAACAAQAAAAyACoAAAACAAQAAAAyACsAAAACAAQAAAAyACwAAAACAAQAAAAyAC0AAAACAAQAAAAyAC4AAAACAAQAAAAyAC8AAAACAAQAAAAyADAAAAACAAQAAAAyADEAAAACAAQAAAAyADIAAAACAAQAAAAyADMAAAAKAA4AAAAzAPD/AAADAAcAAAAzAPH/AAADAAcAAAAzAPL/AAAAAAEAAAAzAPP/AAADAAcAAAAzAPT/AAADAAcAAAAzAPX/AAAAAAEAAAAzAPb/AAAAAAEAAAAzAPf/AAADAAcAAAAzAPj/AAAAAAEAAAAzAPn/AAADAAcAAAAzAPr/AAADAAcAAAAzAPv/AAADAAcAAAAzAPz/AAADAAcAAAAzAP3/AAADAAcAAAAzAP7/AAADAAcAAAAzAP//AAADAAcAAAAzAAAAAAADAAcAAAAzAAEAAAAAAAEAAAAzAAIAAAACAAkAAAAzAAMAAAAEAAgAAAAzAAQAAAAIAAkAAAAzAAUAAAAFAAkAAAAzAAYAAAAHAAkAAAAzAAcAAAAHAAoAAAAzAAgAAAAFAAoAAAAzAAkAAAAHAAoAAAAzAAoAAAAHAAoAAAAzAAsAAAAFAAoAAAAzAAwAAAAFAAoAAAAzAA0AAAAIAAoAAAAzAA4AAAAHAAoAAAAzAA8AAAAHAAkAAAAzABAAAAAFAAkAAAAzABEAAAAHAAoAAAAzABIAAAAIAAoAAAAzABMAAAAFAAoAAAAzABQAAAAFAAkAAAAzABUAAAAHAAoAAAAzABYAAAAHAAkAAAAzABcAAAAIAAkAAAAzABgAAAAIAAkAAAAzABkAAAAHAAkAAAAzABoAAAAIAAoAAAAzABsAAAAFAAoAAAAzABwAAAAIAAoAAAAzAB0AAAAAAAMAAAAzAB4AAAABAAcAAAAzAB8AAAABAAQAAAAzACAAAAABAAQAAAAzACEAAAABAAQAAAAzACIAAAABAAQAAAAzACMAAAABAAUAAAAzACQAAAAIAAkAAAAzACUAAAAAAAAAAAAzACYAAAAIAAkAAAAzACcAAAAIAAoAAAAzACgAAAAHAAoAAAAzACkAAAAHAAoAAAAzACoAAAAAAAAAAAAzACsAAAAIAAoAAAAzACwAAAAHAAkAAAAzAC0AAAAIAAoAAAAzAC4AAAAIAAkAAAAzAC8AAAAFAAkAAAAzADAAAAAHAAoAAAAzADEAAAAIAAkAAAAzADIAAAAIAAkAAAAzADMAAAAAAAAAAAA0APD/AAADAAcAAAA0APH/AAADAAcAAAA0APL/AAADAAcAAAA0APP/AAADAAcAAAA0APT/AAADAAcAAAA0APX/AAAAAAEAAAA0APb/AAADAAcAAAA0APf/AAADAAcAAAA0APj/AAADAAcAAAA0APn/AAADAAcAAAA0APr/AAAAAAEAAAA0APv/AAADAAcAAAA0APz/AAADAAcAAAA0AP3/AAADAAcAAAA0AP7/AAADAAcAAAA0AP//AAADAAcAAAA0AAAAAAADAAcAAAA0AAEAAAADAAcAAAA0AAIAAAADAAgAAAA0AAMAAAAFAAoAAAA0AAQAAAAHAAoAAAA0AAUAAAAAAAAAAAA0AAYAAAAHAAkAAAA0AAcAAAAHAAoAAAA0AAgAAAAIAAkAAAA0AAkAAAAFAAoAAAA0AAoAAAAFAAkAAAA0AAsAAAAHAAoAAAA0AAwAAAAFAAoAAAA0AA0AAAAFAAkAAAA0AA4AAAAHAAkAAAA0AA8AAAAHAAkAAAA0ABAAAAAHAAoAAAA0ABEAAAAIAAoAAAA0ABIAAAAHAAoAAAA0ABMAAAAHAAoAAAA0ABQAAAAHAAoAAAA0ABUAAAAFAAoAAAA0ABYAAAAIAAkAAAA0ABcAAAAFAAkAAAA0ABgAAAAHAAoAAAA0ABkAAAAHAAoAAAA0ABoAAAAFAAoAAAA0ABsAAAAFAAkAAAA0ABwAAAAHAAoAAAA0AB0AAAABAAMAAAA0AB4AAAABAAQAAAA0AB8AAAABAAQAAAA0ACAAAAABAAQAAAA0ACEAAAABAAQAAAA0ACIAAAABAAQAAAA0ACMAAAABAAUAAAA0ACQAAAAFAAkAAAA0ACUAAAAIAAoAAAA0ACYAAAAAAAAAAAA0ACcAAAAIAAkAAAA0ACgAAAAHAAkAAAA0ACkAAAAHAAkAAAA0ACoAAAAHAAkAAAA0ACsAAAAIAAoAAAA0ACwAAAAIAAkAAAA0AC0AAAAFAAoAAAA0AC4AAAAFAAkAAAA0AC8AAAAHAAoAAAA0ADAAAAAHAAkAAAA0ADEAAAAIAAkAAAA0ADIAAAAIAAoAAAA0ADMAAAAAAAAAAAA1APD/AAADAAcAAAA1APH/AAADAAcAAAA1APL/AAADAAcAAAA1APP/AAADAAcAAAA1APT/AAAAAAEAAAA1APX/AAADAAcAAAA1APb/AAAAAAEAAAA1APf/AAAAAAEAAAA1APj/AAADAAcAAAA1APn/AAADAAcAAAA1APr/AAADAAcAAAA1APv/AAAAAAEAAAA1APz/AAADAAcAAAA1AP3/AAADAAcAAAA1AP7/AAADAAcAAAA1AP//AAAAAAEAAAA1AAAAAAAAAAEAAAA1AAEAAAADAAcAAAA1AAIAAAADAAgAAAA1AAMAAAAFAAoAAAA1AAQAAAAFAAkAAAA1AAUAAAAFAAoAAAA1AAYAAAAIAAoAAAA1AAcAAAAHAAoAAAA1AAgAAAAIAAoAAAA1AAkAAAAFAAkAAAA1AAoAAAAHAAkAAAA1AAsAAAAIAAkAAAA1AAwAAAAFAAkAAAA1AA0AAAAIAAkAAAA1AA4AAAAIAAkAAAA1AA8AAAAIAAoAAAA1ABAAAAAHAAoAAAA1ABEAAAAHAAkAAAA1ABIAAAAIAAkAAAA1ABMAAAAHAAoAAAA1ABQAAAAHAAoAAAA1ABUAAAAIAAkAAAA1ABYAAAAIAAkAAAA1ABcAAAAIAAoAAAA1ABgAAAAAAAAAAAA1ABkAAAAHAAoAAAA1ABoAAAAFAAkAAAA1ABsAAAAHAAoAAAA1ABwAAAAAAAMAAAA1AB0AAAABAAcAAAA1AB4AAAABAAQAAAA1AB8AAAABAAQAAAA1ACAAAAAAAAYAAAA1ACEAAAABAAQAAAA1ACIAAAABAAQAAAA1ACMAAAABAAUAAAA1ACQAAAAFAAkAAAA1ACUAAAAHAAkAAAA1ACYAAAAIAAkAAAA1ACcAAAAIAAoAAAA1ACgAAAAFAAkAAAA1ACkAAAAIAAkAAAA1ACoAAAAHAAkAAAA1ACsAAAAHAAkAAAA1ACwAAAAFAAkAAAA1AC0AAAAFAAkAAAA1AC4AAAAFAAoAAAA1AC8AAAAFAAkAAAA1ADAAAAAFAAkAAAA1ADEAAAAFAAkAAAA1ADIAAAAFAAkAAAA1ADMAAAAHAAkAAAA2APD/AAADAAcAAAA2APH/AAADAAcAAAA2APL/AAADAAcAAAA2APP/AAADAAcAAAA2APT/AAADAAcAAAA2APX/AAAAAAEAAAA2APb/AAADAAcAAAA2APf/AAAAAAEAAAA2APj/AAADAAcAAAA2APn/AAADAAcAAAA2APr/AAADAAcAAAA2APv/AAADAAcAAAA2APz/AAAAAAEAAAA2AP3/AAADAAcAAAA2AP7/AAADAAcAAAA2AP//AAADAAcAAAA2AAAAAAADAAcAAAA2AAEAAAADAAcAAAA2AAIAAAADAAgAAAA2AAMAAAAHAAoAAAA2AAQAAAAIAAkAAAA2AAUAAAAFAAoAAAA2AAYAAAAHAAoAAAA2AAcAAAAIAAoAAAA2AAgAAAAIAAoAAAA2AAkAAAAFAAkAAAA2AAoAAAAHAAoAAAA2AAsAAAAHAAoAAAA2AAwAAAAIAAoAAAA2AA0AAAAHAAoAAAA2AA4AAAAIAAoAAAA2AA8AAAAHAAoAAAA2ABAAAAAIAAkAAAA2ABEAAAAHAAkAAAA2ABIAAAAIAAkAAAA2ABMAAAAHAAkAAAA2ABQAAAAIAAkAAAA2ABUAAAAHAAkAAAA2ABYAAAAFAAoAAAA2ABcAAAAFAAoAAAA2ABgAAAAHAAkAAAA2ABkAAAAHAAoAAAA2ABoAAAAHAAkAAAA2ABsAAAAAAAMAAAA2ABwAAAABAAcAAAA2AB0AAAABAAQAAAA2AB4AAAABAAQAAAA2AB8AAAABAAQAAAA2ACAAAAABAAUAAAA2ACEAAAABAAQAAAA2ACIAAAABAAQAAAA2ACMAAAABAAUAAAA2ACQAAAAIAAoAAAA2ACUAAAAHAAkAAAA2ACYAAAAIAAkAAAA2ACcAAAAAAAAAAAA2ACgAAAAFAAoAAAA2ACkAAAAIAAoAAAA2ACoAAAAFAAkAAAA2ACsAAAAFAAkAAAA2ACwAAAAIAAoAAAA2AC0AAAAFAAoAAAA2AC4AAAAHAAkAAAA2AC8AAAAFAAkAAAA2ADAAAAAHAAoAAAA2ADEAAAAHAAoAAAA2ADIAAAAFAAoAAAA2ADMAAAAFAAoAAAA3APD/AAADAAcAAAA3APH/AAADAAcAAAA3APL/AAADAAcAAAA3APP/AAADAAcAAAA3APT/AAADAAcAAAA3APX/AAAAAAEAAAA3APb/AAADAAcAAAA3APf/AAADAAcAAAA3APj/AAADAAcAAAA3APn/AAADAAcAAAA3APr/AAADAAcAAAA3APv/AAAAAAEAAAA3APz/AAADAAcAAAA3AP3/AAADAAcAAAA3AP7/AAADAAcAAAA3AP//AAADAAcAAAA3AAAAAAADAAcAAAA3AAEAAAACAAkAAAA3AAIAAAAEAAgAAAA3AAMAAAAHAAoAAAA3AAQAAAAIAAkAAAA3AAUAAAAHAAkAAAA3AAYAAAAIAAkAAAA3AAcAAAAIAAkAAAA3AAgAAAAAAAAAAAA3AAkAAAAFAAoAAAA3AAoAAAAAAAAAAAA3AAsAAAAHAAkAAAA3AAwAAAAFAAkAAAA3AA0AAAAIAAkAAAA3AA4AAAAAAAAAAAA3AA8AAAAIAAoAAAA3ABAAAAAHAAkAAAA3ABEAAAAFAAoAAAA3ABIAAAAAAAAAAAA3ABMAAAAHAAoAAAA3ABQAAAAAAAAAAAA3ABUAAAAHAAoAAAA3ABYAAAAHAAkAAAA3ABcAAAAIAAkAAAA3ABgAAAAAAAAAAAA3ABkAAAAFAAkAAAA3ABoAAAAIAAkAAAA3ABsAAAABAAMAAAA3ABwAAAABAAQAAAA3AB0AAAABAAQAAAA3AB4AAAABAAQAAAA3AB8AAAAAAAYAAAA3ACAAAAACAAUAAAA3ACEAAAABAAQAAAA3ACIAAAABAAQAAAA3ACMAAAABAAUAAAA3ACQAAAAFAAoAAAA3ACUAAAAIAAkAAAA3ACYAAAAIAAkAAAA3ACcAAAAHAAkAAAA3ACgAAAAIAAoAAAA3ACkAAAAFAAkAAAA3ACoAAAAHAAkAAAA3ACsAAAAFAAoAAAA3ACwAAAAIAAkAAAA3AC0AAAAAAAAAAAA3AC4AAAAHAAkAAAA3AC8AAAAAAAAAAAA3ADAAAAAFAAkAAAA3ADEAAAAFAAkAAAA3ADIAAAAAAAAAAAA3ADMAAAAFAAkAAAA4APD/AAADAAcAAAA4APH/AAADAAcAAAA4APL/AAAAAAEAAAA4APP/AAAAAAEAAAA4APT/AAADAAcAAAA4APX/AAACAAkAAAA4APb/AAAEAAcAAAA4APf/AAAEAAcAAAA4APj/AAAEAAcAAAA4APn/AAAEAAcAAAA4APr/AAACAAoAAAA4APv/AAADAAcAAAA4APz/AAADAAcAAAA4AP3/AAADAAcAAAA4AP7/AAAAAAEAAAA4AP//AAACAAkAAAA4AAAAAAAEAAcAAAA4AAEAAAAEAAgAAAA4AAIAAAAFAAoAAAA4AAMAAAAIAAkAAAA4AAQAAAAFAAkAAAA4AAUAAAAFAAoAAAA4AAYAAAAIAAoAAAA4AAcAAAAHAAkAAAA4AAgAAAAHAAkAAAA4AAkAAAAFAAkAAAA4AAoAAAAFAAoAAAA4AAsAAAAFAAkAAAA4AAwAAAAIAAoAAAA4AA0AAAAIAAkAAAA4AA4AAAAFAAoAAAA4AA8AAAAFAAoAAAA4ABAAAAAHAAoAAAA4ABEAAAAIAAkAAAA4ABIAAAAIAAoAAAA4ABMAAAAIAAkAAAA4ABQAAAAAAAAAAAA4ABUAAAAHAAkAAAA4ABYAAAAAAAAAAAA4ABcAAAAHAAkAAAA4ABgAAAAIAAkAAAA4ABkAAAAIAAkAAAA4ABoAAAAAAAMAAAA4ABsAAAABAAcAAAA4ABwAAAABAAQAAAA4AB0AAAABAAQAAAA4AB4AAAAAAAYAAAA4AB8AAAACAAUAAAA4ACAAAAABAAMAAAA4ACEAAAABAAQAAAA4ACIAAAABAAQAAAA4ACMAAAABAAUAAAA4ACQAAAAHAAkAAAA4ACUAAAAIAAoAAAA4ACYAAAAFAAoAAAA4ACcAAAAHAAoAAAA4ACgAAAAHAAkAAAA4ACkAAAAFAAkAAAA4ACoAAAAFAAoAAAA4ACsAAAAAAAAAAAA4ACwAAAAIAAkAAAA4AC0AAAAIAAoAAAA4AC4AAAAIAAkAAAA4AC8AAAAFAAkAAAA4ADAAAAAFAAkAAAA4ADEAAAAHAAkAAAA4ADIAAAAHAAoAAAA4ADMAAAAFAAkAAAA5APD/AAADAAcAAAA5APH/AAADAAcAAAA5APL/AAADAAcAAAA5APP/AAADAAcAAAA5APT/AAACAAkAAAA5APX/AAAEAAgAAAA5APb/AAAFAAkAAAA5APf/AAAAAAAAAAA5APj/AAAIAAkAAAA5APn/AAAFAAkAAAA5APr/AAAEAAYAAAA5APv/AAAEAAcAAAA5APz/AAAEAAcAAAA5AP3/AAAEAAcAAAA5AP7/AAAEAAcAAAA5AP//AAAEAAgAAAA5AAAAAAAIAAkAAAA5AAEAAAAFAAkAAAA5AAIAAAAHAAkAAAA5AAMAAAAFAAkAAAA5AAQAAAAFAAkAAAA5AAUAAAAFAAoAAAA5AAYAAAAIAAoAAAA5AAcAAAAHAAoAAAA5AAgAAAAFAAoAAAA5AAkAAAAIAAoAAAA5AAoAAAAFAAkAAAA5AAsAAAAFAAoAAAA5AAwAAAAFAAkAAAA5AA0AAAAIAAoAAAA5AA4AAAAFAAkAAAA5AA8AAAAIAAoAAAA5ABAAAAAFAAoAAAA5ABEAAAAFAAkAAAA5ABIAAAAAAAAAAAA5ABMAAAAHAAoAAAA5ABQAAAAAAAAAAAA5ABUAAAAIAAoAAAA5ABYAAAAIAAoAAAA5ABcAAAAHAAkAAAA5ABgAAAAHAAkAAAA5ABkAAAAFAAoAAAA5ABoAAAABAAMAAAA5ABsAAAABAAQAAAA5ABwAAAABAAQAAAA5AB0AAAABAAQAAAA5AB4AAAABAAUAAAA5AB8AAAAIAAkAAAA5ACAAAAABAAMAAAA5ACEAAAABAAQAAAA5ACIAAAABAAQAAAA5ACMAAAABAAUAAAA5ACQAAAAAAAAAAAA5ACUAAAAFAAoAAAA5ACYAAAAFAAoAAAA5ACcAAAAIAAoAAAA5ACgAAAAIAAoAAAA5ACkAAAAHAAoAAAA5ACoAAAAFAAkAAAA5ACsAAAAHAAoAAAA5ACwAAAAFAAoAAAA5AC0AAAAHAAoAAAA5AC4AAAAIAAkAAAA5AC8AAAAFAAoAAAA5ADAAAAAFAAkAAAA5ADEAAAAFAAoAAAA5ADIAAAAHAAoAAAA5ADMAAAAIAAkAAAA6APD/AAAAAAEAAAA6APH/AAADAAcAAAA6APL/AAACAAkAAAA6APP/AAAEAAcAAAA6APT/AAAEAAgAAAA6APX/AAAHAAkAAAA6APb/AAAIAAoAAAA6APf/AAAIAAoAAAA6APj/AAAFAAkAAAA6APn/AAAAAAAAAAA6APr/AAAHAAkAAAA6APv/AAAHAAkAAAA6APz/AAAFAAoAAAA6AP3/AAAIAAoAAAA6AP7/AAAAAAAAAAA6AP//AAAIAAkAAAA6AAAAAAAHAAoAAAA6AAEAAAAFAAoAAAA6AAIAAAAHAAoAAAA6AAMAAAAAAAAAAAA6AAQAAAAHAAkAAAA6AAUAAAAIAAoAAAA6AAYAAAAFAAoAAAA6AAcAAAAHAAkAAAA6AAgAAAAFAAkAAAA6AAkAAAAHAAoAAAA6AAoAAAAHAAoAAAA6AAsAAAAIAAoAAAA6AAwAAAAAAAAAAAA6AA0AAAAIAAoAAAA6AA4AAAAFAAkAAAA6AA8AAAAIAAoAAAA6ABAAAAAAAAAAAAA6ABEAAAAIAAoAAAA6ABIAAAAHAAkAAAA6ABMAAAAFAAkAAAA6ABQAAAAFAAkAAAA6ABUAAAAIAAkAAAA6ABYAAAAIAAkAAAA6ABcAAAAIAAkAAAA6ABgAAAAHAAkAAAA6ABkAAAAAAAMAAAA6ABoAAAABAAcAAAA6ABsAAAABAAQAAAA6ABwAAAABAAQAAAA6AB0AAAAAAAYAAAA6AB4AAAACAAUAAAA6AB8AAAAIAAkAAAA6ACAAAAABAAMAAAA6ACEAAAABAAQAAAA6ACIAAAABAAQAAAA6ACMAAAABAAUAAAA6ACQAAAAIAAoAAAA6ACUAAAAIAAoAAAA6ACYAAAAIAAoAAAA6ACcAAAAAAAAAAAA6ACgAAAAIAAkAAAA6ACkAAAAFAAkAAAA6ACoAAAAAAAAAAAA6ACsAAAAHAAoAAAA6ACwAAAAIAAkAAAA6AC0AAAAIAAoAAAA6AC4AAAAHAAoAAAA6AC8AAAAFAAoAAAA6ADAAAAAIAAoAAAA6ADEAAAAAAAAAAAA6ADIAAAAAAAAAAAA6ADMAAAAFAAkAAAA7APD/AAAEAAcAAAA7APH/AAAEAAcAAAA7APL/AAAEAAgAAAA7APP/AAAHAAkAAAA7APT/AAAHAAoAAAA7APX/AAAIAAoAAAA7APb/AAAHAAoAAAA7APf/AAAHAAoAAAA7APj/AAAHAAoAAAA7APn/AAAAAAAAAAA7APr/AAAAAAAAAAA7APv/AAAFAAoAAAA7APz/AAAAAAAAAAA7AP3/AAAFAAoAAAA7AP7/AAAIAAkAAAA7AP//AAAFAAkAAAA7AAAAAAAIAAoAAAA7AAEAAAAIAAoAAAA7AAIAAAAIAAkAAAA7AAMAAAAFAAkAAAA7AAQAAAAAAAAAAAA7AAUAAAAHAAkAAAA7AAYAAAAFAAoAAAA7AAcAAAAFAAkAAAA7AAgAAAAIAAkAAAA7AAkAAAAFAAoAAAA7AAoAAAAHAAkAAAA7AAsAAAAHAAkAAAA7AAwAAAAHAAoAAAA7AA0AAAAHAAkAAAA7AA4AAAAHAAkAAAA7AA8AAAAHAAkAAAA7ABAAAAAHAAoAAAA7ABEAAAAFAAkAAAA7ABIAAAAIAAkAAAA7ABMAAAAFAAoAAAA7ABQAAAAIAAoAAAA7ABUAAAAAAAAAAAA7ABYAAAAFAAkAAAA7ABcAAAAHAAoAAAA7ABgAAAAAAAMAAAA7ABkAAAABAAcAAAA7ABoAAAABAAQAAAA7ABsAAAABAAQAAAA7ABwAAAAAAAYAAAA7AB0AAAACAAUAAAA7AB4AAAAIAAoAAAA7AB8AAAAIAAkAAAA7ACAAAAABAAMAAAA7ACEAAAABAAQAAAA7ACIAAAABAAQAAAA7ACMAAAABAAUAAAA7ACQAAAAFAAkAAAA7ACUAAAAIAAoAAAA7ACYAAAAFAAkAAAA7ACcAAAAHAAoAAAA7ACgAAAAHAAoAAAA7ACkAAAAHAAoAAAA7ACoAAAAAAAAAAAA7ACsAAAAAAAAAAAA7ACwAAAAFAAkAAAA7AC0AAAAIAAoAAAA7AC4AAAAHAAoAAAA7AC8AAAAAAAAAAAA7ADAAAAAFAAkAAAA7ADEAAAAHAAoAAAA7ADIAAAAHAAoAAAA7ADMAAAAAAAkAAAA8APD/AAABAAsAAAA8APH/AAAFAAoAAAA8APL/AAAHAAoAAAA8APP/AAAFAAkAAAA8APT/AAAFAAoAAAA8APX/AAAHAAoAAAA8APb/AAAAAAAAAAA8APf/AAAFAAkAAAA8APj/AAAHAAkAAAA8APn/AAAHAAoAAAA8APr/AAAFAAkAAAA8APv/AAAIAAoAAAA8APz/AAAIAAkAAAA8AP3/AAAFAAkAAAA8AP7/AAAIAAkAAAA8AP//AAAHAAoAAAA8AAAAAAAIAAoAAAA8AAEAAAAIAAkAAAA8AAIAAAAIAAoAAAA8AAMAAAAIAAkAAAA8AAQAAAAAAAAAAAA8AAUAAAAHAAkAAAA8AAYAAAAFAAoAAAA8AAcAAAAHAAoAAAA8AAgAAAAAAAAAAAA8AAkAAAAIAAkAAAA8AAoAAAAHAAoAAAA8AAsAAAAFAAoAAAA8AAwAAAAAAAAAAAA8AA0AAAAHAAoAAAA8AA4AAAAIAAkAAAA8AA8AAAAIAAoAAAA8ABAAAAAAAAAAAAA8ABEAAAAHAAkAAAA8ABIAAAAHAAoAAAA8ABMAAAAHAAoAAAA8ABQAAAAAAAAAAAA8ABUAAAAFAAkAAAA8ABYAAAAHAAkAAAA8ABcAAAAAAAMAAAA8ABgAAAABAAcAAAA8ABkAAAABAAQAAAA8ABoAAAABAAQAAAA8ABsAAAAAAAYAAAA8ABwAAAACAAUAAAA8AB0AAAAFAAkAAAA8AB4AAAAIAAkAAAA8AB8AAAAIAAkAAAA8ACAAAAABAAMAAAA8ACEAAAABAAQAAAA8ACIAAAABAAQAAAA8ACMAAAABAAUAAAA8ACQAAAAFAAoAAAA8ACUAAAAAAAAAAAA8ACYAAAAHAAoAAAA8ACcAAAAFAAoAAAA8ACgAAAAFAAoAAAA8ACkAAAAFAAkAAAA8ACoAAAAIAAoAAAA8ACsAAAAIAAkAAAA8ACwAAAAIAAoAAAA8AC0AAAAFAAoAAAA8AC4AAAAFAAoAAAA8AC8AAAAFAAkAAAA8ADAAAAAFAAoAAAA8ADEAAAAFAAoAAAA8ADIAAAAHAAoAAAA8ADMAAAABAAkAAAA9APD/AAABAAsAAAA9APH/AAAFAAkAAAA9APL/AAAIAAkAAAA9APP/AAAIAAkAAAA9APT/AAAHAAoAAAA9APX/AAAHAAkAAAA9APb/AAAFAAoAAAA9APf/AAAIAAkAAAA9APj/AAAHAAoAAAA9APn/AAAHAAkAAAA9APr/AAAFAAkAAAA9APv/AAAHAAoAAAA9APz/AAAAAAAAAAA9AP3/AAAHAAkAAAA9AP7/AAAFAAoAAAA9AP//AAAAAAAAAAA9AAAAAAAHAAkAAAA9AAEAAAAAAAAAAAA9AAIAAAAAAAAAAAA9AAMAAAAFAAkAAAA9AAQAAAAIAAkAAAA9AAUAAAAFAAkAAAA9AAYAAAAHAAkAAAA9AAcAAAAFAAoAAAA9AAgAAAAAAAAAAAA9AAkAAAAHAAkAAAA9AAoAAAAHAAkAAAA9AAsAAAAFAAoAAAA9AAwAAAAFAAoAAAA9AA0AAAAAAAAAAAA9AA4AAAAIAAoAAAA9AA8AAAAIAAkAAAA9ABAAAAAFAAkAAAA9ABEAAAAHAAoAAAA9ABIAAAAIAAoAAAA9ABMAAAAHAAkAAAA9ABQAAAAHAAoAAAA9ABUAAAAHAAkAAAA9ABYAAAAAAAMAAAA9ABcAAAABAAcAAAA9ABgAAAABAAQAAAA9ABkAAAABAAQAAAA9ABoAAAAAAAYAAAA9ABsAAAACAAUAAAA9ABwAAAAFAAoAAAA9AB0AAAAFAAkAAAA9AB4AAAAFAAoAAAA9AB8AAAAIAAoAAAA9ACAAAAABAAMAAAA9ACEAAAABAAQAAAA9ACIAAAABAAQAAAA9ACMAAAABAAUAAAA9ACQAAAAIAAkAAAA9ACUAAAAFAAkAAAA9ACYAAAAHAAkAAAA9ACcAAAAAAAAAAAA9ACgAAAAHAAkAAAA9ACkAAAAHAAoAAAA9ACoAAAAIAAkAAAA9ACsAAAAAAAAAAAA9ACwAAAAFAAoAAAA9AC0AAAAIAAkAAAA9AC4AAAAHAAkAAAA9AC8AAAAFAAoAAAA9ADAAAAAIAAoAAAA9ADEAAAAIAAoAAAA9ADIAAAAAAAAAAAA9ADMAAAAHAAoAAAA+APD/AAABAAsAAAA+APH/AAAAAAAAAAA+APL/AAAAAAAAAAA+APP/AAAFAAoAAAA+APT/AAAFAAkAAAA+APX/AAAAAAAAAAA+APb/AAAAAAAAAAA+APf/AAAFAAoAAAA+APj/AAAHAAoAAAA+APn/AAAIAAkAAAA+APr/AAAHAAkAAAA+APv/AAAFAAoAAAA+APz/AAAIAAoAAAA+AP3/AAAHAAkAAAA+AP7/AAAIAAoAAAA+AP//AAAAAAAAAAA+AAAAAAAHAAoAAAA+AAEAAAAFAAkAAAA+AAIAAAAIAAkAAAA+AAMAAAAHAAoAAAA+AAQAAAAFAAkAAAA+AAUAAAAIAAkAAAA+AAYAAAAHAAoAAAA+AAcAAAAFAAoAAAA+AAgAAAAIAAkAAAA+AAkAAAAAAAAAAAA+AAoAAAAIAAoAAAA+AAsAAAAAAAAAAAA+AAwAAAAAAAAAAAA+AA0AAAAHAAoAAAA+AA4AAAAHAAkAAAA+AA8AAAAFAAoAAAA+ABAAAAAAAAAAAAA+ABEAAAAFAAkAAAA+ABIAAAAAAAAAAAA+ABMAAAAHAAoAAAA+ABQAAAAAAAAAAAA+ABUAAAAAAAMAAAA+ABYAAAABAAcAAAA+ABcAAAABAAQAAAA+ABgAAAAAAAYAAAA+ABkAAAACAAQAAAA+ABoAAAACAAUAAAA+ABsAAAAHAAkAAAA+ABwAAAAHAAoAAAA+AB0AAAAHAAoAAAA+AB4AAAAIAAoAAAA+AB8AAAAFAAkAAAA+ACAAAAABAAMAAAA+ACEAAAABAAQAAAA+ACIAAAABAAQAAAA+ACMAAAABAAUAAAA+ACQAAAAHAAoAAAA+ACUAAAAFAAkAAAA+ACYAAAAHAAoAAAA+ACcAAAAHAAkAAAA+ACgAAAAIAAkAAAA+ACkAAAAIAAkAAAA+ACoAAAAIAAoAAAA+ACsAAAAFAAoAAAA+ACwAAAAFAAkAAAA+AC0AAAAFAAoAAAA+AC4AAAAFAAoAAAA+AC8AAAAHAAkAAAA+ADAAAAAFAAkAAAA+ADEAAAAHAAkAAAA+ADIAAAAIAAkAAAA+ADMAAAAAAAAAAAA/APD/AAABAAsAAAA/APH/AAAFAAkAAAA/APL/AAAIAAkAAAA/APP/AAAIAAkAAAA/APT/AAAHAAoAAAA/APX/AAAFAAoAAAA/APb/AAAHAAkAAAA/APf/AAAHAAoAAAA/APj/AAAFAAkAAAA/APn/AAAHAAkAAAA/APr/AAAFAAkAAAA/APv/AAAFAAoAAAA/APz/AAAIAAoAAAA/AP3/AAAFAAkAAAA/AP7/AAAAAAAAAAA/AP//AAAIAAkAAAA/AAAAAAAFAAoAAAA/AAEAAAAHAAkAAAA/AAIAAAAFAAkAAAA/AAMAAAAAAAAAAAA/AAQAAAAFAAoAAAA/AAUAAAAFAAkAAAA/AAYAAAAAAAAAAAA/AAcAAAAAAAAAAAA/AAgAAAAIAAoAAAA/AAkAAAAHAAoAAAA/AAoAAAAHAAoAAAA/AAsAAAAHAAkAAAA/AAwAAAAIAAoAAAA/AA0AAAAFAAkAAAA/AA4AAAAHAAkAAAA/AA8AAAAFAAkAAAA/ABAAAAAHAAoAAAA/ABEAAAAIAAkAAAA/ABIAAAAIAAoAAAA/ABMAAAAHAAkAAAA/ABQAAAAIAAkAAAA/ABUAAAABAAMAAAA/ABYAAAABAAQAAAA/ABcAAAABAAQAAAA/ABgAAAABAAUAAAA/ABkAAAAFAAkAAAA/ABoAAAAFAAoAAAA/ABsAAAAIAAoAAAA/ABwAAAAIAAoAAAA/AB0AAAAHAAkAAAA/AB4AAAAAAAAAAAA/AB8AAAAIAAkAAAA/ACAAAAABAAMAAAA/ACEAAAABAAQAAAA/ACIAAAABAAQAAAA/ACMAAAABAAUAAAA/ACQAAAAIAAkAAAA/ACUAAAAIAAoAAAA/ACYAAAAAAAAAAAA/ACcAAAAIAAkAAAA/ACgAAAAIAAoAAAA/ACkAAAAIAAoAAAA/ACoAAAAIAAoAAAA/ACsAAAAHAAkAAAA/ACwAAAAIAAoAAAA/AC0AAAAHAAoAAAA/AC4AAAAHAAkAAAA/AC8AAAAFAAkAAAA/ADAAAAAFAAoAAAA/ADEAAAAHAAoAAAA/ADIAAAAFAAkAAAA/ADMAAAAFAAkAAABAAPD/AAABAAsAAABAAPH/AAAIAAkAAABAAPL/AAAFAAkAAABAAPP/AAAHAAkAAABAAPT/AAAAAAAAAABAAPX/AAAFAAkAAABAAPb/AAAIAAoAAABAAPf/AAAIAAoAAABAAPj/AAAHAAkAAABAAPn/AAAAAAAAAABAAPr/AAAFAAkAAABAAPv/AAAIAAkAAABAAPz/AAAHAAkAAABAAP3/AAAHAAoAAABAAP7/AAAAAAAAAABAAP//AAAIAAkAAABAAAAAAAAFAAoAAABAAAEAAAAIAAoAAABAAAIAAAAAAAAAAABAAAMAAAAHAAkAAABAAAQAAAAIAAoAAABAAAUAAAAAAAAAAABAAAYAAAAFAAoAAABAAAcAAAAIAAkAAABAAAgAAAAHAAoAAABAAAkAAAAAAAAAAABAAAoAAAAHAAkAAABAAAsAAAAAAAAAAABAAAwAAAAHAAkAAABAAA0AAAAIAAkAAABAAA4AAAAIAAoAAABAAA8AAAAFAAkAAABAABAAAAAHAAkAAABAABEAAAAIAAoAAABAABIAAAAHAAkAAABAABMAAAAIAAkAAABAABQAAAAAAAMAAABAABUAAAABAAcAAABAABYAAAABAAQAAABAABcAAAABAAQAAABAABgAAAABAAUAAABAABkAAAAHAAoAAABAABoAAAAIAAoAAABAABsAAAAFAAkAAABAABwAAAAAAAAAAABAAB0AAAAIAAoAAABAAB4AAAAAAAAAAABAAB8AAAAHAAkAAABAACAAAAABAAMAAABAACEAAAABAAQAAABAACIAAAABAAQAAABAACMAAAABAAUAAABAACQAAAAHAAkAAABAACUAAAAIAAoAAABAACYAAAAHAAoAAABAACcAAAAHAAoAAABAACgAAAAIAAkAAABAACkAAAAFAAoAAABAACoAAAAIAAkAAABAACsAAAAIAAoAAABAACwAAAAIAAkAAABAAC0AAAAIAAoAAABAAC4AAAAAAAAAAABAAC8AAAAFAAkAAABAADAAAAAHAAoAAABAADEAAAAHAAoAAABAADIAAAAFAAkAAABAADMAAAAFAAoAAABBAPD/AAABAAsAAABBAPH/AAAFAAoAAABBAPL/AAAIAAoAAABBAPP/AAAHAAkAAABBAPT/AAAIAAkAAABBAPX/AAAAAAAAAABBAPb/AAAIAAkAAABBAPf/AAAAAAAAAABBAPj/AAAAAAAAAABBAPn/AAAFAAkAAABBAPr/AAAFAAkAAABBAPv/AAAFAAoAAABBAPz/AAAIAAoAAABBAP3/AAAIAAoAAABBAP7/AAAIAAoAAABBAP//AAAFAAoAAABBAAAAAAAFAAkAAABBAAEAAAAHAAkAAABBAAIAAAAFAAkAAABBAAMAAAAHAAkAAABBAAQAAAAIAAkAAABBAAUAAAAIAAoAAABBAAYAAAAHAAoAAABBAAcAAAAHAAkAAABBAAgAAAAFAAkAAABBAAkAAAAFAAoAAABBAAoAAAAIAAkAAABBAAsAAAAFAAoAAABBAAwAAAAHAAoAAABBAA0AAAAHAAoAAABBAA4AAAAFAAkAAABBAA8AAAAFAAoAAABBABAAAAAFAAkAAABBABEAAAAHAAoAAABBABIAAAAFAAkAAABBABMAAAAAAAMAAABBABQAAAABAAcAAABBABUAAAABAAQAAABBABYAAAABAAQAAABBABcAAAAAAAYAAABBABgAAAACAAUAAABBABkAAAAHAAoAAABBABoAAAAHAAkAAABBABsAAAAFAAoAAABBABwAAAAIAAkAAABBAB0AAAAIAAoAAABBAB4AAAAAAAAAAABBAB8AAAAHAAkAAABBACAAAAABAAMAAABBACEAAAABAAQAAABBACIAAAABAAQAAABBACMAAAABAAUAAABBACQAAAAFAAkAAABBACUAAAAFAAoAAABBACYAAAAAAAAAAABBACcAAAAIAAkAAABBACgAAAAAAAAAAABBACkAAAAHAAkAAABBACoAAAAFAAoAAABBACsAAAAAAAAAAABBACwAAAAFAAoAAABBAC0AAAAAAAAAAABBAC4AAAAIAAkAAABBAC8AAAAFAAkAAABBADAAAAAAAAAAAABBADEAAAAHAAoAAABBADIAAAAAAAAAAABBADMAAAAIAAkAAABCAPD/AAACAAsAAABCAPH/AAAAAAQAAABCAPL/AAAAAAUAAABCAPP/AAAIAAoAAABCAPT/AAAIAAkAAABCAPX/AAAHAAoAAABCAPb/AAAFAAoAAABCAPf/AAAIAAoAAABCAPj/AAAFAAoAAABCAPn/AAAAAAAAAABCAPr/AAAFAAoAAABCAPv/AAAHAAkAAABCAPz/AAAFAAoAAABCAP3/AAAHAAkAAABCAP7/AAAHAAkAAABCAP//AAAAAAAAAABCAAAAAAAFAAkAAABCAAEAAAAAAAAAAABCAAIAAAAAAAAAAABCAAMAAAAFAAkAAABCAAQAAAAIAAoAAABCAAUAAAAFAAkAAABCAAYAAAAFAAoAAABCAAcAAAAHAAkAAABCAAgAAAAFAAoAAABCAAkAAAAFAAkAAABCAAoAAAAHAAkAAABCAAsAAAAFAAoAAABCAAwAAAAIAAoAAABCAA0AAAAIAAoAAABCAA4AAAAIAAkAAABCAA8AAAAIAAkAAABCABAAAAAHAAkAAABCABEAAAAIAAoAAABCABIAAAAAAAMAAABCABMAAAABAAcAAABCABQAAAABAAQAAABCABUAAAABAAQAAABCABYAAAAAAAYAAABCABcAAAACAAUAAABCABgAAAAIAAoAAABCABkAAAAFAAkAAABCABoAAAAFAAkAAABCABsAAAAIAAoAAABCABwAAAAHAAkAAABCAB0AAAAHAAoAAABCAB4AAAAFAAkAAABCAB8AAAAAAAAAAABCACAAAAABAAMAAABCACEAAAABAAQAAABCACIAAAABAAQAAABCACMAAAABAAUAAABCACQAAAAHAAoAAABCACUAAAAFAAkAAABCACYAAAAHAAoAAABCACcAAAAAAAAAAABCACgAAAAIAAkAAABCACkAAAAIAAkAAABCACoAAAAHAAkAAABCACsAAAAFAAkAAABCACwAAAAIAAkAAABCAC0AAAAHAAkAAABCAC4AAAAFAAoAAABCAC8AAAAHAAoAAABCADAAAAAAAAAAAABCADEAAAAIAAoAAABCADIAAAAFAAkAAABCADMAAAAIAAkAAABDAPD/AAARAAcAAABDAPH/AAABAAQAAABDAPL/AAABAAYAAABDAPP/AAAAAAUAAABDAPT/AAAFAAkAAABDAPX/AAAIAAkAAABDAPb/AAAFAAkAAABDAPf/AAAIAAkAAABDAPj/AAAFAAkAAABDAPn/AAAAAAAAAABDAPr/AAAHAAkAAABDAPv/AAAHAAkAAABDAPz/AAAHAAkAAABDAP3/AAAFAAkAAABDAP7/AAAHAAkAAABDAP//AAAIAAkAAABDAAAAAAAIAAoAAABDAAEAAAAAAAAAAABDAAIAAAAIAAoAAABDAAMAAAAIAAkAAABDAAQAAAAHAAoAAABDAAUAAAAIAAkAAABDAAYAAAAHAAkAAABDAAcAAAAFAAkAAABDAAgAAAAHAAkAAABDAAkAAAAIAAoAAABDAAoAAAAHAAoAAABDAAsAAAAFAAkAAABDAAwAAAAFAAoAAABDAA0AAAAAAAAAAABDAA4AAAAFAAkAAABDAA8AAAAIAAoAAABDABAAAAAHAAoAAABDABEAAAAAAAMAAABDABIAAAABAAcAAABDABMAAAABAAQAAABDABQAAAABAAQAAABDABUAAAAAAAYAAABDABYAAAACAAUAAABDABcAAAAIAAkAAABDABgAAAAHAAoAAABDABkAAAAAAAAAAABDABoAAAAIAAkAAABDABsAAAAAAAAAAABDABwAAAAIAAoAAABDAB0AAAAHAAkAAABDAB4AAAAFAAoAAABDAB8AAAAAAAAAAABDACAAAAABAAMAAABDACEAAAABAAQAAABDACIAAAABAAQAAABDACMAAAABAAUAAABDACQAAAAFAAkAAABDACUAAAAHAAkAAABDACYAAAAFAAoAAABDACcAAAAFAAoAAABDACgAAAAIAAkAAABDACkAAAAHAAoAAABDACoAAAAIAAoAAABDACsAAAAHAAoAAABDACwAAAAIAAoAAABDAC0AAAAAAAAAAABDAC4AAAAFAAoAAABDAC8AAAAIAAkAAABDADAAAAAAAAAAAABDADEAAAAHAAkAAABDADIAAAAIAAkAAABDADMAAAAFAAoAAABEAPD/AAABAAQAAABEAPH/AAABAAQAAABEAPL/AAABAAQAAABEAPP/AAABAAYAAABEAPT/AAAAAAQAAABEAPX/AAAAAAUAAABEAPb/AAAFAAoAAABEAPf/AAAHAAkAAABEAPj/AAAIAAoAAABEAPn/AAAIAAoAAABEAPr/AAAAAAAAAABEAPv/AAAIAAkAAABEAPz/AAAFAAoAAABEAP3/AAAAAAAAAABEAP7/AAAIAAkAAABEAP//AAAFAAoAAABEAAAAAAAIAAoAAABEAAEAAAAIAAoAAABEAAIAAAAFAAkAAABEAAMAAAAIAAkAAABEAAQAAAAAAAAAAABEAAUAAAAHAAkAAABEAAYAAAAIAAkAAABEAAcAAAAHAAoAAABEAAgAAAAFAAoAAABEAAkAAAAIAAkAAABEAAoAAAAFAAoAAABEAAsAAAAAAAAAAABEAAwAAAAAAAAAAABEAA0AAAAFAAkAAABEAA4AAAAHAAoAAABEAA8AAAAAAAMAAABEABAAAAAAAAQAAABEABEAAAABAAcAAABEABIAAAABAAQAAABEABMAAAABAAQAAABEABQAAAAAAAYAAABEABUAAAACAAUAAABEABYAAAAFAAkAAABEABcAAAAAAAAAAABEABgAAAAAAAAAAABEABkAAAAFAAoAAABEABoAAAAHAAkAAABEABsAAAAFAAkAAABEABwAAAAHAAkAAABEAB0AAAAIAAoAAABEAB4AAAAHAAoAAABEAB8AAAAHAAkAAABEACAAAAABAAMAAABEACEAAAABAAQAAABEACIAAAABAAQAAABEACMAAAABAAUAAABEACQAAAAIAAkAAABEACUAAAAFAAoAAABEACYAAAAIAAkAAABEACcAAAAAAAAAAABEACgAAAAFAAoAAABEACkAAAAFAAkAAABEACoAAAAAAAAAAABEACsAAAAHAAoAAABEACwAAAAIAAkAAABEAC0AAAAIAAoAAABEAC4AAAAAAAAAAABEAC8AAAAIAAkAAABEADAAAAAIAAkAAABEADEAAAAFAAkAAABEADIAAAAFAAkAAABEADMAAAAHAAoAAABFAPD/AAABAAQAAABFAPH/AAABAAQAAABFAPL/AAABAAQAAABFAPP/AAABAAQAAABFAPT/AAABAAQAAABFAPX/AAABAAYAAABFAPb/AAAAAAUAAABFAPf/AAAIAAoAAABFAPj/AAAAAAAAAABFAPn/AAAHAAoAAABFAPr/AAAAAAAAAABFAPv/AAAHAAkAAABFAPz/AAAIAAkAAABFAP3/AAAIAAoAAABFAP7/AAAFAAkAAABFAP//AAAAAAAAAABFAAAAAAAHAAkAAABFAAEAAAAFAAkAAABFAAIAAAAIAAoAAABFAAMAAAAAAAAAAABFAAQAAAAFAAkAAABFAAUAAAAFAAoAAABFAAYAAAAFAAoAAABFAAcAAAAFAAoAAABFAAgAAAAIAAkAAABFAAkAAAAAAAAAAABFAAoAAAAHAAkAAABFAAsAAAAIAAoAAABFAAwAAAAIAAkAAABFAA0AAAAHAAoAAABFAA4AAAAAAAMAAABFAA8AAAABAAcAAABFABAAAAABAAQAAABFABEAAAABAAQAAABFABIAAAABAAQAAABFABMAAAABAAQAAABFABQAAAABAAUAAABFABUAAAAFAAkAAABFABYAAAAFAAoAAABFABcAAAAIAAkAAABFABgAAAAAAAAAAABFABkAAAAHAAkAAABFABoAAAAIAAkAAABFABsAAAAAAAAAAABFABwAAAAFAAkAAABFAB0AAAAAAAAAAABFAB4AAAAAAAAAAABFAB8AAAAAAAAAAABFACAAAAABAAMAAABFACEAAAABAAQAAABFACIAAAABAAQAAABFACMAAAABAAUAAABFACQAAAAIAAkAAABFACUAAAAHAAoAAABFACYAAAAHAAoAAABFACcAAAAIAAkAAABFACgAAAAHAAoAAABFACkAAAAHAAoAAABFACoAAAAAAAAAAABFACsAAAAFAAkAAABFACwAAAAFAAkAAABFAC0AAAAAAAAAAABFAC4AAAAFAAoAAABFAC8AAAAHAAoAAABFADAAAAAFAAoAAABFADEAAAAFAAkAAABFADIAAAAAAAAAAABFADMAAAAHAAkAAABGAPD/AAAAAAsAAABGAPH/AAACAAQAAABGAPL/AAAAAAcAAABGAPP/AAABAAQAAABGAPT/AAABAAQAAABGAPX/AAABAAQAAABGAPb/AAABAAYAAABGAPf/AAAAAAUAAABGAPj/AAAHAAoAAABGAPn/AAAFAAoAAABGAPr/AAAIAAoAAABGAPv/AAAHAAkAAABGAPz/AAAHAAoAAABGAP3/AAAFAAkAAABGAP7/AAAIAAoAAABGAP//AAAAAAAAAABGAAAAAAAHAAoAAABGAAEAAAAFAAkAAABGAAIAAAAAAAAAAABGAAMAAAAFAAoAAABGAAQAAAAIAAoAAABGAAUAAAAFAAoAAABGAAYAAAAAAAAAAABGAAcAAAAAAAAAAABGAAgAAAAIAAoAAABGAAkAAAAIAAkAAABGAAoAAAAIAAkAAABGAAsAAAAAAAAAAABGAAwAAAAAAAAAAABGAA0AAAAAAAMAAABGAA4AAAABAAcAAABGAA8AAAABAAQAAABGABAAAAABAAQAAABGABEAAAABAAQAAABGABIAAAABAAQAAABGABMAAAAAAAYAAABGABQAAAACAAUAAABGABUAAAAHAAkAAABGABYAAAAHAAoAAABGABcAAAAFAAoAAABGABgAAAAAAAAAAABGABkAAAAAAAAAAABGABoAAAAIAAkAAABGABsAAAAIAAkAAABGABwAAAAHAAoAAABGAB0AAAAHAAkAAABGAB4AAAAAAAAAAABGAB8AAAAFAAkAAABGACAAAAABAAMAAABGACEAAAABAAQAAABGACIAAAABAAQAAABGACMAAAABAAUAAABGACQAAAAIAAkAAABGACUAAAAAAAAAAABGACYAAAAAAAAAAABGACcAAAAFAAkAAABGACgAAAAFAAoAAABGACkAAAAIAAkAAABGACoAAAAFAAoAAABGACsAAAAIAAoAAABGACwAAAAFAAoAAABGAC0AAAAIAAoAAABGAC4AAAAFAAkAAABGAC8AAAAFAAkAAABGADAAAAAAAAAAAABGADEAAAAIAAoAAABGADIAAAAIAAkAAABGADMAAAAIAAkAAABHAPD/AAABAAsAAABHAPH/AAAAAAAAAABHAPL/AAACAAMAAABHAPP/AAACAAQAAABHAPT/AAAAAAcAAABHAPX/AAABAAQAAABHAPb/AAABAAQAAABHAPf/AAABAAYAAABHAPj/AAAAAAUAAABHAPn/AAAIAAoAAABHAPr/AAAFAAkAAABHAPv/AAAHAAoAAABHAPz/AAAIAAkAAABHAP3/AAAFAAkAAABHAP7/AAAIAAkAAABHAP//AAAFAAkAAABHAAAAAAAAAAAAAABHAAEAAAAIAAkAAABHAAIAAAAHAAoAAABHAAMAAAAFAAkAAABHAAQAAAAIAAkAAABHAAUAAAAAAAAAAABHAAYAAAAIAAkAAABHAAcAAAAHAAoAAABHAAgAAAAFAAkAAABHAAkAAAAFAAkAAABHAAoAAAAIAAoAAABHAAsAAAAIAAkAAABHAAwAAAAAAAMAAABHAA0AAAABAAcAAABHAA4AAAABAAQAAABHAA8AAAABAAQAAABHABAAAAABAAQAAABHABEAAAAAAAYAAABHABIAAAACAAQAAABHABMAAAACAAUAAABHABQAAAAIAAoAAABHABUAAAAHAAkAAABHABYAAAAFAAkAAABHABcAAAAIAAoAAABHABgAAAAIAAoAAABHABkAAAAHAAkAAABHABoAAAAHAAoAAABHABsAAAAFAAoAAABHABwAAAAHAAoAAABHAB0AAAAHAAoAAABHAB4AAAAHAAoAAABHAB8AAAAHAAkAAABHACAAAAABAAMAAABHACEAAAABAAQAAABHACIAAAABAAQAAABHACMAAAABAAUAAABHACQAAAAIAAkAAABHACUAAAAFAAkAAABHACYAAAAFAAoAAABHACcAAAAHAAoAAABHACgAAAAFAAoAAABHACkAAAAAAAAAAABHACoAAAAAAAAAAABHACsAAAAHAAoAAABHACwAAAAIAAkAAABHAC0AAAAFAAoAAABHAC4AAAAFAAkAAABHAC8AAAAHAAkAAABHADAAAAAIAAkAAABHADEAAAAHAAkAAABHADIAAAAFAAoAAABHADMAAAAHAAkAAABIAPD/AAABAAsAAABIAPH/AAAIAAkAAABIAPL/AAAIAAoAAABIAPP/AAAAAAAAAABIAPT/AAACAAMAAABIAPX/AAAAAAcAAABIAPb/AAABAAQAAABIAPf/AAABAAQAAABIAPj/AAABAAYAAABIAPn/AAAAAAQAAABIAPr/AAAAAAUAAABIAPv/AAAHAAkAAABIAPz/AAAHAAkAAABIAP3/AAAHAAoAAABIAP7/AAAFAAkAAABIAP//AAAFAAoAAABIAAAAAAAHAAkAAABIAAEAAAAHAAkAAABIAAIAAAAIAAkAAABIAAMAAAAIAAoAAABIAAQAAAAHAAkAAABIAAUAAAAFAAoAAABIAAYAAAAIAAkAAABIAAcAAAAIAAoAAABIAAgAAAAAAAAAAABIAAkAAAAHAAkAAABIAAoAAAAAAAMAAABIAAsAAAAAAAQAAABIAAwAAAABAAcAAABIAA0AAAABAAQAAABIAA4AAAABAAQAAABIAA8AAAABAAQAAABIABAAAAAAAAYAAABIABEAAAACAAUAAABIABIAAAAHAAoAAABIABMAAAAIAAkAAABIABQAAAAFAAkAAABIABUAAAAIAAkAAABIABYAAAAHAAkAAABIABcAAAAFAAkAAABIABgAAAAIAAkAAABIABkAAAAFAAkAAABIABoAAAAIAAoAAABIABsAAAAFAAoAAABIABwAAAAFAAoAAABIAB0AAAAAAAAAAABIAB4AAAAIAAoAAABIAB8AAAAIAAoAAABIACAAAAABAAMAAABIACEAAAABAAQAAABIACIAAAABAAQAAABIACMAAAABAAUAAABIACQAAAAHAAkAAABIACUAAAAHAAoAAABIACYAAAAIAAkAAABIACcAAAAHAAoAAABIACgAAAAHAAkAAABIACkAAAAHAAkAAABIACoAAAAFAAkAAABIACsAAAAIAAkAAABIACwAAAAIAAkAAABIAC0AAAAHAAkAAABIAC4AAAAIAAoAAABIAC8AAAAFAAkAAABIADAAAAAFAAoAAABIADEAAAAHAAkAAABIADIAAAAAAAAAAABIADMAAAAHAAoAAABJAPD/AAABAAsAAABJAPH/AAAFAAoAAABJAPL/AAAIAAkAAABJAPP/AAAFAAoAAABJAPT/AAAIAAkAAABJAPX/AAABAAMAAABJAPb/AAABAAQAAABJAPf/AAABAAQAAABJAPj/AAABAAQAAABJAPn/AAABAAQAAABJAPr/AAABAAUAAABJAPv/AAAAAAAAAABJAPz/AAAIAAkAAABJAP3/AAAIAAkAAABJAP7/AAAFAAoAAABJAP//AAAHAAoAAABJAAAAAAAHAAkAAABJAAEAAAAFAAkAAABJAAIAAAAHAAkAAABJAAMAAAAAAAAAAABJAAQAAAAAAAAAAABJAAUAAAAHAAkAAABJAAYAAAAIAAoAAABJAAcAAAAFAAkAAABJAAgAAAAIAAkAAABJAAkAAAAAAAMAAABJAAoAAAABAAcAAABJAAsAAAABAAQAAABJAAwAAAABAAQAAABJAA0AAAABAAQAAABJAA4AAAABAAQAAABJAA8AAAAAAAYAAABJABAAAAACAAUAAABJABEAAAAFAAkAAABJABIAAAAIAAkAAABJABMAAAAIAAkAAABJABQAAAAHAAkAAABJABUAAAAFAAoAAABJABYAAAAFAAkAAABJABcAAAAAAAAAAABJABgAAAAAAAAAAABJABkAAAAHAAkAAABJABoAAAAAAAAAAABJABsAAAAHAAkAAABJABwAAAAFAAoAAABJAB0AAAAHAAoAAABJAB4AAAAHAAkAAABJAB8AAAAHAAoAAABJACAAAAABAAMAAABJACEAAAABAAQAAABJACIAAAABAAQAAABJACMAAAABAAUAAABJACQAAAAIAAkAAABJACUAAAAAAAAAAABJACYAAAAIAAkAAABJACcAAAAIAAkAAABJACgAAAAFAAkAAABJACkAAAAHAAkAAABJACoAAAAIAAkAAABJACsAAAAFAAoAAABJACwAAAAFAAoAAABJAC0AAAAAAAAAAABJAC4AAAAIAAoAAABJAC8AAAAFAAkAAABJADAAAAAHAAkAAABJADEAAAAFAAoAAABJADIAAAAHAAoAAABJADMAAAAIAAoAAABKAPD/AAABAAsAAABKAPH/AAAFAAoAAABKAPL/AAAIAAkAAABKAPP/AAAIAAkAAABKAPT/AAAIAAkAAABKAPX/AAACAAMAAABKAPb/AAAAAAcAAABKAPf/AAABAAQAAABKAPj/AAABAAQAAABKAPn/AAABAAQAAABKAPr/AAABAAYAAABKAPv/AAAAAAUAAABKAPz/AAAHAAkAAABKAP3/AAAIAAoAAABKAP7/AAAFAAoAAABKAP//AAAFAAoAAABKAAAAAAAFAAkAAABKAAEAAAAAAAAAAABKAAIAAAAHAAkAAABKAAMAAAAIAAkAAABKAAQAAAAFAAkAAABKAAUAAAAHAAoAAABKAAYAAAAAAAAAAABKAAcAAAAIAAoAAABKAAgAAAAAAAMAAABKAAkAAAABAAcAAABKAAoAAAABAAQAAABKAAsAAAABAAQAAABKAAwAAAABAAQAAABKAA0AAAABAAQAAABKAA4AAAAAAAYAAABKAA8AAAACAAUAAABKABAAAAAAAAAAAABKABEAAAAHAAoAAABKABIAAAAAAAAAAABKABMAAAAIAAoAAABKABQAAAAHAAoAAABKABUAAAAHAAkAAABKABYAAAAAAAAAAABKABcAAAAFAAkAAABKABgAAAAFAAkAAABKABkAAAAHAAoAAABKABoAAAAAAAAAAABKABsAAAAFAAkAAABKABwAAAAIAAkAAABKAB0AAAAFAAoAAABKAB4AAAAHAAoAAABKAB8AAAAHAAoAAABKACAAAAABAAMAAABKACEAAAABAAQAAABKACIAAAABAAQAAABKACMAAAABAAUAAABKACQAAAAFAAkAAABKACUAAAAFAAkAAABKACYAAAAAAAAAAABKACcAAAAFAAoAAABKACgAAAAFAAoAAABKACkAAAAHAAoAAABKACoAAAAFAAkAAABKACsAAAAHAAoAAABKACwAAAAIAAoAAABKAC0AAAAFAAoAAABKAC4AAAAFAAkAAABKAC8AAAAFAAkAAABKADAAAAAHAAoAAABKADEAAAAHAAkAAABKADIAAAAFAAoAAABKADMAAAAHAAoAAABLAPD/AAABAAsAAABLAPH/AAAHAAkAAABLAPL/AAAHAAoAAABLAPP/AAAHAAkAAABLAPT/AAAFAAkAAABLAPX/AAAFAAoAAABLAPb/AAACAAMAAABLAPf/AAAAAAcAAABLAPj/AAABAAQAAABLAPn/AAABAAQAAABLAPr/AAABAAQAAABLAPv/AAABAAYAAABLAPz/AAAAAAUAAABLAP3/AAAIAAkAAABLAP7/AAAFAAkAAABLAP//AAAHAAkAAABLAAAAAAAFAAkAAABLAAEAAAAAAAAAAABLAAIAAAAIAAoAAABLAAMAAAAIAAkAAABLAAQAAAAIAAkAAABLAAUAAAAAAAAAAABLAAYAAAAAAAMAAABLAAcAAAAAAAQAAABLAAgAAAABAAcAAABLAAkAAAABAAQAAABLAAoAAAABAAQAAABLAAsAAAABAAQAAABLAAwAAAABAAQAAABLAA0AAAAAAAYAAABLAA4AAAACAAUAAABLAA8AAAAFAAoAAABLABAAAAAHAAkAAABLABEAAAAHAAoAAABLABIAAAAHAAkAAABLABMAAAAHAAkAAABLABQAAAAAAAAAAABLABUAAAAHAAoAAABLABYAAAAHAAkAAABLABcAAAAFAAkAAABLABgAAAAAAAAAAABLABkAAAAHAAoAAABLABoAAAAFAAkAAABLABsAAAAIAAoAAABLABwAAAAFAAkAAABLAB0AAAAAAAAAAABLAB4AAAAFAAoAAABLAB8AAAAIAAoAAABLACAAAAABAAMAAABLACEAAAABAAQAAABLACIAAAABAAQAAABLACMAAAABAAUAAABLACQAAAAFAAoAAABLACUAAAAHAAoAAABLACYAAAAFAAkAAABLACcAAAAHAAoAAABLACgAAAAHAAoAAABLACkAAAAIAAkAAABLACoAAAAFAAkAAABLACsAAAAHAAkAAABLACwAAAAAAAAAAABLAC0AAAAFAAoAAABLAC4AAAAAAAAAAABLAC8AAAAAAAAAAABLADAAAAAHAAkAAABLADEAAAAIAAoAAABLADIAAAAHAAoAAABLADMAAAAFAAoAAABMAPD/AAABAAsAAABMAPH/AAAIAAkAAABMAPL/AAAIAAkAAABMAPP/AAAFAAoAAABMAPT/AAAFAAoAAABMAPX/AAAHAAoAAABMAPb/AAAIAAoAAABMAPf/AAABAAMAAABMAPj/AAABAAQAAABMAPn/AAABAAQAAABMAPr/AAABAAQAAABMAPv/AAABAAQAAABMAPz/AAABAAYAAABMAP3/AAAAAAUAAABMAP7/AAAFAAoAAABMAP//AAAIAAkAAABMAAAAAAAHAAoAAABMAAEAAAAIAAkAAABMAAIAAAAFAAkAAABMAAMAAAAHAAkAAABMAAQAAAAAAAMAAABMAAUAAAAAAAQAAABMAAYAAAABAAcAAABMAAcAAAABAAQAAABMAAgAAAABAAQAAABMAAkAAAABAAQAAABMAAoAAAABAAQAAABMAAsAAAABAAQAAABMAAwAAAAAAAYAAABMAA0AAAACAAUAAABMAA4AAAAHAAoAAABMAA8AAAAHAAoAAABMABAAAAAIAAoAAABMABEAAAAHAAoAAABMABIAAAAIAAoAAABMABMAAAAIAAoAAABMABQAAAAFAAoAAABMABUAAAAFAAoAAABMABYAAAAFAAoAAABMABcAAAAHAAoAAABMABgAAAAFAAkAAABMABkAAAAHAAoAAABMABoAAAAIAAkAAABMABsAAAAIAAkAAABMABwAAAAIAAkAAABMAB0AAAAHAAoAAABMAB4AAAAIAAkAAABMAB8AAAAAAAAAAABMACAAAAABAAMAAABMACEAAAABAAQAAABMACIAAAABAAQAAABMACMAAAABAAUAAABMACQAAAAFAAoAAABMACUAAAAFAAkAAABMACYAAAAIAAkAAABMACcAAAAFAAoAAABMACgAAAAIAAoAAABMACkAAAAIAAoAAABMACoAAAAHAAoAAABMACsAAAAFAAkAAABMACwAAAAFAAoAAABMAC0AAAAHAAoAAABMAC4AAAAFAAoAAABMAC8AAAAIAAkAAABMADAAAAAFAAoAAABMADEAAAAHAAoAAABMADIAAAAIAAoAAABMADMAAAAHAAoAAABNAPD/AAABAAsAAABNAPH/AAAIAAoAAABNAPL/AAAFAAkAAABNAPP/AAAAAAAAAABNAPT/AAAFAAoAAABNAPX/AAAFAAkAAABNAPb/AAAHAAoAAABNAPf/AAACAAMAAABNAPj/AAAAAAcAAABNAPn/AAABAAQAAABNAPr/AAABAAQAAABNAPv/AAABAAQAAABNAPz/AAABAAQAAABNAP3/AAABAAUAAABNAP7/AAAFAAkAAABNAP//AAAHAAoAAABNAAAAAAAFAAkAAABNAAEAAAAFAAoAAABNAAIAAAAHAAkAAABNAAMAAAAAAAMAAABNAAQAAAABAAcAAABNAAUAAAABAAQAAABNAAYAAAABAAQAAABNAAcAAAABAAQAAABNAAgAAAABAAQAAABNAAkAAAABAAQAAABNAAoAAAAAAAYAAABNAAsAAAACAAQAAABNAAwAAAACAAUAAABNAA0AAAAAAAAAAABNAA4AAAAHAAkAAABNAA8AAAAIAAkAAABNABAAAAAHAAoAAABNABEAAAAFAAoAAABNABIAAAAFAAoAAABNABMAAAAFAAoAAABNABQAAAAHAAkAAABNABUAAAAFAAkAAABNABYAAAAFAAkAAABNABcAAAAFAAoAAABNABgAAAAHAAoAAABNABkAAAAHAAkAAABNABoAAAAIAAkAAABNABsAAAAIAAoAAABNABwAAAAFAAkAAABNAB0AAAAAAAAAAABNAB4AAAAFAAkAAABNAB8AAAAHAAoAAABNACAAAAABAAMAAABNACEAAAABAAQAAABNACIAAAABAAQAAABNACMAAAABAAUAAABNACQAAAAFAAoAAABNACUAAAAHAAkAAABNACYAAAAFAAoAAABNACcAAAAHAAkAAABNACgAAAAHAAkAAABNACkAAAAFAAoAAABNACoAAAAHAAkAAABNACsAAAAHAAkAAABNACwAAAAHAAoAAABNAC0AAAAFAAoAAABNAC4AAAAHAAoAAABNAC8AAAAIAAkAAABNADAAAAAFAAkAAABNADEAAAAFAAoAAABNADIAAAAHAAkAAABNADMAAAAFAAoAAABOAPD/AAABAAsAAABOAPH/AAAIAAoAAABOAPL/AAAIAAkAAABOAPP/AAAFAAkAAABOAPT/AAAFAAoAAABOAPX/AAAIAAoAAABOAPb/AAAFAAkAAABOAPf/AAAFAAoAAABOAPj/AAACAAMAAABOAPn/AAAAAAcAAABOAPr/AAABAAQAAABOAPv/AAABAAQAAABOAPz/AAABAAQAAABOAP3/AAABAAYAAABOAP7/AAAAAAQAAABOAP//AAAAAAQAAABOAAAAAAAAAAQAAABOAAEAAAAAAAQAAABOAAIAAAAAAAQAAABOAAMAAAABAAcAAABOAAQAAAABAAQAAABOAAUAAAABAAQAAABOAAYAAAABAAQAAABOAAcAAAABAAQAAABOAAgAAAAAAAYAAABOAAkAAAACAAQAAABOAAoAAAACAAUAAABOAAsAAAAIAAoAAABOAAwAAAAFAAkAAABOAA0AAAAAAAAAAABOAA4AAAAIAAoAAABOAA8AAAAFAAoAAABOABAAAAAHAAkAAABOABEAAAAHAAoAAABOABIAAAAHAAoAAABOABMAAAAFAAoAAABOABQAAAAIAAoAAABOABUAAAAFAAoAAABOABYAAAAAAAAAAABOABcAAAAAAAAAAABOABgAAAAHAAkAAABOABkAAAAIAAoAAABOABoAAAAFAAoAAABOABsAAAAIAAkAAABOABwAAAAAAAAAAABOAB0AAAAAAAAAAABOAB4AAAAHAAkAAABOAB8AAAAIAAoAAABOACAAAAABAAMAAABOACEAAAABAAQAAABOACMAAAABAAUAAABOACQAAAAIAAkAAABOACUAAAAFAAoAAABOACYAAAAFAAoAAABOACcAAAAHAAoAAABOACgAAAAIAAoAAABOACkAAAAIAAkAAABOACoAAAAIAAkAAABOACsAAAAIAAoAAABOACwAAAAAAAAAAABOAC0AAAAIAAoAAABOAC4AAAAAAAAAAABOAC8AAAAIAAkAAABOADAAAAAFAAoAAABOADEAAAAHAAoAAABOADIAAAAFAAoAAABOADMAAAAAAAAAAABPAPD/AAABAAsAAABPAPH/AAAHAAoAAABPAPL/AAAAAAAAAABPAPP/AAAFAAoAAABPAPT/AAAHAAkAAABPAPX/AAAHAAoAAABPAPb/AAAFAAkAAABPAPf/AAAIAAkAAABPAPj/AAAIAAkAAABPAPn/AAACAAMAAABPAPr/AAACAAQAAABPAPv/AAAAAAcAAABPAPz/AAABAAQAAABPAP3/AAABAAQAAABPAP7/AAABAAQAAABPAP//AAABAAQAAABPAAAAAAABAAQAAABPAAEAAAABAAQAAABPAAIAAAABAAQAAABPAAMAAAABAAQAAABPAAQAAAABAAQAAABPAAUAAAABAAQAAABPAAYAAAAAAAYAAABPAAcAAAACAAQAAABPAAgAAAACAAUAAABPAAkAAAAIAAoAAABPAAoAAAAHAAoAAABPAAsAAAAFAAkAAABPAAwAAAAIAAoAAABPAA0AAAAFAAoAAABPAA4AAAAIAAoAAABPAA8AAAAHAAkAAABPABAAAAAIAAkAAABPABEAAAAAAAAAAABPABIAAAAHAAkAAABPABMAAAAFAAkAAABPABQAAAAFAAkAAABPABUAAAAFAAkAAABPABYAAAAIAAoAAABPABcAAAAFAAkAAABPABgAAAAHAAoAAABPABkAAAAFAAoAAABPABoAAAAHAAoAAABPABsAAAAHAAkAAABPABwAAAAHAAkAAABPAB0AAAAHAAkAAABPAB4AAAAFAAkAAABPAB8AAAAFAAoAAABPACAAAAABAAMAAABPACEAAAABAAQAAABPACQAAAAHAAkAAABPACUAAAAHAAoAAABPACYAAAAHAAkAAABPACcAAAAFAAoAAABPACgAAAAHAAoAAABPACkAAAAFAAkAAABPACoAAAAIAAoAAABPACsAAAAIAAkAAABPACwAAAAHAAkAAABPAC0AAAAHAAoAAABPAC4AAAAFAAkAAABPAC8AAAAHAAkAAABPADAAAAAIAAoAAABPADEAAAAAAAAAAABPADIAAAAIAAkAAABPADMAAAAAAAAAAABQAPD/AAABAAsAAABQAPH/AAAAAAkAAABQAPL/AAAAAAoAAABQAPP/AAAIAAkAAABQAPT/AAAIAAkAAABQAPX/AAAFAAoAAABQAPb/AAAFAAkAAABQAPf/AAAIAAoAAABQAPj/AAAIAAkAAABQAPn/AAAFAAkAAABQAPr/AAAAAAAAAABQAPv/AAABAAMAAABQAPz/AAABAAQAAABQAP3/AAAPAAYAAABQAP7/AAAPAAgAAABQAP//AAAPAAcAAABQAAAAAAAPAAYAAABQAAEAAAAPAAcAAABQAAIAAAAPAAcAAABQAAMAAAAAAAYAAABQAAQAAAACAAQAAABQAAUAAAACAAQAAABQAAYAAAACAAUAAABQAAcAAAAIAAoAAABQAAgAAAAHAAkAAABQAAkAAAAFAAoAAABQAAoAAAAFAAoAAABQAAsAAAAIAAoAAABQAAwAAAAHAAoAAABQAA0AAAAIAAkAAABQAA4AAAAFAAoAAABQAA8AAAAIAAoAAABQABAAAAAIAAkAAABQABEAAAAAAAkAAABQABIAAAAAAAoAAABQABMAAAAHAAoAAABQABQAAAAHAAkAAABQABUAAAAAAAAAAABQABYAAAAAAAAAAABQABcAAAAIAAoAAABQABgAAAAHAAkAAABQABkAAAAAAAAAAABQABoAAAAIAAkAAABQABsAAAAIAAkAAABQABwAAAAAAAAAAABQAB0AAAAAAAAAAABQAB4AAAAAAAkAAABQAB8AAAAAAAkAAABQACAAAAABAAMAAABQACEAAAABAAQAAABQACQAAAAAAAoAAABQACUAAAAAAAkAAABQACYAAAAAAAoAAABQACcAAAAAAAkAAABQACgAAAAAAAoAAABQACkAAAAAAAkAAABQACoAAAAAAAoAAABQACsAAAAAAAkAAABQACwAAAAAAAoAAABQAC0AAAAAAAkAAABQAC4AAAAAAAoAAABQAC8AAAAAAAkAAABQADAAAAAAAAoAAABQADEAAAAFAAkAAABQADIAAAAHAAkAAABQADMAAAAAAAkAAAAMAAYAAAAHAAoAAAAOAAYAAAAFAAoAAAAYAPj/AAADAAcAAAApAPj/AAADAAcAAAApAPn/AAADAAcAAAAqAPj/AAADAAcAAAAqAPn/AAADAAcAAAAPAAAAAAABAAMAAAAPAAEAAAABAAQAAAAPAAIAAAABAAUAAAAQAAAAAAABAAMAAAAQAAEAAAABAAQAAAAQAAIAAAABAAUAAAARAAAAAAABAAMAAAARAAEAAAABAAQAAAARAAIAAAABAAUAAAAlAAoAAAADAAcAAAAkAAoAAAADAAcAAAAkAAsAAAADAAcAAAAlAAwAAAADAAcAAAAlAAsAAAAAAAEAAAAmAAsAAAAAAAEAAAAmAAwAAAAAAAEAAAAnAAsAAAAAAAEAAAAoAAsAAAADAAcAAAAnAAoAAAAAAAEAAAAmAAoAAAAAAAEAAAAWAAwAAAADAAkAAAAEAP7/AAAAAAAAAAAIAPv/AAAIAAkAAAAKAP3/AAAIAAkAAAAHAP7/AAAAAAAAAAAHAP3/AAAGAAAAAAAIAPz/AAAOAAAAAAAGAPz/AAAAAAAAAAAKAP7/AAAIAAkAAAAHAP//AAABAAQAAAAGAAMAAAALAAAAAABOACIAAAABAAQAAABPACIAAAABAAQAAABQACIAAAAPAAcAAABPACMAAAABAAUAAABQACMAAAACAAsAAAD+/wcAAAAIAAkAAAD8////AAARACEAAAAIABQAAAAIAAkAAABSABYAAAACAAsAAABRABcAAAAAAAkAAABRABgAAAAAAAkAAABRABkAAAAAAAkAAABRABoAAAAAAAoAAABRABsAAAAHAAkAAABRABwAAAAAAAkAAABSABkAAAACAAsAAABSABgAAAACAAsAAABSABcAAAACAAsAAABSABUAAAAAAAkAAABSABQAAAACAAsAAABSABMAAAAAAAkAAABSABIAAAABAAsAAABRABUAAAAAAAkAAABRABYAAAAAAAkAAABRABMAAAAAAAkAAABRABQAAAAAAAoAAABRABIAAAABAAsAAABRAB0AAAAAAAoAAABRAB4AAAAAAAkAAABSABwAAAAAAAkAAABRADEAAAABAAsAAABRADIAAAAIAAoAAABRADMAAAABAAkAAAAbADQAAAADAAcAAAAbADUAAAADAAcAAAAbADYAAAADAAcAAAAaADYAAAADAAcAAAAaADcAAAADAAcAAAAaADgAAAAAAAEAAAAZADgAAAADAAcAAAAZADkAAAADAAcAAAAZADoAAAAAAAEAAAAZADsAAAADAAcAAAAaADkAAAADAAcAAAAbADgAAAAAAAEAAAAbADcAAAADAAcAAAAcADYAAAAAAAEAAAAcADUAAAAAAAEAAAAdADQAAAADAAcAAAAcADQAAAADAAcAAAA=") tile_set = SubResource("TileSet_snsnx") -[node name="DoorSceneManager" parent="." node_paths=PackedStringArray("player") instance=ExtResource("1_qqjfh")] -position = Vector2(120, -15) +[node name="DoorSceneManager" parent="." node_paths=PackedStringArray("player") instance=ExtResource("3_5ranr")] +position = Vector2(-34, 99) player = NodePath("../Player") _to_scene = 1 push_direction = 1 -[node name="DoorSceneManager2" parent="." node_paths=PackedStringArray("player") instance=ExtResource("1_qqjfh")] -position = Vector2(232, 305) +[node name="DoorSceneManager2" parent="." node_paths=PackedStringArray("player") instance=ExtResource("3_5ranr")] +position = Vector2(78, 419) player = NodePath("../Player") _to_scene = 1 push_direction = 1 -[node name="Player" parent="." instance=ExtResource("1_6iuf6")] +[node name="Player" parent="." instance=ExtResource("4_y0qys")] z_index = 1 motion_mode = 1 @@ -1661,11 +1662,11 @@ motion_mode = 1 z_index = 4096 zoom = Vector2(2, 2) -[node name="PauseMenu" parent="Player/Camera2D" instance=ExtResource("2_4k3ic")] +[node name="PauseMenu" parent="Player/Camera2D" instance=ExtResource("5_06oyi")] offset_left = -288.0 offset_top = -162.0 offset_right = 288.0 offset_bottom = 162.0 -[node name="InventoryMenu" parent="Player/Camera2D" instance=ExtResource("6_a0ayx")] +[node name="InventoryMenu" parent="Player/Camera2D" instance=ExtResource("6_cymwe")] process_mode = 3 diff --git a/scenes/interfaces/inventory.tscn b/scenes/menu/inventory.tscn similarity index 60% rename from scenes/interfaces/inventory.tscn rename to scenes/menu/inventory.tscn index 08f856e..adb6fa7 100644 --- a/scenes/interfaces/inventory.tscn +++ b/scenes/menu/inventory.tscn @@ -1,31 +1,12 @@ -[gd_scene load_steps=10 format=3 uid="uid://cjvtoi20cy8wi"] +[gd_scene load_steps=8 format=3 uid="uid://cjvtoi20cy8wi"] -[ext_resource type="Script" path="res://scripts/inventory.gd" id="1_8uk8r"] -[ext_resource type="Script" path="res://addons/gloot/core/inventory_grid_stacked.gd" id="2_yqb3t"] -[ext_resource type="Script" path="res://addons/gloot/core/item_protoset.gd" id="3_76oh0"] -[ext_resource type="Script" path="res://addons/gloot/core/inventory_item.gd" id="4_dbq78"] +[ext_resource type="Script" uid="uid://dleuvr2p33hex" path="res://scripts/inventory.gd" id="1_8uk8r"] +[ext_resource type="Script" uid="uid://bxtv6f17pkdmm" path="res://addons/gloot/core/inventory.gd" id="3_jjk0v"] +[ext_resource type="Script" uid="uid://rk48gcn3clet" path="res://addons/gloot/core/constraints/grid_constraint.gd" id="4_0ccc4"] +[ext_resource type="JSON" path="res://objects/item_protoset.json" id="4_bqieh"] [ext_resource type="Texture2D" uid="uid://caxlr5o014d0h" path="res://assets/ui/button_square_depth_line.png" id="4_pbytw"] +[ext_resource type="Script" uid="uid://bd75talwyq73v" path="res://addons/gloot/ui/ctrl_inventory_grid.gd" id="6_cca0k"] [ext_resource type="Theme" uid="uid://c6osikflt1uy1" path="res://assets/resources/ui_theme.tres" id="6_em7re"] -[ext_resource type="Script" path="res://addons/gloot/ui/ctrl_inventory_grid.gd" id="7_v7tk4"] - -[sub_resource type="Resource" id="Resource_g1a6x"] -script = ExtResource("3_76oh0") -json_data = "[ - { - \"_comment\": \"Grid Based Inventory\", - \"description\": \"An example item used as a base to create other items.\", - \"height\": 2, - \"id\": \"base_item\", - \"image\": \"res://assets/textures/book.png\", - \"name\": \"Base Item\", - \"stack_size\": 10, - \"weight\": 1, - \"width\": 2 - } -]" - -[sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_cujr1"] -size = Vector2(30, 30) [node name="InventoryMenu" type="Control"] process_mode = 2 @@ -37,15 +18,42 @@ grow_horizontal = 2 grow_vertical = 2 script = ExtResource("1_8uk8r") -[node name="InventoryGridStacked" type="Node" parent="."] -script = ExtResource("2_yqb3t") -size = Vector2i(5, 5) -item_protoset = SubResource("Resource_g1a6x") - -[node name="_Node_80111" type="Node" parent="InventoryGridStacked"] -script = ExtResource("4_dbq78") -protoset = SubResource("Resource_g1a6x") -prototype_id = "base_item" +[node name="Inventory" type="Node" parent="."] +script = ExtResource("3_jjk0v") +protoset = ExtResource("4_bqieh") +_serialized_format = { +"constraints": { +"res://addons/gloot/core/constraints/grid_constraint.gd": { +"data": { +"insertion_priority": 0, +"item_positions": { +"1": "Vector2i(1, 0)", +"2": "Vector2i(2, 0)" +}, +"size": "Vector2i(10, 5)" +}, +"name": &"GridConstraint" +} +}, +"items": [{ +"protoset": "res://objects/item_protoset.json", +"prototype_id": "grid_item" +}, { +"protoset": "res://objects/item_protoset.json", +"prototype_id": "deck_of_cards" +}, { +"protoset": "res://objects/item_protoset.json", +"prototype_id": "base_item" +}], +"node_name": "Inventory", +"protoset": "res://objects/item_protoset.json" +} +metadata/_custom_type_script = "uid://bxtv6f17pkdmm" + +[node name="GridConstraint" type="Node" parent="Inventory"] +script = ExtResource("4_0ccc4") +size = Vector2i(10, 5) +insertion_priority = 0 [node name="CenterContainer" type="CenterContainer" parent="."] layout_mode = 1 @@ -79,15 +87,15 @@ theme_override_constants/margin_bottom = 35 layout_mode = 2 [node name="Row1Container" type="HBoxContainer" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer"] +clip_contents = true layout_mode = 2 alignment = 1 -[node name="CtrlInventoryGrid" type="Control" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/Row1Container"] -custom_minimum_size = Vector2(100, 100) +[node name="CtrlInventoryGrid" type="Control" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer/Row1Container" node_paths=PackedStringArray("inventory")] layout_mode = 2 -script = ExtResource("7_v7tk4") -inventory_path = NodePath("../../../../../../InventoryGridStacked") -default_item_texture = SubResource("PlaceholderTexture2D_cujr1") +script = ExtResource("6_cca0k") +inventory = NodePath("../../../../../../Inventory") +metadata/_custom_type_script = "uid://bd75talwyq73v" [node name="MarginContainer" type="MarginContainer" parent="CenterContainer/PanelContainer/MarginContainer/VBoxContainer"] layout_mode = 2 diff --git a/scenes/interfaces/pause_menu.tscn b/scenes/menu/pause_menu.tscn similarity index 86% rename from scenes/interfaces/pause_menu.tscn rename to scenes/menu/pause_menu.tscn index 0aff408..9d68d1b 100644 --- a/scenes/interfaces/pause_menu.tscn +++ b/scenes/menu/pause_menu.tscn @@ -1,9 +1,9 @@ [gd_scene load_steps=4 format=3 uid="uid://d11oo2pxcah1g"] -[ext_resource type="Script" path="res://scripts/pause_menu.gd" id="1_aq3as"] -[ext_resource type="Script" path="res://addons/label_font_auto_sizer/label_auto_sizer.gd" id="2_j81qh"] +[ext_resource type="Script" uid="uid://dhm3u3n5lqe1f" path="res://scripts/pause_menu.gd" id="1_aq3as"] +[ext_resource type="Script" uid="uid://bxml0kyjdhbw5" path="res://addons/label_font_auto_sizer/label_auto_sizer.gd" id="2_j81qh"] -[sub_resource type="LabelSettings" id="LabelSettings_3vmtb"] +[sub_resource type="LabelSettings" id="LabelSettings_ux7g8"] font_size = 50 [node name="PauseMenu" type="Control"] @@ -33,7 +33,7 @@ custom_minimum_size = Vector2(250, 100) layout_mode = 2 theme_override_font_sizes/font_size = 16 text = "Pause" -label_settings = SubResource("LabelSettings_3vmtb") +label_settings = SubResource("LabelSettings_ux7g8") horizontal_alignment = 1 vertical_alignment = 1 autowrap_mode = 3 diff --git a/scenes/interfaces/save_menu.tscn b/scenes/menu/save_menu.tscn similarity index 95% rename from scenes/interfaces/save_menu.tscn rename to scenes/menu/save_menu.tscn index f8ae35b..57c9d94 100644 --- a/scenes/interfaces/save_menu.tscn +++ b/scenes/menu/save_menu.tscn @@ -1,8 +1,8 @@ [gd_scene load_steps=6 format=3 uid="uid://bsiy7irf1p5e1"] -[ext_resource type="Script" path="res://scripts/save_menu.gd" id="1_47jxk"] +[ext_resource type="Script" uid="uid://dm2h8o2ppm2ou" path="res://scripts/save_menu.gd" id="1_47jxk"] [ext_resource type="Texture2D" uid="uid://caxlr5o014d0h" path="res://assets/ui/button_square_depth_line.png" id="1_ejhmr"] -[ext_resource type="Script" path="res://addons/label_font_auto_sizer/label_auto_sizer.gd" id="2_mvfow"] +[ext_resource type="Script" uid="uid://bxml0kyjdhbw5" path="res://addons/label_font_auto_sizer/label_auto_sizer.gd" id="2_mvfow"] [ext_resource type="Theme" uid="uid://c6osikflt1uy1" path="res://assets/resources/ui_theme.tres" id="3_n5hex"] [sub_resource type="LabelSettings" id="LabelSettings_q7utc"] diff --git a/scripts/constants.gd b/scripts/constants.gd index 9dec28f..de443bc 100644 --- a/scripts/constants.gd +++ b/scripts/constants.gd @@ -8,7 +8,7 @@ enum LEVELS_NAMES { } const LEVELS_PATHS: Array[String] = [ - "res://scenes/main_level.tscn", - "res://scenes/house_template.tscn", + "res://scenes/level/main_level.tscn", + "res://scenes/level/house_template.tscn", "res://scenes/interfaces/save_menu.tscn", ] diff --git a/scripts/constants.gd.uid b/scripts/constants.gd.uid new file mode 100644 index 0000000..36a32f6 --- /dev/null +++ b/scripts/constants.gd.uid @@ -0,0 +1 @@ +uid://0wnia2p8acl5 diff --git a/scripts/door_scene_manager.gd b/scripts/door_scene_manager.gd index 696744a..04e75ea 100644 --- a/scripts/door_scene_manager.gd +++ b/scripts/door_scene_manager.gd @@ -85,5 +85,5 @@ func change_scene(): changing_scene = true - Globals.request_update_player_position.emit() + Events.request_update_player_position.emit() SceneManager.change_scene(to_scene, scene_manager_options) diff --git a/scripts/door_scene_manager.gd.uid b/scripts/door_scene_manager.gd.uid new file mode 100644 index 0000000..2c090ed --- /dev/null +++ b/scripts/door_scene_manager.gd.uid @@ -0,0 +1 @@ +uid://b5wo0m62qrv44 diff --git a/scripts/events.gd b/scripts/events.gd new file mode 100644 index 0000000..3cd09ee --- /dev/null +++ b/scripts/events.gd @@ -0,0 +1,5 @@ +extends Node + +signal request_update_player_position +signal game_paused(paused: bool) +signal inventory_open(open: bool) diff --git a/scripts/events.gd.uid b/scripts/events.gd.uid new file mode 100644 index 0000000..680aa6c --- /dev/null +++ b/scripts/events.gd.uid @@ -0,0 +1 @@ +uid://rcf2owkufplh diff --git a/scripts/globals.gd b/scripts/globals.gd index 6ce2d34..40573bc 100644 --- a/scripts/globals.gd +++ b/scripts/globals.gd @@ -17,10 +17,6 @@ var player_positions: Array[_PlayerPositionAt] var last_scene_updated: Constants.LEVELS_NAMES -@warning_ignore("unused_signal") # this signal is called by other classes, was never intended to be called from itself -signal request_update_player_position - - func update_player_position(scene: Constants.LEVELS_NAMES, new_position: Vector2): last_scene_updated = scene diff --git a/scripts/globals.gd.uid b/scripts/globals.gd.uid new file mode 100644 index 0000000..2c81bed --- /dev/null +++ b/scripts/globals.gd.uid @@ -0,0 +1 @@ +uid://d2ubolfbi143e diff --git a/scripts/house_template.gd b/scripts/house_template.gd index 456bf50..b5fa12c 100644 --- a/scripts/house_template.gd +++ b/scripts/house_template.gd @@ -8,9 +8,9 @@ const LEVEL_NAME = "house_template" func _ready(): - Globals.request_update_player_position.connect(update_player_position) - Globals.set_current_scene(Constants.LEVELS_NAMES[LEVEL_NAME]) + Events.request_update_player_position.connect(update_player_position) + Globals.set_current_scene(Constants.LEVELS_NAMES.get(LEVEL_NAME)) func update_player_position(): - Globals.update_player_position(Constants.LEVELS_NAMES[LEVEL_NAME], player.position) + Globals.update_player_position(Constants.LEVELS_NAMES.get(LEVEL_NAME), player.position) diff --git a/scripts/house_template.gd.uid b/scripts/house_template.gd.uid new file mode 100644 index 0000000..c6f6a81 --- /dev/null +++ b/scripts/house_template.gd.uid @@ -0,0 +1 @@ +uid://bv1k68dotk1b0 diff --git a/scripts/inventory.gd b/scripts/inventory.gd index 7a2457b..426070d 100644 --- a/scripts/inventory.gd +++ b/scripts/inventory.gd @@ -3,14 +3,17 @@ extends Control var inventory_open: bool = false var save_menu: Node +var game_paused: bool = false + func _ready(): visible = inventory_open + Events.game_paused.connect(_on_game_paused_signal) func _process(_delta): - if Input.is_action_just_pressed("ui_inventory"): + if Input.is_action_just_pressed("ui_inventory") && not game_paused: open_inventory() print("open inventory (", inventory_open, ")") @@ -19,7 +22,12 @@ func open_inventory(): inventory_open = !inventory_open visible = inventory_open get_tree().paused = inventory_open + Events.inventory_open.emit(inventory_open) func _on_return_button_pressed(): open_inventory() + + +func _on_game_paused_signal(paused: bool): + game_paused = paused diff --git a/scripts/inventory.gd.uid b/scripts/inventory.gd.uid new file mode 100644 index 0000000..74f2325 --- /dev/null +++ b/scripts/inventory.gd.uid @@ -0,0 +1 @@ +uid://dleuvr2p33hex diff --git a/scripts/main_level.gd b/scripts/main_level.gd index 75567bb..9036077 100644 --- a/scripts/main_level.gd +++ b/scripts/main_level.gd @@ -8,7 +8,7 @@ const LEVEL_NAME = "main_level" func _ready(): - Globals.request_update_player_position.connect(update_player_position) + Events.request_update_player_position.connect(update_player_position) Globals.set_current_scene(Constants.LEVELS_NAMES[LEVEL_NAME] as Constants.LEVELS_NAMES) # get player poss diff --git a/scripts/main_level.gd.uid b/scripts/main_level.gd.uid new file mode 100644 index 0000000..635b121 --- /dev/null +++ b/scripts/main_level.gd.uid @@ -0,0 +1 @@ +uid://2k5farej1c8m diff --git a/scripts/pause_menu.gd b/scripts/pause_menu.gd index 20df73a..20548a1 100644 --- a/scripts/pause_menu.gd +++ b/scripts/pause_menu.gd @@ -3,24 +3,29 @@ extends Control var paused: bool = false var save_menu: Node +var is_inventory_open: bool = false + func _ready(): visible = paused + Events.inventory_open.connect(_on_inventory_open) func _process(_delta): - if Input.is_action_just_pressed("ui_cancel"): + if Input.is_action_just_pressed("ui_cancel") && not is_inventory_open: pause_game() func pause_game(): # update player position before pausing the execution - Globals.request_update_player_position.emit() + Events.request_update_player_position.emit() paused = !paused get_tree().paused = paused visible = paused + Events.game_paused.emit(paused) + if !paused: close_save_menu() @@ -46,3 +51,7 @@ func _on_save_button_pressed(): func _on_load_button_pressed(): open_save_menu(false) + + +func _on_inventory_open(open: bool): + is_inventory_open = open diff --git a/scripts/pause_menu.gd.uid b/scripts/pause_menu.gd.uid new file mode 100644 index 0000000..0a70c02 --- /dev/null +++ b/scripts/pause_menu.gd.uid @@ -0,0 +1 @@ +uid://dhm3u3n5lqe1f diff --git a/scripts/player.gd.uid b/scripts/player.gd.uid new file mode 100644 index 0000000..dd0d544 --- /dev/null +++ b/scripts/player.gd.uid @@ -0,0 +1 @@ +uid://dx15rxub22ius diff --git a/scripts/save_menu.gd.uid b/scripts/save_menu.gd.uid new file mode 100644 index 0000000..294551e --- /dev/null +++ b/scripts/save_menu.gd.uid @@ -0,0 +1 @@ +uid://dm2h8o2ppm2ou diff --git a/assets/shaders/water.gdshader b/vfx/water.gdshader similarity index 100% rename from assets/shaders/water.gdshader rename to vfx/water.gdshader diff --git a/vfx/water.gdshader.uid b/vfx/water.gdshader.uid new file mode 100644 index 0000000..4f15e88 --- /dev/null +++ b/vfx/water.gdshader.uid @@ -0,0 +1 @@ +uid://dsxkpfujpmsuo -- 2.30.2