From b99855351dea55d5bc8fc97516042cf1c5ef7318 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerard=20Gasc=C3=B3n?= <52170489+GerardGascon@users.noreply.github.com> Date: Thu, 24 Apr 2025 17:23:34 +0200 Subject: [PATCH] init --- .gitattributes | 57 + .gitignore | 2 + README.md | 32 + addons/inkgd/LICENSE | 23 + .../editor/common/executors/ink_compiler.gd | 146 + .../executors/ink_configuration_tester.gd | 152 + .../ink_external_command_executor.gd | 32 + .../ink_compilation_configuration.gd | 44 + .../structures/ink_execution_configuration.gd | 49 + .../structures/ink_execution_result.gd | 44 + .../inkgd/editor/common/ink_configuration.gd | 204 + .../editor/common/ink_csharp_validator.gd | 103 + .../editor/common/ink_editor_interface.gd | 84 + addons/inkgd/editor/icons/compile.svg | 3 + addons/inkgd/editor/icons/compile.svg.import | 37 + addons/inkgd/editor/icons/ink_player.svg | 3 + .../inkgd/editor/icons/ink_player.svg.import | 37 + .../import_plugins/ink_json_import_plugin.gd | 94 + .../editor/import_plugins/ink_resource.gd | 16 + .../ink_source_import_plugin.gd | 51 + addons/inkgd/editor/ink_editor_plugin.gd | 283 ++ .../panel/common/ink_progress_dialog.gd | 57 + .../panel/common/ink_progress_dialog.tscn | 63 + .../editor/panel/common/ink_rich_dialog.gd | 103 + .../editor/panel/common/ink_rich_dialog.tscn | 89 + .../configuration/ink_configuration_panel.gd | 306 ++ .../ink_configuration_panel.tscn | 258 ++ addons/inkgd/editor/panel/ink_bottom_panel.gd | 106 + .../inkgd/editor/panel/ink_bottom_panel.tscn | 51 + .../editor/panel/preview/ink_preview_panel.gd | 366 ++ .../panel/preview/ink_preview_panel.tscn | 119 + .../panel/stories/empty_state_container.tscn | 13 + .../panel/stories/ink_story_configuration.gd | 153 + .../stories/ink_story_configuration.tscn | 189 + .../editor/panel/stories/ink_story_panel.gd | 524 +++ .../editor/panel/stories/ink_story_panel.tscn | 75 + addons/inkgd/editor/templates/.gdignore | 0 addons/inkgd/editor/templates/ink_template.gd | 101 + .../editor/templates/ink_template_signals.gd | 107 + addons/inkgd/ink_player.gd | 886 ++++ addons/inkgd/ink_player_factory.gd | 49 + addons/inkgd/mono/InkBridger.cs | 182 + addons/inkgd/mono/InkPlayer.cs | 1271 ++++++ addons/inkgd/mono/assemblies/.gitkeep | 0 addons/inkgd/plugin.cfg | 7 + addons/inkgd/runtime.gd | 35 + addons/inkgd/runtime/callstack.gd | 457 ++ addons/inkgd/runtime/common/ink.gd | 24 + addons/inkgd/runtime/common/ink_base.gd | 31 + addons/inkgd/runtime/common/ink_object.gd | 212 + .../runtime/content/choices/ink_choice.gd | 58 + .../content/choices/ink_choice_point.gd | 122 + addons/inkgd/runtime/content/ink_container.gd | 333 ++ .../runtime/content/ink_control_command.gd | 213 + addons/inkgd/runtime/content/ink_divert.gd | 145 + addons/inkgd/runtime/content/ink_glue.gd | 29 + .../content/ink_native_function_call.gd | 372 ++ addons/inkgd/runtime/content/ink_tag.gd | 36 + .../content/ink_variable_assignment.gd | 60 + .../runtime/content/ink_variable_reference.gd | 69 + addons/inkgd/runtime/content/ink_void.gd | 27 + addons/inkgd/runtime/debug_metadata.gd | 76 + addons/inkgd/runtime/extra/function_result.gd | 24 + .../inkgd/runtime/extra/ink_key_value_pair.gd | 39 + addons/inkgd/runtime/extra/state_element.gd | 50 + addons/inkgd/runtime/extra/stopwatch.gd | 34 + addons/inkgd/runtime/extra/story_error.gd | 31 + .../runtime/extra/story_error_metadata.gd | 30 + addons/inkgd/runtime/extra/string_set.gd | 63 + addons/inkgd/runtime/extra/string_writer.gd | 33 + addons/inkgd/runtime/extra/try_get_result.gd | 25 + addons/inkgd/runtime/extra/utils.gd | 272 ++ addons/inkgd/runtime/flow.gd | 154 + addons/inkgd/runtime/ink_path.gd | 294 ++ addons/inkgd/runtime/lists/ink_list.gd | 522 +++ addons/inkgd/runtime/lists/list_definition.gd | 102 + .../runtime/lists/list_definitions_origin.gd | 86 + .../runtime/lists/structs/ink_list_item.gd | 159 + addons/inkgd/runtime/profiler.gd | 57 + addons/inkgd/runtime/search_result.gd | 41 + addons/inkgd/runtime/simple_json.gd | 588 +++ addons/inkgd/runtime/state_patch.gd | 105 + addons/inkgd/runtime/static/ink_runtime.gd | 200 + addons/inkgd/runtime/static/json.gd | 623 +++ .../runtime/static/native_function_call.gd | 284 ++ addons/inkgd/runtime/story.gd | 2095 +++++++++ addons/inkgd/runtime/story_state.gd | 1144 +++++ addons/inkgd/runtime/structs/pointer.gd | 125 + addons/inkgd/runtime/values/bool_value.gd | 62 + .../runtime/values/divert_target_value.gd | 60 + addons/inkgd/runtime/values/float_value.gd | 59 + addons/inkgd/runtime/values/int_value.gd | 59 + addons/inkgd/runtime/values/list_value.gd | 90 + addons/inkgd/runtime/values/string_value.gd | 82 + addons/inkgd/runtime/values/value.gd | 131 + addons/inkgd/runtime/values/value_type.gd | 23 + .../runtime/values/variable_pointer_value.gd | 69 + addons/inkgd/runtime/variables_state.gd | 373 ++ audio/Ambiente.ogg | 3 + audio/Ambiente.ogg.import | 19 + audio/Sounds/destruirFoto.ogg | 3 + audio/Sounds/destruirFoto.ogg.import | 19 + audio/Sounds/foto1.ogg | 3 + audio/Sounds/foto1.ogg.import | 19 + audio/Sounds/foto2.ogg | 3 + audio/Sounds/foto2.ogg.import | 19 + audio/Sounds/foto3.ogg | 3 + audio/Sounds/foto3.ogg.import | 19 + audio/Sounds/paso1.ogg | 3 + audio/Sounds/paso1.ogg.import | 19 + audio/Sounds/paso2.ogg | 3 + audio/Sounds/paso2.ogg.import | 19 + audio/Sounds/paso3.ogg | 3 + audio/Sounds/paso3.ogg.import | 19 + audio/Sounds/paso4.ogg | 3 + audio/Sounds/paso4.ogg.import | 19 + audio/Sounds/texto1.ogg | 3 + audio/Sounds/texto1.ogg.import | 19 + audio/Sounds/texto2.ogg | 3 + audio/Sounds/texto2.ogg.import | 19 + audio/Sounds/texto3.ogg | 3 + audio/Sounds/texto3.ogg.import | 19 + audio/Sounds/texto4.ogg | 3 + audio/Sounds/texto4.ogg.import | 19 + audio/Sounds/texto5.ogg | 3 + audio/Sounds/texto5.ogg.import | 19 + audio/Sounds/texto6.ogg | 3 + audio/Sounds/texto6.ogg.import | 19 + audio/gameplay01.ogg | 3 + audio/gameplay01.ogg.import | 19 + audio/gameplay02L.ogg | 3 + audio/gameplay02L.ogg.import | 19 + audio/gameplay03.ogg | 3 + audio/gameplay03.ogg.import | 19 + audio/gameplay04L.ogg | 3 + audio/gameplay04L.ogg.import | 19 + audio/gameplay05.ogg | 3 + audio/gameplay05.ogg.import | 19 + audio/gameplay06.ogg | 3 + audio/gameplay06.ogg.import | 19 + audio/gameplay07L.ogg | 3 + audio/gameplay07L.ogg.import | 19 + audio/gameplay08.ogg | 3 + audio/gameplay08.ogg.import | 19 + dialogues/character1.ink | 40 + dialogues/character1.ink.import | 14 + dialogues/character1.json | 1 + dialogues/character1.json.import | 15 + dialogues/character2.ink | 43 + dialogues/character2.ink.import | 14 + dialogues/character2.json | 1 + dialogues/character2.json.import | 15 + dialogues/character3.ink | 36 + dialogues/character3.ink.import | 14 + dialogues/character3.json | 1 + dialogues/character3.json.import | 15 + dialogues/character4.ink | 39 + dialogues/character4.ink.import | 14 + dialogues/character4.json | 1 + dialogues/character4.json.import | 15 + dialogues/character5.ink | 45 + dialogues/character5.ink.import | 14 + dialogues/character5.json | 1 + dialogues/character5.json.import | 15 + dialogues/foto1.ink | 5 + dialogues/foto1.ink.import | 14 + dialogues/foto1.json | 1 + dialogues/foto1.json.import | 15 + dialogues/foto2.ink | 5 + dialogues/foto2.ink.import | 14 + dialogues/foto2.json | 1 + dialogues/foto2.json.import | 15 + dialogues/foto3.ink | 5 + dialogues/foto3.ink.import | 14 + dialogues/foto3.json | 1 + dialogues/foto3.json.import | 15 + dialogues/foto4.ink | 5 + dialogues/foto4.ink.import | 14 + dialogues/foto4.json | 1 + dialogues/foto4.json.import | 15 + dialogues/foto5.ink | 5 + dialogues/foto5.ink.import | 14 + dialogues/foto5.json | 1 + dialogues/foto5.json.import | 15 + dialogues/variables.ink | 17 + dialogues/variables.ink.import | 14 + export_presets.cfg | 61 + fonts/ReadexPro-Regular.ttf | 3 + fonts/ReadexPro-Regular.ttf.import | 33 + icon.ico | Bin 0 -> 102443 bytes icon.png | 3 + icon.png.import | 34 + materials/MainTexture.tres | 8 + materials/MainTextureTransparent.tres | 10 + .../general_texture-Recovered.png.import | 34 + materials/opaque_plane.tres | 9 + materials/opaque_terrains.tres | 8 + materials/plants_opacity.tres | 11 + materials/sol_sol.png.import | 35 + materials/sun.tres | 11 + materials/sun_inner.tres | 5 + materials/sun_outer.tres | 5 + materials/textures/Characters.png | 3 + materials/textures/Characters.png.import | 34 + materials/textures/dummy.png | 3 + materials/textures/dummy.png.import | 35 + materials/textures/hojas_1.png | 3 + materials/textures/hojas_1.png.import | 34 + materials/textures/hojas_2.png | 3 + materials/textures/hojas_2.png.import | 34 + materials/textures/paleta2.png | 3 + materials/textures/paleta2.png.import | 34 + materials/textures/sol_sol.png | 3 + materials/textures/sol_sol.png.import | 34 + materials/textures/vegetation_terrains.png | 3 + .../textures/vegetation_terrains.png.import | 34 + materials/tree1.tres | 10 + models/Buc.glb | 3 + models/Buc.glb.import | 3639 +++++++++++++++ models/Buc_general_texture-Recovered.png | 3 + .../Buc_general_texture-Recovered.png.import | 36 + models/Myd.glb | 3 + models/Myd.glb.import | 3639 +++++++++++++++ models/Myd_general_texture-Recovered.png | 3 + .../Myd_general_texture-Recovered.png.import | 36 + models/arbusto.glb | 3 + models/arbusto.glb.import | 39 + models/arbusto_vegetation_terrains.png | 3 + models/arbusto_vegetation_terrains.png.import | 35 + models/banco.glb | 3 + models/banco.glb.import | 39 + models/banco_vegetation_terrains.png | 3 + models/banco_vegetation_terrains.png.import | 36 + models/barco.glb | 3 + models/barco.glb.import | 39 + models/barco_vegetation_terrains.png | 3 + models/barco_vegetation_terrains.png.import | 35 + models/caja.glb | 3 + models/caja.glb.import | 39 + models/caja_vegetation_terrains.png | 3 + models/caja_vegetation_terrains.png.import | 36 + models/cama.glb | 3 + models/cama.glb.import | 39 + models/cama_vegetation_terrains.png | 3 + models/cama_vegetation_terrains.png.import | 36 + models/captain_D._Ed.glb | 3 + models/captain_D._Ed.glb.import | 3643 +++++++++++++++ .../captain_D_general_texture-Recovered.png | 3 + ...ain_D_general_texture-Recovered.png.import | 36 + models/casa.glb | 3 + models/casa.glb.import | 39 + models/casa_vegetation_terrains.png | 3 + models/casa_vegetation_terrains.png.import | 36 + models/cesped.glb | 3 + models/cesped.glb.import | 39 + models/cesped_vegetation_terrains.png | 3 + models/cesped_vegetation_terrains.png.import | 35 + models/dawg.glb | 3 + models/dawg.glb.import | 3639 +++++++++++++++ models/dawg_general_texture-Recovered.png | 3 + .../dawg_general_texture-Recovered.png.import | 36 + models/faro.glb | 3 + models/faro.glb.import | 39 + models/faro_vegetation_terrains.png | 3 + models/faro_vegetation_terrains.png.import | 36 + models/fence.glb | 3 + models/fence.glb.import | 39 + models/fence_vegetation_terrains.png | 3 + models/fence_vegetation_terrains.png.import | 35 + models/floor.glb | 3 + models/floor.glb.import | 43 + ...r_Myd_general_texture-Recovered.png.import | 35 + models/floor_vegetation_terrains.png | 3 + models/floor_vegetation_terrains.png.import | 36 + models/flotador.glb | 3 + models/flotador.glb.import | 39 + models/flotador_vegetation_terrains.png | 3 + .../flotador_vegetation_terrains.png.import | 35 + models/hojas_suelo.glb | 3 + models/hojas_suelo.glb.import | 39 + models/hojas_suelo_hojas_2.png | 3 + models/hojas_suelo_hojas_2.png.import | 36 + models/lianas.glb | 3 + models/lianas.glb.import | 39 + models/lianas_vegetation_terrains.png | 3 + models/lianas_vegetation_terrains.png.import | 35 + models/madera.glb | 3 + models/madera.glb.import | 39 + models/madera_vegetation_terrains.png | 3 + models/madera_vegetation_terrains.png.import | 35 + models/mueele.glb | 3 + models/mueele.glb.import | 43 + .../mueele_Myd_general_texture-Recovered.png | 3 + ...e_Myd_general_texture-Recovered.png.import | 36 + models/mueele_vegetation_terrains.png | 3 + models/mueele_vegetation_terrains.png.import | 36 + models/mum.glb | 3 + models/mum.glb.import | 3639 +++++++++++++++ models/mum_general_texture-Recovered.png | 3 + .../mum_general_texture-Recovered.png.import | 36 + models/paleta.png.import | 34 + models/palm.glb | 3 + models/palm.glb.import | 39 + models/palm2.glb | 3 + models/palm2.glb.import | 43 + .../palm2_Myd_general_texture-Recovered.png | 3 + ...2_Myd_general_texture-Recovered.png.import | 35 + ...m_Myd_general_texture-Recovered.png.import | 36 + models/palm_vegetation_terrains.png | 3 + models/palm_vegetation_terrains.png.import | 35 + models/parasol.glb | 3 + models/parasol.glb.import | 39 + models/parasol_vegetation_terrains.png | 3 + models/parasol_vegetation_terrains.png.import | 36 + models/planta_cueva.glb | 3 + models/planta_cueva.glb.import | 39 + models/planta_cueva_vegetation_terrains.png | 3 + ...lanta_cueva_vegetation_terrains.png.import | 35 + models/ship1.glb | 3 + models/ship1.glb.import | 39 + models/ship1_vegetation_terrains.png | 3 + models/ship1_vegetation_terrains.png.import | 36 + models/ship2.glb | 3 + models/ship2.glb.import | 39 + models/ship2_vegetation_terrains.png | 3 + models/ship2_vegetation_terrains.png.import | 35 + models/sol.glb | 3 + models/sol.glb.import | 39 + models/sol_sol.png | 3 + models/sol_sol.png.import | 36 + models/stalactita_vegetation_terrains.png | 3 + .../stalactita_vegetation_terrains.png.import | 36 + models/stalactitaglb.glb | 3 + models/stalactitaglb.glb.import | 39 + models/stalactitaglb_vegetation_terrains.png | 3 + ...alactitaglb_vegetation_terrains.png.import | 35 + models/tleafs.glb | 3 + models/tleafs.glb.import | 39 + models/tleafs_hojas_2.png | 3 + models/tleafs_hojas_2.png.import | 35 + models/tobogan.glb | 3 + models/tobogan.glb.import | 39 + models/tobogan_vegetation_terrains.png | 3 + models/tobogan_vegetation_terrains.png.import | 36 + models/tree.glb | 3 + models/tree.glb.import | 39 + models/tree_vegetation_terrains.png | 3 + models/tree_vegetation_terrains.png.import | 35 + prefabs/Palm.tscn | 8 + prefabs/audio_manager.tscn | 27 + prefabs/eyes.tscn | 23 + prefabs/ink_template.tscn | 73 + prefabs/npcs/npc_1.tscn | 19 + prefabs/npcs/npc_1_path.tscn | 22 + prefabs/npcs/npc_2.tscn | 19 + prefabs/npcs/npc_2_path.tscn | 22 + prefabs/npcs/npc_3.tscn | 19 + prefabs/npcs/npc_3_path.tscn | 22 + prefabs/npcs/npc_4.tscn | 19 + prefabs/npcs/npc_4_path.tscn | 22 + prefabs/npcs/npc_5.tscn | 19 + prefabs/npcs/npc_5_path.tscn | 22 + prefabs/photo_preview.tscn | 146 + prefabs/pickups/photo1.tscn | 117 + prefabs/pickups/photo2.tscn | 118 + prefabs/pickups/photo3.tscn | 118 + prefabs/pickups/photo4.tscn | 118 + prefabs/pickups/photo5.tscn | 118 + prefabs/player.tscn | 28 + prefabs/postprocessing/crt.tscn | 37 + prefabs/postprocessing/pixelation.tscn | 27 + prefabs/tree.tscn | 19 + project.godot | 104 + rcedit-x64.exe | Bin 0 -> 1308672 bytes scenes/cutscene.gd | 23 + scenes/ending.tscn | 4036 +++++++++++++++++ scenes/main.tscn | 3461 ++++++++++++++ scenes/scene_transition.gd | 21 + scenes/scene_transition.tscn | 207 + script_templates/.gdignore | 0 script_templates/ink_template.gd | 101 + script_templates/ink_template_signals.gd | 107 + scripts/audio_manager.gd | 65 + scripts/counter.gd | 20 + scripts/dialogue/ink_handler.gd | 133 + scripts/main_menu.gd | 9 + scripts/npc/npc.gd | 23 + scripts/npc/npc_path_follow.gd | 29 + scripts/npc/photo.gd | 21 + scripts/npc/pickup.gd | 27 + scripts/player/eyes.gd | 93 + scripts/player/player.gd | 84 + scripts/shaders/Perlin_noise_example.png | 3 + .../shaders/Perlin_noise_example.png.import | 35 + scripts/shaders/cloud.gdshader | 46 + scripts/shaders/crt.gdshader | 231 + scripts/shaders/dissolve.gdshader | 11 + scripts/shaders/pixelation.gdshader | 45 + scripts/shaders/water.gdshader | 199 + scripts/singletons/dialogue_manager.gd | 56 + sprites/characters_trasparent.png | 3 + sprites/characters_trasparent.png.import | 34 + sprites/credits_trasparent.png | 3 + sprites/credits_trasparent.png.import | 34 + sprites/dialogue_box.png | 3 + sprites/dialogue_box.png.import | 34 + sprites/eye_half-export.png | 3 + sprites/eye_half-export.png.import | 34 + sprites/eye_half.png | 3 + sprites/eye_half.png.import | 34 + sprites/foto1.png | 3 + sprites/foto1.png.import | 34 + sprites/foto2.png | 3 + sprites/foto2.png.import | 34 + sprites/foto3.png | 3 + sprites/foto3.png.import | 34 + sprites/foto4.png | 3 + sprites/foto4.png.import | 34 + sprites/foto5.png | 3 + sprites/foto5.png.import | 34 + sprites/foto_test.png | 3 + sprites/foto_test.png.import | 35 + sprites/palette.png | 3 + sprites/palette.png.import | 34 + sprites/palette1.png | 3 + sprites/palette1.png.import | 34 + sprites/splashart-export.png | 3 + sprites/splashart-export.png.import | 34 + sprites/splashart.png | 3 + sprites/splashart.png.import | 34 + untitled.glb | 3 + untitled.glb.import | 32 + untitled1.glb | 3 + untitled1.glb.import | 32 + 434 files changed, 50357 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 README.md create mode 100644 addons/inkgd/LICENSE create mode 100644 addons/inkgd/editor/common/executors/ink_compiler.gd create mode 100644 addons/inkgd/editor/common/executors/ink_configuration_tester.gd create mode 100644 addons/inkgd/editor/common/executors/ink_external_command_executor.gd create mode 100644 addons/inkgd/editor/common/executors/structures/ink_compilation_configuration.gd create mode 100644 addons/inkgd/editor/common/executors/structures/ink_execution_configuration.gd create mode 100644 addons/inkgd/editor/common/executors/structures/ink_execution_result.gd create mode 100644 addons/inkgd/editor/common/ink_configuration.gd create mode 100644 addons/inkgd/editor/common/ink_csharp_validator.gd create mode 100644 addons/inkgd/editor/common/ink_editor_interface.gd create mode 100644 addons/inkgd/editor/icons/compile.svg create mode 100644 addons/inkgd/editor/icons/compile.svg.import create mode 100644 addons/inkgd/editor/icons/ink_player.svg create mode 100644 addons/inkgd/editor/icons/ink_player.svg.import create mode 100644 addons/inkgd/editor/import_plugins/ink_json_import_plugin.gd create mode 100644 addons/inkgd/editor/import_plugins/ink_resource.gd create mode 100644 addons/inkgd/editor/import_plugins/ink_source_import_plugin.gd create mode 100644 addons/inkgd/editor/ink_editor_plugin.gd create mode 100644 addons/inkgd/editor/panel/common/ink_progress_dialog.gd create mode 100644 addons/inkgd/editor/panel/common/ink_progress_dialog.tscn create mode 100644 addons/inkgd/editor/panel/common/ink_rich_dialog.gd create mode 100644 addons/inkgd/editor/panel/common/ink_rich_dialog.tscn create mode 100644 addons/inkgd/editor/panel/configuration/ink_configuration_panel.gd create mode 100644 addons/inkgd/editor/panel/configuration/ink_configuration_panel.tscn create mode 100644 addons/inkgd/editor/panel/ink_bottom_panel.gd create mode 100644 addons/inkgd/editor/panel/ink_bottom_panel.tscn create mode 100644 addons/inkgd/editor/panel/preview/ink_preview_panel.gd create mode 100644 addons/inkgd/editor/panel/preview/ink_preview_panel.tscn create mode 100644 addons/inkgd/editor/panel/stories/empty_state_container.tscn create mode 100644 addons/inkgd/editor/panel/stories/ink_story_configuration.gd create mode 100644 addons/inkgd/editor/panel/stories/ink_story_configuration.tscn create mode 100644 addons/inkgd/editor/panel/stories/ink_story_panel.gd create mode 100644 addons/inkgd/editor/panel/stories/ink_story_panel.tscn create mode 100644 addons/inkgd/editor/templates/.gdignore create mode 100644 addons/inkgd/editor/templates/ink_template.gd create mode 100644 addons/inkgd/editor/templates/ink_template_signals.gd create mode 100644 addons/inkgd/ink_player.gd create mode 100644 addons/inkgd/ink_player_factory.gd create mode 100644 addons/inkgd/mono/InkBridger.cs create mode 100644 addons/inkgd/mono/InkPlayer.cs create mode 100644 addons/inkgd/mono/assemblies/.gitkeep create mode 100644 addons/inkgd/plugin.cfg create mode 100644 addons/inkgd/runtime.gd create mode 100644 addons/inkgd/runtime/callstack.gd create mode 100644 addons/inkgd/runtime/common/ink.gd create mode 100644 addons/inkgd/runtime/common/ink_base.gd create mode 100644 addons/inkgd/runtime/common/ink_object.gd create mode 100644 addons/inkgd/runtime/content/choices/ink_choice.gd create mode 100644 addons/inkgd/runtime/content/choices/ink_choice_point.gd create mode 100644 addons/inkgd/runtime/content/ink_container.gd create mode 100644 addons/inkgd/runtime/content/ink_control_command.gd create mode 100644 addons/inkgd/runtime/content/ink_divert.gd create mode 100644 addons/inkgd/runtime/content/ink_glue.gd create mode 100644 addons/inkgd/runtime/content/ink_native_function_call.gd create mode 100644 addons/inkgd/runtime/content/ink_tag.gd create mode 100644 addons/inkgd/runtime/content/ink_variable_assignment.gd create mode 100644 addons/inkgd/runtime/content/ink_variable_reference.gd create mode 100644 addons/inkgd/runtime/content/ink_void.gd create mode 100644 addons/inkgd/runtime/debug_metadata.gd create mode 100644 addons/inkgd/runtime/extra/function_result.gd create mode 100644 addons/inkgd/runtime/extra/ink_key_value_pair.gd create mode 100644 addons/inkgd/runtime/extra/state_element.gd create mode 100644 addons/inkgd/runtime/extra/stopwatch.gd create mode 100644 addons/inkgd/runtime/extra/story_error.gd create mode 100644 addons/inkgd/runtime/extra/story_error_metadata.gd create mode 100644 addons/inkgd/runtime/extra/string_set.gd create mode 100644 addons/inkgd/runtime/extra/string_writer.gd create mode 100644 addons/inkgd/runtime/extra/try_get_result.gd create mode 100644 addons/inkgd/runtime/extra/utils.gd create mode 100644 addons/inkgd/runtime/flow.gd create mode 100644 addons/inkgd/runtime/ink_path.gd create mode 100644 addons/inkgd/runtime/lists/ink_list.gd create mode 100644 addons/inkgd/runtime/lists/list_definition.gd create mode 100644 addons/inkgd/runtime/lists/list_definitions_origin.gd create mode 100644 addons/inkgd/runtime/lists/structs/ink_list_item.gd create mode 100644 addons/inkgd/runtime/profiler.gd create mode 100644 addons/inkgd/runtime/search_result.gd create mode 100644 addons/inkgd/runtime/simple_json.gd create mode 100644 addons/inkgd/runtime/state_patch.gd create mode 100644 addons/inkgd/runtime/static/ink_runtime.gd create mode 100644 addons/inkgd/runtime/static/json.gd create mode 100644 addons/inkgd/runtime/static/native_function_call.gd create mode 100644 addons/inkgd/runtime/story.gd create mode 100644 addons/inkgd/runtime/story_state.gd create mode 100644 addons/inkgd/runtime/structs/pointer.gd create mode 100644 addons/inkgd/runtime/values/bool_value.gd create mode 100644 addons/inkgd/runtime/values/divert_target_value.gd create mode 100644 addons/inkgd/runtime/values/float_value.gd create mode 100644 addons/inkgd/runtime/values/int_value.gd create mode 100644 addons/inkgd/runtime/values/list_value.gd create mode 100644 addons/inkgd/runtime/values/string_value.gd create mode 100644 addons/inkgd/runtime/values/value.gd create mode 100644 addons/inkgd/runtime/values/value_type.gd create mode 100644 addons/inkgd/runtime/values/variable_pointer_value.gd create mode 100644 addons/inkgd/runtime/variables_state.gd create mode 100644 audio/Ambiente.ogg create mode 100644 audio/Ambiente.ogg.import create mode 100644 audio/Sounds/destruirFoto.ogg create mode 100644 audio/Sounds/destruirFoto.ogg.import create mode 100644 audio/Sounds/foto1.ogg create mode 100644 audio/Sounds/foto1.ogg.import create mode 100644 audio/Sounds/foto2.ogg create mode 100644 audio/Sounds/foto2.ogg.import create mode 100644 audio/Sounds/foto3.ogg create mode 100644 audio/Sounds/foto3.ogg.import create mode 100644 audio/Sounds/paso1.ogg create mode 100644 audio/Sounds/paso1.ogg.import create mode 100644 audio/Sounds/paso2.ogg create mode 100644 audio/Sounds/paso2.ogg.import create mode 100644 audio/Sounds/paso3.ogg create mode 100644 audio/Sounds/paso3.ogg.import create mode 100644 audio/Sounds/paso4.ogg create mode 100644 audio/Sounds/paso4.ogg.import create mode 100644 audio/Sounds/texto1.ogg create mode 100644 audio/Sounds/texto1.ogg.import create mode 100644 audio/Sounds/texto2.ogg create mode 100644 audio/Sounds/texto2.ogg.import create mode 100644 audio/Sounds/texto3.ogg create mode 100644 audio/Sounds/texto3.ogg.import create mode 100644 audio/Sounds/texto4.ogg create mode 100644 audio/Sounds/texto4.ogg.import create mode 100644 audio/Sounds/texto5.ogg create mode 100644 audio/Sounds/texto5.ogg.import create mode 100644 audio/Sounds/texto6.ogg create mode 100644 audio/Sounds/texto6.ogg.import create mode 100644 audio/gameplay01.ogg create mode 100644 audio/gameplay01.ogg.import create mode 100644 audio/gameplay02L.ogg create mode 100644 audio/gameplay02L.ogg.import create mode 100644 audio/gameplay03.ogg create mode 100644 audio/gameplay03.ogg.import create mode 100644 audio/gameplay04L.ogg create mode 100644 audio/gameplay04L.ogg.import create mode 100644 audio/gameplay05.ogg create mode 100644 audio/gameplay05.ogg.import create mode 100644 audio/gameplay06.ogg create mode 100644 audio/gameplay06.ogg.import create mode 100644 audio/gameplay07L.ogg create mode 100644 audio/gameplay07L.ogg.import create mode 100644 audio/gameplay08.ogg create mode 100644 audio/gameplay08.ogg.import create mode 100644 dialogues/character1.ink create mode 100644 dialogues/character1.ink.import create mode 100644 dialogues/character1.json create mode 100644 dialogues/character1.json.import create mode 100644 dialogues/character2.ink create mode 100644 dialogues/character2.ink.import create mode 100644 dialogues/character2.json create mode 100644 dialogues/character2.json.import create mode 100644 dialogues/character3.ink create mode 100644 dialogues/character3.ink.import create mode 100644 dialogues/character3.json create mode 100644 dialogues/character3.json.import create mode 100644 dialogues/character4.ink create mode 100644 dialogues/character4.ink.import create mode 100644 dialogues/character4.json create mode 100644 dialogues/character4.json.import create mode 100644 dialogues/character5.ink create mode 100644 dialogues/character5.ink.import create mode 100644 dialogues/character5.json create mode 100644 dialogues/character5.json.import create mode 100644 dialogues/foto1.ink create mode 100644 dialogues/foto1.ink.import create mode 100644 dialogues/foto1.json create mode 100644 dialogues/foto1.json.import create mode 100644 dialogues/foto2.ink create mode 100644 dialogues/foto2.ink.import create mode 100644 dialogues/foto2.json create mode 100644 dialogues/foto2.json.import create mode 100644 dialogues/foto3.ink create mode 100644 dialogues/foto3.ink.import create mode 100644 dialogues/foto3.json create mode 100644 dialogues/foto3.json.import create mode 100644 dialogues/foto4.ink create mode 100644 dialogues/foto4.ink.import create mode 100644 dialogues/foto4.json create mode 100644 dialogues/foto4.json.import create mode 100644 dialogues/foto5.ink create mode 100644 dialogues/foto5.ink.import create mode 100644 dialogues/foto5.json create mode 100644 dialogues/foto5.json.import create mode 100644 dialogues/variables.ink create mode 100644 dialogues/variables.ink.import create mode 100644 export_presets.cfg create mode 100644 fonts/ReadexPro-Regular.ttf create mode 100644 fonts/ReadexPro-Regular.ttf.import create mode 100644 icon.ico create mode 100644 icon.png create mode 100644 icon.png.import create mode 100644 materials/MainTexture.tres create mode 100644 materials/MainTextureTransparent.tres create mode 100644 materials/general_texture-Recovered.png.import create mode 100644 materials/opaque_plane.tres create mode 100644 materials/opaque_terrains.tres create mode 100644 materials/plants_opacity.tres create mode 100644 materials/sol_sol.png.import create mode 100644 materials/sun.tres create mode 100644 materials/sun_inner.tres create mode 100644 materials/sun_outer.tres create mode 100644 materials/textures/Characters.png create mode 100644 materials/textures/Characters.png.import create mode 100644 materials/textures/dummy.png create mode 100644 materials/textures/dummy.png.import create mode 100644 materials/textures/hojas_1.png create mode 100644 materials/textures/hojas_1.png.import create mode 100644 materials/textures/hojas_2.png create mode 100644 materials/textures/hojas_2.png.import create mode 100644 materials/textures/paleta2.png create mode 100644 materials/textures/paleta2.png.import create mode 100644 materials/textures/sol_sol.png create mode 100644 materials/textures/sol_sol.png.import create mode 100644 materials/textures/vegetation_terrains.png create mode 100644 materials/textures/vegetation_terrains.png.import create mode 100644 materials/tree1.tres create mode 100644 models/Buc.glb create mode 100644 models/Buc.glb.import create mode 100644 models/Buc_general_texture-Recovered.png create mode 100644 models/Buc_general_texture-Recovered.png.import create mode 100644 models/Myd.glb create mode 100644 models/Myd.glb.import create mode 100644 models/Myd_general_texture-Recovered.png create mode 100644 models/Myd_general_texture-Recovered.png.import create mode 100644 models/arbusto.glb create mode 100644 models/arbusto.glb.import create mode 100644 models/arbusto_vegetation_terrains.png create mode 100644 models/arbusto_vegetation_terrains.png.import create mode 100644 models/banco.glb create mode 100644 models/banco.glb.import create mode 100644 models/banco_vegetation_terrains.png create mode 100644 models/banco_vegetation_terrains.png.import create mode 100644 models/barco.glb create mode 100644 models/barco.glb.import create mode 100644 models/barco_vegetation_terrains.png create mode 100644 models/barco_vegetation_terrains.png.import create mode 100644 models/caja.glb create mode 100644 models/caja.glb.import create mode 100644 models/caja_vegetation_terrains.png create mode 100644 models/caja_vegetation_terrains.png.import create mode 100644 models/cama.glb create mode 100644 models/cama.glb.import create mode 100644 models/cama_vegetation_terrains.png create mode 100644 models/cama_vegetation_terrains.png.import create mode 100644 models/captain_D._Ed.glb create mode 100644 models/captain_D._Ed.glb.import create mode 100644 models/captain_D_general_texture-Recovered.png create mode 100644 models/captain_D_general_texture-Recovered.png.import create mode 100644 models/casa.glb create mode 100644 models/casa.glb.import create mode 100644 models/casa_vegetation_terrains.png create mode 100644 models/casa_vegetation_terrains.png.import create mode 100644 models/cesped.glb create mode 100644 models/cesped.glb.import create mode 100644 models/cesped_vegetation_terrains.png create mode 100644 models/cesped_vegetation_terrains.png.import create mode 100644 models/dawg.glb create mode 100644 models/dawg.glb.import create mode 100644 models/dawg_general_texture-Recovered.png create mode 100644 models/dawg_general_texture-Recovered.png.import create mode 100644 models/faro.glb create mode 100644 models/faro.glb.import create mode 100644 models/faro_vegetation_terrains.png create mode 100644 models/faro_vegetation_terrains.png.import create mode 100644 models/fence.glb create mode 100644 models/fence.glb.import create mode 100644 models/fence_vegetation_terrains.png create mode 100644 models/fence_vegetation_terrains.png.import create mode 100644 models/floor.glb create mode 100644 models/floor.glb.import create mode 100644 models/floor_Myd_general_texture-Recovered.png.import create mode 100644 models/floor_vegetation_terrains.png create mode 100644 models/floor_vegetation_terrains.png.import create mode 100644 models/flotador.glb create mode 100644 models/flotador.glb.import create mode 100644 models/flotador_vegetation_terrains.png create mode 100644 models/flotador_vegetation_terrains.png.import create mode 100644 models/hojas_suelo.glb create mode 100644 models/hojas_suelo.glb.import create mode 100644 models/hojas_suelo_hojas_2.png create mode 100644 models/hojas_suelo_hojas_2.png.import create mode 100644 models/lianas.glb create mode 100644 models/lianas.glb.import create mode 100644 models/lianas_vegetation_terrains.png create mode 100644 models/lianas_vegetation_terrains.png.import create mode 100644 models/madera.glb create mode 100644 models/madera.glb.import create mode 100644 models/madera_vegetation_terrains.png create mode 100644 models/madera_vegetation_terrains.png.import create mode 100644 models/mueele.glb create mode 100644 models/mueele.glb.import create mode 100644 models/mueele_Myd_general_texture-Recovered.png create mode 100644 models/mueele_Myd_general_texture-Recovered.png.import create mode 100644 models/mueele_vegetation_terrains.png create mode 100644 models/mueele_vegetation_terrains.png.import create mode 100644 models/mum.glb create mode 100644 models/mum.glb.import create mode 100644 models/mum_general_texture-Recovered.png create mode 100644 models/mum_general_texture-Recovered.png.import create mode 100644 models/paleta.png.import create mode 100644 models/palm.glb create mode 100644 models/palm.glb.import create mode 100644 models/palm2.glb create mode 100644 models/palm2.glb.import create mode 100644 models/palm2_Myd_general_texture-Recovered.png create mode 100644 models/palm2_Myd_general_texture-Recovered.png.import create mode 100644 models/palm_Myd_general_texture-Recovered.png.import create mode 100644 models/palm_vegetation_terrains.png create mode 100644 models/palm_vegetation_terrains.png.import create mode 100644 models/parasol.glb create mode 100644 models/parasol.glb.import create mode 100644 models/parasol_vegetation_terrains.png create mode 100644 models/parasol_vegetation_terrains.png.import create mode 100644 models/planta_cueva.glb create mode 100644 models/planta_cueva.glb.import create mode 100644 models/planta_cueva_vegetation_terrains.png create mode 100644 models/planta_cueva_vegetation_terrains.png.import create mode 100644 models/ship1.glb create mode 100644 models/ship1.glb.import create mode 100644 models/ship1_vegetation_terrains.png create mode 100644 models/ship1_vegetation_terrains.png.import create mode 100644 models/ship2.glb create mode 100644 models/ship2.glb.import create mode 100644 models/ship2_vegetation_terrains.png create mode 100644 models/ship2_vegetation_terrains.png.import create mode 100644 models/sol.glb create mode 100644 models/sol.glb.import create mode 100644 models/sol_sol.png create mode 100644 models/sol_sol.png.import create mode 100644 models/stalactita_vegetation_terrains.png create mode 100644 models/stalactita_vegetation_terrains.png.import create mode 100644 models/stalactitaglb.glb create mode 100644 models/stalactitaglb.glb.import create mode 100644 models/stalactitaglb_vegetation_terrains.png create mode 100644 models/stalactitaglb_vegetation_terrains.png.import create mode 100644 models/tleafs.glb create mode 100644 models/tleafs.glb.import create mode 100644 models/tleafs_hojas_2.png create mode 100644 models/tleafs_hojas_2.png.import create mode 100644 models/tobogan.glb create mode 100644 models/tobogan.glb.import create mode 100644 models/tobogan_vegetation_terrains.png create mode 100644 models/tobogan_vegetation_terrains.png.import create mode 100644 models/tree.glb create mode 100644 models/tree.glb.import create mode 100644 models/tree_vegetation_terrains.png create mode 100644 models/tree_vegetation_terrains.png.import create mode 100644 prefabs/Palm.tscn create mode 100644 prefabs/audio_manager.tscn create mode 100644 prefabs/eyes.tscn create mode 100644 prefabs/ink_template.tscn create mode 100644 prefabs/npcs/npc_1.tscn create mode 100644 prefabs/npcs/npc_1_path.tscn create mode 100644 prefabs/npcs/npc_2.tscn create mode 100644 prefabs/npcs/npc_2_path.tscn create mode 100644 prefabs/npcs/npc_3.tscn create mode 100644 prefabs/npcs/npc_3_path.tscn create mode 100644 prefabs/npcs/npc_4.tscn create mode 100644 prefabs/npcs/npc_4_path.tscn create mode 100644 prefabs/npcs/npc_5.tscn create mode 100644 prefabs/npcs/npc_5_path.tscn create mode 100644 prefabs/photo_preview.tscn create mode 100644 prefabs/pickups/photo1.tscn create mode 100644 prefabs/pickups/photo2.tscn create mode 100644 prefabs/pickups/photo3.tscn create mode 100644 prefabs/pickups/photo4.tscn create mode 100644 prefabs/pickups/photo5.tscn create mode 100644 prefabs/player.tscn create mode 100644 prefabs/postprocessing/crt.tscn create mode 100644 prefabs/postprocessing/pixelation.tscn create mode 100644 prefabs/tree.tscn create mode 100644 project.godot create mode 100644 rcedit-x64.exe create mode 100644 scenes/cutscene.gd create mode 100644 scenes/ending.tscn create mode 100644 scenes/main.tscn create mode 100644 scenes/scene_transition.gd create mode 100644 scenes/scene_transition.tscn create mode 100644 script_templates/.gdignore create mode 100644 script_templates/ink_template.gd create mode 100644 script_templates/ink_template_signals.gd create mode 100644 scripts/audio_manager.gd create mode 100644 scripts/counter.gd create mode 100644 scripts/dialogue/ink_handler.gd create mode 100644 scripts/main_menu.gd create mode 100644 scripts/npc/npc.gd create mode 100644 scripts/npc/npc_path_follow.gd create mode 100644 scripts/npc/photo.gd create mode 100644 scripts/npc/pickup.gd create mode 100644 scripts/player/eyes.gd create mode 100644 scripts/player/player.gd create mode 100644 scripts/shaders/Perlin_noise_example.png create mode 100644 scripts/shaders/Perlin_noise_example.png.import create mode 100644 scripts/shaders/cloud.gdshader create mode 100644 scripts/shaders/crt.gdshader create mode 100644 scripts/shaders/dissolve.gdshader create mode 100644 scripts/shaders/pixelation.gdshader create mode 100644 scripts/shaders/water.gdshader create mode 100644 scripts/singletons/dialogue_manager.gd create mode 100644 sprites/characters_trasparent.png create mode 100644 sprites/characters_trasparent.png.import create mode 100644 sprites/credits_trasparent.png create mode 100644 sprites/credits_trasparent.png.import create mode 100644 sprites/dialogue_box.png create mode 100644 sprites/dialogue_box.png.import create mode 100644 sprites/eye_half-export.png create mode 100644 sprites/eye_half-export.png.import create mode 100644 sprites/eye_half.png create mode 100644 sprites/eye_half.png.import create mode 100644 sprites/foto1.png create mode 100644 sprites/foto1.png.import create mode 100644 sprites/foto2.png create mode 100644 sprites/foto2.png.import create mode 100644 sprites/foto3.png create mode 100644 sprites/foto3.png.import create mode 100644 sprites/foto4.png create mode 100644 sprites/foto4.png.import create mode 100644 sprites/foto5.png create mode 100644 sprites/foto5.png.import create mode 100644 sprites/foto_test.png create mode 100644 sprites/foto_test.png.import create mode 100644 sprites/palette.png create mode 100644 sprites/palette.png.import create mode 100644 sprites/palette1.png create mode 100644 sprites/palette1.png.import create mode 100644 sprites/splashart-export.png create mode 100644 sprites/splashart-export.png.import create mode 100644 sprites/splashart.png create mode 100644 sprites/splashart.png.import create mode 100644 untitled.glb create mode 100644 untitled.glb.import create mode 100644 untitled1.glb create mode 100644 untitled1.glb.import diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1b5bde0 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,57 @@ +# Auto detect text files and perform LF normalization +* text=auto +# 3D models +*.3dm filter=lfs diff=lfs merge=lfs -text +*.3ds filter=lfs diff=lfs merge=lfs -text +*.blend filter=lfs diff=lfs merge=lfs -text +*.c4d filter=lfs diff=lfs merge=lfs -text +*.collada filter=lfs diff=lfs merge=lfs -text +*.dae filter=lfs diff=lfs merge=lfs -text +*.dxf filter=lfs diff=lfs merge=lfs -text +*.fbx filter=lfs diff=lfs merge=lfs -text +*.jas filter=lfs diff=lfs merge=lfs -text +*.lws filter=lfs diff=lfs merge=lfs -text +*.lxo filter=lfs diff=lfs merge=lfs -text +*.ma filter=lfs diff=lfs merge=lfs -text +*.max filter=lfs diff=lfs merge=lfs -text +*.mb filter=lfs diff=lfs merge=lfs -text +*.obj filter=lfs diff=lfs merge=lfs -text +*.ply filter=lfs diff=lfs merge=lfs -text +*.skp filter=lfs diff=lfs merge=lfs -text +*.stl filter=lfs diff=lfs merge=lfs -text +*.ztl filter=lfs diff=lfs merge=lfs -text +*.glb filter=lfs diff=lfs merge=lfs -text +# Audio +*.aif filter=lfs diff=lfs merge=lfs -text +*.aiff filter=lfs diff=lfs merge=lfs -text +*.it filter=lfs diff=lfs merge=lfs -text +*.mod filter=lfs diff=lfs merge=lfs -text +*.mp3 filter=lfs diff=lfs merge=lfs -text +*.ogg filter=lfs diff=lfs merge=lfs -text +*.s3m filter=lfs diff=lfs merge=lfs -text +*.wav filter=lfs diff=lfs merge=lfs -text +*.xm filter=lfs diff=lfs merge=lfs -text +*.bank filter=lfs diff=lfs merge=lfs -text +# Fonts +*.otf filter=lfs diff=lfs merge=lfs -text +*.ttf filter=lfs diff=lfs merge=lfs -text +# Images +*.bmp filter=lfs diff=lfs merge=lfs -text +*.exr filter=lfs diff=lfs merge=lfs -text +*.gif filter=lfs diff=lfs merge=lfs -text +*.hdr filter=lfs diff=lfs merge=lfs -text +*.iff filter=lfs diff=lfs merge=lfs -text +*.jpeg filter=lfs diff=lfs merge=lfs -text +*.jpg filter=lfs diff=lfs merge=lfs -text +*.svg filter=lfs diff=lfs merge=lfs -text +*.pict filter=lfs diff=lfs merge=lfs -text +*.png filter=lfs diff=lfs merge=lfs -text +*.psd filter=lfs diff=lfs merge=lfs -text +*.tga filter=lfs diff=lfs merge=lfs -text +*.tif filter=lfs diff=lfs merge=lfs -text +*.tiff filter=lfs diff=lfs merge=lfs -text +Assets/Fonts/Pangolin-Regular_SDF.asset filter=lfs diff=lfs merge=lfs -text +Assets/Fonts/LiberationSans_SDF.asset filter=lfs diff=lfs merge=lfs -text +*.dll filter=lfs diff=lfs merge=lfs -text +*.so filter=lfs diff=lfs merge=lfs -text +*.dylib filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4709183 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# Godot 4+ specific ignores +.godot/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..8f6deeb --- /dev/null +++ b/README.md @@ -0,0 +1,32 @@ +# Figments of the Night + +## Description + +You wake up on a deserted island with no memory of who you are or what you are doing there. You will have to explore its landscapes, meet its other visitors and find clues in order to discover the truth behind this mysterious place… + +or + +you can simply relax in this paradise in the middle of the ocean and accept ignorance… whatever you do, do it before you have to go to sleep… to sleep… + +## Honors + +Indie Spain Jam 2023 — Top 25 Finalist + +## The Team + +> Gerard Gascón - Programming\ +> Marc Batlle - Character Design, 3D Modeling & Narrative\ +> Oriol Jaumot - Level Design & Environment Art\ +> Pedro Astasio - SFXs & Music + +## Game Jam + +Indie Spain Jam 2023 — September 18th - 25th 2023 (1 week) + +## Theme + +The night falls + +## Languages + +Spanish diff --git a/addons/inkgd/LICENSE b/addons/inkgd/LICENSE new file mode 100644 index 0000000..d209350 --- /dev/null +++ b/addons/inkgd/LICENSE @@ -0,0 +1,23 @@ +The MIT License (MIT) + +Copyright (c) 2015-2021 inkle Ltd. +Copyright (c) 2018-2021 Paul Joannon +Copyright (c) 2019-2022 Frédéric Maquin + +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. \ No newline at end of file diff --git a/addons/inkgd/editor/common/executors/ink_compiler.gd b/addons/inkgd/editor/common/executors/ink_compiler.gd new file mode 100644 index 0000000..97d98a4 --- /dev/null +++ b/addons/inkgd/editor/common/executors/ink_compiler.gd @@ -0,0 +1,146 @@ +# ############################################################################ # +# Copyright © 2019-2022 Frédéric Maquin +# Licensed under the MIT License. +# See LICENSE in the project root for license information. +# ############################################################################ # + +extends InkExternalCommandExecutor + +class_name InkCompiler + +# ############################################################################ # +# Imports +# ############################################################################ # + +var InkExecutionResult = load("res://addons/inkgd/editor/common/executors/structures/ink_execution_result.gd") + +# ############################################################################ # +# Private Properties +# ############################################################################ # + +## Ink Configuration +var _configuration: InkCompilationConfiguration + +# ############################################################################ # +# Signals +# ############################################################################ # + +## Emitted when a compilation completed. Note that this doesn't imply that +## the compulation was successful. Check the content of result +## (InkCompiler.Result) for more information. +signal story_compiled(result) + +# ############################################################################ # +# Overrides +# ############################################################################ # + +func _init(configuration: InkCompilationConfiguration): + _configuration = configuration + + if _configuration.use_threads: + _thread = Thread.new() + +# ############################################################################ # +# Methods +# ############################################################################ # + +## Compile the story, based on the compilation configuration provided +## by this object. If `configuration.use_thread` is set to `false`, +## this method will return `true` if the compilation succeeded and `false` +## otherwise. If `configuration.use_thread` is set to `true`, this method +## always returns `true`. +func compile_story() -> bool: + if _configuration.use_threads: + var error = _thread.start(Callable(self, "_compile_story").bind(_configuration), Thread.PRIORITY_HIGH) + + if error != OK: + var result = InkExecutionResult.new( + self.identifier, + _configuration.use_threads, + _configuration.user_triggered, + false, + "" + ) + + call_deferred("emit_signal", "story_compiled", result) + + return true + else: + return _compile_story(_configuration) + +# ############################################################################ # +# Private Helpers +# ############################################################################ # + +## Compile the story, based on the given compilation configuration +## If `configuration.use_thread` is set to `false`, this method will +## return `true` if the compilation succeeded and `false` otherwise. +## If `configuration.use_thread` is set to `false`, this method always +## returns `true`. +func _compile_story(config: InkCompilationConfiguration) -> bool: + print("[inkgd] [INFO] Executing compilation command…") + var return_code = 0 + var output = [] + + var start_time = Time.get_ticks_msec() + + if config.use_mono: + var args = [config.inklecate_path, '-o', config.target_file_path, config.source_file_path] + return_code = OS.execute(config.mono_path, args, output, true, false) + else: + var args = ['-o', config.target_file_path, config.source_file_path] + return_code = OS.execute(config.inklecate_path, args, output, true, false) + + var end_time = Time.get_ticks_msec() + + print("[inkgd] [INFO] Command executed in %dms." % (end_time - start_time)) + + var string_output = PackedStringArray(output) + if _configuration.use_threads: + call_deferred("_handle_compilation_result", config, return_code, string_output) + return true + else: + var result = _process_compilation_result(config, return_code, string_output) + return result.success + + +## Handles the compilation results when exectuted in a different thread. +## +## This method should always be executed on the main thread. +func _handle_compilation_result( + config: InkCompilationConfiguration, + return_code: int, + output: Array +): + _thread.wait_to_finish() + + var result = _process_compilation_result(config, return_code, output) + emit_signal("story_compiled", result) + + +## Process the compilation results turning them into an instance of `Result`. +## +## This method will also print to the editor's output panel. +func _process_compilation_result( + config: InkCompilationConfiguration, + return_code: int, + output: PackedStringArray +) -> InkExecutionResult: + var success: bool = (return_code == 0) + var output_text: String = "\n".join(output).replace(BOM, "").strip_edges() + + if success: + print("[inkgd] [INFO] %s was successfully compiled." % config.source_file_path) + if output_text.length() > 0: + print(output_text) + else: + printerr("[inkgd] [ERROR] Could not compile %s." % config.source_file_path) + printerr(output_text) + + return InkExecutionResult.new( + self.identifier, + config.use_threads, + config.user_triggered, + success, + output_text + ) diff --git a/addons/inkgd/editor/common/executors/ink_configuration_tester.gd b/addons/inkgd/editor/common/executors/ink_configuration_tester.gd new file mode 100644 index 0000000..8b186b3 --- /dev/null +++ b/addons/inkgd/editor/common/executors/ink_configuration_tester.gd @@ -0,0 +1,152 @@ +# ############################################################################ # +# Copyright © 2019-2022 Frédéric Maquin +# Licensed under the MIT License. +# See LICENSE in the project root for license information. +# ############################################################################ # + +extends InkExternalCommandExecutor + +class_name InkConfigurationTester + +# ############################################################################ # +# Imports +# ############################################################################ # + +var InkExecutionResult = load("res://addons/inkgd/editor/common/executors/structures/ink_execution_result.gd") + +# ############################################################################ # +# Private Properties +# ############################################################################ # + +## Ink Configuration +var _configuration: InkExecutionConfiguration + +# ############################################################################ # +# Signals +# ############################################################################ # + +## Emitted when a test completed. Note that this doesn't imply that +## the test was successful. Check the content of result +## (InkConfigurationTester.Result) for more information. +signal availability_tested(result) + +# ############################################################################ # +# Overrides +# ############################################################################ # + +func _init(configuration: InkExecutionConfiguration): + _configuration = configuration + + if _configuration.use_threads: + _thread = Thread.new() + +# ############################################################################ # +# Methods +# ############################################################################ # + +## Test inklecate's availability, based on the configuration provided by this object. +## If `configuration.use_thread` is set to `false`, this method will return +## an instance of `InkExecutionResult`, otherwise, it will return `null`. +func test_availability(): + if _configuration.use_threads: + var error = _thread.start(Callable(self, "_test_availablity").bind(_configuration), Thread.PRIORITY_HIGH) + if error != OK: + var result = InkExecutionResult.new( + self.identifier, + _configuration.use_threads, + _configuration.user_triggered, + false, + "" + ) + + emit_signal("availability_tested", result) + return true + else: + return _test_availability(_configuration) + +# ############################################################################ # +# Private Helpers +# ############################################################################ # + +## Test inklecate's availability, based on the configuration provided by this object +## If `configuration.use_thread` is set to `false`, this method will return +## an instance of `InkExecutionResult`, otherwise, it will return `null`. +func _test_availability(config: InkExecutionConfiguration): + print("[inkgd] [INFO] Executing test command…") + var return_code = 0 + var output = [] + + var start_time = Time.get_ticks_msec() + + if config.use_mono: + var args = [config.inklecate_path] + return_code = OS.execute(config.mono_path, args, output, true, false) + + else: + return_code = OS.execute(config.inklecate_path, [], output, true, false) + + var end_time = Time.get_ticks_msec() + + print("[inkgd] [INFO] Command executed in %dms." % (end_time - start_time)) + + var string_output = PackedStringArray(output) + if _configuration.use_threads: + call_deferred("_handle_test_result", config, return_code, string_output) + return null + else: + return _process_test_result(config, return_code, string_output) + + +## Handles the test result when exectuted in a different thread. +## +## This method should always be executed on the main thread. +func _handle_test_result(config: InkExecutionConfiguration, return_code: int, output: Array): + _thread.wait_to_finish() + + var result = _process_test_result(config, return_code, output) + emit_signal("availability_tested", result) + + +## Process the compilation results turning them into an instance of `Result`. +## +## This method will also print to the editor's output panel. +func _process_test_result( + config: InkExecutionConfiguration, + return_code: int, + output: PackedStringArray +) -> InkExecutionResult: + var success: bool = (return_code == 0 || _contains_inklecate_output_prefix(output)) + var output_text: String = "\n".join(output).replace(BOM, "").strip_edges() + + if success: + if !output_text.is_empty(): + print("[inkgd] [INFO] inklecate was found and executed:") + print(output_text) + else: + print("[inkgd] [INFO] inklecate was found and executed.") + else: + printerr("[inkgd] [ERROR] Something went wrong while testing inklecate's setup.") + printerr(output_text) + + return InkExecutionResult.new( + self.identifier, + config.use_threads, + config.user_triggered, + success, + output_text + ) + + +## Guess whether the provided `output_array` looks like the usage inklecate +## outputs when run with no parameters. +func _contains_inklecate_output_prefix(output_array: PackedStringArray): + # No valid output -> it's not inklecate. + if output_array.size() == 0: return false + + # The first line of the output is cleaned up by removing the BOM and + # any sort of whitespace/unprintable character. + var cleaned_line = output_array[0].replace(BOM, "").strip_edges() + + # If the first line starts with the correct substring, it's likely + # to be inklecate! + return cleaned_line.find("Usage: inklecate2") == 0 diff --git a/addons/inkgd/editor/common/executors/ink_external_command_executor.gd b/addons/inkgd/editor/common/executors/ink_external_command_executor.gd new file mode 100644 index 0000000..fddaa90 --- /dev/null +++ b/addons/inkgd/editor/common/executors/ink_external_command_executor.gd @@ -0,0 +1,32 @@ +# ############################################################################ # +# Copyright © 2019-2022 Frédéric Maquin +# Licensed under the MIT License. +# See LICENSE in the project root for license information. +# ############################################################################ # + +extends RefCounted + +class_name InkExternalCommandExecutor + +# ############################################################################ # +# Properties +# ############################################################################ # + +## The identifier of this compiler. +var identifier: int: get = get_identifier +func get_identifier() -> int: + return get_instance_id() + +# ############################################################################ # +# Constants +# ############################################################################ # + +const BOM = "\ufeff" + +# ############################################################################ # +# Private Properties +# ############################################################################ # + +## Thread used to compile the story. +@warning_ignore("unused_private_class_variable") # Used by subclasses. +var _thread: Thread diff --git a/addons/inkgd/editor/common/executors/structures/ink_compilation_configuration.gd b/addons/inkgd/editor/common/executors/structures/ink_compilation_configuration.gd new file mode 100644 index 0000000..2f7cd3b --- /dev/null +++ b/addons/inkgd/editor/common/executors/structures/ink_compilation_configuration.gd @@ -0,0 +1,44 @@ +# ############################################################################ # +# Copyright © 2019-2022 Frédéric Maquin +# Licensed under the MIT License. +# See LICENSE in the project root for license information. +# ############################################################################ # + +extends InkExecutionConfiguration + +## Contains all the configuration settings necessary to perform a compilation. +class_name InkCompilationConfiguration + +# ############################################################################ # +# Properties +# ############################################################################ # + +## The path to the story to compile, local to the file system. +var source_file_path: String = "" + +## The path to the compiled story, local to the file system. +var target_file_path: String = "" + +# ############################################################################ # +# Overrides +# ############################################################################ # + +@warning_ignore("shadowed_variable") +func _init( + configuration: InkConfiguration, + use_threads: bool, + user_triggered: bool, + source_file_path: String, + target_file_path: String +): + super(configuration, use_threads, user_triggered) + self.source_file_path = ProjectSettings.globalize_path(source_file_path) + self.target_file_path = ProjectSettings.globalize_path(target_file_path) + +# ############################################################################ # +# Private Methods +# ############################################################################ # + +func _is_running_on_windows(): + var os_name = OS.get_name() + return (os_name == "Windows" || os_name == "UWP") diff --git a/addons/inkgd/editor/common/executors/structures/ink_execution_configuration.gd b/addons/inkgd/editor/common/executors/structures/ink_execution_configuration.gd new file mode 100644 index 0000000..3d7f091 --- /dev/null +++ b/addons/inkgd/editor/common/executors/structures/ink_execution_configuration.gd @@ -0,0 +1,49 @@ +@tool +# ############################################################################ # +# Copyright © 2019-2022 Frédéric Maquin +# Licensed under the MIT License. +# See LICENSE in the project root for license information. +# ############################################################################ # + +extends RefCounted + +## Contains all the configuration settings necessary to perform an execution. +class_name InkExecutionConfiguration + +# ############################################################################ # +# Properties +# ############################################################################ # + +var use_threads: bool = false +var user_triggered: bool = false + + +var use_mono: bool = false +var mono_path: String = "" +var inklecate_path: String = "" + +# ############################################################################ # +# Overrides +# ############################################################################ # + +@warning_ignore("shadowed_variable") +func _init( + configuration: InkConfiguration, + use_threads: bool, + user_triggered: bool +): + self.use_threads = use_threads + self.user_triggered = user_triggered + + self.use_mono = !_is_running_on_windows() && configuration.use_mono + + self.mono_path = configuration.mono_path + self.inklecate_path = configuration.inklecate_path + +# ############################################################################ # +# Private Methods +# ############################################################################ # + +func _is_running_on_windows(): + var os_name = OS.get_name() + return (os_name == "Windows" || os_name == "UWP") diff --git a/addons/inkgd/editor/common/executors/structures/ink_execution_result.gd b/addons/inkgd/editor/common/executors/structures/ink_execution_result.gd new file mode 100644 index 0000000..1072a99 --- /dev/null +++ b/addons/inkgd/editor/common/executors/structures/ink_execution_result.gd @@ -0,0 +1,44 @@ +# ############################################################################ # +# Copyright © 2019-2022 Frédéric Maquin +# Licensed under the MIT License. +# See LICENSE in the project root for license information. +# ############################################################################ # + +extends RefCounted + +## A test result, containing information about whether the test +## suceeded and the generated output. +class_name InkExecutionResult + +# ############################################################################ # +# Properties +# ############################################################################ # + +## The identifier of the compiler that generated this result. +## This is the value of 'InkExecutor.identifier'. +var identifier: int = 0 + +var use_threads: bool = false +var user_triggered: bool = false + +var success: bool = false + +var output: String = "" + +# ############################################################################ # +# Overrides +# ############################################################################ # + +@warning_ignore("shadowed_variable") +func _init( + identifier: int, + use_threads: bool, + user_triggered: bool, + success: bool, + output: String +): + self.identifier = identifier + self.use_threads = use_threads + self.user_triggered = user_triggered + self.success = success + self.output = output diff --git a/addons/inkgd/editor/common/ink_configuration.gd b/addons/inkgd/editor/common/ink_configuration.gd new file mode 100644 index 0000000..51d3483 --- /dev/null +++ b/addons/inkgd/editor/common/ink_configuration.gd @@ -0,0 +1,204 @@ +# ############################################################################ # +# Copyright © 2019-2022 Frédéric Maquin +# Licensed under the MIT License. +# See LICENSE in the project root for license information. +# ############################################################################ # + +extends RefCounted + +class_name InkConfiguration + +# ############################################################################ # +# Enums +# ############################################################################ # + +enum BuildMode { + MANUAL = 0, + DURING_BUILD, + AFTER_CHANGE +} + +# ############################################################################ # +# Constants +# ############################################################################ # + +const ROOT_DIR = "res://" + +const COMPILER_CONFIG = ROOT_DIR + ".inkgd_compiler.cfg" +const INK_CONFIG = ROOT_DIR + ".inkgd_ink.cfg" + +const COMPILER_CONFIG_FORMAT_VERSION = 2 +const INK_CONFIG_FORMAT_VERSION = 2 + +const FORMAT_SECTION = "format" +const VERSION = "version" + +const INKGD_SECTION = "inkgd" +const USE_MONO = "use_mono" +const MONO_PATH = "mono_path" +const INKLECATE_PATH = "inklecate_path" +const COMPILATION_MODE = "compilation_mode" +const STORIES = "stories" +const SOURCE_FILE_PATH = "source_file_path" +const TARGET_FILE_PATH = "target_file_path" +const WATCHED_FOLDER_PATH = "watched_folder_path" + +const DEFAULT_STORIES = [ + { + SOURCE_FILE_PATH: "", + TARGET_FILE_PATH: "", + WATCHED_FOLDER_PATH: "" + } +] + +# ############################################################################ # +# Signals +# ############################################################################ # + +signal story_configuration_changed() +signal compilation_mode_changed(compilation_mode) + +# ############################################################################ # +# Properties +# ############################################################################ # + +var use_mono: bool = false +var mono_path: String = "" +var inklecate_path: String = "" + +var compilation_mode: int = BuildMode.MANUAL: set = set_compilation_mode +func set_compilation_mode(new_value: int): + compilation_mode = new_value + emit_signal("compilation_mode_changed", compilation_mode) + +var stories: Array = DEFAULT_STORIES + +# ############################################################################ # +# Private Properties +# ############################################################################ # + +var _compiler_config_file = ConfigFile.new() +var _ink_config_file = ConfigFile.new() + +# ############################################################################ # +# Overrides +# ############################################################################ # + +func _init(): + pass + +# ############################################################################ # +# Public Methods +# ############################################################################ # + +## Loads the content of the configuration files from disk. +func retrieve(): + _retrieve_inklecate() + _retrieve_ink() + +## Stores the content of the configuration to the disk. +func persist(): + _persist_inklecate() + _persist_ink() + +func append_new_story_configuration( + source_file_path: String, + target_file_path: String, + wacthed_folder_path: String +): + stories.append({ + SOURCE_FILE_PATH: source_file_path, + TARGET_FILE_PATH: target_file_path, + WATCHED_FOLDER_PATH: wacthed_folder_path + }) + + emit_signal("story_configuration_changed") + +func remove_story_configuration_at_index(index: int): + if index >= 0 && index < stories.size(): + stories.remove_at(index) + + emit_signal("story_configuration_changed") + +func get_story_configuration_at_index(index): + if index >= 0 && index < stories.size(): + return stories[index] + else: + return null + +func get_source_file_path(story_configuration): + return story_configuration[SOURCE_FILE_PATH] + +func get_target_file_path(story_configuration): + return story_configuration[TARGET_FILE_PATH] + +func get_watched_folder_path(story_configuration): + return story_configuration[WATCHED_FOLDER_PATH] + +# ############################################################################ # +# Private Methods +# ############################################################################ # + +## Loads the content of the inklecate configuration file from disk. +func _retrieve_inklecate(): + var err = _compiler_config_file.load(COMPILER_CONFIG) + if err != OK: + # Assuming it doesn't exist. + return + + use_mono = _compiler_config_file.get_value(INKGD_SECTION, USE_MONO, false) + mono_path = _compiler_config_file.get_value(INKGD_SECTION, MONO_PATH, "") + inklecate_path = _compiler_config_file.get_value(INKGD_SECTION, INKLECATE_PATH, "") + + if _compiler_config_file.get_value(FORMAT_SECTION, VERSION, 0) >= 2: + compilation_mode = _compiler_config_file.get_value(INKGD_SECTION, COMPILATION_MODE, 0) + +## Loads the content of the story configuration file from disk. +func _retrieve_ink(): + var err = _ink_config_file.load(INK_CONFIG) + if err != OK: + # Assuming it doesn't exist. + return + + if _ink_config_file.get_value(FORMAT_SECTION, VERSION, 0) >= 2: + stories = _ink_config_file.get_value(INKGD_SECTION, STORIES, DEFAULT_STORIES) + else: + var source_file_path = _ink_config_file.get_value(INKGD_SECTION, SOURCE_FILE_PATH, "") + var target_file_path = _ink_config_file.get_value(INKGD_SECTION, TARGET_FILE_PATH, "") + var watched_folder_path = _ink_config_file.get_value(INKGD_SECTION, WATCHED_FOLDER_PATH, "") + + stories[0] = { + SOURCE_FILE_PATH: source_file_path, + TARGET_FILE_PATH: target_file_path, + WATCHED_FOLDER_PATH: watched_folder_path + } + +## Stores the content of the inklecate configuration to the disk. +func _persist_inklecate(): + _compiler_config_file.set_value(FORMAT_SECTION, VERSION, COMPILER_CONFIG_FORMAT_VERSION) + + _compiler_config_file.set_value(INKGD_SECTION, USE_MONO, use_mono) + _compiler_config_file.set_value(INKGD_SECTION, MONO_PATH, mono_path) + _compiler_config_file.set_value(INKGD_SECTION, INKLECATE_PATH, inklecate_path) + _compiler_config_file.set_value(INKGD_SECTION, COMPILATION_MODE, compilation_mode) + + var err = _compiler_config_file.save(COMPILER_CONFIG) + if err != OK: + printerr("[inkgd] [ERROR] Could not save: %s" % COMPILER_CONFIG) + +## Stores the content of the story configuration to the disk. +func _persist_ink(): + # Clean up the file if it was created before version 2. + if _ink_config_file.has_section_key(INKGD_SECTION, SOURCE_FILE_PATH): + _ink_config_file.erase_section_key(INKGD_SECTION, SOURCE_FILE_PATH) + + if _ink_config_file.has_section_key(INKGD_SECTION, TARGET_FILE_PATH): + _ink_config_file.erase_section_key(INKGD_SECTION, TARGET_FILE_PATH) + + # Write version 2 values. + _ink_config_file.set_value(FORMAT_SECTION, VERSION, COMPILER_CONFIG_FORMAT_VERSION) + _ink_config_file.set_value(INKGD_SECTION, STORIES, stories) + + var err = _ink_config_file.save(INK_CONFIG) + if err != OK: + printerr("[inkgd] [ERROR] Could not save: %s" % INK_CONFIG) diff --git a/addons/inkgd/editor/common/ink_csharp_validator.gd b/addons/inkgd/editor/common/ink_csharp_validator.gd new file mode 100644 index 0000000..71bb305 --- /dev/null +++ b/addons/inkgd/editor/common/ink_csharp_validator.gd @@ -0,0 +1,103 @@ +# ############################################################################ # +# Copyright © 2019-2022 Frédéric Maquin +# Licensed under the MIT License. +# See LICENSE in the project root for license information. +# ############################################################################ # + +extends RefCounted + +# A crude validator catching the most common mistakes. + +class_name InkCSharpValidator + +const INK_ENGINE_RUNTIME = "ink-engine-runtime.dll" + +# ############################################################################ # +# Methods +# ############################################################################ # + +func validate_csharp_project_files(project_name) -> bool: + var ink_engine_runtime := get_runtime_path() + + if ink_engine_runtime.is_empty(): + print( + "[inkgd] [INFO] 'ink-engine-runtime.dll' seems to be missing " + + "from the project. If you encounter errors while building the " + + "solution, please refer to [TO BE ADDED] for help." + ) + return false + + return _validate_csproj(project_name, ink_engine_runtime) + +func get_runtime_path() -> String: + return _scan_directory("res://") + +func _validate_csproj(project_name: String, runtime_path: String) -> bool: + var csproj_path = "res://%s.csproj" % project_name + + if !FileAccess.file_exists(csproj_path): + printerr( + ("[inkgd] [ERROR] The C# project (%s.csproj) doesn't exist. " % project_name) + + "You can create a new C# project through " + + "Project > Tools > C# > Create C# Solution. Alternatively, you can also set " + + "Project Settings > General > Inkgd > Do Not Use Mono Runtime to 'Yes' " + + "if you do not wish to use the C# version of Ink. " + ) + return false + + var file := FileAccess.open(csproj_path, FileAccess.READ) + var error := FileAccess.get_open_error() + if error != OK: + printerr( + "[inkgd] [ERROR] The C# project (%s.csproj) exists but it could not be opened." + + "(Code %d)" % [project_name, error] + ) + return false + + var content := file.get_as_text() + file.close() + + if content.find(runtime_path.replace("res://", "")) == -1: + print( + "[inkgd] [INFO] '%s.csproj' seems to be missing a " % project_name + + " item matching '%s'. If you encounter " % runtime_path + + "further errors please refer to [TO BE ADDED] for help." + ) + return false + + print("[inkgd] [INFO] The C# Project seems to be configured correctly.") + return true + +func _scan_directory(path) -> String: + var directory := DirAccess.open(path) + var error := DirAccess.get_open_error() + if error != OK: + printerr( + "[inkgd] [ERROR] Could not open '%s', " % path + + "can't look for ink-engine-runtime.dll." + ) + return "" + + if directory.list_dir_begin() != OK:# TODOConverter3To4 fill missing arguments https://github.com/godotengine/godot/pull/40547 + printerr( + "[inkgd] [ERROR] Could not list contents of '%s', " % path + + "can't look for ink-engine-runtime.dll." + ) + return "" + + var file_name := directory.get_next() + while file_name != "": + if directory.current_is_dir(): + var ink_runtime = _scan_directory( + "%s/%s" % [directory.get_current_dir(), file_name] + ) + + if !ink_runtime.is_empty(): + return ink_runtime + else: + if file_name == INK_ENGINE_RUNTIME: + return "%s/%s" % [directory.get_current_dir(), file_name] + + file_name = directory.get_next() + + return "" diff --git a/addons/inkgd/editor/common/ink_editor_interface.gd b/addons/inkgd/editor/common/ink_editor_interface.gd new file mode 100644 index 0000000..e649760 --- /dev/null +++ b/addons/inkgd/editor/common/ink_editor_interface.gd @@ -0,0 +1,84 @@ +# ############################################################################ # +# Copyright © 2019-2022 Frédéric Maquin +# Licensed under the MIT License. +# See LICENSE in the project root for license information. +# ############################################################################ # + +extends RefCounted + +class_name InkEditorInterface + +# ############################################################################ # +# Signals +# ############################################################################ # + +## Emitted when 'Ink' resources (i. e. files with the '.ink' extension) were +## reimported by Godot. +signal ink_ressources_reimported(resources) + +# ############################################################################ # +# Properties +# ############################################################################ # + +## The pixel display scale of the editor. +var scale: float = 1.0 + +var editor_interface: EditorInterface +var editor_settings: EditorSettings +var editor_filesystem: EditorFileSystem + +## `true` if the editor is running on Windows, `false` otherwise. +var is_running_on_windows: bool: get = get_is_running_on_windows +func get_is_running_on_windows() -> bool: + var os_name = OS.get_name() + return (os_name == "Windows" || os_name == "UWP") + + +# ############################################################################ # +# Overrides +# ############################################################################ # + +@warning_ignore("shadowed_variable") +func _init(editor_interface: EditorInterface): + self.editor_interface = editor_interface + self.editor_settings = editor_interface.get_editor_settings() + self.editor_filesystem = editor_interface.get_resource_filesystem() + + scale = editor_interface.get_editor_scale() + + self.editor_filesystem.connect("resources_reimported", Callable(self, "_resources_reimported")) + +# ############################################################################ # +# Methods +# ############################################################################ # + +## Tell Godot to scan for updated resources. +func scan_file_system(): + self.editor_filesystem.scan() + +## Tell Godot to scan the given resource. +func update_file(path: String): + self.editor_filesystem.update_file(path) + +## Returns a custom header color based on the editor's base color. +## +## If the base color is not found, return 'Color.transparent'. +func get_custom_header_color() -> Color: + var color = self.editor_settings.get_setting("interface/theme/base_color") + if color != null: + return Color.from_hsv(color.h * 0.99, color.s * 0.6, color.v * 1.1) + else: + return Color.TRANSPARENT + +# ############################################################################ # +# Signal Receivers +# ############################################################################ # + +func _resources_reimported(resources): + var ink_resources := PackedStringArray() + + for resource in resources: + if resource.get_extension() == "ink": + ink_resources.append(resource) + + emit_signal("ink_ressources_reimported", ink_resources) diff --git a/addons/inkgd/editor/icons/compile.svg b/addons/inkgd/editor/icons/compile.svg new file mode 100644 index 0000000..bdedea7 --- /dev/null +++ b/addons/inkgd/editor/icons/compile.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a7af8461fd3fad887eb74d0143c727ca85f4cc1f17270a8fc00c5bc0e5ad787 +size 2298 diff --git a/addons/inkgd/editor/icons/compile.svg.import b/addons/inkgd/editor/icons/compile.svg.import new file mode 100644 index 0000000..94023b3 --- /dev/null +++ b/addons/inkgd/editor/icons/compile.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b3mk2i51yhbcn" +path="res://.godot/imported/compile.svg-8aaa0400caa294ef4be4b83b3d6de9aa.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/inkgd/editor/icons/compile.svg" +dest_files=["res://.godot/imported/compile.svg-8aaa0400caa294ef4be4b83b3d6de9aa.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/inkgd/editor/icons/ink_player.svg b/addons/inkgd/editor/icons/ink_player.svg new file mode 100644 index 0000000..9502be7 --- /dev/null +++ b/addons/inkgd/editor/icons/ink_player.svg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e8debd5d42f7b8d926952387e7a3bcda40a8278fc8400354fae5b916bf220563 +size 2903 diff --git a/addons/inkgd/editor/icons/ink_player.svg.import b/addons/inkgd/editor/icons/ink_player.svg.import new file mode 100644 index 0000000..9feab76 --- /dev/null +++ b/addons/inkgd/editor/icons/ink_player.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://tq48ux26onni" +path="res://.godot/imported/ink_player.svg-69488eb4b789a6c4d2f7a8b28953ad01.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/inkgd/editor/icons/ink_player.svg" +dest_files=["res://.godot/imported/ink_player.svg-69488eb4b789a6c4d2f7a8b28953ad01.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/inkgd/editor/import_plugins/ink_json_import_plugin.gd b/addons/inkgd/editor/import_plugins/ink_json_import_plugin.gd new file mode 100644 index 0000000..b9d54f9 --- /dev/null +++ b/addons/inkgd/editor/import_plugins/ink_json_import_plugin.gd @@ -0,0 +1,94 @@ +# ############################################################################ # +# Copyright © 2018-2022 Paul Joannon +# Copyright © 2019-2022 Frédéric Maquin +# Licensed under the MIT License. +# See LICENSE in the project root for license information. +# ############################################################################ # + +extends EditorImportPlugin + +class_name InkJsonImportPlugin + +# ############################################################################ # +# Imports +# ############################################################################ # + +var InkConfiguration = load("res://addons/inkgd/editor/common/ink_configuration.gd") +var InkResource = load("res://addons/inkgd/editor/import_plugins/ink_resource.gd") + +# ############################################################################ # +# Properties +# ############################################################################ # + +var _configuration = InkConfiguration.new() + +# ############################################################################ # +# Overrides +# ############################################################################ # + +func _get_importer_name(): + return "inkgd.ink.json"; + +func _get_visible_name(): + return "Compiled ink story"; + +func _get_recognized_extensions(): + return ["json"]; + +func _get_save_extension(): + return "res"; + +func _get_resource_type(): + return "Resource"; + +func _get_priority(): + return 1.0 + +func _get_import_options(_path, _preset): + return [ + { + "name": "compress", + "default_value": true + } + ] + +func _get_import_order(): + return 0 + +func _get_option_visibility(_path, _option_name, _options): + return true + +func _get_preset_count(): + return 0 + +func _import(source_file, save_path, options, _platform_variants, _gen_files): + _configuration.retrieve() + + var raw_json = _get_file_content(source_file) + + var test_json_conv = JSON.new() + test_json_conv.parse(raw_json) + var json = test_json_conv.get_data() + if !json.has("inkVersion"): + return ERR_FILE_UNRECOGNIZED + + var resource = InkResource.new() + resource.json = raw_json + + var flags = ResourceSaver.FLAG_COMPRESS if options["compress"] else 0 + return ResourceSaver.save(resource, "%s.%s" % [save_path, _get_save_extension()], flags) + +# ############################################################################ # +# Private Helpers +# ############################################################################ # + +func _get_file_content(source_file): + var file := FileAccess.open(source_file, FileAccess.READ) + var err := FileAccess.get_open_error() + if err != OK: + return err + + var text_content = file.get_as_text() + + file.close() + return text_content diff --git a/addons/inkgd/editor/import_plugins/ink_resource.gd b/addons/inkgd/editor/import_plugins/ink_resource.gd new file mode 100644 index 0000000..8a2977a --- /dev/null +++ b/addons/inkgd/editor/import_plugins/ink_resource.gd @@ -0,0 +1,16 @@ +# ############################################################################ # +# Copyright © 2019-2022 Frédéric Maquin +# Licensed under the MIT License. +# See LICENSE in the project root for license information. +# ############################################################################ # + +extends Resource + +# A very simple resource to store the content of a json file, as a string. +class_name InkResource + +# ############################################################################ # +# Properties +# ############################################################################ # + +@export var json: String = "" diff --git a/addons/inkgd/editor/import_plugins/ink_source_import_plugin.gd b/addons/inkgd/editor/import_plugins/ink_source_import_plugin.gd new file mode 100644 index 0000000..307665d --- /dev/null +++ b/addons/inkgd/editor/import_plugins/ink_source_import_plugin.gd @@ -0,0 +1,51 @@ +# ############################################################################ # +# Copyright © 2018-2022 Paul Joannon +# Copyright © 2019-2022 Frédéric Maquin +# Licensed under the MIT License. +# See LICENSE in the project root for license information. +# ############################################################################ # + +extends EditorImportPlugin + +class_name InkSourceImportPlugin + +# ############################################################################ # +# Overrides +# ############################################################################ # + +func _get_importer_name(): + return "inkgd.ink"; + +func _get_visible_name(): + return "Ink file"; + +func _get_recognized_extensions(): + return ["ink"]; + +func _get_save_extension(): + return "res"; + +func _get_resource_type(): + return "Resource"; + +func _get_priority(): + return 1.0 + +func _get_import_options(_path, _preset): + return [] + +func _get_import_order(): + return 0 + +func _get_option_visibility(_path, _option_name, _options): + return true + +func _get_preset_count(): + return 0 + +func _import(_source_file, save_path, _options, _platform_variants, _gen_files): + return ResourceSaver.save( + Resource.new(), + "%s.%s" % [save_path, _get_save_extension()], + ResourceSaver.FLAG_COMPRESS + ) diff --git a/addons/inkgd/editor/ink_editor_plugin.gd b/addons/inkgd/editor/ink_editor_plugin.gd new file mode 100644 index 0000000..0036cce --- /dev/null +++ b/addons/inkgd/editor/ink_editor_plugin.gd @@ -0,0 +1,283 @@ +@tool +# ############################################################################ # +# Copyright © 2019-2022 Frédéric Maquin +# Licensed under the MIT License. +# See LICENSE in the project root for license information. +# ############################################################################ # + +extends EditorPlugin + +# Hiding this type to prevent registration of "private" nodes. +# See https://github.com/godotengine/godot-proposals/issues/1047 +# class_name InkEditorPlugin + +# ############################################################################ # +# Imports +# ############################################################################ # + +var InkJsonImportPlugin = preload("res://addons/inkgd/editor/import_plugins/ink_json_import_plugin.gd") +var InkSourceImportPlugin = preload("res://addons/inkgd/editor/import_plugins/ink_source_import_plugin.gd") + +var InkBottomPanel = preload("res://addons/inkgd/editor/panel/ink_bottom_panel.tscn") + +var InkCSharpValidator = preload("res://addons/inkgd/editor/common/ink_csharp_validator.gd") + +var InkEditorInterface = load("res://addons/inkgd/editor/common/ink_editor_interface.gd") +var InkConfiguration = load("res://addons/inkgd/editor/common/ink_configuration.gd") + +var InkCompilationConfiguration = load("res://addons/inkgd/editor/common/executors/structures/ink_compilation_configuration.gd") +var InkCompiler = load("res://addons/inkgd/editor/common/executors/ink_compiler.gd") + +# ############################################################################ # +# Constant +# ############################################################################ # + +const USE_MONO_RUNTIME_SETTING = "inkgd/use_mono_runtime" +const REGISTER_TEMPLATES_SETTING = "inkgd/register_templates" + + +# ############################################################################ # +# Private Properties +# ############################################################################ # + +var _editor_interface: InkEditorInterface = null +var _configuration: InkConfiguration = null +var _panel = null + +var _ink_source_import_plugin: InkSourceImportPlugin = null +var _ink_json_import_plugin: InkJsonImportPlugin = null + +var _tool_button: Button = null + + +# ############################################################################ # +# Overrides +# ############################################################################ # + +func _enter_tree(): + var ink_player_icon = load("res://addons/inkgd/editor/icons/ink_player.svg") + if ink_player_icon == null: + printerr( + "[inkgd] [ERROR] The plugin could not be initialized because the required assets " + + "haven't been imported by Godot yet. This can happen when cloning a fresh project or " + + "after deleting the '.import' folder. Disabling and reenabling InkGD in " + + "Project > Project setting… > Plugins or reloading the project should fix the problem." + ) + return + + # Note: assets are not preloaded to prevent the script from failing + # its interpretation phase if the resources have never been imported before. + if _should_use_mono() && _validate_csproj(): + print("[inkgd] [INFO] Using the Mono runtime.") + _register_custom_settings() + add_custom_type( + "InkPlayer", + "Node", + load("res://addons/inkgd/mono/InkPlayer.cs"), + ink_player_icon + ) + else: + print("[inkgd] [INFO] Using the GDScript runtime.") + _register_custom_settings() + add_custom_type( + "InkPlayer", + "Node", + load("res://addons/inkgd/ink_player.gd"), + ink_player_icon + ) + + _editor_interface = InkEditorInterface.new(get_editor_interface()) + + _configuration = InkConfiguration.new() + _configuration.retrieve() + + _add_bottom_panel() + _add_import_plugin() + + _add_autoloads() + _add_templates() + + +func _exit_tree(): + # The plugin hasn't been intialised properly, nothing to do. + if _panel == null: + return + + _remove_bottom_panel() + _remove_import_plugin() + + _remove_autoloads() + _remove_templates() + + remove_custom_type("InkPlayer") + + +func build(): + if _configuration.compilation_mode == InkConfiguration.BuildMode.DURING_BUILD: + var previous_result = true + for story_configuration in _configuration.stories: + if !previous_result: + break + + var source_file_path = _configuration.get_source_file_path(story_configuration) + var target_file_path = _configuration.get_target_file_path(story_configuration) + + var compiler_configuration = InkCompilationConfiguration.new( + _configuration, + false, + false, + source_file_path, + target_file_path + ) + + var compiler = InkCompiler.new(compiler_configuration) + var current_result = compiler.compile_story() + + if current_result: + _editor_interface.call_deferred("update_file", target_file_path) + + previous_result = previous_result && current_result + + return previous_result + else: + return true + + +# ############################################################################ # +# Private Helpers +# ############################################################################ # + +func _add_import_plugin(): + _ink_source_import_plugin = InkSourceImportPlugin.new() + _ink_json_import_plugin = InkJsonImportPlugin.new() + add_import_plugin(_ink_source_import_plugin) + add_import_plugin(_ink_json_import_plugin) + + +func _remove_import_plugin(): + remove_import_plugin(_ink_source_import_plugin) + remove_import_plugin(_ink_json_import_plugin) + _ink_source_import_plugin = null + _ink_json_import_plugin = null + + +func _add_bottom_panel(): + _panel = InkBottomPanel.instantiate() + _panel.editor_interface = _editor_interface + _panel.configuration = _configuration + + _tool_button = add_control_to_bottom_panel(_panel, "Ink") + + +func _remove_bottom_panel(): + remove_control_from_bottom_panel(_panel) + _panel.queue_free() + + +## Registers the Ink runtime node as an autoloaded singleton. +func _add_autoloads(): + add_autoload_singleton("__InkRuntime", "res://addons/inkgd/runtime/static/ink_runtime.gd") + + +## Unregisters the Ink runtime node from autoloaded singletons. +func _remove_autoloads(): + remove_autoload_singleton("__InkRuntime") + + +## Registers the script templates provided by the plugin. +func _add_templates(): + if ProjectSettings.has_setting(REGISTER_TEMPLATES_SETTING): + var register_template = ProjectSettings.get_setting(REGISTER_TEMPLATES_SETTING) + if !register_template: return + + var names = _get_plugin_templates_names() + + # Setup the templates folder for the project + var template_dir_path = ProjectSettings.get_setting("editor/script/templates_search_path") + if !DirAccess.dir_exists_absolute(template_dir_path): + DirAccess.make_dir_absolute(template_dir_path) + + for template_name in names: + var template_file_path = template_dir_path + "/" + template_name + DirAccess.copy_absolute("res://addons/inkgd/editor/templates/" + template_name, template_file_path) + + +## Unregisters the script templates provided by the plugin. +func _remove_templates(): + var names = _get_plugin_templates_names() + var template_dir_path = ProjectSettings.get_setting("editor/script/templates_search_path") + + for template_name in names: + var template_file_path = template_dir_path + "/" + template_name + if FileAccess.file_exists(template_file_path): + DirAccess.remove_absolute(template_file_path) + + +## Get all the script templates provided by the plugin. +func _get_plugin_templates_names() -> Array: + var plugin_template_names = [] + + var dir = DirAccess.open("res://addons/inkgd/editor/templates/") + if dir: + dir.list_dir_begin() + var temp = dir.get_next() + while temp != "": + plugin_template_names.append(temp) + temp = dir.get_next() + + return plugin_template_names + else: + print("An error occurred when trying to access the path.") + return [] + + +func _register_custom_settings(): + if _can_run_mono(): + if !ProjectSettings.has_setting(USE_MONO_RUNTIME_SETTING): + ProjectSettings.set_setting(USE_MONO_RUNTIME_SETTING, true) + + var mono_property_info = { + "name": USE_MONO_RUNTIME_SETTING, + "type": TYPE_BOOL, + "hint_string": "If `true` _inkgd_ will alwaus use the Mono runtime when available.", + "default": false + } + + ProjectSettings.add_property_info(mono_property_info) + + if !ProjectSettings.has_setting(REGISTER_TEMPLATES_SETTING): + ProjectSettings.set_setting(REGISTER_TEMPLATES_SETTING, true) + + var template_property_info = { + "name": REGISTER_TEMPLATES_SETTING, + "type": TYPE_BOOL, + "hint_string": "If `true` _inkgd_ will register its script templates with the current project.", + "default": false + } + + ProjectSettings.add_property_info(template_property_info) + + +func _validate_csproj() -> bool: + var project_name = ProjectSettings.get_setting("application/config/name") + if project_name.is_empty(): + printerr("[inkgd] [ERROR] The project is missing a name.") + return false + + var validator = InkCSharpValidator.new() + return validator.validate_csharp_project_files(project_name) + + +func _should_use_mono(): + if ProjectSettings.has_setting(USE_MONO_RUNTIME_SETTING): + var use_mono = ProjectSettings.get_setting(USE_MONO_RUNTIME_SETTING) + if use_mono == null: + use_mono = true + + return _can_run_mono() && use_mono + else: + return _can_run_mono() + + +func _can_run_mono(): + return type_exists("_GodotSharp") diff --git a/addons/inkgd/editor/panel/common/ink_progress_dialog.gd b/addons/inkgd/editor/panel/common/ink_progress_dialog.gd new file mode 100644 index 0000000..a709211 --- /dev/null +++ b/addons/inkgd/editor/panel/common/ink_progress_dialog.gd @@ -0,0 +1,57 @@ +@tool +# ############################################################################ # +# Copyright © 2019-2022 Frédéric Maquin +# Licensed under the MIT License. +# See LICENSE in the project root for license information. +# ############################################################################ # + +extends Popup + +# A custom dialog showing a progress bar. + +# Hiding this type to prevent registration of "private" nodes. +# See https://github.com/godotengine/godot-proposals/issues/1047 +# class_name InkProgressDialog + +# ############################################################################ # +# Nodes +# ############################################################################ # + +@onready var _margin_container = $MarginContainer +@onready var _vbox_container = $MarginContainer/VBoxContainer +@onready var _title_label = $MarginContainer/VBoxContainer/TitleLabel +@onready var _progress_bar = $MarginContainer/VBoxContainer/ProgressBar +@onready var _current_step_label = $MarginContainer/VBoxContainer/CurrentStepLabel + +# ############################################################################ # +# Properties +# ############################################################################ # + +## The title of the progress. +var progress_title: String: get = get_progress_title, set = set_progress_title +func set_progress_title(text: String): + _title_label.text = text +func get_progress_title() -> String: + return _title_label.text + +## The name of the current step. +var current_step_name: String: get = get_current_step_name, set = set_current_step_name +func set_current_step_name(text: String): + _current_step_label.text = text +func get_current_step_name() -> String: + return _current_step_label.text + +## The current progress. +var progress: float: + get: + return _progress_bar.value + set(value): + _progress_bar.value = value + + +func update_layout(scale: float) -> void: + _margin_container.add_theme_constant_override("offset_right", 10 * scale) + _margin_container.add_theme_constant_override("offset_top", 10 * scale) + _margin_container.add_theme_constant_override("offset_left", 10 * scale) + _margin_container.add_theme_constant_override("offset_bottom", 10 * scale) + _vbox_container.add_theme_constant_override("separation", 5 * scale) diff --git a/addons/inkgd/editor/panel/common/ink_progress_dialog.tscn b/addons/inkgd/editor/panel/common/ink_progress_dialog.tscn new file mode 100644 index 0000000..e963f09 --- /dev/null +++ b/addons/inkgd/editor/panel/common/ink_progress_dialog.tscn @@ -0,0 +1,63 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/inkgd/editor/panel/common/ink_progress_dialog.gd" type="Script" id=1] + +[node name="InkProgressDialog" type="Popup"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -250.0 +offset_top = -42.5 +offset_right = 250.0 +offset_bottom = 42.5 +custom_minimum_size = Vector2( 500, 85 ) +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="MarginContainer" type="MarginContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +theme_override_constants/margin_right = 10 +theme_override_constants/margin_top = 10 +theme_override_constants/margin_left = 10 +theme_override_constants/margin_bottom = 10 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"] +offset_left = 10.0 +offset_top = 10.0 +offset_right = 490.0 +offset_bottom = 75.0 +theme_override_constants/separation = 5 +alignment = 1 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TitleLabel" type="Label" parent="MarginContainer/VBoxContainer"] +offset_top = 1.0 +offset_right = 480.0 +offset_bottom = 15.0 +text = "Compiling..." +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ProgressBar" type="ProgressBar" parent="MarginContainer/VBoxContainer"] +offset_top = 25.0 +offset_right = 480.0 +offset_bottom = 39.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="CurrentStepLabel" type="Label" parent="MarginContainer/VBoxContainer"] +offset_top = 49.0 +offset_right = 480.0 +offset_bottom = 63.0 +text = "the_intercept.ink" diff --git a/addons/inkgd/editor/panel/common/ink_rich_dialog.gd b/addons/inkgd/editor/panel/common/ink_rich_dialog.gd new file mode 100644 index 0000000..ee9292a --- /dev/null +++ b/addons/inkgd/editor/panel/common/ink_rich_dialog.gd @@ -0,0 +1,103 @@ +@tool +# ############################################################################ # +# Copyright © 2019-2022 Frédéric Maquin +# Licensed under the MIT License. +# See LICENSE in the project root for license information. +# ############################################################################ # + +extends Window + +# A custom dialog showing a message and, optionally, a command output. + +# Hiding this type to prevent registration of "private" nodes. +# See https://github.com/godotengine/godot-proposals/issues/1047 +# class_name InkRichDialog + +# ############################################################################ # +# Nodes +# ############################################################################ # + +@onready var _margin_container = $MarginContainer +@onready var _vbox_container = $MarginContainer/VBoxContainer +@onready var _message_label = $MarginContainer/VBoxContainer/MessageLabel +@onready var _accept_button = $MarginContainer/VBoxContainer/AcceptButton +@onready var _output_panel = $MarginContainer/VBoxContainer/OutputPanel +@onready var _output_label = find_child("OutputLabel") + +# ############################################################################ # +# Properties +# ############################################################################ # + +## The message displayed in the dialog. +var message_text: String: get = get_message_text, set = set_message_text +func set_message_text(text: String): + _message_label.text = text +func get_message_text() -> String: + return _message_label.text + +## An output, often the result of a command, than can optionally be displayed +## in the dialog. +## +## Setting this property to null hides the corresponding panel in the dialog. +var output_text: String: get = get_output_text, set = set_output_text +func set_output_text(text: String): + _output_label.text = text + _output_label.visible = !(text == null || text.length() == 0) +func get_output_text() -> String: + return _output_label.text + +# ############################################################################ # +# Overriden Methods +# ############################################################################ # + +func _ready(): + _accept_button.connect("pressed", Callable(self, "_accept_button_pressed")) + + var font = _get_source_font() + if font != null: + _output_panel.add_theme_font_override("font", font) + +# ############################################################################ # +# Methods +# ############################################################################ # + +func update_layout(scale: float) -> void: + _margin_container.add_theme_constant_override("offset_right", 10 * scale) + _margin_container.add_theme_constant_override("offset_top", 10 * scale) + _margin_container.add_theme_constant_override("offset_left", 10 * scale) + _margin_container.add_theme_constant_override("offset_bottom", 10 * scale) + _vbox_container.add_theme_constant_override("separation", 10 * scale) + + +# ############################################################################ # +# Signal Receivers +# ############################################################################ # + +func _accept_button_pressed(): + self.get_parent().remove_child(self) + self.queue_free() + +# ############################################################################ # +# Private helpers +# ############################################################################ # + +## Gets the monospaced font used by the editor. +func _get_source_font(): + var base_theme = _retrieve_base_theme() + if base_theme: + return base_theme.get_font("output_source", "EditorFonts") + else: + return null + +## Gets the theme currently used by the editor. +func _retrieve_base_theme(): + var parent = self + + while(parent != null && parent.theme == null): + var older_parent = parent.get_parent() + if older_parent is Control: + parent = older_parent + else: + break + + return parent.theme diff --git a/addons/inkgd/editor/panel/common/ink_rich_dialog.tscn b/addons/inkgd/editor/panel/common/ink_rich_dialog.tscn new file mode 100644 index 0000000..fa558d3 --- /dev/null +++ b/addons/inkgd/editor/panel/common/ink_rich_dialog.tscn @@ -0,0 +1,89 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/inkgd/editor/panel/common/ink_rich_dialog.gd" type="Script" id=1] + +[node name="Window" type="Window"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -250.0 +offset_top = -150.0 +offset_right = 250.0 +offset_bottom = 150.0 +custom_minimum_size = Vector2( 500, 300 ) +window_title = "Error" +resizable = true +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="MarginContainer" type="MarginContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme_override_constants/margin_right = 10 +theme_override_constants/margin_top = 10 +theme_override_constants/margin_left = 10 +theme_override_constants/margin_bottom = 10 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"] +offset_left = 10.0 +offset_top = 10.0 +offset_right = 490.0 +offset_bottom = 290.0 +theme_override_constants/separation = 10 + +[node name="MessageLabel" type="Label" parent="MarginContainer/VBoxContainer"] +offset_right = 480.0 +offset_bottom = 31.0 +text = "Something went wrong while testing inklecate's setup. Please see the output below." +autowrap = true + +[node name="OutputPanel" type="Panel" parent="MarginContainer/VBoxContainer"] +offset_top = 41.0 +offset_right = 480.0 +offset_bottom = 250.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="OutputScrollContainer" type="ScrollContainer" parent="MarginContainer/VBoxContainer/OutputPanel"] +anchor_right = 1.0 +anchor_bottom = 1.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="OutputMarginContainer" type="MarginContainer" parent="MarginContainer/VBoxContainer/OutputPanel/OutputScrollContainer"] +offset_right = 480.0 +offset_bottom = 136.0 +size_flags_horizontal = 3 +theme_override_constants/margin_right = 10 +theme_override_constants/margin_top = 10 +theme_override_constants/margin_left = 10 +theme_override_constants/margin_bottom = 10 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="OutputLabel" type="Label" parent="MarginContainer/VBoxContainer/OutputPanel/OutputScrollContainer/OutputMarginContainer"] +offset_left = 10.0 +offset_top = 10.0 +offset_right = 470.0 +offset_bottom = 126.0 +size_flags_vertical = 0 +text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." +autowrap = true + +[node name="AcceptButton" type="Button" parent="MarginContainer/VBoxContainer"] +offset_left = 224.0 +offset_top = 260.0 +offset_right = 255.0 +offset_bottom = 280.0 +size_flags_horizontal = 4 +text = "OK" diff --git a/addons/inkgd/editor/panel/configuration/ink_configuration_panel.gd b/addons/inkgd/editor/panel/configuration/ink_configuration_panel.gd new file mode 100644 index 0000000..caf649b --- /dev/null +++ b/addons/inkgd/editor/panel/configuration/ink_configuration_panel.gd @@ -0,0 +1,306 @@ +@tool +# ############################################################################ # +# Copyright © 2019-2022 Frédéric Maquin +# Licensed under the MIT License. +# See LICENSE in the project root for license information. +# ############################################################################ # + +extends Control + +# Hiding this type to prevent registration of "private" nodes. +# See https://github.com/godotengine/godot-proposals/issues/1047 +# class_name InkConfigurationPanel + +# ############################################################################ # +# Imports +# ############################################################################ # + +var InkExecutionConfiguration = load("res://addons/inkgd/editor/common/executors/structures/ink_execution_configuration.gd") +var InkConfigurationTester = load("res://addons/inkgd/editor/common/executors/ink_configuration_tester.gd") + +var InkCSharpValidator = preload("res://addons/inkgd/editor/common/ink_csharp_validator.gd") + +var InkRichDialog = load("res://addons/inkgd/editor/panel/common/ink_rich_dialog.tscn") + + +# ############################################################################ # +# Enums +# ############################################################################ # + +## Represents which configuration setting triggered the file dialog. +enum FileDialogSelection { + UNKNOWN, + MONO_EXECUTABLE, + INKLECATE_EXECUTABLE +} + + +# ############################################################################ # +# Constants +# ############################################################################ # + +const BOM = "\ufeff" + + +# ############################################################################ # +# Properties +# ############################################################################ # + +var editor_interface: InkEditorInterface = null +var configuration: InkConfiguration = null + + +# ############################################################################ # +# Private Properties +# ############################################################################ # + +var _file_dialog = EditorFileDialog.new() + +## Configuration item for which the FileDialog is currently shown. +## +## Unknown by default. +var _file_dialog_selection = FileDialogSelection.UNKNOWN + + +# ############################################################################ # +# Nodes +# ############################################################################ # + +@onready var _test_button = find_child("TestButton") + +@onready var _use_mono_label = find_child("UseMonoLabel") +@onready var _use_mono_checkbox = find_child("UseMonoCheckBox") + +@onready var _mono_label = find_child("MonoLabel") +@onready var _mono_container = find_child("MonoH") +@onready var _mono_line_edit = find_child("MonoLineEdit") +@onready var _mono_dialog_button = find_child("MonoDialogButton") + +@onready var _executable_line_edit = find_child("ExecutableLineEdit") +@onready var _executable_dialog_button = find_child("ExecutableDialogButton") + +@onready var _recompilation_mode_button = find_child("RecompilationModeOptionButton") + +@onready var _mono_support_container = find_child("MonoSupportV") +@onready var _mono_support_documentation_button = find_child("DocumentationButton") +@onready var _mono_support_presence_label = _mono_support_container.find_child("PresenceLabel") +@onready var _mono_support_refresh_button = _mono_support_container.find_child("RefreshButton") + + +# ############################################################################ # +# Overrides +# ############################################################################ # + +func _ready(): + # FIXME: This needs investigating. + # Sanity check. It seems the editor instantiates tools script on their + # own, probably to add them to its tree. In that case, they won't have + # their dependencies injected, so we're not doing anything. + if editor_interface == null || configuration == null: + print("[inkgd] [INFO] Ink Configuration Tab: dependencies not met, ignoring.") + return + + _set_button_icons() + _apply_configuration() + _connect_signals() + _check_runtime_presence() + + _mono_support_container.visible = _can_run_mono() + + add_child(_file_dialog) + + +# ############################################################################ # +# Signal Receivers +# ############################################################################ # + +func _configuration_entered(_new_text: String): + _configuration_focus_exited() + + +func _configuration_focus_exited(): + configuration.mono_path = _mono_line_edit.text + configuration.inklecate_path = _executable_line_edit.text + + configuration.persist() + + +func _use_mono_toggled(_toggled: bool): + configuration.use_mono = !configuration.use_mono + configuration.persist() + + _update_mono_availability(false) + + +func _mono_button_pressed(): + _reset_file_dialog() + + _file_dialog_selection = FileDialogSelection.MONO_EXECUTABLE + _file_dialog.current_path = configuration.mono_path + _file_dialog.current_dir = configuration.mono_path.get_base_dir() + _file_dialog.current_file = configuration.mono_path.get_file() + _file_dialog.file_mode = FileDialog.FILE_MODE_OPEN_FILE + _file_dialog.access = FileDialog.ACCESS_FILESYSTEM + _file_dialog.popup_centered(Vector2(1280, 800) * editor_interface.scale) + + +func _executable_button_pressed(): + _reset_file_dialog() + + _file_dialog_selection = FileDialogSelection.INKLECATE_EXECUTABLE + _file_dialog.current_file = configuration.inklecate_path + _file_dialog.current_dir = configuration.inklecate_path.get_base_dir() + _file_dialog.current_file = configuration.inklecate_path.get_file() + _file_dialog.file_mode = FileDialog.FILE_MODE_OPEN_FILE + _file_dialog.access = FileDialog.ACCESS_FILESYSTEM + _file_dialog.popup_centered(Vector2(1280, 800) * editor_interface.scale) + + +func _recompilation_mode_button_selected(index): + configuration.compilation_mode = index + configuration.persist() + + +func _test_button_pressed(): + var test_configuration = InkExecutionConfiguration.new(configuration, false, true) + var tester = InkConfigurationTester.new(test_configuration) + + var result = tester.test_availability() + + # NOTE: At the moment, inklecate doesn't support a subcommand that would just + # exit with 0 so `_contains_inklecate_output_prefix` will always be executed. + if result.success: + var dialog = AcceptDialog.new() + add_child(dialog) + + dialog.title = "Success" + dialog.dialog_text = "The configuration seems to be valid!" + + dialog.popup_centered() + else: + var dialog = InkRichDialog.instantiate() + add_child(dialog) + + + dialog.title = "Error" + dialog.message_text = "Something went wrong while testing inklecate's setup. Please see the output below." + dialog.output_text = result.output + dialog.update_layout(editor_interface.scale) + + dialog.popup_centered(Vector2(700, 400) * editor_interface.scale) + + +func _on_file_selected(path: String): + match _file_dialog_selection: + FileDialogSelection.MONO_EXECUTABLE: + configuration.mono_path = ProjectSettings.globalize_path(path) + _update_save_and_cleanup(configuration.mono_path, _mono_line_edit) + + FileDialogSelection.INKLECATE_EXECUTABLE: + configuration.inklecate_path = ProjectSettings.globalize_path(path) + _update_save_and_cleanup(configuration.inklecate_path, _executable_line_edit) + + _: + printerr("[inkgd] [ERROR] Unknown FileDialogSelection, failed to save FileDialog file.") + + _file_dialog_selection = FileDialogSelection.UNKNOWN + + +func _check_runtime_presence(): + var ink_engine_runtime = InkCSharpValidator.new().get_runtime_path() + var is_present = !ink_engine_runtime.is_empty() + + if is_present: + _mono_support_presence_label.add_theme_color_override("font_color", Color.GREEN) + _mono_support_presence_label.text = "PRESENT" + else: + _mono_support_presence_label.add_theme_color_override("font_color", Color.RED) + _mono_support_presence_label.text = "MISSING" + + +func _mono_support_documentation_pressed(): + OS.shell_open("https://inkgd.readthedocs.io/en/latest/advanced/migrating_to_godot_mono.html") + + +# ############################################################################ # +# Private helpers +# ############################################################################ # + +func _reset_file_dialog(): + _file_dialog.current_file = "" + _file_dialog.clear_filters() + + +func _update_save_and_cleanup(value, line_edit): + line_edit.text = value + line_edit.queue_redraw() + + configuration.persist() + + +func _apply_configuration(): + var compilation_mode = configuration.compilation_mode + var item_count = _recompilation_mode_button.get_item_count() + + if compilation_mode >= 0 && compilation_mode < item_count: + _recompilation_mode_button.select(configuration.compilation_mode) + else: + _recompilation_mode_button.select(0) + + _mono_line_edit.text = configuration.mono_path + _executable_line_edit.text = configuration.inklecate_path + + _update_mono_availability(true) + + +func _update_mono_availability(updates_checkbox: bool = false): + var is_running_on_windows: bool = editor_interface.is_running_on_windows + var is_control_visible: bool = !is_running_on_windows && configuration.use_mono + + _use_mono_label.visible = !is_running_on_windows + _use_mono_checkbox.visible = !is_running_on_windows + + _mono_label.visible = is_control_visible + _mono_container.visible = is_control_visible + + if updates_checkbox: + _use_mono_checkbox.set_pressed(configuration.use_mono) + + +func _set_button_icons(): + var folder_icon = get_theme_icon("Folder", "EditorIcons") + var reload_icon = get_theme_icon("Reload", "EditorIcons") + var instance_icon = get_theme_icon("Instance", "EditorIcons") + + _mono_dialog_button.icon = folder_icon + _executable_dialog_button.icon = folder_icon + + _mono_support_documentation_button.icon = instance_icon + _mono_support_refresh_button.icon = reload_icon + + +func _connect_signals(): + editor_interface.editor_filesystem.connect("filesystem_changed", Callable(self, "_check_runtime_presence")) + + _test_button.connect("pressed", Callable(self, "_test_button_pressed")) + _use_mono_checkbox.connect("toggled", Callable(self, "_use_mono_toggled")) + + _mono_line_edit.connect("text_submitted", Callable(self, "_configuration_entered")) + _executable_line_edit.connect("text_submitted", Callable(self, "_configuration_entered")) + + _mono_line_edit.connect("focus_exited", Callable(self, "_configuration_focus_exited")) + _executable_line_edit.connect("focus_exited", Callable(self, "_configuration_focus_exited")) + + _mono_dialog_button.connect("pressed", Callable(self, "_mono_button_pressed")) + _executable_dialog_button.connect("pressed", Callable(self, "_executable_button_pressed")) + + _recompilation_mode_button.connect("item_selected", Callable(self, "_recompilation_mode_button_selected")) + + _mono_support_documentation_button.connect("pressed", Callable(self, "_mono_support_documentation_pressed")) + _mono_support_refresh_button.connect("pressed", Callable(self, "_check_runtime_presence")) + + _file_dialog.connect("file_selected", Callable(self, "_on_file_selected")) + + +func _can_run_mono(): + return type_exists("_GodotSharp") diff --git a/addons/inkgd/editor/panel/configuration/ink_configuration_panel.tscn b/addons/inkgd/editor/panel/configuration/ink_configuration_panel.tscn new file mode 100644 index 0000000..143e96d --- /dev/null +++ b/addons/inkgd/editor/panel/configuration/ink_configuration_panel.tscn @@ -0,0 +1,258 @@ +[gd_scene load_steps=6 format=3 uid="uid://cbuep470x6krw"] + +[ext_resource type="Script" path="res://addons/inkgd/editor/panel/configuration/ink_configuration_panel.gd" id="1"] + +[sub_resource type="Image" id="Image_h71nq"] +data = { +"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id="7"] +image = SubResource("Image_h71nq") + +[sub_resource type="Image" id="Image_e0kbj"] +data = { +"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id="5"] +image = SubResource("Image_e0kbj") + +[node name="Configuration" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +script = ExtResource("1") + +[node name="ScrollContainer" type="ScrollContainer" parent="."] +layout_mode = 0 +anchor_right = 1.0 +anchor_bottom = 1.0 +pivot_offset = Vector2(1346, -25) + +[node name="V" type="VBoxContainer" parent="ScrollContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 25 + +[node name="InklecateV" type="VBoxContainer" parent="ScrollContainer/V"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="H" type="HBoxContainer" parent="ScrollContainer/V/InklecateV"] +layout_mode = 2 + +[node name="Label" type="Label" parent="ScrollContainer/V/InklecateV/H"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Inklecate" + +[node name="TestButton" type="Button" parent="ScrollContainer/V/InklecateV/H"] +layout_mode = 2 +mouse_filter = 1 +text = "Test configuration" + +[node name="M" type="MarginContainer" parent="ScrollContainer/V/InklecateV"] +layout_mode = 2 + +[node name="Panel" type="Panel" parent="ScrollContainer/V/InklecateV/M"] +self_modulate = Color(1, 1, 1, 0.686275) +layout_mode = 2 + +[node name="M" type="MarginContainer" parent="ScrollContainer/V/InklecateV/M"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme_override_constants/margin_left = 5 +theme_override_constants/margin_top = 5 +theme_override_constants/margin_right = 5 +theme_override_constants/margin_bottom = 5 + +[node name="V" type="VBoxContainer" parent="ScrollContainer/V/InklecateV/M/M"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="G" type="GridContainer" parent="ScrollContainer/V/InklecateV/M/M/V"] +layout_mode = 2 +size_flags_horizontal = 3 +columns = 2 + +[node name="UseMonoLabel" type="Label" parent="ScrollContainer/V/InklecateV/M/M/V/G"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 1 +tooltip_text = "When toggled, run inklecate through Mono. + +Only enable this setting is you want to use an older version of inklecate or you have a custom setup. +Modern versions of inklecate come bundled with a mono runtime on all platforms." +mouse_filter = 1 +text = "Use Mono / .NET Core" + +[node name="UseMonoCheckBox" type="CheckBox" parent="ScrollContainer/V/InklecateV/M/M/V/G"] +layout_mode = 2 +text = "Yes" + +[node name="MonoLabel" type="Label" parent="ScrollContainer/V/InklecateV/M/M/V/G"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 1 +tooltip_text = "The path to Mono." +mouse_filter = 1 +text = "Mono / .NET Core Executable" + +[node name="MonoH" type="HBoxContainer" parent="ScrollContainer/V/InklecateV/M/M/V/G"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="MonoLineEdit" type="LineEdit" parent="ScrollContainer/V/InklecateV/M/M/V/G/MonoH"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "/Library/Frameworks/Mono.framework/Versions/Current/Commands/mono" + +[node name="MonoDialogButton" type="Button" parent="ScrollContainer/V/InklecateV/M/M/V/G/MonoH"] +layout_mode = 2 +icon = SubResource("7") + +[node name="ExecutableLabel" type="Label" parent="ScrollContainer/V/InklecateV/M/M/V/G"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 1 +tooltip_text = "The path to inklecate." +mouse_filter = 1 +text = "Executable" + +[node name="ExecutableH" type="HBoxContainer" parent="ScrollContainer/V/InklecateV/M/M/V/G"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="ExecutableLineEdit" type="LineEdit" parent="ScrollContainer/V/InklecateV/M/M/V/G/ExecutableH"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "/opt/homebrew/bin/inklecate" + +[node name="ExecutableDialogButton" type="Button" parent="ScrollContainer/V/InklecateV/M/M/V/G/ExecutableH"] +layout_mode = 2 +icon = SubResource("7") + +[node name="Recompilation Mode" type="Label" parent="ScrollContainer/V/InklecateV/M/M/V/G"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 1 +tooltip_text = "Define if/when your stories should be recompiled. + +– Manual: no automatic compilation. +– During Build: every time the project is built/ran, the stories will be recompiled. +– On change: as soon as an Ink resource is reimported by Godot, trigger a recompilation. A folder to watch can be defined in the \"Story\" tab." +mouse_filter = 1 +text = "Recompilation Mode" + +[node name="RecompilationModeOptionButton" type="OptionButton" parent="ScrollContainer/V/InklecateV/M/M/V/G"] +layout_mode = 2 +item_count = 3 +selected = 0 +popup/item_0/text = "Manual" +popup/item_0/id = 0 +popup/item_1/text = "During Build" +popup/item_1/id = 1 +popup/item_2/text = "On change (experimental)" +popup/item_2/id = 2 + +[node name="InkDirectoryLabel" type="Label" parent="ScrollContainer/V/InklecateV/M/M/V/G"] +visible = false +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 1 +tooltip_text = "The path to Mono." +mouse_filter = 1 +text = "Mono" + +[node name="InkDirectoryH" type="HBoxContainer" parent="ScrollContainer/V/InklecateV/M/M/V/G"] +visible = false +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="InkDirectoryLineEdit" type="LineEdit" parent="ScrollContainer/V/InklecateV/M/M/V/G/InkDirectoryH"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="InkDIrectoryDialogButton" type="Button" parent="ScrollContainer/V/InklecateV/M/M/V/G/InkDirectoryH"] +layout_mode = 2 +icon = SubResource("5") + +[node name="MonoSupportV" type="VBoxContainer" parent="ScrollContainer/V"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="H" type="HBoxContainer" parent="ScrollContainer/V/MonoSupportV"] +layout_mode = 2 + +[node name="Label" type="Label" parent="ScrollContainer/V/MonoSupportV/H"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Mono Support" + +[node name="DocumentationButton" type="Button" parent="ScrollContainer/V/MonoSupportV/H"] +layout_mode = 2 +mouse_filter = 1 +theme_override_constants/h_separation = 8 +text = "Documentation" + +[node name="M" type="MarginContainer" parent="ScrollContainer/V/MonoSupportV"] +layout_mode = 2 + +[node name="Panel" type="Panel" parent="ScrollContainer/V/MonoSupportV/M"] +self_modulate = Color(1, 1, 1, 0.686275) +layout_mode = 2 + +[node name="M" type="MarginContainer" parent="ScrollContainer/V/MonoSupportV/M"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme_override_constants/margin_left = 5 +theme_override_constants/margin_top = 5 +theme_override_constants/margin_right = 5 +theme_override_constants/margin_bottom = 5 + +[node name="V" type="VBoxContainer" parent="ScrollContainer/V/MonoSupportV/M/M"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="G" type="GridContainer" parent="ScrollContainer/V/MonoSupportV/M/M/V"] +layout_mode = 2 +size_flags_horizontal = 3 +columns = 2 + +[node name="DLLLabel" type="Label" parent="ScrollContainer/V/MonoSupportV/M/M/V/G"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 1 +tooltip_text = "Whether the ink runtime DLL (ink-engine-runtime.dll) can be found in the project or not." +mouse_filter = 1 +text = "ink DLL" + +[node name="DLLH" type="HBoxContainer" parent="ScrollContainer/V/MonoSupportV/M/M/V/G"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="PresenceLabel" type="Label" parent="ScrollContainer/V/MonoSupportV/M/M/V/G/DLLH"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 1 +mouse_filter = 1 +theme_override_colors/font_color = Color(1, 0, 0, 1) +text = "MISSING" + +[node name="RefreshButton" type="Button" parent="ScrollContainer/V/MonoSupportV/M/M/V/G/DLLH"] +layout_mode = 2 +theme_override_constants/h_separation = 8 +text = "Scan" +icon = SubResource("7") diff --git a/addons/inkgd/editor/panel/ink_bottom_panel.gd b/addons/inkgd/editor/panel/ink_bottom_panel.gd new file mode 100644 index 0000000..e451d93 --- /dev/null +++ b/addons/inkgd/editor/panel/ink_bottom_panel.gd @@ -0,0 +1,106 @@ +@tool +# warning-ignore-all:return_value_discarded + +# ############################################################################ # +# Copyright © 2019-2022 Frédéric Maquin +# Licensed under the MIT License. +# See LICENSE in the project root for license information. +# ############################################################################ # + +extends Control + +# Hiding this type to prevent registration of "private" nodes. +# See https://github.com/godotengine/godot-proposals/issues/1047 +# class_name InkBottomPanel + +# ############################################################################ # +# Imports +# ############################################################################ # + +var InkStoryPanelScene = load("res://addons/inkgd/editor/panel/stories/ink_story_panel.tscn") +var InkPreviewPanelScene = load("res://addons/inkgd/editor/panel/preview/ink_preview_panel.tscn") +var InkConfigurationPanelScene = load("res://addons/inkgd/editor/panel/configuration/ink_configuration_panel.tscn") + +# ############################################################################ # +# Properties +# ############################################################################ # + +var editor_interface: InkEditorInterface = null +var configuration: InkConfiguration = null + +# ############################################################################ # +# Private Properties +# ############################################################################ # + +var _progress_texture: AnimatedTexture + +# ############################################################################ # +# Hierarchy Nodes +# ############################################################################ # + +@onready var _tab_container: TabContainer = $TabContainer +@onready var _beta_button: LinkButton = $MarginContainer/LinkButton + +@onready var _story_panel = InkStoryPanelScene.instantiate() +@onready var _preview_panel = InkPreviewPanelScene.instantiate() +@onready var _configuration_panel = InkConfigurationPanelScene.instantiate() + +# ############################################################################ # +# Overrides +# ############################################################################ # + +func _ready(): + # FIXME: This needs investigating. + # Sanity check. It seems the editor instantiates tools script on their + # own, probably to add them to its tree. In that case, they won't have + # their dependencies injected, so we're not doing anything. + if editor_interface == null || configuration == null: + print("[inkgd] [INFO] Ink Bottom Panel: dependencies not met, ignoring.") + return + + _progress_texture = _create_progress_texture() + + _story_panel.editor_interface = editor_interface + _story_panel.configuration = configuration + _story_panel.progress_texture = _progress_texture + + _preview_panel.editor_interface = editor_interface + _preview_panel.configuration = configuration + _preview_panel.progress_texture = _progress_texture + + _configuration_panel.editor_interface = editor_interface + _configuration_panel.configuration = configuration + + _tab_container.add_child(_story_panel) + _tab_container.add_child(_preview_panel) + _tab_container.add_child(_configuration_panel) + + _beta_button.connect("pressed", Callable(self, "_open_github_issues")) + + _set_minimum_panel_size() + + +# ############################################################################ # +# Signals Receivers +# ############################################################################ # + +func _open_github_issues(): + OS.shell_open("https://github.com/ephread/inkgd/issues/new?assignees=&labels=&template=bug_report.md") + +# ############################################################################ # +# Private helpers +# ############################################################################ # + +func _create_progress_texture() -> AnimatedTexture: + var animated_texture = AnimatedTexture.new() + animated_texture.frames = 8 + + for index in range(8): + var texture = get_theme_icon(str("Progress", (index + 1)), "EditorIcons") + animated_texture.set_frame_texture(index, texture) + + return animated_texture + +func _set_minimum_panel_size(): + # Adapting the minimum size of the panel to the scale of the editor. + custom_minimum_size = Vector2(900, 245) * editor_interface.scale diff --git a/addons/inkgd/editor/panel/ink_bottom_panel.tscn b/addons/inkgd/editor/panel/ink_bottom_panel.tscn new file mode 100644 index 0000000..2ed2868 --- /dev/null +++ b/addons/inkgd/editor/panel/ink_bottom_panel.tscn @@ -0,0 +1,51 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/inkgd/editor/panel/ink_bottom_panel.gd" type="Script" id=1] + +[node name="Control" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TabContainer" type="TabContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +custom_minimum_size = Vector2( 0, 428.75 ) +size_flags_vertical = 3 +tab_alignment = 0 +drag_to_rearrange_enabled = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="MarginContainer" type="MarginContainer" parent="."] +anchor_right = 1.0 +offset_bottom = 24.0 +clip_contents = true +mouse_filter = 2 +size_flags_horizontal = 0 +size_flags_vertical = 0 +theme_override_constants/margin_right = 5 +theme_override_constants/margin_top = 5 +theme_override_constants/margin_left = 5 +theme_override_constants/margin_bottom = 5 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="LinkButton" type="LinkButton" parent="MarginContainer"] +self_modulate = Color( 1, 1, 1, 0.647059 ) +offset_left = 1887.0 +offset_top = 5.0 +offset_right = 1915.0 +offset_bottom = 19.0 +tooltip_text = "Open a new issue on Github to report a problem!" +size_flags_horizontal = 8 +text = "beta" +underline = 1 +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/addons/inkgd/editor/panel/preview/ink_preview_panel.gd b/addons/inkgd/editor/panel/preview/ink_preview_panel.gd new file mode 100644 index 0000000..4c1560d --- /dev/null +++ b/addons/inkgd/editor/panel/preview/ink_preview_panel.gd @@ -0,0 +1,366 @@ +@tool +# ############################################################################ # +# Copyright © 2018-2022 Paul Joannon +# Copyright © 2019-2022 Frédéric Maquin +# Licensed under the MIT License. +# See LICENSE in the project root for license information. +# ############################################################################ # + +extends Control + +# Hiding this type to prevent registration of "private" nodes. +# See https://github.com/godotengine/godot-proposals/issues/1047 +# class_name InkPreviewPanel + +# ############################################################################ # +# Imports +# ############################################################################ # + +var InkPlayerFactory := preload("res://addons/inkgd/ink_player_factory.gd") as GDScript + +# ############################################################################ # +# Enums +# ############################################################################ # + +enum StoryOrigin { + CONFIGURATION, + FILE +} + +# ############################################################################ # +# Constants +# ############################################################################ # + +const NAME = "name" +const STORY_ORIGIN = "story_origin" +const FILE_PATH = "file_path" + +# ############################################################################ # +# Public Properties +# ############################################################################ # + +var editor_interface: InkEditorInterface +var configuration: InkConfiguration +var progress_texture: AnimatedTexture + +# ############################################################################ # +# Private Properties +# ############################################################################ # + +var _scrollbar_max_value = -1 +var _current_story_index = -1 + +var _custom_stories: Array = [] +var _available_stories: Array = [] + +var _file_dialog = EditorFileDialog.new() + +var _ink_player = InkPlayerFactory.create() + +# ############################################################################ # +# On Ready | Private Properties +# ############################################################################ # + +@onready var _play_icon = get_theme_icon("Play", "EditorIcons") + +# ############################################################################ # +# On Ready | Private Nodes +# ############################################################################ + +@onready var _command_strip = find_child("CommandStripHBoxContainer") + +@onready var _pick_story_button = _command_strip.get_node("PickStoryOptionButton") +@onready var _load_story_button = _command_strip.get_node("LoadStoryButton") +@onready var _start_button = _command_strip.get_node("StartButton") +@onready var _stop_button = _command_strip.get_node("StopButton") +@onready var _clear_button = _command_strip.get_node("ClearButton") + +@onready var _scroll_container = find_child("ScrollContainer") +@onready var _story_container = _scroll_container.get_node("MarginContainer/StoryVBoxContainer") + +@onready var _choice_area_container = find_child("ChoicesAreaVBoxContainer") +@onready var _choices_container = _choice_area_container.get_node("ChoicesVBoxContainer") + +# ############################################################################ # +# Overrides +# ############################################################################ # + +func _ready(): + # FIXME: This needs investigating. + # Sanity check. It seems the editor instantiates tools script on their + # own, probably to add them to its tree. In that case, they won't have + # their dependencies injected, so we're not doing anything. + if editor_interface == null || configuration == null || progress_texture == null: + print("[inkgd] [INFO] Ink Preview Tab: dependencies not met, ignoring.") + return + + add_child(_ink_player) + + _connect_signals() + _apply_configuration() + _update_story_picker() + + var load_icon = get_theme_icon("Load", "EditorIcons") + var stop_icon = get_theme_icon("Stop", "EditorIcons") + var clear_icon = get_theme_icon("Clear", "EditorIcons") + + _start_button.icon = _play_icon + _load_story_button.icon = load_icon + _stop_button.icon = stop_icon + _clear_button.icon = clear_icon + + _stop_button.visible = false + + _choice_area_container.custom_minimum_size = Vector2(200, 0) * editor_interface.scale + _choice_area_container.visible = false + + _file_dialog.connect("file_selected", Callable(self, "_on_file_selected")) + add_child(_file_dialog) + +# ############################################################################ # +# Signal Receivers +# ############################################################################ # + +func _start_button_pressed(): + var file_path = _get_current_story_file_path() + if file_path == null: + return + + print("[inkgd] [INFO] Previewing %s" % file_path) + _clear_content() + + _ink_player.destroy() + _ink_player.ink_file = load(file_path) + + _start_button.icon = progress_texture + _disable_command_strip(true) + + _ink_player.create_story() + + +func _stop_button_pressed(): + _start_button.visible = true + _stop_button.visible = false + _choice_area_container.visible = false + + _ink_player.destroy() + + _clear_choices() + _clear_content() + + +func _story_loaded(successfully: bool): + _disable_command_strip(false) + _start_button.icon = _play_icon + + if !successfully: + return + + _start_button.visible = false + _stop_button.visible = true + + _ink_player.allow_external_function_fallbacks = true + _continue_story() + +func _pick_story_button_selected(index): + if _current_story_index != index: + _stop_button_pressed() + + _current_story_index = index + + +func _load_story_button_pressed(): + _file_dialog.file_mode = FileDialog.FILE_MODE_OPEN_FILE + _file_dialog.access = FileDialog.ACCESS_RESOURCES + _file_dialog.add_filter("*.json;Compiled Ink story") + _file_dialog.popup_centered(Vector2(1280, 800) * editor_interface.scale) + + +func _choice_button_pressed(index): + _clear_choices() + + _ink_player.choose_choice_index(index) + _continue_story() + + +func _on_file_selected(path: String): + if _custom_stories.has(path): + return + + for story_configuration in self.configuration.stories: + var target_file_path = self.configuration.get_target_file_path(story_configuration) + if target_file_path == path: + return + + _custom_stories.append(path) + _apply_configuration() + _update_story_picker(path) + + +func _scrollbar_changed(): + var max_value = _scroll_container.get_v_scroll_bar().max_value + + if _scrollbar_max_value == max_value && _scrollbar_max_value != -1: + return + + _scrollbar_max_value = max_value + _scroll_container.scroll_vertical = max_value + + +func _configuration_changed(): + # Cleaning everything on configuration change may end up being frustrating. + # But for now, it's going to make everybody's life easier. + _stop_button_pressed() + _apply_configuration() + _update_story_picker() + + +# ############################################################################ # +# Private Methods +# ############################################################################ # + +func _apply_configuration(): + _available_stories.clear() + + _current_story_index = -1 + _pick_story_button.selected = _current_story_index + + var i = 0 + for story_configuration in self.configuration.stories: + var target_file_path = self.configuration.get_target_file_path(story_configuration) + if target_file_path != null && !target_file_path.is_empty(): + _available_stories.append({ + NAME: "Story %d - %s" % [i + 1, target_file_path.get_file()], + FILE_PATH: target_file_path, + STORY_ORIGIN: StoryOrigin.CONFIGURATION + }) + i += 1 + + var j = 0 + for custom_story_path in _custom_stories: + if custom_story_path != null && !custom_story_path.is_empty(): + _available_stories.append({ + NAME: custom_story_path.get_file(), + FILE_PATH: ProjectSettings.localize_path(custom_story_path), + STORY_ORIGIN: StoryOrigin.FILE + }) + j += 1 + + +func _update_story_picker(selected_path = null): + _pick_story_button.clear() + + var i = 0 + for story in _available_stories: + _pick_story_button.add_item(story[NAME], i) + if selected_path != null && story[FILE_PATH] == selected_path: + _current_story_index = i + _pick_story_button.selected = _current_story_index + i += 1 + + if _available_stories.size() > 0: + if _current_story_index == -1: + _current_story_index = 0 + _pick_story_button.selected = _current_story_index + + _pick_story_button.visible = true + else: + _current_story_index = -1 + _pick_story_button.selected = _current_story_index + + _pick_story_button.visible = false + + +func _continue_story(): + while _ink_player.can_continue: + var text = _ink_player.continue_story() + + if text.right(text.length() - 1) == "\n": + text.erase(text.length() - 1, 1) + + var text_label = Label.new() + text_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + text_label.text = text + + _story_container.add_child(text_label) + + var tags = _ink_player.current_tags + if !tags.is_empty(): + var tag_label = Label.new() + tag_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + tag_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + tag_label.text = "# " + ", ".join(PackedStringArray(tags)) + tag_label.add_theme_color_override("font_color", Color(1, 1, 1, 0.4)) + + _story_container.add_child(tag_label) + + var separator = HSeparator.new() + _story_container.add_child(separator) + + if _ink_player.current_choices.size() > 0: + var i = 0 + for choice in _ink_player.current_choices: + var button = Button.new() + button.text = choice.text + button.connect("pressed", Callable(self, "_choice_button_pressed").bind(i)) + + _choices_container.add_child(button) + i += 1 + + _choice_area_container.visible = true + else: + var label = Label.new() + label.text = "End of the story." + label.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT + + _story_container.add_child(label) + + _choice_area_container.visible = false + + +func _get_current_story_file_path(): + if _current_story_index >= 0 && _current_story_index < _available_stories.size(): + return _available_stories[_current_story_index][FILE_PATH] + else: + return null + + +func _clear_content(): + for child in _story_container.get_children(): + _story_container.remove_child(child) + child.queue_free() + + +func _clear_choices(): + for child in _choices_container.get_children(): + _choices_container.remove_child(child) + child.queue_free() + +func _disable_command_strip(disabled: bool): + _pick_story_button.disabled = disabled + _load_story_button.disabled = disabled + _start_button.disabled = disabled + _stop_button.disabled = disabled + _clear_button.disabled = disabled + +func _connect_signals(): + if configuration != null: + var is_signal_connected := configuration.is_connected( + "story_configuration_changed", + Callable(self, "_configuration_changed") + ) + + if !is_signal_connected: + configuration.connect( + "story_configuration_changed", + Callable(self, "_configuration_changed") + ) + + _ink_player.connect("loaded", Callable(self, "_story_loaded")) + _pick_story_button.connect("item_selected", Callable(self, "_pick_story_button_selected")) + _load_story_button.connect("pressed", Callable(self, "_load_story_button_pressed")) + _start_button.connect("pressed", Callable(self, "_start_button_pressed")) + _stop_button.connect("pressed", Callable(self, "_stop_button_pressed")) + _clear_button.connect("pressed", Callable(self, "_clear_content")) + + _scroll_container.get_v_scroll_bar().connect("changed", Callable(self, "_scrollbar_changed")) diff --git a/addons/inkgd/editor/panel/preview/ink_preview_panel.tscn b/addons/inkgd/editor/panel/preview/ink_preview_panel.tscn new file mode 100644 index 0000000..202fde0 --- /dev/null +++ b/addons/inkgd/editor/panel/preview/ink_preview_panel.tscn @@ -0,0 +1,119 @@ +[gd_scene load_steps=4 format=3 uid="uid://0do8xgmkscjn"] + +[ext_resource type="Script" path="res://addons/inkgd/editor/panel/preview/ink_preview_panel.gd" id="2"] + +[sub_resource type="Image" id="Image_nl482"] +data = { +"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id="2"] +image = SubResource("Image_nl482") + +[node name="Preview" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +script = ExtResource("2") + +[node name="MarginContainer" type="MarginContainer" parent="."] +layout_mode = 0 +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="HSplitContainer" type="HSplitContainer" parent="MarginContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="StoryVBoxContainer" type="VBoxContainer" parent="MarginContainer/HSplitContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme_override_constants/separation = 5 + +[node name="CommandStripHBoxContainer" type="HBoxContainer" parent="MarginContainer/HSplitContainer/StoryVBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 10 + +[node name="LoadStoryButton" type="Button" parent="MarginContainer/HSplitContainer/StoryVBoxContainer/CommandStripHBoxContainer"] +layout_mode = 2 +theme_override_constants/h_separation = 8 +text = "Load new…" +icon = SubResource("2") + +[node name="PickStoryOptionButton" type="OptionButton" parent="MarginContainer/HSplitContainer/StoryVBoxContainer/CommandStripHBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 0 + +[node name="Control" type="Control" parent="MarginContainer/HSplitContainer/StoryVBoxContainer/CommandStripHBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="StartButton" type="Button" parent="MarginContainer/HSplitContainer/StoryVBoxContainer/CommandStripHBoxContainer"] +layout_mode = 2 +theme_override_constants/h_separation = 8 +text = "Start" +icon = SubResource("2") + +[node name="StopButton" type="Button" parent="MarginContainer/HSplitContainer/StoryVBoxContainer/CommandStripHBoxContainer"] +visible = false +layout_mode = 2 +theme_override_constants/h_separation = 10 +text = "Stop" +icon = SubResource("2") + +[node name="ClearButton" type="Button" parent="MarginContainer/HSplitContainer/StoryVBoxContainer/CommandStripHBoxContainer"] +layout_mode = 2 +theme_override_constants/h_separation = 8 +text = "Clear" +icon = SubResource("2") + +[node name="MarginContainer" type="MarginContainer" parent="MarginContainer/HSplitContainer/StoryVBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Panel" type="Panel" parent="MarginContainer/HSplitContainer/StoryVBoxContainer/MarginContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="ScrollContainer" type="ScrollContainer" parent="MarginContainer/HSplitContainer/StoryVBoxContainer/MarginContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="MarginContainer" type="MarginContainer" parent="MarginContainer/HSplitContainer/StoryVBoxContainer/MarginContainer/ScrollContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +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="StoryVBoxContainer" type="VBoxContainer" parent="MarginContainer/HSplitContainer/StoryVBoxContainer/MarginContainer/ScrollContainer/MarginContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="ChoicesAreaVBoxContainer" type="VBoxContainer" parent="MarginContainer/HSplitContainer"] +custom_minimum_size = Vector2(300, 0) +layout_mode = 2 +theme_override_constants/separation = 5 + +[node name="Button" type="Button" parent="MarginContainer/HSplitContainer/ChoicesAreaVBoxContainer"] +layout_mode = 2 +mouse_filter = 2 +text = "Choices" +flat = true + +[node name="ChoicesVBoxContainer" type="VBoxContainer" parent="MarginContainer/HSplitContainer/ChoicesAreaVBoxContainer"] +layout_mode = 2 diff --git a/addons/inkgd/editor/panel/stories/empty_state_container.tscn b/addons/inkgd/editor/panel/stories/empty_state_container.tscn new file mode 100644 index 0000000..9ccc9a1 --- /dev/null +++ b/addons/inkgd/editor/panel/stories/empty_state_container.tscn @@ -0,0 +1,13 @@ +[gd_scene format=2] + +[node name="EmptyStateContainer" type="CenterContainer"] +offset_right = 1902.0 +offset_bottom = 100.0 +custom_minimum_size = Vector2( 0, 100 ) + +[node name="Label" type="Label" parent="."] +offset_left = 879.0 +offset_top = 43.0 +offset_right = 1022.0 +offset_bottom = 57.0 +text = "No stories to compile." diff --git a/addons/inkgd/editor/panel/stories/ink_story_configuration.gd b/addons/inkgd/editor/panel/stories/ink_story_configuration.gd new file mode 100644 index 0000000..25cdac7 --- /dev/null +++ b/addons/inkgd/editor/panel/stories/ink_story_configuration.gd @@ -0,0 +1,153 @@ +@tool +# ############################################################################ # +# Copyright © 2019-2022 Frédéric Maquin +# Licensed under the MIT License. +# See LICENSE in the project root for license information. +# ############################################################################ # + +extends VBoxContainer + +# Hiding this type to prevent registration of "private" nodes. +# See https://github.com/godotengine/godot-proposals/issues/1047 +# class_name InkStoryConfiguration + +# ############################################################################ # +# Signals +# ############################################################################ # + +signal configuration_changed(story_configuration) + +signal remove_button_pressed(story_configuration) + +signal build_button_pressed(story_configuration) + +signal source_file_button_pressed(story_configuration) + +signal target_file_button_pressed(story_configuration) + +signal watched_folder_button_pressed(story_configuration) + +# ############################################################################ # +# Properties +# ############################################################################ # + +var editor_interface: InkEditorInterface = null + +# ############################################################################ # +# Nodes +# ############################################################################ # + +@onready var story_label = find_child("StoryLabel") + +@onready var remove_button = find_child("RemoveButton") +@onready var build_button = find_child("BuildButton") + +@onready var source_file_line_edit = find_child("SourceFileLineEdit") +@onready var source_file_dialog_button = find_child("SourceFileDialogButton") + +@onready var target_file_line_edit = find_child("TargetFileLineEdit") +@onready var target_file_dialog_button = find_child("TargetFileDialogButton") + +@onready var watched_folder_label = find_child("WatchedFolderLabel") +@onready var watched_folder_container = find_child("WatchedFolderHBoxContainer") +@onready var watched_folder_line_edit = find_child("WatchedFolderLineEdit") +@onready var watched_folder_dialog_button = find_child("WatchedFolderDialogButton") + +@onready var background_color_rect = find_child("BackgroundColorRect") + +# ############################################################################ # +# Overrides +# ############################################################################ # + +func _ready(): + # FIXME: This needs investigating. + # Sanity check. It seems the editor instantiates tools script on their + # own, probably to add them to its tree. In that case, they won't have + # their dependencies injected, so we're not doing anything. + if editor_interface == null: + return + + _apply_custom_header_color() + _set_button_icons() + _connect_signals() + + show_watched_folder(false) + +# ############################################################################ # +# Signals +# ############################################################################ # + +func _configuration_entered(_new_text: String): + _configuration_focus_exited() + + +func _configuration_focus_exited(): + emit_signal("configuration_changed", self) + + +func _remove_button_pressed(): + emit_signal("remove_button_pressed", self) + + +func _build_button_pressed(): + emit_signal("build_button_pressed", self) + + +func _source_file_button_pressed(): + emit_signal("source_file_button_pressed", self) + + +func _target_file_button_pressed(): + emit_signal("target_file_button_pressed", self) + + +func _watched_folder_button_pressed(): + emit_signal("watched_folder_button_pressed", self) + +# ############################################################################ # +# Public Methods +# ############################################################################ # + +@warning_ignore("shadowed_variable") +func show_watched_folder(show: bool): + watched_folder_label.visible = show + watched_folder_container.visible = show + +func disable_all_buttons(disable: bool): + remove_button.disabled = disable + build_button.disabled = disable + + +# ############################################################################ # +# Private Methods +# ############################################################################ # + +func _apply_custom_header_color(): + var header_color = editor_interface.get_custom_header_color() + if header_color != Color.TRANSPARENT: + background_color_rect.color = header_color + + +func _set_button_icons(): + var folder_icon = get_theme_icon("Folder", "EditorIcons") + source_file_dialog_button.icon = folder_icon + target_file_dialog_button.icon = folder_icon + watched_folder_dialog_button.icon = folder_icon + + var trash_icon = get_theme_icon("Remove", "EditorIcons") + remove_button.icon = trash_icon + + +func _connect_signals(): + source_file_line_edit.connect("text_submitted", Callable(self, "_configuration_entered")) + source_file_line_edit.connect("focus_exited", Callable(self, "_configuration_focus_exited")) + + target_file_line_edit.connect("text_submitted", Callable(self, "_configuration_entered")) + target_file_line_edit.connect("focus_exited", Callable(self, "_configuration_focus_exited")) + + source_file_dialog_button.connect("pressed", Callable(self, "_source_file_button_pressed")) + target_file_dialog_button.connect("pressed", Callable(self, "_target_file_button_pressed")) + watched_folder_dialog_button.connect("pressed", Callable(self, "_watched_folder_button_pressed")) + + remove_button.connect("pressed", Callable(self, "_remove_button_pressed")) + build_button.connect("pressed", Callable(self, "_build_button_pressed")) diff --git a/addons/inkgd/editor/panel/stories/ink_story_configuration.tscn b/addons/inkgd/editor/panel/stories/ink_story_configuration.tscn new file mode 100644 index 0000000..2b16072 --- /dev/null +++ b/addons/inkgd/editor/panel/stories/ink_story_configuration.tscn @@ -0,0 +1,189 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://addons/inkgd/editor/panel/stories/ink_story_configuration.gd" type="Script" id=1] + +[sub_resource type="Image" id=3] +data = { +"data": PackedByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=2] +flags = 4 +flags = 4 +image = SubResource( 3 ) +size = Vector2( 16, 16 ) + +[node name="StoryConfiguration" type="VBoxContainer"] +offset_right = 1902.0 +offset_bottom = 87.0 +theme_override_constants/separation = 5 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HeaderMarginContainer" type="MarginContainer" parent="."] +offset_right = 1902.0 +offset_bottom = 32.0 +theme_override_constants/margin_right = 0 +theme_override_constants/margin_top = 0 +theme_override_constants/margin_left = 0 +theme_override_constants/margin_bottom = 0 + +[node name="BackgroundColorRect" type="ColorRect" parent="HeaderMarginContainer"] +offset_right = 1902.0 +offset_bottom = 32.0 +color = Color( 0.268314, 0.291712, 0.340784, 1 ) + +[node name="MarginContainer" type="MarginContainer" parent="HeaderMarginContainer"] +offset_right = 1902.0 +offset_bottom = 32.0 +theme_override_constants/margin_right = 5 +theme_override_constants/margin_top = 5 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_bottom = 5 + +[node name="HBoxContainer" type="HBoxContainer" parent="HeaderMarginContainer/MarginContainer"] +offset_left = 25.0 +offset_top = 5.0 +offset_right = 1897.0 +offset_bottom = 27.0 + +[node name="StoryLabel" type="Label" parent="HeaderMarginContainer/MarginContainer/HBoxContainer"] +offset_top = 4.0 +offset_right = 1711.0 +offset_bottom = 18.0 +size_flags_horizontal = 3 +text = "0" + +[node name="RemoveButton" type="Button" parent="HeaderMarginContainer/MarginContainer/HBoxContainer"] +offset_left = 1715.0 +offset_right = 1803.0 +offset_bottom = 22.0 +mouse_filter = 1 +theme_override_constants/h_separation = 8 +text = "Remove" +icon = SubResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false, +"_editor_description_": "Compile the story manually, based on the configuration below." +} + +[node name="BuildButton" type="Button" parent="HeaderMarginContainer/MarginContainer/HBoxContainer"] +offset_left = 1807.0 +offset_right = 1872.0 +offset_bottom = 22.0 +mouse_filter = 1 +theme_override_constants/h_separation = 8 +text = "Compile" +__meta__ = { +"_edit_use_anchors_": false, +"_editor_description_": "Compile the story manually, based on the configuration below." +} + +[node name="ConfigurationMarginContainer" type="MarginContainer" parent="."] +offset_top = 37.0 +offset_right = 1902.0 +offset_bottom = 117.0 +theme_override_constants/margin_right = 0 +theme_override_constants/margin_top = 0 +theme_override_constants/margin_left = 5 +theme_override_constants/margin_bottom = 0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="GridContainer" type="GridContainer" parent="ConfigurationMarginContainer"] +offset_left = 5.0 +offset_right = 1902.0 +offset_bottom = 80.0 +size_flags_horizontal = 3 +columns = 2 + +[node name="SourceFileLabel" type="Label" parent="ConfigurationMarginContainer/GridContainer"] +offset_right = 946.0 +offset_bottom = 24.0 +tooltip_text = "The input path, a.k.a the original ink story." +mouse_filter = 1 +size_flags_horizontal = 3 +size_flags_vertical = 1 +text = "Source File (*.ink)" + +[node name="SourceFileHBoxContainer" type="HBoxContainer" parent="ConfigurationMarginContainer/GridContainer"] +offset_left = 950.0 +offset_right = 1896.0 +offset_bottom = 24.0 +size_flags_horizontal = 3 + +[node name="SourceFileLineEdit" type="LineEdit" parent="ConfigurationMarginContainer/GridContainer/SourceFileHBoxContainer"] +offset_right = 914.0 +offset_bottom = 24.0 +size_flags_horizontal = 3 + +[node name="SourceFileDialogButton" type="Button" parent="ConfigurationMarginContainer/GridContainer/SourceFileHBoxContainer"] +offset_left = 918.0 +offset_right = 946.0 +offset_bottom = 24.0 +icon = SubResource( 2 ) + +[node name="TargetFileLabel" type="Label" parent="ConfigurationMarginContainer/GridContainer"] +offset_top = 28.0 +offset_right = 946.0 +offset_bottom = 52.0 +tooltip_text = "The output path, a.k.a the JSON file compiled from the original ink story." +mouse_filter = 1 +size_flags_horizontal = 3 +size_flags_vertical = 1 +text = "Target File (*.json)" + +[node name="TargetFileHBoxContainer" type="HBoxContainer" parent="ConfigurationMarginContainer/GridContainer"] +offset_left = 950.0 +offset_top = 28.0 +offset_right = 1896.0 +offset_bottom = 52.0 +size_flags_horizontal = 3 + +[node name="TargetFileLineEdit" type="LineEdit" parent="ConfigurationMarginContainer/GridContainer/TargetFileHBoxContainer"] +offset_right = 914.0 +offset_bottom = 24.0 +size_flags_horizontal = 3 + +[node name="TargetFileDialogButton" type="Button" parent="ConfigurationMarginContainer/GridContainer/TargetFileHBoxContainer"] +offset_left = 918.0 +offset_right = 946.0 +offset_bottom = 24.0 +icon = SubResource( 2 ) + +[node name="WatchedFolderLabel" type="Label" parent="ConfigurationMarginContainer/GridContainer"] +offset_top = 56.0 +offset_right = 946.0 +offset_bottom = 80.0 +tooltip_text = "The directory to watch for changes in Ink sources. + +This path is optional, leave it blank to disable automatic recompilation for that story." +mouse_filter = 1 +size_flags_horizontal = 3 +size_flags_vertical = 1 +text = "Watched Folder" + +[node name="WatchedFolderHBoxContainer" type="HBoxContainer" parent="ConfigurationMarginContainer/GridContainer"] +offset_left = 950.0 +offset_top = 56.0 +offset_right = 1896.0 +offset_bottom = 80.0 +size_flags_horizontal = 3 + +[node name="WatchedFolderLineEdit" type="LineEdit" parent="ConfigurationMarginContainer/GridContainer/WatchedFolderHBoxContainer"] +offset_right = 914.0 +offset_bottom = 24.0 +size_flags_horizontal = 3 + +[node name="WatchedFolderDialogButton" type="Button" parent="ConfigurationMarginContainer/GridContainer/WatchedFolderHBoxContainer"] +offset_left = 918.0 +offset_right = 946.0 +offset_bottom = 24.0 +icon = SubResource( 2 ) diff --git a/addons/inkgd/editor/panel/stories/ink_story_panel.gd b/addons/inkgd/editor/panel/stories/ink_story_panel.gd new file mode 100644 index 0000000..222dcb6 --- /dev/null +++ b/addons/inkgd/editor/panel/stories/ink_story_panel.gd @@ -0,0 +1,524 @@ +@tool +# ############################################################################ # +# Copyright © 2019-2022 Frédéric Maquin +# Licensed under the MIT License. +# See LICENSE in the project root for license information. +# ############################################################################ # + +extends Control + +# Hiding this type to prevent registration of "private" nodes. +# See https://github.com/godotengine/godot-proposals/issues/1047 +# class_name InkStoryPanel + +# ############################################################################ # +# Imports +# ############################################################################ # + +var InkConfiguration = load("res://addons/inkgd/editor/common/ink_configuration.gd") + +var InkCompilationConfiguration = load("res://addons/inkgd/editor/common/executors/structures/ink_compilation_configuration.gd") +var InkCompiler = load("res://addons/inkgd/editor/common/executors/ink_compiler.gd") + +var InkRichDialog = load("res://addons/inkgd/editor/panel/common/ink_rich_dialog.tscn") +var InkProgressDialog = load("res://addons/inkgd/editor/panel/common/ink_progress_dialog.tscn") +var InkStoryConfigurationScene = load("res://addons/inkgd/editor/panel/stories/ink_story_configuration.tscn") +var EmptyStateContainerScene = load("res://addons/inkgd/editor/panel/stories/empty_state_container.tscn") + +# ############################################################################ # +# Signals +# ############################################################################ # + +signal _compiled() + +# ############################################################################ # +# Enums +# ############################################################################ # + +enum FileDialogSelection { + UNKNOWN, + SOURCE_FILE, + TARGET_FILE, + WATCHED_FOLDER +} + + +# ############################################################################ # +# Properties +# ############################################################################ # + +var editor_interface: InkEditorInterface +var configuration: InkConfiguration +var progress_texture: AnimatedTexture + + +# ############################################################################ # +# Private Properties +# ############################################################################ # + +var _scrollbar_max_value = -1 + +var _compilers: Dictionary = {} + +var _file_dialog = EditorFileDialog.new() + +## Configuration item for which the FileDialog is currently shown. +## +## Unknown by default. +var _file_dialog_selection = FileDialogSelection.UNKNOWN + +## The story index for which the FileDialog is currenlty shown. +## +## -1 by default or when the file dialog currently displayed doesn't +## concern the stories source/target files. +var _file_dialog_selection_story_index = -1 + +var _current_story_node = null + +var _progress_dialog = null + +# ############################################################################ # +# Nodes +# ############################################################################ # + +@onready var _empty_state_container = EmptyStateContainerScene.instantiate() + +@onready var _build_all_button = find_child("BuildAllButton") +@onready var _add_new_story_button = find_child("AddNewStoryButton") + +@onready var _story_configuration_container = find_child("StoryConfigurationVBoxContainer") +@onready var _scroll_container = find_child("ScrollContainer") + + +# ############################################################################ # +# Overrides +# ############################################################################ # + +func _ready(): + # FIXME: This needs investigating. + # Sanity check. It seems the editor instantiates tools script on their + # own, probably to add them to its tree. In that case, they won't have + # their dependencies injected, so we're not doing anything. + if editor_interface == null || configuration == null || progress_texture == null: + print("[inkgd] [INFO] Ink Stories Tab: dependencies not met, ignoring.") + return + + configuration.connect("compilation_mode_changed", Callable(self, "_compilation_mode_changed")) + + editor_interface.editor_filesystem.connect("resources_reimported", Callable(self, "_resources_reimported")) + + _story_configuration_container.add_child(_empty_state_container) + add_child(_file_dialog) + + var add_icon = get_theme_icon("Add", "EditorIcons") + _add_new_story_button.icon = add_icon + + _load_story_configurations() + _connect_signals() + + _compilation_mode_changed(configuration.compilation_mode) + + +# ############################################################################ # +# Signal Receivers +# ############################################################################ # + +func _resources_reimported(resources): + call_deferred("_recompile_if_necessary", resources) + +func _compilation_mode_changed(compilation_mode: int): + var show_folder = (compilation_mode == InkConfiguration.BuildMode.AFTER_CHANGE) + + for child in _story_configuration_container.get_children(): + child.show_watched_folder(show_folder) + +func _source_file_button_pressed(node): + _reset_file_dialog() + + var index = _get_story_configuration_index(node) + + _file_dialog_selection = FileDialogSelection.SOURCE_FILE + _file_dialog_selection_story_index = index + + var story_configuration = _get_story_configuration_at_index(index) + var path = story_configuration.source_file_line_edit.text + + _file_dialog.current_path = path + _file_dialog.current_dir = path.get_base_dir() + _file_dialog.current_file = path.get_file() + + _file_dialog.file_mode = FileDialog.FILE_MODE_OPEN_FILE + _file_dialog.access = FileDialog.ACCESS_FILESYSTEM + _file_dialog.add_filter("*.ink;Ink source file") + _file_dialog.popup_centered(Vector2(1280, 800) * editor_interface.scale) + + +func _target_file_button_pressed(node): + _reset_file_dialog() + + var index = _get_story_configuration_index(node) + + _file_dialog_selection = FileDialogSelection.TARGET_FILE + _file_dialog_selection_story_index = index + + var story_configuration = _get_story_configuration_at_index(index) + var path = story_configuration.target_file_line_edit.text + + _file_dialog.current_path = path + _file_dialog.current_dir = path.get_base_dir() + _file_dialog.current_file = path.get_file() + + _file_dialog.file_mode = FileDialog.FILE_MODE_SAVE_FILE + _file_dialog.access = FileDialog.ACCESS_FILESYSTEM + _file_dialog.add_filter("*.json;Compiled Ink story") + _file_dialog.popup_centered(Vector2(1280, 800) * editor_interface.scale) + +func _watched_folder_button_pressed(node): + _reset_file_dialog() + + var index = _get_story_configuration_index(node) + + _file_dialog_selection = FileDialogSelection.WATCHED_FOLDER + _file_dialog_selection_story_index = index + + var story_configuration = _get_story_configuration_at_index(index) + var path = story_configuration.watched_folder_line_edit.text + + _file_dialog.current_path = path + _file_dialog.current_dir = path.get_base_dir() + _file_dialog.current_file = path.get_file() + + _file_dialog.file_mode = FileDialog.FILE_MODE_OPEN_DIR + _file_dialog.access = FileDialog.ACCESS_FILESYSTEM + _file_dialog.popup_centered(Vector2(1280, 800) * editor_interface.scale) + + +func _build_all_button_pressed(): + _compile_all_stories() + + +func _add_new_story_button_pressed(): + _add_new_story_configuration() + + +func _configuration_changed(_node): + _persist_configuration() + + +func _remove_button_pressed(node): + var index = _get_story_configuration_index(node) + configuration.remove_story_configuration_at_index(index) + + # TODO: Rebuild from scratch instead. + var parent = node.get_parent() + if parent != null: + parent.remove_child(node) + node.queue_free() + + if _story_configuration_container.get_child_count() == 0: + _story_configuration_container.add_child(_empty_state_container) + else: + var i = 0 + for child in _story_configuration_container.get_children(): + # Not using "is InkStoryConfiguration", because it requires a type + # declaration. Node Types register in the editor and we don't want + # that. This is a bit hacky, but until the proposal is accepted, + # it prevents cluttering the "Create new node" list. + if "story_label" in child: + child.story_label.text = "Story %d" % (i + 1) + i += 1 + + _persist_configuration() + + +func _build_button_pressed(node): + var index = _get_story_configuration_index(node) + var story_configuration = configuration.get_story_configuration_at_index(index) + + if story_configuration == null: + printerr("[inkgd] [ERROR] No configurations found for Story %d" % (index + 1)) + return + + _compile_story(story_configuration, node) + + +func _compile_all_stories(): + _disable_all_buttons(true) + var number_of_stories = configuration.stories.size() + var current_story_index = 0 + + _progress_dialog = InkProgressDialog.instantiate() + add_child(_progress_dialog) + + _progress_dialog.update_layout(editor_interface.scale) + _progress_dialog.popup_centered(Vector2(600, 100) * editor_interface.scale) + + for story_configuration in configuration.stories: + var source_file_path: String = configuration.get_source_file_path(story_configuration) + _progress_dialog.current_step_name = source_file_path.get_file() + + _compile_story(story_configuration) + await self._compiled + + @warning_ignore("integer_division") + _progress_dialog.progress = float(100 * (current_story_index + 1) / number_of_stories) + current_story_index += 1 + + remove_child(_progress_dialog) + _progress_dialog.queue_free() + _progress_dialog = null + _disable_all_buttons(false) + +func _compile_story(story_configuration, node = null): + var source_file_path = configuration.get_source_file_path(story_configuration) + var target_file_path = configuration.get_target_file_path(story_configuration) + + if node != null: + _current_story_node = node + + node.build_button.icon = progress_texture + _disable_all_buttons(true) + + var compiler_configuration = InkCompilationConfiguration.new( + configuration, + true, + node != null, + source_file_path, + target_file_path + ) + var compiler = InkCompiler.new(compiler_configuration) + + _compilers[compiler.identifier] = compiler + compiler.connect("story_compiled", Callable(self, "_handle_compilation")) + compiler.compile_story() + + +func _handle_compilation(result): + if _current_story_node != null: + var button = _current_story_node.build_button + button.icon = null + _disable_all_buttons(false) + _current_story_node = null + + if result.user_triggered: + if result.success: + if result.output && !result.output.is_empty(): + var dialog = InkRichDialog.instantiate() + add_child(dialog) + + dialog.title = "Success!" + dialog.message_text = "The story was successfully compiled." + dialog.output_text = result.output + dialog.update_layout(editor_interface.scale) + + dialog.popup_centered(Vector2(700, 400) * editor_interface.scale) + else: + var dialog = AcceptDialog.new() + add_child(dialog) + + dialog.title = "Success!" + dialog.dialog_text = "The story was successfully compiled." + + dialog.popup_centered() + + _reimport_compiled_stories() + else: + var dialog = InkRichDialog.instantiate() + add_child(dialog) + + dialog.title = "Error" + dialog.message_text = "The story could not be compiled. See inklecate's output below." + dialog.output_text = result.output + dialog.update_layout(editor_interface.scale) + + dialog.popup_centered(Vector2(700, 400) * editor_interface.scale) + else: + _reimport_compiled_stories() + + if _compilers.has(result.identifier): + _compilers.erase(result.identifier) + + emit_signal("_compiled") + + +func _on_file_selected(path: String): + var index = _file_dialog_selection_story_index + + match _file_dialog_selection: + FileDialogSelection.SOURCE_FILE: + var story_configuration = _get_story_configuration_at_index(index) + if story_configuration == null: + return + + var localized_path = ProjectSettings.localize_path(path) + var source_line_edit = story_configuration.source_file_line_edit + + source_line_edit.text = localized_path + source_line_edit.queue_redraw() + + if story_configuration.target_file_line_edit.text.is_empty(): + var target_line_edit = story_configuration.target_file_line_edit + target_line_edit.text = localized_path + ".json" + target_line_edit.queue_redraw() + + if story_configuration.watched_folder_line_edit.text.is_empty(): + var watched_folder_line_edit = story_configuration.watched_folder_line_edit + watched_folder_line_edit.text = localized_path.get_base_dir() + watched_folder_line_edit.queue_redraw() + + _persist_configuration() + + FileDialogSelection.TARGET_FILE: + var story_configuration = _get_story_configuration_at_index(index) + if story_configuration == null: + return + + var localized_path = ProjectSettings.localize_path(path) + var line_edit = story_configuration.target_file_line_edit + + line_edit.text = localized_path + line_edit.queue_redraw() + _persist_configuration() + + FileDialogSelection.WATCHED_FOLDER: + var story_configuration = _get_story_configuration_at_index(index) + if story_configuration == null: + return + + var localized_path = ProjectSettings.localize_path(path) + var line_edit = story_configuration.watched_folder_line_edit + + line_edit.text = localized_path + line_edit.queue_redraw() + _persist_configuration() + + _: + printerr("[inkgd] [ERROR] Unknown FileDialogSelection, failed to save FileDialog file.") + + _file_dialog_selection = FileDialogSelection.UNKNOWN + + +func _scrollbar_changed(): + var max_value = _scroll_container.get_v_scroll_bar().max_value + + if _scrollbar_max_value == max_value && _scrollbar_max_value != -1: + return + + _scrollbar_max_value = max_value + _scroll_container.scroll_vertical = max_value + + +# ############################################################################ # +# Private helpers +# ############################################################################ # + +func _reset_file_dialog(): + _file_dialog.current_path = "res://" + _file_dialog.current_dir = "res://" + _file_dialog.current_file = "" + _file_dialog.clear_filters() + + +func _persist_configuration(): + configuration.stories.clear() + + if _empty_state_container.get_parent() == null: + configuration.stories.clear() + for node in _story_configuration_container.get_children(): + # Not using "is InkStoryConfiguration", because it requires a type + # declaration. Node Types register in the editor and we don't want + # that. This is a bit hacky, but until the proposal is accepted, + # it prevents cluttering the "Create new node" list. + if !("story_label" in node): + continue + + configuration.append_new_story_configuration( + node.source_file_line_edit.text, + node.target_file_line_edit.text, + node.watched_folder_line_edit.text + ) + + configuration.persist() + + +func _load_story_configurations(): + for story_configuration in configuration.stories: + var node = _add_new_story_configuration() + + node.source_file_line_edit.text = configuration.get_source_file_path(story_configuration) + node.target_file_line_edit.text = configuration.get_target_file_path(story_configuration) + node.watched_folder_line_edit.text = configuration.get_watched_folder_path(story_configuration) + + +func _add_new_story_configuration(): + var story_configuration = InkStoryConfigurationScene.instantiate() + + story_configuration.editor_interface = editor_interface + + story_configuration.connect("configuration_changed", Callable(self, "_configuration_changed")) + story_configuration.connect("remove_button_pressed", Callable(self, "_remove_button_pressed")) + story_configuration.connect("build_button_pressed", Callable(self, "_build_button_pressed")) + story_configuration.connect("source_file_button_pressed", Callable(self, "_source_file_button_pressed")) + story_configuration.connect("target_file_button_pressed", Callable(self, "_target_file_button_pressed")) + story_configuration.connect("watched_folder_button_pressed", Callable(self, "_watched_folder_button_pressed")) + + if _empty_state_container.get_parent() != null: + _story_configuration_container.remove_child(_empty_state_container) + + _story_configuration_container.add_child(story_configuration) + + var count = _story_configuration_container.get_child_count() + story_configuration.story_label.text = "Story %d" % count + + var show_folder = (configuration.compilation_mode == InkConfiguration.BuildMode.AFTER_CHANGE) + story_configuration.show_watched_folder(show_folder) + + return story_configuration + + +func _reimport_compiled_stories(): + editor_interface.scan_file_system() + + +func _get_story_configuration_index(node) -> int: + return _story_configuration_container.get_children().find(node) + + +func _get_story_configuration_at_index(index: int): + if index >= 0 && _story_configuration_container.get_child_count(): + return _story_configuration_container.get_children()[index] + + return null + + +func _recompile_if_necessary(resources: PackedStringArray): + # Making sure the resources have been imported before recompiling. + await get_tree().create_timer(0.5).timeout + + for story_configuration in configuration.stories: + var watched_folder_path: String = configuration.get_watched_folder_path(story_configuration) + + if watched_folder_path.is_empty(): + return + + for resource in resources: + if resource.begins_with(watched_folder_path): + _compile_story(story_configuration) + break + + +func _disable_all_buttons(disable: bool): + _add_new_story_button.disabled = disable + _build_all_button.disabled = disable + for child in _story_configuration_container.get_children(): + child.disable_all_buttons(disable) + + +func _connect_signals(): + _build_all_button.connect("pressed", Callable(self, "_build_all_button_pressed")) + _add_new_story_button.connect("pressed", Callable(self, "_add_new_story_button_pressed")) + + _file_dialog.connect("file_selected", Callable(self, "_on_file_selected")) + _file_dialog.connect("dir_selected", Callable(self, "_on_file_selected")) + + _scroll_container.get_v_scroll_bar().connect("changed", Callable(self, "_scrollbar_changed")) diff --git a/addons/inkgd/editor/panel/stories/ink_story_panel.tscn b/addons/inkgd/editor/panel/stories/ink_story_panel.tscn new file mode 100644 index 0000000..cfb3a38 --- /dev/null +++ b/addons/inkgd/editor/panel/stories/ink_story_panel.tscn @@ -0,0 +1,75 @@ +[gd_scene load_steps=4 format=3 uid="uid://b16uj28y2mqmk"] + +[ext_resource type="Script" path="res://addons/inkgd/editor/panel/stories/ink_story_panel.gd" id="1"] + +[sub_resource type="Image" id="Image_3omov"] +data = { +"data": PackedByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id="2"] +image = SubResource("Image_3omov") + +[node name="Story" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +script = ExtResource("1") + +[node name="ScrollContainer" type="ScrollContainer" parent="."] +layout_mode = 0 +anchor_right = 1.0 +anchor_bottom = 1.0 + +[node name="StoriesVBoxContainer" type="VBoxContainer" parent="ScrollContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="HBoxContainer" type="HBoxContainer" parent="ScrollContainer/StoriesVBoxContainer"] +layout_mode = 2 +alignment = 2 + +[node name="Label" type="Label" parent="ScrollContainer/StoriesVBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Managed Stories" + +[node name="AddNewStoryButton" type="Button" parent="ScrollContainer/StoriesVBoxContainer/HBoxContainer"] +layout_mode = 2 +mouse_filter = 1 +theme_override_constants/h_separation = 8 +text = "New story" +icon = SubResource("2") + +[node name="VSeparator" type="VSeparator" parent="ScrollContainer/StoriesVBoxContainer/HBoxContainer"] +layout_mode = 2 + +[node name="BuildAllButton" type="Button" parent="ScrollContainer/StoriesVBoxContainer/HBoxContainer"] +layout_mode = 2 +mouse_filter = 1 +theme_override_constants/h_separation = 10 +text = "Compile All" + +[node name="MarginContainer" type="MarginContainer" parent="ScrollContainer/StoriesVBoxContainer"] +layout_mode = 2 + +[node name="Panel" type="Panel" parent="ScrollContainer/StoriesVBoxContainer/MarginContainer"] +self_modulate = Color(1, 1, 1, 0.686275) +layout_mode = 2 + +[node name="MarginContainer" type="MarginContainer" parent="ScrollContainer/StoriesVBoxContainer/MarginContainer"] +layout_mode = 2 +theme_override_constants/margin_left = 5 +theme_override_constants/margin_top = 5 +theme_override_constants/margin_right = 5 +theme_override_constants/margin_bottom = 5 + +[node name="StoryConfigurationVBoxContainer" type="VBoxContainer" parent="ScrollContainer/StoriesVBoxContainer/MarginContainer/MarginContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 15 diff --git a/addons/inkgd/editor/templates/.gdignore b/addons/inkgd/editor/templates/.gdignore new file mode 100644 index 0000000..e69de29 diff --git a/addons/inkgd/editor/templates/ink_template.gd b/addons/inkgd/editor/templates/ink_template.gd new file mode 100644 index 0000000..c2976d8 --- /dev/null +++ b/addons/inkgd/editor/templates/ink_template.gd @@ -0,0 +1,101 @@ +# warning-ignore-all:return_value_discarded + +extends %BASE% + +# ############################################################################ # +# Imports +# ############################################################################ # + +var InkPlayer = load("res://addons/inkgd/ink_player.gd") + +# ############################################################################ # +# Public Nodes +# ############################################################################ # + +# Alternatively, it could also be retrieved from the tree. +# onready var _ink_player = $InkPlayer +@onready var _ink_player = InkPlayer.new() + +# ############################################################################ # +# Lifecycle +# ############################################################################ # + +func _ready(): +%TS%# Adds the player to the tree. +%TS%add_child(_ink_player) + +%TS%# Replace the example path with the path to your story. +%TS%# Remove this line if you set 'ink_file' in the inspector. +%TS%_ink_player.ink_file = load("res://path/to/file.ink.json") + +%TS%# It's recommended to load the story in the background. On platforms that +%TS%# don't support threads, the value of this variable is ignored. +%TS%_ink_player.loads_in_background = true + +%TS%_ink_player.connect("loaded", Callable(self, "_story_loaded")) + +%TS%# Creates the story. 'loaded' will be emitted once Ink is ready +%TS%# continue the story. +%TS%_ink_player.create_story() + + +# ############################################################################ # +# Signal Receivers +# ############################################################################ # + +func _story_loaded(successfully: bool): +%TS%if !successfully: +%TS%%TS%return + +%TS%# _observe_variables() +%TS%# _bind_externals() + +%TS%_continue_story() + + +# ############################################################################ # +# Private Methods +# ############################################################################ # + +func _continue_story(): +%TS%while _ink_player.can_continue: +%TS%%TS%var text = _ink_player.continue_story() +%TS%%TS%# This text is a line of text from the ink story. +%TS%%TS%# Set the text of a Label to this value to display it in your game. +%TS%%TS%print(text) +%TS%if _ink_player.has_choices: +%TS%%TS%# 'current_choices' contains a list of the choices, as strings. +%TS%%TS%for choice in _ink_player.current_choices: +%TS%%TS%%TS%print(choice.text) +%TS%%TS%%TS%print(choice.tags) +%TS%%TS%# '_select_choice' is a function that will take the index of +%TS%%TS%# your selection and continue the story. +%TS%%TS%_select_choice(0) +%TS%else: +%TS%%TS%# This code runs when the story reaches it's end. +%TS%%TS%print("The End") + + +func _select_choice(index): +%TS%_ink_player.choose_choice_index(index) +%TS%_continue_story() + + +# Uncomment to bind an external function. +# +# func _bind_externals(): +# %TS%_ink_player.bind_external_function("", self, "_external_function") +# +# +# func _external_function(arg1, arg2): +# %TS%pass + + +# Uncomment to observe the variables from your ink story. +# You can observe multiple variables by putting adding them in the array. +# func _observe_variables(): +# %TS%_ink_player.observe_variables(["var1", "var2"], self, "_variable_changed") +# +# +# func _variable_changed(variable_name, new_value): +# %TS%print("Variable '%s' changed to: %s" %[variable_name, new_value]) diff --git a/addons/inkgd/editor/templates/ink_template_signals.gd b/addons/inkgd/editor/templates/ink_template_signals.gd new file mode 100644 index 0000000..3777489 --- /dev/null +++ b/addons/inkgd/editor/templates/ink_template_signals.gd @@ -0,0 +1,107 @@ +# warning-ignore-all:return_value_discarded + +extends %BASE% + +# ############################################################################ # +# Imports +# ############################################################################ # + +var InkPlayer = load("res://addons/inkgd/ink_player.gd") + + +# ############################################################################ # +# Public Nodes +# ############################################################################ # + +# Alternatively, it could also be retrieved from the tree. +# onready var _ink_player = $InkPlayer +@onready var _ink_player = InkPlayer.new() + +# ############################################################################ # +# Lifecycle +# ############################################################################ # + +func _ready(): +%TS%# Adds the player to the tree. +%TS%add_child(_ink_player) + +%TS%# Replace the example path with the path to your story. +%TS%# Remove this line if you set 'ink_file' in the inspector. +%TS%_ink_player.ink_file = load("res://path/to/file.ink.json") + +%TS%# It's recommended to load the story in the background. On platforms that +%TS%# don't support threads, the value of this variable is ignored. +%TS%_ink_player.loads_in_background = true + +%TS%_ink_player.connect("loaded", Callable(self, "_story_loaded")) +%TS%_ink_player.connect("continued", Callable(self, "_continued")) +%TS%_ink_player.connect("prompt_choices", Callable(self, "_prompt_choices")) +%TS%_ink_player.connect("ended", Callable(self, "_ended")) + +%TS%# Creates the story. 'loaded' will be emitted once Ink is ready +%TS%# continue the story. +%TS%_ink_player.create_story() + +# ############################################################################ # +# Signal Receivers +# ############################################################################ # + +func _story_loaded(successfully: bool): +%TS%if !successfully: +%TS%%TS%return + +%TS%# _observe_variables() +%TS%# _bind_externals() + +%TS%# Here, the story is started immediately, but it could be started +%TS%# at a later time. +%TS%_ink_player.continue_story() + + +func _continued(text, tags): +%TS%print(text) +%TS%# Here you could yield for an hypothetical signal, before continuing. +%TS%# await self.event +%TS%_ink_player.continue_story() + + +# ############################################################################ # +# Private Methods +# ############################################################################ # + +func _prompt_choices(choices): +%TS%if !choices.is_empty(): +%TS%%TS%print(choices) + +%TS%%TS%# In a real world scenario, _select_choice' could be +%TS%%TS%# connected to a signal, like 'Button.pressed'. +%TS%%TS%_select_choice(0) + + +func _ended(): +%TS%print("The End") + + +func _select_choice(index): +%TS%_ink_player.choose_choice_index(index) +%TS%_ink_player.continue_story() + + +# Uncomment to bind an external function. +# +# func _bind_externals(): +# %TS%_ink_player.bind_external_function("", self, "_external_function") +# +# +# func _external_function(arg1, arg2): +# %TS%pass + + +# Uncomment to observe the variables from your ink story. +# You can observe multiple variables by putting adding them in the array. +# func _observe_variables(): +# %TS%_ink_player.observe_variables(["var1", "var2"], self, "_variable_changed") +# +# +# func _variable_changed(variable_name, new_value): +# %TS%print("Variable '%s' changed to: %s" %[variable_name, new_value]) diff --git a/addons/inkgd/ink_player.gd b/addons/inkgd/ink_player.gd new file mode 100644 index 0000000..719c023 --- /dev/null +++ b/addons/inkgd/ink_player.gd @@ -0,0 +1,886 @@ +# ############################################################################ # +# Copyright © 2018-2022 Paul Joannon +# Copyright © 2019-2022 Frédéric Maquin +# Licensed under the MIT License. +# See LICENSE in the project root for license information. +# ############################################################################ # + +extends Node + +class_name InkPlayer + +# ############################################################################ # +# Imports +# ############################################################################ # + +var InkRuntime = load("res://addons/inkgd/runtime.gd") +var InkResource = load("res://addons/inkgd/editor/import_plugins/ink_resource.gd") +var InkStory = load("res://addons/inkgd/runtime/story.gd") +var InkFunctionResult = load("res://addons/inkgd/runtime/extra/function_result.gd") + + +# ############################################################################ # +# Signals +# ############################################################################ # + +## Emitted when the ink runtime encountered an exception. Exception are +## usually not recoverable as they corrupt the state. `stack_trace` is +## an optional PoolStringArray containing a stack trace, for logging purposes. +signal exception_raised(message, stack_trace) + +## Emitted when the _story encountered an error. These errors are usually +## recoverable. +signal error_encountered(message, type) + +## Emitted with `true` when the runtime had loaded the JSON file and created +## the _story. If an error was encountered, `successfully` will be `false` and +## and error will appear Godot's output. +signal loaded(successfully) + +## Emitted with the text and tags of the current line when the _story +## successfully continued. +signal continued(text, tags) + +## Emitted when using `continue_async`, if the time spent evaluating the ink +## exceeded the alloted time. +signal interrupted() + +## Emitted when the player should pick a choice. +signal prompt_choices(choices) + +## Emitted when a choice was reported back to the runtime. +signal choice_made(choice) + +## Emitted when an external function is about to evaluate. +signal function_evaluating(function_name, arguments) + +## Emitted when an external function evaluated. +signal function_evaluated(function_name, arguments, function_result) + +## Emitted when a valid path string was choosen. +signal path_choosen(path, arguments) + +## Emitted when the _story ended. +signal ended() + + +# ############################################################################ # +# Exported Properties +# ############################################################################ # + +## The compiled Ink file (.json) to play. +@export var ink_file: Resource + +## When `true` the _story will be created in a separate threads, to +## prevent the UI from freezing if the _story is too big. Note that +## on platforms where threads aren't available, the value of this +## property is ignored. +@export var loads_in_background: bool = true + + +# ############################################################################ # +# Properties +# ############################################################################ # + +# These properties aren't exported because they depend on the runtime or the +# story to be set. The runtime insn't always available upon instantiation, +# and the story is only available after calling 'create_story' so rather than +# losing the values and confusing everybody, those properties are code-only. + +## `true` to allow external function fallbacks, `false` otherwise. If this +## property is `false` and the appropriate function hasn't been binded, the +## _story will output an error. +var allow_external_function_fallbacks: bool: get = get_aeff, set = set_aeff +func set_aeff(value: bool): + if _story == null: + _push_null_story_error() + return + + _story.allow_external_function_fallbacks = value +func get_aeff() -> bool: + if _story == null: + _push_null_story_error() + return false + + return _story.allow_external_function_fallbacks + +# skips saving global values that remain equal to the initial values that were +# declared in Ink. +var do_not_save_default_values: bool: get = get_dnsdv, set = set_dnsdv +func set_dnsdv(value: bool): + var ink_runtime = _ink_runtime.get_ref() + if ink_runtime == null: + _push_null_runtime_error() + return false + + ink_runtime.dont_save_default_values = value +func get_dnsdv() -> bool: + var ink_runtime = _ink_runtime.get_ref() + if ink_runtime == null: + _push_null_runtime_error() + return false + + return ink_runtime.dont_save_default_values + +## Uses `assert` instead of `push_error` to report critical errors, thus +## making them more explicit during development. +var stop_execution_on_exception: bool: get = get_seoex, set = set_seoex +func set_seoex(value: bool): + var ink_runtime = _ink_runtime.get_ref() + if ink_runtime == null: + _push_null_runtime_error() + return + + ink_runtime.stop_execution_on_exception = value +func get_seoex() -> bool: + var ink_runtime = _ink_runtime.get_ref() + if ink_runtime == null: + _push_null_runtime_error() + return false + + return ink_runtime.stop_execution_on_exception + +## Uses `assert` instead of `push_error` to report _story errors, thus +## making them more explicit during development. +var stop_execution_on_error: bool: get = get_seoer, set = set_seoer +func set_seoer(value: bool): + var ink_runtime = _ink_runtime.get_ref() + if ink_runtime == null: + _push_null_runtime_error() + return + + ink_runtime.stop_execution_on_error = value + +func get_seoer() -> bool: + var ink_runtime = _ink_runtime.get_ref() + if ink_runtime == null: + _push_null_runtime_error() + return false + + return ink_runtime.stop_execution_on_error + + +# ############################################################################ # +# Read-only Properties +# ############################################################################ # + +## `true` if the _story can continue (i. e. is not expecting a choice to be +## choosen and hasn't reached the end). +var can_continue: bool: get = get_can_continue +func get_can_continue() -> bool: + if _story == null: + _push_null_story_error() + return false + + return _story.can_continue + + +## If `continue_async` was called (with milliseconds limit > 0) then this +## property will return false if the ink evaluation isn't yet finished, and +## you need to call it again in order for the continue to fully complete. +var async_continue_complete: bool: get = get_async_continue_complete +func get_async_continue_complete() -> bool: + if _story == null: + _push_null_story_error() + return false + + return _story.async_continue_complete + + +## The content of the current line. +var current_text: String: get = get_current_text +func get_current_text() -> String: + if _story == null: + _push_null_story_error() + return "" + + + return _story.current_text + + +## The current choices. Empty is there are no choices for the current line. +var current_choices: Array: get = get_current_choices +func get_current_choices() -> Array: + if _story == null: + _push_null_story_error() + return [] + + return _story.current_choices.duplicate() + + +## The current tags. Empty is there are no tags for the current line. +var current_tags: Array: get = get_current_tags +func get_current_tags() -> Array: + if _story == null: + _push_null_story_error() + return [] + + if _story.current_tags == null: + return [] + + return _story.current_tags + + +## The global tags for the _story. Empty if none have been declared. +var global_tags: Array: get = get_global_tags +func get_global_tags() -> Array: + if _story == null: + _push_null_story_error() + return [] + + if _story.global_tags == null: + return [] + + return _story.global_tags + + +## `true` if the _story currently has choices, `false` otherwise. +var has_choices: bool: get = get_has_choices +func get_has_choices() -> bool: + return !self.current_choices.is_empty() + + +## The name of the current flow. +var current_flow_name: String: get = get_current_flow_name +func get_current_flow_name() -> String: + if _story == null: + _push_null_story_error() + return "" + + return _story.state.current_flow_name + + +## The names of all flows currently alive. +var alive_flow_names: Array: get = get_alive_flow_names +func get_alive_flow_names() -> Array: + if _story == null: + _push_null_story_error() + return [] + + return _story.alive_flow_names + + +## `true` if the current flow is the default flow. +var current_flow_is_default_flow: bool: get = get_current_flow_is_default_flow +func get_current_flow_is_default_flow() -> bool: + if _story == null: + _push_null_story_error() + return false + + return _story.current_flow_is_default_flow + + +## The current story path. +var current_path: String: get = get_current_path +func get_current_path() -> String: + if _story == null: + _push_null_story_error() + return "" + + var path = _story.state.current_path_string + if path == null: + return "" + else: + return path + + +# ############################################################################ # +# Private Properties +# ############################################################################ # + +var _ink_runtime: WeakRef = WeakRef.new() +var _story: InkStory = null +var _thread: Thread +var _manages_runtime: bool = false + + +# ############################################################################ # +# Initialization +# ############################################################################ # + +func _init(): + name = "InkPlayer" + + +# ############################################################################ # +# Overrides +# ############################################################################ # + +func _exit_tree(): + call_deferred("_remove_runtime") + + +# ############################################################################ # +# Methods +# ############################################################################ # + +## Creates the _story, based on the value of `ink_file`. The result of this +## method is reported through the 'story_loaded' signal. +func create_story() -> int: + if ink_file == null: + _push_error("'ink_file' is null, did Godot import the resource correctly?") + call_deferred("emit_signal", "loaded", false) + return ERR_CANT_CREATE + + if !("json" in ink_file) || typeof(ink_file.json) != TYPE_STRING: + _push_error( + "'ink_file' doesn't have the appropriate resource type." + \ + "Are you sure you imported a JSON file?" + ) + call_deferred("emit_signal", "loaded", false) + return ERR_CANT_CREATE + + if loads_in_background && _current_platform_supports_threads(): + _thread = Thread.new() + var error = _thread.start(_async_create_story.bind(ink_file.json, _ink_runtime.get_ref())) + if error != OK: + printerr("[inkgd] [ERROR] Could not start the thread: error code %d", error) + call_deferred("emit_signal", "loaded", false) + return error + else: + return OK + else: + call_deferred("_create_and_finalize_story", ink_file.json, _ink_runtime.get_ref()) + return OK + + +## Reset the Story back to its initial state as it was when it was +## first constructed. +func reset() -> void: + if _story == null: + _push_null_story_error() + return + + _story.reset_state() + + +## Destroys the current story. +func destroy() -> void: + _story = null + +# ############################################################################ # +# Methods | Story Flow +# ############################################################################ # + +## Continues the story. +func continue_story() -> String: + if _story == null: + _push_null_story_error() + return "" + + var text: String = "" + if self.can_continue: + _story.continue_story() + + text = self.current_text + + elif self.has_choices: + emit_signal("prompt_choices", self.current_choices) + else: + emit_signal("ended") + + return text + +## An "asynchronous" version of `continue_story` that only partially evaluates +## the ink, with a budget of a certain time limit. It will exit ink evaluation +## early if the evaluation isn't complete within the time limit, with the +## `async_continue_complete` property being false. This is useful if the +## evaluation takes a long time, and you want to distribute it over multiple +## game frames for smoother animation. If you pass a limit of zero, then it will +## fully evaluate the ink in the same way as calling continue_story. +## +## To get notified when the evaluation is exited early, you can connect to the +## `interrupted` signal. +func continue_story_async(millisecs_limit_async: float) -> void: + if _story == null: + _push_null_story_error() + return + + if self.can_continue: + _story.continue_async(millisecs_limit_async) + + if !self.async_continue_complete: + emit_signal("interrupted") + return + + elif self.has_choices: + emit_signal("prompt_choices", self.current_choices) + else: + emit_signal("ended") + +## Continue the story until the next choice point or until it runs out of +## content. This is as opposed to `continue` which only evaluates one line +## of output at a time. It returns the resulting text evaluated by the ink +## engine, concatenated together. +func continue_story_maximally() -> String: + if _story == null: + _push_null_story_error() + return "" + + var text: String = "" + if self.can_continue: + _story.continue_story_maximally() + + text = self.current_text + + elif self.has_choices: + emit_signal("prompt_choices", self.current_choices) + else: + emit_signal("ended") + + return text + +## Chooses a choice. If the _story is not currently expected choices or +## the index is out of bounds, this method does nothing. +func choose_choice_index(index: int) -> void: + if _story == null: + _push_null_story_error() + return + + if index >= 0 && index < self.current_choices.size(): + _story.choose_choice_index(index); + + +## Moves the _story to the specified knot/stitch/gather. This method +## will throw an error through the 'exception' signal if the path string +## does not match any known path. +func choose_path(path: String) -> void: + if _story == null: + _push_null_story_error() + return + + _story.choose_path_string(path) + + +## Switches the flow, creating a new flow if it doesn't exist. +func switch_flow(flow_name: String) -> void: + if _story == null: + _push_null_story_error() + return + + _story.switch_flow(flow_name) + + +## Switches the the default flow. +func switch_to_default_flow() -> void: + if _story == null: + _push_null_story_error() + return + + _story.switch_to_default_flow() + + +## Remove the given flow. +func remove_flow(flow_name: String) -> void: + if _story == null: + _push_null_story_error() + return + + _story.remove_flow(flow_name) + + +# ############################################################################ # +# Methods | Tags +# ############################################################################ # + +## Returns the tags declared at the given path. +func tags_for_content_at_path(path: String) -> Array: + if _story == null: + _push_null_story_error() + return [] + + return _story.tags_for_content_at_path(path) + + +# ############################################################################ # +# Methods | Visit Count +# ############################################################################ # + +## Returns the visit count of the given path. +func visit_count_at_path(path: String) -> int: + if _story == null: + _push_null_story_error() + return 0 + + return _story.state.visit_count_at_path_string(path) + + +# ############################################################################ # +# Methods | State Management +# ############################################################################ # + +## Gets the current state as a JSON string. It can then be saved somewhere. +func get_state() -> String: + if _story == null: + _push_null_story_error() + return "" + + return _story.state.to_json() + + +## If you have a large story, and saving state to JSON takes too long for your +## framerate, you can temporarily freeze a copy of the state for saving on +## a separate thread. Internally, the engine maintains a "diff patch". +## When you've finished saving your state, call `background_save_complete` +## and that diff patch will be applied, allowing the story to continue +## in its usual mode. +func copy_state_for_background_thread_save() -> String: + if _story == null: + _push_null_story_error() + return "" + + return _story.copy_state_for_background_thread_save().to_json() + + +## See `copy_state_for_background_thread_save`. This method releases the +## "frozen" save state, applying its patch that it was using internally. +func background_save_complete() -> void: + if _story == null: + _push_null_story_error() + return + + _story.background_save_complete() + + +## Sets the state from a JSON string. +func set_state(state: String) -> void: + if _story == null: + _push_null_story_error() + return + + _story.state.load_json(state) + + +## Saves the current state to the given path. +func save_state_to_path(path: String): + if _story == null: + _push_null_story_error() + return + + if !path.begins_with("res://") && !path.begins_with("user://"): + path = "user://%s" % path + + var file := FileAccess.open(path, FileAccess.WRITE) + save_state_to_file(file) + file.close() + + +## Saves the current state to the file. +func save_state_to_file(file: FileAccess): + if _story == null: + _push_null_story_error() + return + + if file.is_open(): + file.store_string(get_state()) + +# TODO: Add save and load in background + +## Loads the state from the given path. +func load_state_from_path(path: String): + if _story == null: + _push_null_story_error() + return + + if !path.begins_with("res://") && !path.begins_with("user://"): + path = "user://%s" % path + + var file := FileAccess.open(path, FileAccess.READ) + load_state_from_file(file) + file.close() + + +## Loads the state from the given file. +func load_state_from_file(file: FileAccess): + if _story == null: + _push_null_story_error() + return + + if !file.is_open(): + return + + file.seek(0); + if file.get_length() > 0: + _story.state.load_json(file.get_as_text()) + + +# ############################################################################ # +# Methods | Variables +# ############################################################################ # + +## Returns the value of variable named 'name' or 'null' if it doesn't exist. +@warning_ignore("shadowed_variable_base_class") +func get_variable(name: String): + if _story == null: + _push_null_story_error() + return null + + return _story.variables_state.get_variable(name) + + +## Sets the value of variable named 'name'. +@warning_ignore("shadowed_variable_base_class") +func set_variable(name: String, value): + if _story == null: + _push_null_story_error() + return + + _story.variables_state.set_variable(name, value) + + +# ############################################################################ # +# Methods | Variable Observers +# ############################################################################ # + +## Registers an observer for the given variables. +func observe_variables(variable_names: Array, object: Object, method_name: String): + if _story == null: + _push_null_story_error() + return + + _story.observe_variables(variable_names, object, method_name) + + +## Registers an observer for the given variable. +func observe_variable(variable_name: String, object: Object, method_name: String): + if _story == null: + _push_null_story_error() + return + + _story.observe_variable(variable_name, object, method_name) + + +## Removes an observer for the given variable name. This method is highly +## specific and will only remove one observer. +func remove_variable_observer(object: Object, method_name: String, specific_variable_name: String) -> void: + if _story == null: + _push_null_story_error() + return + + _story.remove_variable_observer(object, method_name, specific_variable_name) + + +## Removes all observers registered with the couple object/method_name, +## regardless of which variable they observed. +func remove_variable_observer_for_all_variables(object: Object, method_name: String) -> void: + if _story == null: + _push_null_story_error() + return + + _story.remove_variable_observer(object, method_name) + + +## Removes all observers observing the given variable. +func remove_all_variable_observers(specific_variable_name: String) -> void: + if _story == null: + _push_null_story_error() + return + + _story.remove_variable_observer(null, null, specific_variable_name) + + +# ############################################################################ # +# Methods | External Functions +# ############################################################################ # + +## Binds an external function. +func bind_external_function( + func_name: String, + object: Object, + method_name: String, + lookahead_safe = false +) -> void: + if _story == null: + _push_null_story_error() + return + + _story.bind_external_function(func_name, object, method_name, lookahead_safe) + + +## Unbinds an external function. +func unbind_external_function(func_name: String) -> void: + if _story == null: + _push_null_story_error() + return + + _story.unbind_external_function(func_name) + + +# ############################################################################ # +# Methods | Functions +# ############################################################################ # + +func has_function(function_name: String) -> bool: + return _story.has_function(function_name) + +## Evaluate a given ink function, returning its return value (but not +## its output). +func evaluate_function(function_name: String, arguments = []) -> InkFunctionResult: + if _story == null: + _push_null_story_error() + return null + + var result = _story.evaluate_function(function_name, arguments, true) + + if result != null: + return InkFunctionResult.new(result["output"], result["result"]) + else: + return null + +# ############################################################################ # +# Methods | Ink List Creation +# ############################################################################ # + +## Creates a new empty InkList that's intended to hold items from a particular +## origin list definition. +func create_ink_list_with_origin(single_origin_list_name: String) -> InkList: + return InkList.new_with_origin(single_origin_list_name, _story) + +## Creates a new InkList from the name of a preexisting item. +func create_ink_list_from_item_name(item_name: String) -> InkList: + return InkList.from_string(item_name, _story) + + +# ############################################################################ # +# Private Methods | Signal Forwarding +# ############################################################################ # + +func _exception_raised(message, stack_trace) -> void: + emit_signal("exception_raised", message, stack_trace) + + +func _on_error(message, type) -> void: + if get_signal_connection_list("error_encountered").size() == 0: + _push_story_error(message, type) + else: + emit_signal("error_encountered", message, type) + + +func _on_did_continue() -> void: + emit_signal("continued", self.current_text, self.current_tags) + + +func _on_make_choice(choice) -> void: + emit_signal("choice_made", choice.text) + + +func _on_evaluate_function(function_name, arguments) -> void: + emit_signal("function_evaluating", function_name, arguments) + + +func _on_complete_evaluate_function(function_name, arguments, text_output, return_value) -> void: + var function_result = InkFunctionResult.new(text_output, return_value) + emit_signal("function_evaluated", function_name, arguments, function_result) + + +func _on_choose_path_string(path, arguments) -> void: + emit_signal("path_choosen", path, arguments) + + +# ############################################################################ # +# Private Methods +# ############################################################################ # + +func _create_story(json_story, runtime) -> void: + _story = InkStory.new(json_story, runtime) + + +func _async_create_story(json_story, runtime) -> void: + _create_story(json_story, runtime) + call_deferred("_async_creation_completed") + + +func _async_creation_completed() -> void: + _thread.wait_to_finish() + _thread = null + + _finalise_story_creation() + + +func _create_and_finalize_story(json_story, runtime) -> void: + _create_story(json_story, runtime) + _finalise_story_creation() + + +func _finalise_story_creation() -> void: + _story.connect("on_error", Callable(self, "_on_error")) + _story.connect("on_did_continue", Callable(self, "_on_did_continue")) + _story.connect("on_make_choice", Callable(self, "_on_make_choice")) + _story.connect("on_evaluate_function", Callable(self, "_on_evaluate_function")) + _story.connect("on_complete_evaluate_function", Callable(self, "_on_complete_evaluate_function")) + _story.connect("on_choose_path_string", Callable(self, "_on_choose_path_string")) + + var ink_runtime = _ink_runtime.get_ref() + if ink_runtime == null: + _push_null_runtime_error() + emit_signal("loaded", false) + return + + emit_signal("loaded", true) + + +func _add_runtime(root) -> void: + # The InkRuntime is normaly an auto-loaded singleton, + # but if it's not present, it's added here. + var runtime: Node + if root.has_node("__InkRuntime"): + runtime = root.get_node("__InkRuntime") + else: + _manages_runtime = true + runtime = InkRuntime.init(root) + + if !runtime.is_connected("exception_raised", _exception_raised): + runtime.connect("exception_raised", _exception_raised) + + _ink_runtime = weakref(runtime) + + +func _remove_runtime() -> void: + if _manages_runtime: + InkRuntime.deinit(get_tree().root) + + +func _current_platform_supports_threads() -> bool: + return OS.get_name() != "HTML5" + + +func _push_null_runtime_error() -> void: + _push_error( + "InkRuntime could not found, did you remove it from the tree?" + ) + + +func _push_null_story_error() -> void: + _push_error("The _story is 'null', was it loaded properly?") + + +func _push_story_error(message: String, type: int) -> void: + if Engine.is_editor_hint(): + match type: + Ink.ErrorType.ERROR: + printerr(message) + Ink.ErrorType.WARNING, Ink.ErrorType.AUTHOR: + print(message) + else: + match type: + Ink.ErrorType.ERROR: + push_error(message) + Ink.ErrorType.WARNING, Ink.ErrorType.AUTHOR: + push_warning(message) + +func _push_error(message: String): + if Engine.is_editor_hint(): + printerr(message) + + var i = 1 + for stack_element in get_stack(): + if i <= 2: + i += 1 + continue + + printerr( + " ", (i - 2), " - ", stack_element["source"], ":", + stack_element["line"], " - at function: ", stack_element["function"] + ) + else: + push_error(message) diff --git a/addons/inkgd/ink_player_factory.gd b/addons/inkgd/ink_player_factory.gd new file mode 100644 index 0000000..2f9a0d1 --- /dev/null +++ b/addons/inkgd/ink_player_factory.gd @@ -0,0 +1,49 @@ +@tool +# ############################################################################ # +# Copyright © 2018-2021 Paul Joannon +# Copyright © 2019-2022 Frédéric Maquin +# Licensed under the MIT License. +# See LICENSE in the project root for license information. +# ############################################################################ # + +extends RefCounted + +class_name InkPlayerFactory + +const DO_NOT_USE_MONO_RUNTIME_SETTING = "inkgd/do_not_use_mono_runtime" + +# ############################################################################ # +# Methods +# ############################################################################ # + +static func create(): + if _should_use_mono(): + var InkPlayer = load("res://addons/inkgd/mono/InkPlayer.cs") + if InkPlayer.can_instantiate(): + return InkPlayer.new() + else: + printerr( + "[inkgd] [ERROR] InkPlayer can't be instantiated. Make sure that a suitable " + + "copy of 'ink-runtime-engine.dll' can be found in project and double check " + + "that the .csproj file contains a item pointing to it. " + + "If everything is configured correctly, you may need to rebuild " + + "the C# solution. Please refer to [TO BE ADDED] for additional help." + ) + print("[inkgd] [INFO] Falling back to the GDScript runtime.") + + # Falling back to GDscript. + return load("res://addons/inkgd/ink_player.gd").new() + + +static func _should_use_mono() -> bool: + if ProjectSettings.has_setting(DO_NOT_USE_MONO_RUNTIME_SETTING): + var do_not_use_mono = ProjectSettings.get_setting(DO_NOT_USE_MONO_RUNTIME_SETTING) + if do_not_use_mono == null: + do_not_use_mono = false + + return _can_run_mono() && !do_not_use_mono + else: + return _can_run_mono() + +static func _can_run_mono() -> bool: + return type_exists("_GodotSharp") diff --git a/addons/inkgd/mono/InkBridger.cs b/addons/inkgd/mono/InkBridger.cs new file mode 100644 index 0000000..9655172 --- /dev/null +++ b/addons/inkgd/mono/InkBridger.cs @@ -0,0 +1,182 @@ +// /////////////////////////////////////////////////////////////////////////// / +// Copyright © 2019-2022 Frédéric Maquin +// Licensed under the MIT License. +// See LICENSE in the project root for license information. +// /////////////////////////////////////////////////////////////////////////// / + +using Godot; +using System; +using System.Linq; +using System.Collections.Generic; +using System.ComponentModel; + +public partial class InkBridger : Node +{ + #region Imports + private readonly GDScript InkPath = + (GDScript) ResourceLoader.Load("res://addons/inkgd/runtime/ink_path.gd"); + + private readonly GDScript InkList = + (GDScript) ResourceLoader.Load("res://addons/inkgd/runtime/lists/ink_list.gd"); + + private readonly GDScript InkListDefinition = + (GDScript) ResourceLoader.Load("res://addons/inkgd/runtime/lists/list_definition.gd"); + + private readonly GDScript InkListItem = + (GDScript) ResourceLoader.Load("res://addons/inkgd/runtime/lists/structs/ink_list_item.gd"); + + private readonly GDScript InkFunctionResult = + (GDScript) ResourceLoader.Load("res://addons/inkgd/runtime/extra/function_result.gd"); + #endregion + + #region Methods | Helpers + public bool IsInkObjectOfType(Godot.Object inkObject, string name) + { + return inkObject.HasMethod("is_ink_class") && (bool)inkObject.Call("is_ink_class", new object[] { name }); + } + + public Godot.Object MakeFunctionResult(string textOutput, object returnValue) + { + var parameters = new object[] { textOutput ?? "", returnValue }; + return (Godot.Object) InkFunctionResult.New(parameters); + } + #endregion + + #region Methods | Conversion -> (GDScript -> C#) + public Godot.Object MakeGDInkPath(Ink.Runtime.Path3D path) { + var inkPath = (Godot.Object) InkPath.New(); + inkPath.Call("_init_with_components_string", path.componentsString); + return inkPath; + } + + public Godot.Object MakeGDInkList(Ink.Runtime.InkList list) + { + var inkListBase = new Godot.Collections.Dictionary(); + + foreach(KeyValuePair kv in list) { + inkListBase.Add(MakeGDInkListItem(kv.Key).Call("serialized") as string, kv.Value); + } + + object[] inkListParams = new object[] { + inkListBase, + list.originNames.ToArray(), + MakeGDInkListOrigins(list.origins) + }; + + var inkList = (Godot.Object) InkList.New(); + inkList.Call("_init_from_csharp", inkListParams); + + return inkList; + } + + public Ink.Runtime.Path3D MakeSharpInkPath(Godot.Object path) { + if (!IsInkObjectOfType(path, "InkPath")) + { + throw new ArgumentException("Expected a 'Godot.Object' of class 'InkPath'"); + } + + return new Ink.Runtime.Path3D((string)path.Get("components_string")); + } + #endregion + + #region Methods | Conversion (GDScript -> C#) + public Ink.Runtime.InkList MakeSharpInkList(Godot.Object list, Ink.Runtime.Story story) + { + if (!IsInkObjectOfType(list, "InkList")) + { + throw new ArgumentException("Expected a 'Godot.Object' of class 'InkList'"); + } + + var underlyingDictionary = new Godot.Collections.Dictionary( + (Godot.Collections.Dictionary)list.Get("_dictionary")); + + var originNames = new Godot.Collections.Array( + (Godot.Collections.Array)list.Get("origin_names")); + + var inkList = new Ink.Runtime.InkList(); + inkList.origins = new List(); + + inkList.SetInitialOriginNames(originNames.ToList()); + + foreach(string originName in originNames) + { + if (story.listDefinitions.TryListGetDefinition (originName, out Ink.Runtime.ListDefinition definition)) + { + if (!inkList.origins.Contains(definition)) { + inkList.origins.Add(definition); + } + } + else + { + throw new Exception ( + $"InkList origin could not be found in story when reconstructing list: {originName}" + ); + } + } + + foreach(KeyValuePair kv in underlyingDictionary) + { + inkList[MakeSharpInkListItem(kv.Key)] = kv.Value; + } + + return inkList; + } + #endregion + + #region Private Methods | Conversion (C# -> GDScript) + private Godot.Collections.Array MakeGDInkListOrigins( + List listDefinitions) + { + var inkListDefinitions = new Godot.Collections.Array(); + + foreach(Ink.Runtime.ListDefinition listDefinition in listDefinitions) { + var inkListDefinition = MakeGDListDefinition(listDefinition); + inkListDefinitions.Add(inkListDefinition); + } + + return inkListDefinitions; + } + + private Godot.Object MakeGDListDefinition(Ink.Runtime.ListDefinition listDefinition) + { + var items = new Godot.Collections.Dictionary(); + + foreach(KeyValuePair kv in listDefinition.items) { + var inkListItem = MakeGDInkListItem(kv.Key); + items.Add(inkListItem, kv.Value); + } + + var definitionParams = new object[] { listDefinition.name, items }; + var inkListDefinition = (Godot.Object) InkListDefinition.New(definitionParams); + + return inkListDefinition; + } + + private Godot.Object MakeGDInkListItem(Ink.Runtime.InkListItem listItem) + { + object[] itemParams = new object[] { listItem.fullName }; + + var inkListItem = (Godot.Object) InkListItem.New(); + inkListItem.Call("_init_with_full_name", itemParams); + + return inkListItem; + } + #endregion + + #region Private Methods | Conversion (GDScript -> C#) + private Ink.Runtime.InkListItem MakeSharpInkListItem(string listItemKey) + { + + var listItem = (Godot.Object) InkListItem.Call("from_serialized_key", new object[] { listItemKey }); + + if (!IsInkObjectOfType(listItem, "InkListItem")) { + throw new ArgumentException("Expected a 'Godot.Object' of class 'InkListItem'"); + } + + return new Ink.Runtime.InkListItem( + listItem.Get("origin_name") as string, + listItem.Get("item_name") as string + ); + } + #endregion +} diff --git a/addons/inkgd/mono/InkPlayer.cs b/addons/inkgd/mono/InkPlayer.cs new file mode 100644 index 0000000..a357777 --- /dev/null +++ b/addons/inkgd/mono/InkPlayer.cs @@ -0,0 +1,1271 @@ +// /////////////////////////////////////////////////////////////////////////// / +// Copyright © 2018-2022 Paul Joannon +// Copyright © 2019-2022 Frédéric Maquin +// Licensed under the MIT License. +// See LICENSE in the project root for license information. +// /////////////////////////////////////////////////////////////////////////// / + +using Godot; +using System; +using System.Linq; +using System.Collections.Generic; +using System.Diagnostics; + +[Tool] + +public partial class InkPlayer : Node +{ + #region Signals + [Signal] public delegate void exception_raised(string message, Godot.Collections.Array stack_trace); + [Signal] public delegate void error_encountered(string message, int type); + [Signal] public delegate void loaded(bool successfully); + [Signal] public delegate void continued(string text, Godot.Collections.Array tags); + [Signal] public delegate void interrupted(); + [Signal] public delegate void prompt_choices(Godot.Collections.Array choices); + [Signal] public delegate void choice_made(Godot.Object choice); + [Signal] public delegate void function_evaluating(Godot.Collections.Array function_name, object[] arguments); + [Signal] public delegate void function_evaluated(Godot.Collections.Array function_name, object[] arguments, Godot.Object function_result); + [Signal] public delegate void path_choosen(string path, object[] arguments); + [Signal] public delegate void ended(); + #endregion + + #region Exported properties + [Export] + public Godot.Resource ink_file = null; + + [Export] + public bool loads_in_background = false; + #endregion + + #region Properties + // These properties aren't exported because they depend on the runtime or + // the story to be set. The runtime insn't always available upon + // instantiation, and the story is only available after calling + // 'create_story' so rather than losing the values and confusing everybody, + // those properties are code-only. + public bool allow_external_function_fallbacks + { + get { + if (story == null) + { + PushNullStoryError(); + return false; + } + + return story.allowExternalFunctionFallbacks; + } + + set { + if (story == null) + { + PushNullStoryError(); + return; + } + + story.allowExternalFunctionFallbacks = value; + } + } + + public bool do_not_save_default_values + { + get { return Ink.Runtime.VariablesState.dontSaveDefaultValues; } + + set { Ink.Runtime.VariablesState.dontSaveDefaultValues = value; } + } + + public bool stop_execution_on_exception = false; + + public bool stop_execution_on_error = false; + #endregion + + #region Read-only Properties + public bool can_continue + { + get { + if (story == null) + { + PushNullStoryError(); + return false; + } + + return story.canContinue; + } + } + + public bool async_continue_complete + { + get { + if (story == null) + { + PushNullStoryError(); + return false; + } + + return story.asyncContinueComplete; + } + } + + public string current_text + { + get { + if (story == null) + { + PushNullStoryError(); + return ""; + } + + if (story.currentText == null) + { + PushNullStateError("current_choices"); + return ""; + } + + + return story.currentText ?? ""; + } + } + + public Godot.Collections.Array current_choices + { + get { + if (story == null) + { + PushNullStoryError(); + return new Godot.Collections.Array(); + } + + if (story.currentChoices == null) + { + PushNullStateError("current_choices"); + return new Godot.Collections.Array(); + } + + if (choices != null) { + return new Godot.Collections.Array(story.currentChoices); + } else { + return new Godot.Collections.Array(); + } + } + } + + public Godot.Collections.Array current_tags + { + get { + if (story == null) + { + PushNullStoryError(); + return new Godot.Collections.Array(); + } + + if (story.currentTags == null) + { + PushNullStateError("current_tags"); + return new Godot.Collections.Array(); + } + + if (story.currentTags != null) { + return new Godot.Collections.Array(story.currentTags); + } else { + return new Godot.Collections.Array(); + } + } + } + + public Godot.Collections.Array global_tags + { + get { + if (story == null) + { + PushNullStoryError(); + return new Godot.Collections.Array(); + } + + if (story.globalTags != null) { + return new Godot.Collections.Array(story.globalTags); + } else { + return new Godot.Collections.Array(); + } + } + } + + public bool has_choices + { + get { return current_choices.Count > 0; } + } + + public string current_flow_name + { + get { + if (story == null) + { + PushNullStoryError(); + return ""; + } + + return story.state.currentFlowName; + } + } + + public string current_path + { + get { + if (story == null) + { + PushNullStoryError(); + return ""; + } + + return story.state.currentPathString; + } + } + #endregion + + #region Private Properties + private Ink.Runtime.Story story = null; + private Thread thread = null; + + private readonly InkBridger inkBridger = new InkBridger(); + private Dictionary> observers = + new Dictionary>(); + #endregion + + #region Private Properties + public InkPlayer() { + this.Set("name", "InkPlayer"); + } + #endregion + + #region Methods + public void create_story() + { + if (ink_file == null) { + PushError("'ink_file' is 'Nil', did Godot import the resource correctly?"); + CallDeferred("emit_signal", "loaded", false); + return; + } + + if (!IsValidResource(ink_file)) + { + PushError( + "'ink_file' doesn't have the appropriate resource type. Are you sure you imported a JSON file?" + ); + CallDeferred("emit_signal", "loaded", false); + return; + } + + if (loads_in_background && CurrentPlatformSupportsThreads()) + { + thread = new Thread(); + var error = thread.Start(this, "AsyncCreateStory", (string)ink_file.Get("json")); + if (error != Error.Ok) + { + GD.PrintErr($"[inkgd] [ERROR] Could not start the thread: error code {error}."); + EmitSignal("loaded", false); + } + } + else + { + CreateStory((string)ink_file.Get("json")); + FinaliseStoryCreation(); + } + } + + public void reset() + { + if (story == null) + { + PushNullStoryError(); + return; + } + + try + { + story.ResetState(); + } + catch (Exception e) + { + HandleException(e); + } + } + + public void destroy() + { + story = null; + } + #endregion + + #region Methods | Story Flow + public string continue_story() + { + if (story == null) + { + PushNullStoryError(); + return ""; + } + + var text = ""; + + try + { + if (can_continue) + { + story.Continue(); + text = current_text; + } + else if (has_choices) + { + EmitSignal("prompt_choices", new object[] { current_choices }); + } + else + { + EmitSignal("ended"); + } + + return text; + } + catch (Exception e) + { + HandleException(e); + return text; + } + } + + public void continue_story_async(float millisecs_limit_async) + { + if (story == null) + { + PushNullStoryError(); + return; + } + + try + { + if (can_continue) + { + story.ContinueAsync(millisecs_limit_async); + + if (!async_continue_complete) { + EmitSignal("interrupted"); + return; + } + } + else if (has_choices) + { + EmitSignal("prompt_choices", new object[] { current_choices }); + } + else + { + EmitSignal("ended"); + } + + return; + } + catch (Exception e) + { + HandleException(e); + return; + } + } + + public string continue_story_maximally() + { + if (story == null) + { + PushNullStoryError(); + return ""; + } + + var text = ""; + + try + { + if (can_continue) + { + story.ContinueMaximally(); + text = current_text; + } + else if (has_choices) + { + EmitSignal("prompt_choices", new object[] { current_choices }); + } + else + { + EmitSignal("ended"); + } + + return text; + } + catch (Exception e) + { + HandleException(e); + return text; + } + } + + public void choose_choice_index(int index) + { + try + { + if (index >= 0 && index < current_choices.Count) + { + story.ChooseChoiceIndex(index); + } + } + catch (Exception e) + { + HandleException(e); + } + } + + public void choose_path(string path) + { + if (story == null) + { + PushNullStoryError(); + return; + } + + try + { + story.ChoosePathString(path); + } + catch (Exception e) + { + HandleException(e); + } + } + + public void switch_flow(string flow_name) + { + if (story == null) + { + PushNullStoryError(); + return; + } + + try + { + story.SwitchFlow(flow_name); + } + catch (Exception e) + { + HandleException(e); + } + } + + public void switch_to_default_flow() + { + if (story == null) + { + PushNullStoryError(); + return; + } + + try + { + story.SwitchToDefaultFlow(); + } + catch (Exception e) + { + HandleException(e); + } + } + + public void remove_flow(string flow_name) + { + if (story == null) + { + PushNullStoryError(); + return; + } + + try + { + story.RemoveFlow(flow_name); + } + catch (Exception e) + { + HandleException(e); + } + } + #endregion + + #region Methods | Tags + public Godot.Collections.Array tags_for_content_at_path(string path) + { + if (story == null) + { + PushNullStoryError(); + return new Godot.Collections.Array(); + } + + try + { + var tags = story.TagsForContentAtPath(path); + if (tags != null) { + return new Godot.Collections.Array(tags); + } else { + return new Godot.Collections.Array(); + } + } + catch (Exception e) + { + HandleException(e); + return new Godot.Collections.Array(); + } + } + + public int visit_count_at_path(string path) + { + if (story == null) + { + PushNullStoryError(); + return 0; + } + + try + { + return story.state.VisitCountAtPathString(path); + } + catch (Exception e) + { + HandleException(e); + return 0; + } + } + #endregion + + #region Methods | State Management + public string get_state() + { + if (story == null) + { + PushNullStoryError(); + return ""; + } + + try + { + return story.state.ToJson(); + } + catch (Exception e) + { + HandleException(e); + return ""; + } + } + + public string copy_state_for_background_thread_save() + { + if (story == null) + { + PushNullStoryError(); + return ""; + } + + return story.CopyStateForBackgroundThreadSave().ToJson(); + } + + public void background_save_complete() + { + if (story == null) + { + PushNullStoryError(); + return; + } + + story.BackgroundSaveComplete(); + } + + public void set_state(string state) + { + if (story == null) + { + PushNullStoryError(); + return; + } + + try + { + story.state.LoadJson(state); + } + catch (Exception e) + { + HandleException(e); + } + } + + public void save_state_to_path(string path) + { + if (story == null) + { + PushNullStoryError(); + return; + } + + string sanitizedPath; + if (!path.StartsWith("res://") && !path.StartsWith("user://")) + { + sanitizedPath = $"user://{path}"; + } + else + { + sanitizedPath = path; + } + + var file = new File(); + file.Open(sanitizedPath, File.ModeFlags.Write); + save_state_to_file(file); + file.Close(); + } + + public void save_state_to_file(Godot.File file) + { + if (story == null) + { + PushNullStoryError(); + return; + } + + if (file.IsOpen()) + { + file.StoreString(get_state()); + } + } + + public void load_state_from_path(string path) + { + if (story == null) + { + PushNullStoryError(); + return; + } + + string sanitizedPath; + if (!path.StartsWith("res://") && !path.StartsWith("user://")) + { + sanitizedPath = $"user://{path}"; + } + else + { + sanitizedPath = path; + } + + var file = new File(); + file.Open(sanitizedPath, File.ModeFlags.Read); + load_state_from_file(file); + file.Close(); + } + + public void load_state_from_file(Godot.File file) + { + if (story == null) + { + PushNullStoryError(); + return; + } + + if (!file.IsOpen()) { + return; + } + + file.Seek(0); + if (file.GetLength() > 0) { + story.state.LoadJson(file.GetAsText()); + } + } + #endregion + + #region Methods | Variables + public object get_variable(string name) + { + if (story == null) + { + PushNullStoryError(); + return null; + } + + try + { + var variable = story.variablesState[name]; + + if (variable is Ink.Runtime.InkList inkList) + { + return inkBridger.MakeGDInkList(inkList); + } + + if (variable is Ink.Runtime.Path3D path) + { + return inkBridger.MakeGDInkPath(path); + } + } + catch(Exception e) + { + HandleException(e); + return null; + } + + return story.variablesState[name]; + } + + public void set_variable(string name, object value) + { + if (story == null) + { + PushNullStoryError(); + return; + } + + try + { + if (value is Godot.Object gdObject) + { + if (IsInkObject(gdObject, "InkList")) + { + story.variablesState[name] = inkBridger.MakeSharpInkList(gdObject, story); + return; + } + + if (IsInkObject(gdObject, "InkPath")) + { + story.variablesState[name] = inkBridger.MakeSharpInkPath(gdObject); + return; + } + } + story.variablesState[name] = value; + } + catch (Exception e) + { + HandleException(e); + } + } + #endregion + + #region Methods | Variable Observers + public void observe_variables(Godot.Collections.Array variable_names, Godot.Object gd_object, string method_name) + { + if (story == null) + { + PushNullStoryError(); + return; + } + + try + { + foreach(string variable_name in variable_names) + { + observe_variable(variable_name, gd_object, method_name); + } + } + catch (Exception e) + { + HandleException(e); + } + } + + public void observe_variable(string variable_name, Godot.Object gd_object, string method_name) + { + if (story == null) + { + PushNullStoryError(); + return; + } + + try + { + var instanceId = (int)gd_object.Call("get_instance_id"); + var funcRef = GD.FuncRef(gd_object, method_name); + + var functionReference = new FunctionReference( + variable_name, + instanceId, + method_name, + (string variableName, object value) => { + funcRef.CallFuncv(new Godot.Collections.Array() { variableName, value }); + } + ); + + if (observers.TryGetValue(variable_name, out List referenceList)) + { + referenceList.Append(functionReference); + } + else + { + observers[variable_name] = new List () { functionReference }; + } + + story.ObserveVariable(variable_name, functionReference.observer); + } + catch (Exception e) + { + HandleException(e); + } + } + + public void remove_variable_observer(Godot.Object gd_object, string method_name, string specific_variable_name) + { + if (story == null) + { + PushNullStoryError(); + return; + } + + try + { + if (observers.TryGetValue(specific_variable_name, out List references)) + { + var validReferences = + references.FindAll(reference => reference.Matches(specific_variable_name, gd_object, method_name)); + + foreach(FunctionReference reference in validReferences) { + story.RemoveVariableObserver(reference.observer, specific_variable_name); + references.Remove(reference); + } + } + } + catch (Exception e) + { + HandleException(e); + } + } + + public void remove_variable_observer_for_all_variables(Godot.Object gd_object, string method_name) + { + if (story == null) + { + PushNullStoryError(); + return; + } + + try + { + List observersToRemove = new List(); + + foreach(KeyValuePair> kv in observers) + { + var validReferences = + kv.Value.FindAll(reference => reference.Matches(gd_object, method_name)); + + foreach(FunctionReference reference in validReferences) { + story.RemoveVariableObserver(reference.observer); + kv.Value.Remove(reference); + } + } + } + catch (Exception e) + { + HandleException(e); + } + } + + public void remove_all_variable_observers(string specific_variable_name) + { + if (story == null) + { + PushNullStoryError(); + return; + } + + try + { + story.RemoveVariableObserver(null, specific_variable_name); + observers.Remove(specific_variable_name); + } + catch (Exception e) + { + HandleException(e); + } + } + #endregion + + #region Methods | External Functions + public void bind_external_function( + string func_name, + Godot.Object gd_object, + string method_name) + { + bind_external_function(func_name, gd_object, method_name, false); + } + + public void bind_external_function( + string func_name, + Godot.Object gd_object, + string method_name, + bool lookahead_safe) + { + if (story == null) + { + PushNullStoryError(); + return; + } + + try + { + story.BindExternalFunctionGeneral( + func_name, + (object[] args) => gd_object.Call(method_name, args), + lookahead_safe); + } + catch (Exception e) + { + HandleException(e); + } + } + + public void unbind_external_function(string func_name) + { + if (story == null) + { + PushNullStoryError(); + return; + } + + try + { + story.UnbindExternalFunction(func_name); + } + catch (Exception e) + { + HandleException(e); + } + } + #endregion + + #region Methods | Functions + + public bool has_function(string function_name) + { + if (story == null) + { + PushNullStoryError(); + return false; + } + + return story.HasFunction(function_name); + } + + public Godot.Object evaluate_function(string function_name, object[] arguments) + { + if (story == null) + { + PushNullStoryError(); + return null; + } + + // Prevents sending `null` to EvaluateFunction, which would + // otherwise raise an exception. + object[] sanitizedArguments; + if (arguments != null) { + sanitizedArguments = arguments; + } else { + sanitizedArguments = new object[] { }; + } + + try + { + object returnValue = story.EvaluateFunction(function_name, out string textOutput, sanitizedArguments); + return inkBridger.MakeFunctionResult(textOutput, returnValue); + } + catch (Exception e) + { + HandleException(e); + return null; + } + } + #endregion + + #region Methods | Ink List Creation + public Godot.Object create_ink_list_with_origin(string single_origin_list_name) + { + if (story == null) + { + PushNullStoryError(); + return null; + } + + try + { + var inkList = new Ink.Runtime.InkList(single_origin_list_name, story); + return inkBridger.MakeGDInkList(inkList); + } + catch (Exception e) + { + HandleException(e); + return null; + } + } + + public Godot.Object create_ink_list_from_item_name(string item_name) + { + if (story == null) + { + PushNullStoryError(); + return null; + } + + try + { + var inkList = Ink.Runtime.InkList.FromString(item_name, story); + return inkBridger.MakeGDInkList(inkList); + } + catch (Exception e) + { + HandleException(e); + return null; + } + } + #endregion + + #region Event Handlers + private void onError(string message, Ink.Ink.ErrorType type) + { + if (stop_execution_on_error) + { + PushStoryError(message, type); + Debug.Assert(false, "Error encountered, check the debugger tab for more information."); + return; + } + + if (GetSignalConnectionList("error_encountered").Count == 0) + { + PushStoryError(message, type); + } + else + { + EmitSignal("error_encountered", new object[] { message, type }); + } + } + + private void onDidContinue() + { + EmitSignal("continued", new object[] { current_text, current_tags }); + } + + private void onMakeChoice(Ink.Runtime.Choice choice) + { + EmitSignal("choice_made", new object[] { choice }); + } + + private void onEvaluateFunction(string functionName, object[] arguments) + { + EmitSignal("function_evaluating", new object[] { functionName, arguments }); + } + + private void onCompleteEvaluateFunction( + string functionName, + object[] arguments, + string textOuput, + object returnValue) + { + var functionResult = inkBridger.MakeFunctionResult(textOuput, returnValue); + var parameters = new object[] { functionName, arguments, functionResult }; + + EmitSignal("function_evaluated", parameters); + } + + private void onChoosePathString(string path, object[] arguments) + { + EmitSignal("path_choosen", new object[] { path, arguments }); + } + #endregion + + #region Private Methods + private void CreateStory(string json_story) + { + story = new Ink.Runtime.Story(json_story); + } + + private void AsyncCreateStory(string json_story) + { + CreateStory(json_story); + CallDeferred("AsyncCreationCompleted"); + } + + private void AsyncCreationCompleted() + { + thread.WaitToFinish(); + thread = null; + + FinaliseStoryCreation(); + } + + private void FinaliseStoryCreation() + { + story.onError += onError; + story.onDidContinue += onDidContinue; + story.onMakeChoice += onMakeChoice; + story.onEvaluateFunction += onEvaluateFunction; + story.onCompleteEvaluateFunction += onCompleteEvaluateFunction; + story.onChoosePathString += onChoosePathString; + + EmitSignal("loaded", new object[] { true }); + } + + private bool CurrentPlatformSupportsThreads() + { + return OS.GetName() != "HTML5"; + } + + private void PushNullStoryError() + { + PushError("The story is 'null', was it loaded properly?"); + } + + private void PushNullStateError(string variable) + { + var message = + $"'{variable}' is 'null', the internal state is corrupted or missing, this is an unrecoverable error."; + + PushError(message); + } + + private void PushStoryError(string message, Ink.Ink.ErrorType type) + { + if (Engine.EditorHint) + { + switch (type) + { + case Ink.Ink.ErrorType.Error: + GD.PrintErr(message); + break; + case Ink.Ink.ErrorType.Warning: + case Ink.Ink.ErrorType.Author: + GD.Print(message); + break; + } + } + else + { + switch (type) + { + case Ink.Ink.ErrorType.Error: + GD.PushError(message); + break; + case Ink.Ink.ErrorType.Warning: + case Ink.Ink.ErrorType.Author: + GD.PushWarning(message); + break; + } + } + } + + private void PushError(string message) + { + if (Engine.EditorHint) + { + GD.PrintErr(message); + foreach(string line in System.Environment.StackTrace.Split("\n")) + { + GD.PrintErr(line); + } + } + else + { + GD.PushError(message); + } + } + + private bool IsValidResource(Resource resource) + { + + var properties = resource.GetPropertyList().Cast().ToList(); + return ( + properties.Exists(element => "json".Equals(element["name"])) && + resource.Get("json") is string + ); + } + + private bool IsInkObject(Godot.Object inkObject, string name) + { + return inkObject.HasMethod("is_ink_class") && (bool)inkObject.Call("is_ink_class", new object[] { name }); + } + + private void HandleException(Exception e) + { + var message = $"{GetExceptionType(e)}: {e.Message}"; + + if (ShouldStopExecution(e)) + { + GD.PrintErr(message); + + foreach(string line in e.StackTrace.Split("\n")) + { + GD.PrintErr(line); + } + + Debug.Assert(false, "Exception encountered, check the output tab for more information."); + } + else + { + EmitSignal("exception_raised", new object[] { message, e.StackTrace.Split("\n") }); + } + } + + private bool ShouldStopExecution(Exception e) + { + return ( + (e is Ink.Runtime.StoryException && stop_execution_on_error) || + (!(e is Ink.Runtime.StoryException) && stop_execution_on_exception) + ); + } + + private string GetExceptionType(Exception e) + { + if (e is Ink.Runtime.StoryException) + { + return "STORY EXCEPTION"; + } + else if (e is System.ArgumentException) + { + return "ARGUMENT EXCEPTION"; + } + else + { + return "EXCEPTION"; + } + + } + #endregion + + #region Private Structures + private readonly struct FunctionReference + { + public readonly string variableName; + + public readonly int objectReferenceId; + public readonly string methodName; + + public readonly Ink.Runtime.Story.VariableObserver observer; + + public FunctionReference( + string variableName, + int objectReferenceId, + string methodName, + Ink.Runtime.Story.VariableObserver observer) + { + this.variableName = variableName; + this.objectReferenceId = objectReferenceId; + this.methodName = methodName; + this.observer = observer; + } + + public bool Matches(string variableName, Godot.Object gdObject, string methodName) + { + return this.variableName.Equals(variableName) && Matches(gdObject, methodName); + } + + public bool Matches(Godot.Object gdObject, string methodName) + { + return ( + (int)gdObject.Call("get_instance_id") == objectReferenceId && + this.methodName.Equals(methodName) + ); + } + + public override string ToString() + { + return $"FunctionReference[{variableName}, {objectReferenceId}, {methodName}]"; + } + } + #endregion +} diff --git a/addons/inkgd/mono/assemblies/.gitkeep b/addons/inkgd/mono/assemblies/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/addons/inkgd/plugin.cfg b/addons/inkgd/plugin.cfg new file mode 100644 index 0000000..0fbc3f6 --- /dev/null +++ b/addons/inkgd/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="InkGD" +description="Full implementation of inkle's Ink narrative language in pure GDScript, with editor support." +author="Frédéric Maquin" +version="0.6.0" +script="editor/ink_editor_plugin.gd" diff --git a/addons/inkgd/runtime.gd b/addons/inkgd/runtime.gd new file mode 100644 index 0000000..24c9b2b --- /dev/null +++ b/addons/inkgd/runtime.gd @@ -0,0 +1,35 @@ +# ############################################################################ # +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends Node + +# Hiding this type to prevent registration of "private" nodes. +# See https://github.com/godotengine/godot-proposals/issues/1047 +# class_name InkRuntime + +static func init(root_node, stop_on_error = true): + if root_node.has_node("__InkRuntime"): + var _ink_runtime = root_node.get_node("__InkRuntime") + _ink_runtime.stop_execution_on_exception = stop_on_error + _ink_runtime.stop_execution_on_error = stop_on_error + + return _ink_runtime + + var _ink_runtime = load("res://addons/inkgd/runtime/static/ink_runtime.gd").new() + + _ink_runtime.stop_execution_on_exception = stop_on_error + _ink_runtime.stop_execution_on_error = stop_on_error + + root_node.add_child(_ink_runtime) + + return _ink_runtime + +static func deinit(root_node): + var _ink_runtime = root_node.get_node("__InkRuntime") + root_node.remove_child(_ink_runtime) + _ink_runtime.queue_free() diff --git a/addons/inkgd/runtime/callstack.gd b/addons/inkgd/runtime/callstack.gd new file mode 100644 index 0000000..3c41d5c --- /dev/null +++ b/addons/inkgd/runtime/callstack.gd @@ -0,0 +1,457 @@ +# warning-ignore-all:shadowed_variable +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkBase + +class_name InkCallStack + +# ############################################################################ # + +class Element extends InkBase: + + var current_pointer: InkPointer = InkPointer.null_pointer + + var in_expression_evaluation: bool = false + var temporary_variables = null # Dictionary + var type: int = 0 # Ink.PushPopType + var evaluation_stack_height_when_pushed: int = 0 + var function_start_in_ouput_stream: int = 0 + + # (Ink.PushPopType, Pointer, bool) -> InkElement + func _init(type, pointer, in_expression_evaluation = false): + self.current_pointer = pointer + self.in_expression_evaluation = in_expression_evaluation + self.temporary_variables = {} + self.type = type + + # () -> InkElement + func copy(): + var copy = Element.new(self.type, self.current_pointer, self.in_expression_evaluation) + copy.temporary_variables = self.temporary_variables.duplicate() + copy.evaluation_stack_height_when_pushed = evaluation_stack_height_when_pushed + copy.function_start_in_ouput_stream = function_start_in_ouput_stream + return copy + + # ######################################################################## # + # GDScript extra methods + # ######################################################################## # + + func is_ink_class(type): + return type == "CallStack.Element" || super.is_ink_class(type) + + func get_ink_class(): + return "CallStack.Element" + +class InkThread extends InkBase: + + var callstack = null # Array + var thread_index: int = 0 # int + var previous_pointer: InkPointer = InkPointer.null_pointer + + func _init(static_json = null): + get_static_json(static_json) + callstack = [] + + # Dictionary, Story + func _init_with(jthread_obj, story_context): + thread_index = int(jthread_obj["threadIndex"]) + var jthread_callstack = jthread_obj["callstack"] + + for jel_tok in jthread_callstack: + var jelement_obj = jel_tok + var push_pop_type = int(jelement_obj["type"]) + + var pointer = InkPointer.null_pointer + var current_container_path_str = null + var current_container_path_str_token = null + + if jelement_obj.has("cPath"): + current_container_path_str_token = jelement_obj["cPath"] + current_container_path_str = str(current_container_path_str_token) + + var thread_pointer_result = story_context.content_at_path(InkPath.new_with_components_string(current_container_path_str)) + pointer = InkPointer.new(thread_pointer_result.container, int(jelement_obj["idx"])) + + if thread_pointer_result.obj == null: + InkUtils.throw_exception( + "When loading state, internal story location " + + "couldn't be found: '%s'. " % current_container_path_str + + "Has the story changed since this save data was created?" + ) + return + elif thread_pointer_result.approximate: + story_context.warning( + "When loading state, exact internal story location " + + "couldn't be found: '%s', so it was" % current_container_path_str + + "approximated to '%s' " + pointer.container.path._to_string() + + "to recover. Has the story changed since this save data was created?" + ) + + var in_expression_evaluation = bool(jelement_obj["exp"]) + var el = Element.new(push_pop_type, pointer, in_expression_evaluation) + + var temps + if jelement_obj.has("temp"): + temps = jelement_obj["temp"] # Dictionary + el.temporary_variables = self.StaticJSON.jobject_to_dictionary_runtime_objs(temps) + else: + el.temporary_variables.clear() + + callstack.append(el) + + var prev_content_obj_path + if jthread_obj.has("previousContentObject"): + prev_content_obj_path = str(jthread_obj["previousContentObject"]) + var prev_path = InkPath.new_with_components_string(prev_content_obj_path) + self.previous_pointer = story_context.pointer_at_path(prev_path) + + # () -> InkThread + func copy(): + var copy = InkThread.new(self.StaticJSON) + copy.thread_index = self.thread_index + for e in callstack: + copy.callstack.append(e.copy()) + copy.previous_pointer = self.previous_pointer + return copy + + # (SimpleJson.Writer) -> void + func write_json(writer): + writer.write_object_start() + + writer.write_property_start("callstack") + writer.write_array_start() + + for el in self.callstack: + writer.write_object_start() + if !el.current_pointer.is_null: + writer.write_property("cPath", el.current_pointer.container.path.components_string) + writer.write_property("idx", el.current_pointer.index) + + writer.write_property("exp", el.in_expression_evaluation) + writer.write_property("type", int(el.type)) + + if el.temporary_variables.size() > 0: + writer.write_property_start("temp") + self.StaticJSON.write_dictionary_runtime_objs(writer, el.temporary_variables) + writer.write_property_end() + + writer.write_object_end() + + writer.write_array_end() + writer.write_property_end() + + writer.write_property("threadIndex", self.thread_index) + + if !self.previous_pointer.is_null: + writer.write_property("previousContentObject", self.previous_pointer.resolve().path._to_string()) + + writer.write_object_end() + + # ######################################################################## # + # GDScript extra methods + # ######################################################################## # + + func is_ink_class(type): + return type == "CallStack.InkThread" || super.is_ink_class(type) + + func get_ink_class(): + return "CallStack.InkThread" + + # ######################################################################## # + + static func new_with(jthread_obj, story_context, static_json = null): + var thread = InkThread.new(static_json) + thread._init_with(jthread_obj, story_context) + return thread + + # ######################################################################## # + + var StaticJSON: InkStaticJSON: + get: return _static_json.get_ref() + + var _static_json = WeakRef.new() + + func get_static_json(static_json = null): + if static_json != null: + _static_json = weakref(static_json) + return + + var InkRuntime = Engine.get_main_loop().root.get_node("__InkRuntime") + + InkUtils.__assert__(InkRuntime != null, + str("[InkCallStack.InkThread] Could not retrieve 'InkRuntime' singleton from the scene tree.")) + + _static_json = weakref(InkRuntime.json) + +# () -> Array +var elements : get = get_elements +func get_elements(): + return self.callstack + +# () -> int +var depth : get = get_depth +func get_depth(): + return self.elements.size() + +# () -> InkElement +var current_element : get = get_current_element +func get_current_element(): + var thread = self._threads.back() + var cs = thread.callstack + return cs.back() + +# () -> int +var current_element_index : get = get_current_element_index +func get_current_element_index(): + return self.callstack.size() - 1 + +# () -> InkThread +# (InkThread) -> void +var current_thread : get = get_current_thread, set = set_current_thread +func get_current_thread(): + return self._threads.back() + +func set_current_thread(value): + InkUtils.__assert__(_threads.size() == 1, + "Shouldn't be directly setting the current thread when we have a stack of them") + self._threads.clear() + self._threads.append(value) + +# () -> bool +var can_pop : get = get_can_pop +func get_can_pop(): + return self.callstack.size() > 1 + +# (InkStory | CallStack) -> CallStack +func _init(story_context_or_to_copy, static_json = null): + get_static_json(static_json) + + if story_context_or_to_copy.is_ink_class("Story"): + var story_context = story_context_or_to_copy + _start_of_root = InkPointer.start_of(story_context.root_content_container) + reset() + elif story_context_or_to_copy.is_ink_class("CallStack"): + var to_copy = story_context_or_to_copy + self._threads = [] + for other_thread in to_copy._threads: + self._threads.append(other_thread.copy()) + self._thread_counter = to_copy._thread_counter + self._start_of_root = to_copy._start_of_root + +# () -> void +func reset(): + self._threads = [] + self._threads.append(InkThread.new(self.StaticJSON)) + self._threads[0].callstack.append(Element.new(Ink.PushPopType.TUNNEL, self._start_of_root)) + +# (Dictionary, InkStory) -> void +func set_json_token(jobject, story_context): + self._threads.clear() + var jthreads = jobject["threads"] + + for jthread_tok in jthreads: + var jthread_obj = jthread_tok + var thread = InkThread.new_with(jthread_obj, story_context) + self._threads.append(thread) + + self._thread_counter = int(jobject["threadCounter"]) + self._start_of_root = InkPointer.start_of(story_context.root_content_container) + + +# (SimpleJson.Writer) -> void +func write_json(writer): + writer.write_object(Callable(self, "_anonymous_write_json")) + +# () -> void +func push_thread(): + var new_thread = self.current_thread.copy() + self._thread_counter += 1 + new_thread.thread_index = self._thread_counter + self._threads.append(new_thread) + +# () -> void +func fork_thread(): + var forked_thread = self.current_thread.copy() + self._thread_counter += 1 + forked_thread.thread_index = self._thread_counter + return forked_thread + +# () -> void +func pop_thread(): + if self.can_pop_thread: + self._threads.erase(self.current_thread) + else: + InkUtils.throw_exception("Can't pop thread") + +# () -> bool +var can_pop_thread : get = get_can_pop_thread +func get_can_pop_thread(): + return _threads.size() > 1 && !self.element_is_evaluate_from_game + +# () -> bool +var element_is_evaluate_from_game : get = get_element_is_evaluate_from_game +func get_element_is_evaluate_from_game(): + return self.current_element.type == Ink.PushPopType.FUNCTION_EVALUATION_FROM_GAME + +# (Ink.PushPopType, int, int) -> void +func push(type, external_evaluation_stack_height = 0, output_stream_length_with_pushed = 0): + var element = Element.new(type, self.current_element.current_pointer, false) + + element.evaluation_stack_height_when_pushed = external_evaluation_stack_height + element.function_start_in_ouput_stream = output_stream_length_with_pushed + + self.callstack.append(element) + +# (Ink.PushPopType | null) -> void +func can_pop_type(type = null): + if !self.can_pop: + return false + + if type == null: + return true + + return self.current_element.type == type + +# (Ink.PushPopType | null) -> void +func pop(type = null): + if can_pop_type(type): + self.callstack.pop_back() + return + else: + InkUtils.throw_exception("Mismatched push/pop in Callstack") + +# (String, int) -> InkObject +func get_temporary_variable_with_name(name, context_index = -1) -> InkObject: + if context_index == -1: + context_index = self.current_element_index + 1 + + var var_value = null + + var context_element = self.callstack[context_index - 1] + + if context_element.temporary_variables.has(name): + var_value = context_element.temporary_variables[name] + return var_value + else: + return null + +# (String, InkObject, bool, int) -> void +func set_temporary_variable(name, value, declare_new, context_index = -1): + if context_index == -1: + context_index = self.current_element_index + 1 + + var context_element = self.callstack[context_index - 1] + + if !declare_new && !context_element.temporary_variables.has(name): + InkUtils.throw_exception("Could not find temporary variable to set: %s" % name) + return + + if context_element.temporary_variables.has(name): + var old_value = context_element.temporary_variables[name] + InkListValue.retain_list_origins_for_assignment(old_value, value) + + context_element.temporary_variables[name] = value + + +# (String) -> int +func context_for_variable_named(name): + if self.current_element.temporary_variables.has(name): + return self.current_element_index + 1 + else: + return 0 + +# (int) -> InkThread | null +func thread_with_index(index): + for thread in self._threads: + if thread.thread_index == index: + return thread + + return null + +var callstack : get = get_callstack +func get_callstack(): + return self.current_thread.callstack + +var callstack_trace : get = get_callstack_trace +func get_callstack_trace(): + var sb = "" + var t = 0 + while t < _threads.size(): + var thread = _threads[t] + var is_current = (t == _threads.size() - 1) + sb += str("=== THREAD ", str(t + 1), "/", str(_threads.size()), " ", + ("(current) " if is_current else "" ), "===\n") + + var i = 0 + while i < thread.callstack.size(): + if thread.callstack[i].type == Ink.PushPopType.FUNCTION: + sb += " [FUNCTION] " + else: + sb += " [TUNNEL] " + + var pointer = thread.callstack[i].current_pointer + if !pointer.is_null: + sb += " +var _thread_counter = 0 # int +var _start_of_root = InkPointer.null_pointer # Pointer + +# ############################################################################ # +# GDScript extra methods +# ############################################################################ # + +func is_ink_class(type): + return type == "CallStack" || super.is_ink_class(type) + +func get_ink_class(): + return "CallStack" + +# C# Actions & Delegates ##################################################### # + +# (SimpleJson.Writer) -> void +func _anonymous_write_json(writer: InkSimpleJSON.Writer) -> void: + writer.write_property_start("threads") + writer.write_array_start() + for thread in self._threads: + thread.write_json(writer) + writer.write_array_end() + writer.write_property_end() + + writer.write_property_start("threadCounter") + writer.write(self._thread_counter) + writer.write_property_end() + +# ######################################################################## # + +var StaticJSON: InkStaticJSON: + get: return _static_json.get_ref() + +var _static_json = WeakRef.new() + +func get_static_json(static_json = null): + if static_json != null: + _static_json = weakref(static_json) + return + + var InkRuntime = Engine.get_main_loop().root.get_node("__InkRuntime") + + InkUtils.__assert__(InkRuntime != null, + str("[InkCallStack] Could not retrieve 'InkRuntime' singleton from the scene tree.")) + + _static_json = weakref(InkRuntime.json) diff --git a/addons/inkgd/runtime/common/ink.gd b/addons/inkgd/runtime/common/ink.gd new file mode 100644 index 0000000..2546b52 --- /dev/null +++ b/addons/inkgd/runtime/common/ink.gd @@ -0,0 +1,24 @@ +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +class_name Ink + +# ############################################################################ # + +enum ErrorType { + AUTHOR, + WARNING, + ERROR +} + +enum PushPopType { + TUNNEL, + FUNCTION, + FUNCTION_EVALUATION_FROM_GAME +} diff --git a/addons/inkgd/runtime/common/ink_base.gd b/addons/inkgd/runtime/common/ink_base.gd new file mode 100644 index 0000000..22832fa --- /dev/null +++ b/addons/inkgd/runtime/common/ink_base.gd @@ -0,0 +1,31 @@ +# warning-ignore-all:shadowed_variable +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends RefCounted + +class_name InkBase + +# ############################################################################ # + +func equals(_ink_base: InkBase) -> bool: + return false + + +# ############################################################################ # +# GDScript extra methods +# ############################################################################ # + +func is_ink_class(type: String) -> bool: + return type == "InkBase" + + +func get_ink_class() -> String: + return "InkBase" diff --git a/addons/inkgd/runtime/common/ink_object.gd b/addons/inkgd/runtime/common/ink_object.gd new file mode 100644 index 0000000..4d1f6ab --- /dev/null +++ b/addons/inkgd/runtime/common/ink_object.gd @@ -0,0 +1,212 @@ +# warning-ignore-all:shadowed_variable +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkBase + +class_name InkObject + +# ############################################################################ # + +# Encapsulating parent into a weak ref. +var parent: InkObject: + get: + return self._parent.get_ref() + + set(value): + self._parent = weakref(value) + +var _parent: WeakRef = WeakRef.new() # InkObject + + +# ############################################################################ # + +var debug_metadata: InkDebugMetadata: + get: + if _debug_metadata == null: + if self.parent: + return self.parent.debug_metadata + return _debug_metadata + + set(value): + _debug_metadata = value + +var _debug_metadata: InkDebugMetadata = null + + +# ############################################################################ # + +var own_debug_metadata: InkDebugMetadata: + get: return _debug_metadata + + +# ############################################################################ # + +# (InkPath) -> int? +func debug_line_number_of_path(path: InkPath): + if path == null: + return null + + var root = self.root_content_container + if root != null: + var target_content := root.content_at_path(path).obj + if target_content: + var dm = target_content.debug_metadata + if dm != null: + return dm.start_line_number + + return null + + +# TODO: Make inspectable +# InkPath +var path: InkPath: + get: + if _path == null: + if self.parent == null: + _path = InkPath.new() + else: + var comps: Array = [] # Stack + + var child = self + var container = InkUtils.as_or_null(child.parent, "InkContainer") + + while container: + var named_child = InkUtils.as_INamedContent_or_null(child) + if (named_child != null && named_child.has_valid_name): + comps.push_front(InkPath.Component.new(named_child.name)) + else: + comps.push_front(InkPath.Component.new(container.content.find(child))) + + child = container + container = InkUtils.as_or_null(container.parent, "InkContainer") + + _path = InkPath.new_with_components(comps) + + return _path + +var _path: InkPath = null + + +func resolve_path(path: InkPath) -> InkSearchResult: + if path.is_relative: + var nearest_container = InkUtils.as_or_null(self, "InkContainer") + if !nearest_container: + InkUtils.__assert__( + self.parent != null, + "Can't resolve relative path because we don't have a parent" + ) + + nearest_container = InkUtils.as_or_null(self.parent, "InkContainer") + + InkUtils.__assert__(nearest_container != null, "Expected parent to be a container") + InkUtils.__assert__(path.get_component(0).is_parent) + + path = path.tail + + return nearest_container.content_at_path(path) + else: + return self.root_content_container.content_at_path(path) + + +func convert_path_to_relative(global_path: InkPath) -> InkPath: + var own_path := self.path + + var min_path_length: int = min(global_path.length, own_path.length) + var last_shared_path_comp_index: int = -1 + + var i: int = 0 + while i < min_path_length: + var own_comp: InkPath.Component = own_path.get_component(i) + var other_comp: InkPath.Component = global_path.get_component(i) + + if own_comp.equals(other_comp): + last_shared_path_comp_index = i + else: + break + + i += 1 + + if last_shared_path_comp_index == -1: + return global_path + + var num_upwards_moves: int = (own_path.length - 1) - last_shared_path_comp_index + + var new_path_comps: Array = [] # Array + + var up = 0 + while up < num_upwards_moves: + new_path_comps.append(InkPath.Component.to_parent()) + up += 1 + + var down = last_shared_path_comp_index + 1 + while down < global_path.length: + new_path_comps.append(global_path.get_component(down)) + down += 1 + + var relative_path = InkPath.new_with_components(new_path_comps, true) + return relative_path + + +func compact_path_string(other_path: InkPath) -> String: + var global_path_str + var relative_path_str + + if other_path.is_relative: + relative_path_str = other_path.components_string + global_path_str = self.path.path_by_appending_path(other_path).components_string + else: + var relative_path = convert_path_to_relative(other_path) + relative_path_str = relative_path.components_string + global_path_str = other_path.components_string + + if (relative_path_str.length() < global_path_str.length()): + return relative_path_str + else: + return global_path_str + + +# () -> InkContainer +var root_content_container: InkContainer: + get: + var ancestor := self + while (ancestor.parent): + ancestor = ancestor.parent + + return InkUtils.as_or_null(ancestor, "InkContainer") + + +# () -> InkObject +func copy(): + InkUtils.throw_exception("Not Implemented: Doesn't support copying") + return null + + +# (InkObject, InkObject) -> void +func set_child(obj: InkObject, value: InkObject): + if obj: + obj.parent = null + + obj = value + + if obj: + obj.parent = self + + +# ############################################################################ # +# GDScript extra methods +# ############################################################################ # + +func is_ink_class(type: String) -> bool: + return type == "InkObject" || super.is_ink_class(type) + + +func get_ink_class() -> String: + return "InkObject" diff --git a/addons/inkgd/runtime/content/choices/ink_choice.gd b/addons/inkgd/runtime/content/choices/ink_choice.gd new file mode 100644 index 0000000..fd30457 --- /dev/null +++ b/addons/inkgd/runtime/content/choices/ink_choice.gd @@ -0,0 +1,58 @@ +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkObject + +class_name InkChoice + +# ############################################################################ # + +var text: String + +var path_string_on_choice: String: + get: + # TODO: handle null case? + return target_path._to_string() + + set(value): + target_path = InkPath.new_with_components_string(value) + + +var source_path = null # String? + + +var index: int = 0 + + +var target_path: InkPath = null + + +var thread_at_generation: InkCallStack.InkThread = null + + +var original_thread_index: int = 0 + + +var is_invisible_default: bool = false + + +var tags = null # Array? + + +# ############################################################################ # +# GDScript extra methods +# ############################################################################ # + +func is_ink_class(type): + return type == "Choice" || super.is_ink_class(type) + + +func get_ink_class(): + return "Choice" diff --git a/addons/inkgd/runtime/content/choices/ink_choice_point.gd b/addons/inkgd/runtime/content/choices/ink_choice_point.gd new file mode 100644 index 0000000..494fb0b --- /dev/null +++ b/addons/inkgd/runtime/content/choices/ink_choice_point.gd @@ -0,0 +1,122 @@ +# warning-ignore-all:shadowed_variable +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkObject + +class_name InkChoicePoint + +# ############################################################################ # + +# () -> InkPath +# (InkPath) -> void +var path_on_choice: InkPath: + get: + if self._path_on_choice != null && self._path_on_choice.is_relative: + var choice_target_obj := self.choice_target + if choice_target_obj: + self._path_on_choice = choice_target_obj.path + + return _path_on_choice + + set(value): + _path_on_choice = value + +var _path_on_choice: InkPath = null + + +# ############################################################################ # + +var choice_target: InkContainer: + get: + var cont: InkContainer = resolve_path(self._path_on_choice).container + return cont + + +# ############################################################################ # + +var path_string_on_choice: String: + get: + return compact_path_string(self.path_on_choice) + + set(value): + self.path_on_choice = InkPath.new_with_components_string(value) + + +# ############################################################################ # + +var has_condition: bool + + +var has_start_content: bool + + +var has_choice_only_content: bool + + +var once_only: bool + + +var is_invisible_default: bool + + +# ############################################################################ # + +var flags: int: + get: + var flags: int = 0 + + if has_condition: + flags |= 1 + if has_start_content: + flags |= 2 + if has_choice_only_content: + flags |= 4 + if is_invisible_default: + flags |= 8 + if once_only: + flags |= 16 + + return flags + + set(value): + has_condition = (value & 1) > 0 + has_start_content = (value & 2) > 0 + has_choice_only_content = (value & 4) > 0 + is_invisible_default = (value & 8) > 0 + once_only = (value & 16) > 0 + + +# ############################################################################ # + +func _init(once_only: bool = true): + self.once_only = once_only + + +func _to_string() -> String: + var target_line_num = debug_line_number_of_path(self.path_on_choice) + var target_string := self.path_on_choice._to_string() + + if target_line_num != null: + target_string = " line %d(%s)" % [target_line_num, target_string] + + return "Choice: -> %s" % target_string + + +# ############################################################################ # +# GDScript extra methods +# ############################################################################ # + +func is_ink_class(type: String) -> bool: + return type == "ChoicePoint" || super.is_ink_class(type) + + +func get_ink_class() -> String: + return "ChoicePoint" diff --git a/addons/inkgd/runtime/content/ink_container.gd b/addons/inkgd/runtime/content/ink_container.gd new file mode 100644 index 0000000..ed530a8 --- /dev/null +++ b/addons/inkgd/runtime/content/ink_container.gd @@ -0,0 +1,333 @@ +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkObject + +class_name InkContainer + +# ############################################################################ # + + +var name = null # String? + + +var content: Array: # Array + get: + return self._content + set(value): + add_content(value) + + +var _content: Array # Array + + +var named_content: Dictionary # Dictionary + + +var named_only_content: # Dictionary? + get: + var named_only_content_dict = {} # Dictionary? + for key in self.named_content: + named_only_content_dict[key] = self.named_content[key] + + for c in self.content: + var named = InkUtils.as_INamedContent_or_null(c) + if named != null && named.has_valid_name: + named_only_content_dict.erase(named.name) + + if named_only_content_dict.size() == 0: + named_only_content_dict = null + + return named_only_content_dict + + set(value): + var existing_named_only = named_only_content + if existing_named_only != null: + for key in existing_named_only: + self.named_content.erase(key) + + if value == null: + return + + for key in value: + var named = InkUtils.as_INamedContent_or_null(value[key]) + if named != null: + add_to_named_content_only(named) + + +var visits_should_be_counted: bool = false + + +var turn_index_should_be_counted: bool = false + + +var counting_at_start_only: bool = false + + +enum CountFlags { + VISITS = 1, + TURNS = 2, + COUNT_START_ONLY = 4 +} + + +# CountFlags +var count_flags: int: + get: + var flags = 0 + + if visits_should_be_counted: flags |= CountFlags.VISITS + if turn_index_should_be_counted: flags |= CountFlags.TURNS + if counting_at_start_only: flags |= CountFlags.COUNT_START_ONLY + + if flags == CountFlags.COUNT_START_ONLY: + flags = 0 + + return flags + + set(value): + var flag = value + if (flag & CountFlags.VISITS) > 0: visits_should_be_counted = true + if (flag & CountFlags.TURNS) > 0: turn_index_should_be_counted = true + if (flag & CountFlags.COUNT_START_ONLY) > 0: counting_at_start_only = true + + +var has_valid_name: bool: + get: return self.name != null && self.name.length() > 0 + +var path_to_first_leaf_content: InkPath: + get: + if self._path_to_first_leaf_content == null: + self._path_to_first_leaf_content = self.path.path_by_appending_path(self.internal_path_to_first_leaf_content) + + return self._path_to_first_leaf_content + +# InkPath? +var _path_to_first_leaf_content: InkPath = null + + +# TODO: Make inspectable +var internal_path_to_first_leaf_content: InkPath: + get: + var components: Array = [] # Array + var container: InkContainer = self + while container != null: + if container.content.size() > 0: + components.append(InkPath.Component.new(0)) + container = InkUtils.as_or_null(container.content[0], "InkContainer") + + return InkPath.new_with_components(components) + + +func _init(): + self._content = [] # Array + self.named_content = {} # Dictionary + + +func add_content(content_obj_or_content_list) -> void: + if InkUtils.is_ink_class(content_obj_or_content_list, "InkObject"): + var content_obj: InkObject = content_obj_or_content_list + self.content.append(content_obj) + + if content_obj.parent: + InkUtils.throw_exception("content is already in %s" % content_obj.parent._to_string()) + return + + content_obj.parent = self + + try_add_named_content(content_obj) + elif content_obj_or_content_list is Array: + var content_list: Array = content_obj_or_content_list + for c in content_list: + add_content(c) + + +func insert_content(content_obj: InkObject, index: int) -> void: + self.content.insert(index, content_obj) + + if content_obj.parent: + InkUtils.throw_exception("content is already in %s" % content_obj.parent._to_string()) + return + + content_obj.parent = self + + try_add_named_content(content_obj) + + +func try_add_named_content(content_obj: InkObject) -> void: + var named_content_obj = InkUtils.as_INamedContent_or_null(content_obj) + if (named_content_obj != null && named_content_obj.has_valid_name): + add_to_named_content_only(named_content_obj) + + +# (INamedContent) -> void +func add_to_named_content_only(named_content_obj: InkObject) -> void: + InkUtils.__assert__(named_content_obj.is_ink_class("InkObject"), "Can only add Runtime.Objects to a Runtime.Container") + var runtime_obj = named_content_obj + runtime_obj.parent = self + + named_content[named_content_obj.name] = named_content_obj + + +func add_contents_of_container(other_container: InkContainer) -> void: + self.content = self.content + other_container.content + for obj in other_container.content: + obj.parent = self + try_add_named_content(obj) + + +func content_with_path_component(component: InkPath.Component) -> InkObject: + if component.is_index: + if component.index >= 0 && component.index < self.content.size(): + return self.content[component.index] + else: + return null + elif component.is_parent: + return self.parent + else: + if named_content.has(component.name): + var found_content = named_content[component.name] + return found_content + else: + return null + + +func content_at_path( + path: InkPath, + partial_path_start: int = 0, + partial_path_length: int = -1 +) -> InkSearchResult: + if partial_path_length == -1: + partial_path_length = path.length + + var result: InkSearchResult = InkSearchResult.new() + result.approximate = false + + var current_container: InkContainer = self + var current_obj: InkObject = self + + var i: int = partial_path_start + while i < partial_path_length: + var comp = path.get_component(i) + + if current_container == null: + result.approximate = true + break + + var found_obj: InkObject = current_container.content_with_path_component(comp) + + if found_obj == null: + result.approximate = true + break + + current_obj = found_obj + current_container = InkUtils.as_or_null(found_obj, "InkContainer") + + i += 1 + + result.obj = current_obj + + return result + + +func build_string_of_hierarchy( + existing_hierarchy: String, + indentation: int, + pointed_obj: InkObject +) -> String: + existing_hierarchy = _append_indentation(existing_hierarchy, indentation) + existing_hierarchy += "[" + + if self.has_valid_name: + existing_hierarchy += str(" (%s) " % self.name) + + if self == pointed_obj: + existing_hierarchy += " <---" + + existing_hierarchy += "\n" + + indentation += 1 + + var i = 0 + while i < self.content.size(): + var obj = self.content[i] + + if InkUtils.is_ink_class(obj, "InkContainer"): + existing_hierarchy = obj.build_string_of_hierarchy(existing_hierarchy, indentation, pointed_obj) + else: + existing_hierarchy = _append_indentation(existing_hierarchy, indentation) + if InkUtils.is_ink_class(obj, "StringValue"): + existing_hierarchy += "\"" + existing_hierarchy += obj._to_string().replace("\n", "\\n") + existing_hierarchy += "\"" + else: + existing_hierarchy += obj._to_string() + + if i != self.content.size() - 1: + existing_hierarchy += "," + + if !InkUtils.is_ink_class(obj, "InkContainer") && obj == pointed_obj: + existing_hierarchy += " <---" + + existing_hierarchy += "\n" + i += 1 + + var only_named: Dictionary = {} # Dictionary + + for obj_key in self.named_content: + var value = self.named_content[obj_key] + if self.content.find(value) != -1: + continue + else: + only_named[obj_key] = value + + if only_named.size() > 0: + existing_hierarchy = _append_indentation(existing_hierarchy, indentation) + existing_hierarchy += "-- named: --\n" + + for object_key in only_named: + var value = only_named[object_key] + InkUtils.__assert__(InkUtils.is_ink_class(value, "InkContainer"), "Can only print out named Containers") + var container = value + existing_hierarchy = container.build_string_of_hierarchy(existing_hierarchy, indentation, pointed_obj) + existing_hierarchy += "\n" + + indentation -= 1 + + existing_hierarchy = _append_indentation(existing_hierarchy, indentation) + existing_hierarchy += "]" + + return existing_hierarchy + + +func build_full_string_of_hierarchy() -> String: + return build_string_of_hierarchy("", 0, null) + + +func _append_indentation(string: String, indentation: int) -> String: + var spaces_per_indent = 4 + var i = 0 + while(i < spaces_per_indent * indentation): + string += " " + i += 1 + + return string + + +# ############################################################################ # +# GDScript extra methods +# ############################################################################ # + +func is_ink_class(type: String) -> bool: + return type == "InkContainer" || super.is_ink_class(type) + + +func get_ink_class() -> String: + return "InkContainer" diff --git a/addons/inkgd/runtime/content/ink_control_command.gd b/addons/inkgd/runtime/content/ink_control_command.gd new file mode 100644 index 0000000..6089f5d --- /dev/null +++ b/addons/inkgd/runtime/content/ink_control_command.gd @@ -0,0 +1,213 @@ +# warning-ignore-all:shadowed_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkObject + +class_name InkControlCommand + +# ############################################################################ # + +enum CommandType { + NOT_SET = -1, + EVAL_START, + EVAL_OUTPUT, + EVAL_END, + DUPLICATE, + POP_EVALUATED_VALUE, + POP_FUNCTION, + POP_TUNNEL, + BEGIN_STRING, + END_STRING, + NO_OP, + CHOICE_COUNT, + TURNS, + TURNS_SINCE, + READ_COUNT, + RANDOM, + SEED_RANDOM, + VISIT_INDEX, + SEQUENCE_SHUFFLE_INDEX, + START_THREAD, + DONE, + END, + LIST_FROM_INT, + LIST_RANGE, + LIST_RANDOM, + BEGIN_TAG, + END_TAG, + #---- + TOTAL_VALUES +} + + +# ############################################################################ # + +# CommandType +var command_type: int + + +# ############################################################################ # + +@warning_ignore("shadowed_variable") +func _init(command_type: int = CommandType.NOT_SET): + self.command_type = command_type + + +# ############################################################################ # + +func copy() -> InkControlCommand: + return InkControlCommand.new(self.command_type) + +static func eval_start() -> InkControlCommand: + return InkControlCommand.new(CommandType.EVAL_START) + + +static func eval_output() -> InkControlCommand: + return InkControlCommand.new(CommandType.EVAL_OUTPUT) + + +static func eval_end() -> InkControlCommand: + return InkControlCommand.new(CommandType.EVAL_END) + + +static func duplicate() -> InkControlCommand: + return InkControlCommand.new(CommandType.DUPLICATE) + + +static func pop_evaluated_value() -> InkControlCommand: + return InkControlCommand.new(CommandType.POP_EVALUATED_VALUE) + + +static func pop_function() -> InkControlCommand: + return InkControlCommand.new(CommandType.POP_FUNCTION) + + +static func pop_tunnel() -> InkControlCommand: + return InkControlCommand.new(CommandType.POP_TUNNEL) + + +static func begin_string() -> InkControlCommand: + return InkControlCommand.new(CommandType.BEGIN_STRING) + + +static func end_string() -> InkControlCommand: + return InkControlCommand.new(CommandType.END_STRING) + + +static func no_op() -> InkControlCommand: + return InkControlCommand.new(CommandType.NO_OP) + + +static func choice_count() -> InkControlCommand: + return InkControlCommand.new(CommandType.CHOICE_COUNT) + + +static func turns() -> InkControlCommand: + return InkControlCommand.new(CommandType.TURNS) + + +static func turns_since() -> InkControlCommand: + return InkControlCommand.new(CommandType.TURNS_SINCE) + + +static func read_count() -> InkControlCommand: + return InkControlCommand.new(CommandType.READ_COUNT) + + +static func random() -> InkControlCommand: + return InkControlCommand.new(CommandType.RANDOM) + + +static func seed_random() -> InkControlCommand: + return InkControlCommand.new(CommandType.SEED_RANDOM) + + +static func visit_index() -> InkControlCommand: + return InkControlCommand.new(CommandType.VISIT_INDEX) + + +static func sequence_shuffle_index() -> InkControlCommand: + return InkControlCommand.new(CommandType.SEQUENCE_SHUFFLE_INDEX) + + +static func done() -> InkControlCommand: + return InkControlCommand.new(CommandType.DONE) + + +static func end() -> InkControlCommand: + return InkControlCommand.new(CommandType.END) + + +static func list_from_int() -> InkControlCommand: + return InkControlCommand.new(CommandType.LIST_FROM_INT) + + +static func list_range() -> InkControlCommand: + return InkControlCommand.new(CommandType.LIST_RANGE) + + +static func list_random() -> InkControlCommand: + return InkControlCommand.new(CommandType.LIST_RANDOM) + + +static func begin_tag() -> InkControlCommand: + return InkControlCommand.new(CommandType.BEGIN_TAG) + + +static func end_tag() -> InkControlCommand: + return InkControlCommand.new(CommandType.END_TAG) + + +# () -> String +func _to_string() -> String: + var command_name: String = "" + match self.command_type: + CommandType.NOT_SET: command_name = "NOT_SET" + CommandType.EVAL_START: command_name = "EVAL_START" + CommandType.EVAL_OUTPUT: command_name = "EVAL_OUTPUT" + CommandType.EVAL_END: command_name = "EVAL_END" + CommandType.DUPLICATE: command_name = "DUPLICATE" + CommandType.POP_EVALUATED_VALUE: command_name = "POP_EVALUATED_VALUE" + CommandType.POP_FUNCTION: command_name = "POP_FUNCTION" + CommandType.POP_TUNNEL: command_name = "POP_TUNNEL" + CommandType.BEGIN_STRING: command_name = "BEGIN_STRING" + CommandType.END_STRING: command_name = "END_STRING" + CommandType.NO_OP: command_name = "NO_OP" + CommandType.CHOICE_COUNT: command_name = "CHOICE_COUNT" + CommandType.TURNS: command_name = "TURNS" + CommandType.TURNS_SINCE: command_name = "TURNS_SINCE" + CommandType.READ_COUNT: command_name = "READ_COUNT" + CommandType.RANDOM: command_name = "RANDOM" + CommandType.SEED_RANDOM: command_name = "SEED_RANDOM" + CommandType.VISIT_INDEX: command_name = "VISIT_INDEX" + CommandType.SEQUENCE_SHUFFLE_INDEX: command_name = "SEQUENCE_SHUFFLE_INDEX" + CommandType.START_THREAD: command_name = "START_THREAD" + CommandType.DONE: command_name = "DONE" + CommandType.END: command_name = "END" + CommandType.LIST_FROM_INT: command_name = "LIST_FROM_INT" + CommandType.LIST_RANGE: command_name = "LIST_RANGE" + CommandType.LIST_RANDOM: command_name = "LIST_RANDOM" + CommandType.BEGIN_TAG: command_name = "BEGIN_TAG" + CommandType.END_TAG: command_name = "END_TAG" + CommandType.TOTAL_VALUES: command_name = "TOTAL_VALUES" + + return "Command(%s)" % command_name + + +# ############################################################################ # +# GDScript extra methods +# ############################################################################ # + +func is_ink_class(type: String) -> bool: + return type == "ControlCommand" || super.is_ink_class(type) + + +func get_ink_class() -> String: + return "ControlCommand" diff --git a/addons/inkgd/runtime/content/ink_divert.gd b/addons/inkgd/runtime/content/ink_divert.gd new file mode 100644 index 0000000..7e69388 --- /dev/null +++ b/addons/inkgd/runtime/content/ink_divert.gd @@ -0,0 +1,145 @@ +# warning-ignore-all:shadowed_variable +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkObject + +class_name InkDivert + +# ############################################################################ # + +var target_path: InkPath: + get: + if self._target_path != null && self._target_path.is_relative: + var target_obj: InkObject = self.target_pointer.resolve() + if target_obj: + self._target_path = target_obj.path + + return self._target_path + + set(value): + self._target_path = value + self._target_pointer = InkPointer.null_pointer + +var _target_path: InkPath = null + + +var target_pointer: InkPointer: + get: + if self._target_pointer.is_null: + var target_obj = resolve_path(self._target_path).obj + + if self._target_path.last_component.is_index: + self._target_pointer = InkPointer.new( + InkUtils.as_or_null(target_obj.parent, "InkContainer"), + self._target_path.last_component.index + ) + else: + self._target_pointer = InkPointer.start_of(InkUtils.as_or_null(target_obj, "InkContainer")) + + return self._target_pointer + +var _target_pointer: InkPointer = InkPointer.null_pointer + + +var target_path_string: # String? + get: + if self.target_path == null: + return null + + return self.compact_path_string(self.target_path) + + set(value): + if value == null: + self.target_path = null + else: + self.target_path = InkPath.new_with_components_string(value) + + +var variable_divert_name = null # String? +var has_variable_target: bool: + get: return self.variable_divert_name != null + + +var pushes_to_stack: bool = false + +var stack_push_type: int = 0 # Ink.PushPopType + +var is_external: bool = false + +var external_args: int = 0 + +var is_conditional: bool = false + + +# (int?) -> InkDivert +@warning_ignore("shadowed_variable") +func _init_with(stack_push_type = null): + self.pushes_to_stack = false + + if stack_push_type != null: + self.pushes_to_stack = true + self.stack_push_type = stack_push_type + + +func equals(obj: InkBase) -> bool: + var other_divert: InkDivert = InkUtils.as_or_null(obj, "Divert") + if other_divert: + if self.has_variable_target == other_divert.has_variable_target: + if self.has_variable_target: + return self.variable_divert_name == other_divert.variable_divert_name + else: + return self.target_path.equals(other_divert.target_path) + + return false + + +func _to_string() -> String: + if self.has_variable_target: + return "Divert(variable: %s)" % self.variable_divert_name + elif self.target_path == null: + return "Divert(null)" + else: + var _string = "" + + var target_str: String = self.target_path._to_string() + var target_line_num = debug_line_number_of_path(self.target_path) + if target_line_num != null: + target_str = "line " + target_line_num + + _string += "Divert" + + if self.is_conditional: + _string += "?" + + if self.pushes_to_stack: + if self.stack_push_type == Ink.PushPopType.FUNCTION: + _string += " function" + else: + _string += " tunnel" + + _string += " -> " + _string += self.target_path_string + + _string += " (%s)" % target_str + + return _string + + +# ############################################################################ # +# GDScript extra methods +# ############################################################################ # + +func is_ink_class(type: String) -> bool: + return type == "Divert" || super.is_ink_class(type) + + +func get_ink_class() -> String: + return "Divert" diff --git a/addons/inkgd/runtime/content/ink_glue.gd b/addons/inkgd/runtime/content/ink_glue.gd new file mode 100644 index 0000000..46c74f7 --- /dev/null +++ b/addons/inkgd/runtime/content/ink_glue.gd @@ -0,0 +1,29 @@ +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkObject + +class_name InkGlue + +# ############################################################################ # + +func _to_string() -> String: + return "Glue" + + +# ############################################################################ # +# GDScript extra methods +# ############################################################################ # + +func is_ink_class(type: String) -> bool: + return type == "Glue" || super.is_ink_class(type) + + +func get_ink_class() -> String: + return "Glue" diff --git a/addons/inkgd/runtime/content/ink_native_function_call.gd b/addons/inkgd/runtime/content/ink_native_function_call.gd new file mode 100644 index 0000000..940e77e --- /dev/null +++ b/addons/inkgd/runtime/content/ink_native_function_call.gd @@ -0,0 +1,372 @@ +# warning-ignore-all:shadowed_variable +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkObject + +class_name InkNativeFunctionCall + +# ############################################################################ # +# Imports +# ############################################################################ # + +# TODO: Migrate to Ink.ValueType +const ValueType = preload("res://addons/inkgd/runtime/values/value_type.gd").ValueType + +# ############################################################################ # + +# (String) -> NativeFunctionCall +@warning_ignore("shadowed_variable") +static func call_with_name( + function_name: String, + _static_native_function_call: InkStaticNativeFunctionCall = null +) -> InkNativeFunctionCall: + return InkNativeFunctionCall.new_with_name(function_name, _static_native_function_call) + + +var name: String: + get: + return _name + + set(value): + _name = value + if !_is_prototype: + _prototype = self._static_native_function_call.native_functions[_name] + +var _name: String + + +var number_of_parameters: int: + get: + if _prototype: + return _prototype.number_of_parameters + else: + return _number_of_parameters + + set(value): + _number_of_parameters = value + +var _number_of_parameters: int = 0 + + +# (Array) -> InkObject +# +# The name is different to avoid shadowing 'Object.call' +# +# The method takes a `StoryErrorMetadata` object as a parameter that +# doesn't exist in upstream. The metadat are used in case an 'exception' +# is raised. For more information, see story.gd. +func call_with_parameters(parameters: Array, metadata: StoryErrorMetadata) -> InkObject: + if _prototype: + return _prototype.call_with_parameters(parameters, metadata) + + if self.number_of_parameters != parameters.size(): + InkUtils.throw_exception("Unexpected number of parameters") + return null + + var has_list = false + for p in parameters: + if InkUtils.is_ink_class(p, "Void"): + InkUtils.throw_story_exception( + "Attempting to perform operation on a void value. Did you forget to " + + "'return' a value from a function you called here?", + false, + metadata + ) + return null + if InkUtils.is_ink_class(p, "ListValue"): + has_list = true + + if parameters.size() == 2 && has_list: + return call_binary_list_operation(parameters, metadata) + + var coerced_params: Array = coerce_values_to_single_type(parameters, metadata) + + # ValueType + var coerced_type: int = coerced_params[0].value_type + + if ( + coerced_type == ValueType.INT || + coerced_type == ValueType.FLOAT || + coerced_type == ValueType.STRING || + coerced_type == ValueType.DIVERT_TARGET || + coerced_type == ValueType.LIST + ): + return call_coerced(coerced_params, metadata) + + return null + + +# (Array) -> Value # Call in the original code +# +# The method takes a `StoryErrorMetadata` object as a parameter that +# doesn't exist in upstream. The metadat are used in case an 'exception' +# is raised. For more information, see story.gd. +func call_coerced(parameters_of_single_type: Array, metadata: StoryErrorMetadata) -> InkValue: + var param1: InkValue = parameters_of_single_type[0] + var val_type: int = param1.value_type + + var param_count: int = parameters_of_single_type.size() + + if param_count == 2 || param_count == 1: + var op_for_type = null + if _operation_funcs.has(val_type): + op_for_type = _operation_funcs[val_type] + else: + var type_name = InkUtils.value_type_name(val_type) + InkUtils.throw_story_exception( + "Cannot perform operation '%s' on value of type (%d)" \ + % [self.name, type_name], + false, + metadata + ) + return null + + if param_count == 2: + var param2 = parameters_of_single_type[1] + + var result_val = self._static_native_function_call.call(op_for_type, param1.value, param2.value) + + return InkValue.create(result_val) + else: + var result_val = self._static_native_function_call.call(op_for_type, param1.value) + + return InkValue.create(result_val) + else: + InkUtils.throw_exception( + "Unexpected number of parameters to NativeFunctionCall: %d" % \ + parameters_of_single_type.size() + ) + return null + + +# (Array) -> Value +# +# The method takes a `StoryErrorMetadata` object as a parameter that +# doesn't exist in upstream. The metadat are used in case an 'exception' +# is raised. For more information, see story.gd. +func call_binary_list_operation(parameters: Array, metadata: StoryErrorMetadata) -> InkValue: + if ((self.name == "+" || self.name == "-") && + InkUtils.is_ink_class(parameters[0], "ListValue") && + InkUtils.is_ink_class(parameters [1], "IntValue") + ): + return call_list_increment_operation(parameters) + + var v1 = InkUtils.as_or_null(parameters[0], "Value") + var v2 = InkUtils.as_or_null(parameters[1], "Value") + + if ((self.name == "&&" || self.name == "||") && + (v1.value_type != ValueType.LIST || v2.value_type != ValueType.LIST) + ): + var op: String = _operation_funcs[ValueType.INT] + var result = bool(self._static_native_function_call.call( + "op_for_type", + 1 if v1.is_truthy else 0, + 1 if v2.is_truthy else 0 + )) + + return InkBoolValue.new_with(result) + + if v1.value_type == ValueType.LIST && v2.value_type == ValueType.LIST: + return call_coerced([v1, v2], metadata) + + var v1_type_name = InkUtils.value_type_name(v1.value_type) + var v2_type_name = InkUtils.value_type_name(v2.value_type) + InkUtils.throw_story_exception( + "Can not call use '%s' operation on %s and %s" % \ + [self.name, v1_type_name, v2_type_name], + false, + metadata + ) + + return null + + +# (Array) -> Value +func call_list_increment_operation(list_int_params: Array) -> InkValue: + var list_val: InkListValue = InkUtils.cast(list_int_params[0], "ListValue") + var int_val: InkIntValue = InkUtils.cast(list_int_params [1], "IntValue") + + var result_raw_list = InkList.new() + + for list_item in list_val.value.keys(): # TODO: Optimize? + var list_item_value = list_val.value.get_item(list_item) + + var int_op: String = _operation_funcs[ValueType.INT] + + var target_int = int( + self._static_native_function_call.call( + int_op, + list_item_value, + int_val.value + ) + ) + + var item_origin: InkListDefinition = null + for origin in list_val.value.origins: + if origin.name == list_item.origin_name: + item_origin = origin + break + + if item_origin != null: + var incremented_item: InkTryGetResult = item_origin.try_get_item_with_value(target_int) + if incremented_item.exists: + result_raw_list.set_item(incremented_item.result, target_int) + + return InkListValue.new_with(result_raw_list) + + +# (Array) -> Array? +# +# The method takes a `StoryErrorMetadata` object as a parameter that +# doesn't exist in upstream. The metadata are used in case an 'exception' +# is raised. For more information, see story.gd. +func coerce_values_to_single_type(parameters_in: Array, metadata: StoryErrorMetadata): + var val_type: int = ValueType.INT + + var special_case_list: InkListValue = null + + for obj in parameters_in: + var val: InkValue = obj + if val.value_type > val_type: + val_type = val.value_type + + if val.value_type == ValueType.LIST: + special_case_list = InkUtils.as_or_null(val, "ListValue") + + var parameters_out: Array = [] # Array + + if val_type == ValueType.LIST: + for val in parameters_in: + if val.value_type == ValueType.LIST: + parameters_out.append(val) + elif val.value_type == ValueType.INT: + var int_val = int(val.value_object) + var list = special_case_list.value.origin_of_max_item + + var item: InkTryGetResult = list.try_get_item_with_value(int_val) + if item.exists: + var casted_value = InkListValue.new_with_single_item(item.result, int_val) + parameters_out.append(casted_value) + else: + InkUtils.throw_story_exception( + "Could not find List item with the value %d in %s" \ + % [int_val, list.name], + false, + metadata + ) + + return null + else: + var type_name = InkUtils.value_type_name(val.value_type) + InkUtils.throw_story_exception( + "Cannot mix Lists and %s values in this operation" % type_name, + false, + metadata + ) + + return null + + else: + for val in parameters_in: + var casted_value = val.cast(val_type) + parameters_out.append(casted_value) + + return parameters_out + + +func _init(static_native_function_call: InkStaticNativeFunctionCall = null): + generate_native_functions_if_necessary(static_native_function_call) + + +@warning_ignore("shadowed_variable") +func _init_with_name(name: String): + self.name = name + + +@warning_ignore("shadowed_variable") +func _init_with_name_and_number_of_parameters(name: String, number_of_parameters: int): + _is_prototype = true + self.name = name + self.number_of_parameters = number_of_parameters + + +func generate_native_functions_if_necessary(static_native_function_call: InkStaticNativeFunctionCall) -> void: + find_static_objects(static_native_function_call) + self._static_native_function_call.generate_native_functions_if_necessary() + + +func add_op_func_for_type(val_type: int, op: String) -> void: + if _operation_funcs == null: + _operation_funcs = {} + + _operation_funcs[val_type] = op + + +func _to_string() -> String: + return "Native '%s'" % self.name + + +var _prototype: InkNativeFunctionCall = null + +var _is_prototype: bool = false + +# Dictionary +var _operation_funcs: Dictionary = {} + + +# ############################################################################ # +# GDScript extra methods +# ############################################################################ # + +func is_ink_class(type): + return type == "NativeFunctionCall" || super.is_ink_class(type) + + +func get_ink_class(): + return "NativeFunctionCall" + + +var _static_native_function_call: InkStaticNativeFunctionCall: + get: return _weak_static_native_function_call.get_ref() + +var _weak_static_native_function_call = WeakRef.new() + + +func find_static_objects(static_native_function_call: InkStaticNativeFunctionCall = null): + if _static_native_function_call == null: + if static_native_function_call: + _weak_static_native_function_call = weakref(static_native_function_call) + else: + var ink_runtime = Engine.get_main_loop().root.get_node("__InkRuntime") + _weak_static_native_function_call = weakref(ink_runtime.native_function_call) + + +# ############################################################################ # + +@warning_ignore("shadowed_variable") +static func new_with_name( + name: String, + static_native_function_call: InkStaticNativeFunctionCall = null +): + var native_function_call = InkNativeFunctionCall.new(static_native_function_call) + native_function_call._init_with_name(name) + return native_function_call + + +@warning_ignore("shadowed_variable") +static func new_with_name_and_number_of_parameters( + name: String, + number_of_parameters: int, + static_native_function_call: InkStaticNativeFunctionCall = null +): + var native_function_call = InkNativeFunctionCall.new(static_native_function_call) + native_function_call._init_with_name_and_number_of_parameters(name, number_of_parameters) + return native_function_call diff --git a/addons/inkgd/runtime/content/ink_tag.gd b/addons/inkgd/runtime/content/ink_tag.gd new file mode 100644 index 0000000..2d27e40 --- /dev/null +++ b/addons/inkgd/runtime/content/ink_tag.gd @@ -0,0 +1,36 @@ +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkObject + +class_name InkTag + +# ############################################################################ # + +var text: String + + +func _init(tag_text: String): + text = tag_text + + +func _to_string() -> String: + return '# ' + text + + +# ############################################################################ # +# GDScript extra methods +# ############################################################################ # + +func is_ink_class(type: String) -> bool: + return type == "Tag" || super.is_ink_class(type) + + +func get_ink_class() -> String: + return "Tag" diff --git a/addons/inkgd/runtime/content/ink_variable_assignment.gd b/addons/inkgd/runtime/content/ink_variable_assignment.gd new file mode 100644 index 0000000..530c07f --- /dev/null +++ b/addons/inkgd/runtime/content/ink_variable_assignment.gd @@ -0,0 +1,60 @@ +# warning-ignore-all:shadowed_variable +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkObject + +class_name InkVariableAssignment + +# ############################################################################ # + +var variable_name = null # String? + +var is_new_declaration: bool = false + +var is_global: bool = false + + +func _init(): + _init_with(null, false) + + +# (String?, bool) -> InkVariableAssignment +@warning_ignore("shadowed_variable") +func _init_with(variable_name, is_new_declaration: bool): + self.variable_name = variable_name + self.is_new_declaration = is_new_declaration + + +func _to_string() -> String: + return "VarAssign to %s" % variable_name + + +# ############################################################################ # +# GDScript extra methods +# ############################################################################ # + +func is_ink_class(type: String) -> bool: + return type == "VariableAssignment" || super.is_ink_class(type) + + +func get_ink_class() -> String: + return "VariableAssignment" + + +# (String?, bool) -> InkVariableAssignment +@warning_ignore("shadowed_variable") +static func new_with( + variable_name: String, + is_new_declaration: bool +) -> InkVariableAssignment: + var variable_assignment = InkVariableAssignment.new() + variable_assignment._init_with(variable_name, is_new_declaration) + return variable_assignment diff --git a/addons/inkgd/runtime/content/ink_variable_reference.gd b/addons/inkgd/runtime/content/ink_variable_reference.gd new file mode 100644 index 0000000..3d38979 --- /dev/null +++ b/addons/inkgd/runtime/content/ink_variable_reference.gd @@ -0,0 +1,69 @@ +# warning-ignore-all:shadowed_variable +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkObject + +class_name InkVariableReference + +# ############################################################################ # + +var name = null # String? + +# InkPath +var path_for_count: InkPath = null + +# Container? +var container_for_count: InkContainer: + get: return self.resolve_path(path_for_count).container + +# String? +var path_string_for_count: + get: + if path_for_count == null: + return null + + return compact_path_string(path_for_count) + + set(value): + if value == null: + path_for_count = null + else: + path_for_count = InkPath.new_with_components_string(value) + + +# ############################################################################ # + +@warning_ignore("shadowed_variable") +func _init(name = null): + if name: + self.name = name + + +# ############################################################################ # + +func _to_string() -> String: + if name != null: + return "var(%s)" % name + else: + var path_str = self.path_string_for_count + return "read_count(%s)" % path_str + + +# ############################################################################ # +# GDScript extra methods +# ############################################################################ # + +func is_ink_class(type: String) -> bool: + return type == "VariableReference" || super.is_ink_class(type) + + +func get_ink_class() -> String: + return "VariableReference" diff --git a/addons/inkgd/runtime/content/ink_void.gd b/addons/inkgd/runtime/content/ink_void.gd new file mode 100644 index 0000000..2bd104d --- /dev/null +++ b/addons/inkgd/runtime/content/ink_void.gd @@ -0,0 +1,27 @@ +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkObject + +class_name InkVoid + +# ############################################################################ # +# GDScript extra methods +# ############################################################################ # + +func is_ink_class(type: String) -> bool: + return type == "Void" || super.is_ink_class(type) + + +func get_ink_class() -> String: + return "Void" + + +func _to_string() -> String: + return "Void" diff --git a/addons/inkgd/runtime/debug_metadata.gd b/addons/inkgd/runtime/debug_metadata.gd new file mode 100644 index 0000000..6d8371e --- /dev/null +++ b/addons/inkgd/runtime/debug_metadata.gd @@ -0,0 +1,76 @@ +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkBase + +class_name InkDebugMetadata + +# ############################################################################ # + +var start_line_number: int = 0 +var end_line_number: int = 0 +var start_character_number: int = 0 +var end_character_number: int = 0 +# String? +var file_name = null +# String? +var source_name = null + +# ############################################################################ # + +func merge(dm: InkDebugMetadata) -> InkDebugMetadata: + var new_debug_metadata = DebugMetadata().new() + + new_debug_metadata.file_name = self.file_name + new_debug_metadata.source_name = self.source_name + + if self.start_line_number < dm.start_line_number: + new_debug_metadata.start_line_number = self.start_line_number + new_debug_metadata.start_character_number = self.start_character_number + elif self.start_line_number > dm.start_line_number: + new_debug_metadata.start_line_number = dm.start_line_number + new_debug_metadata.start_character_number = dm.start_character_number + else: + var min_scn = min(self.start_character_number, dm.start_character_number) + new_debug_metadata.start_line_number = self.start_line_number + new_debug_metadata.start_character_number = min_scn + + if self.end_line_number > dm.end_line_number: + new_debug_metadata.end_line_number = self.end_line_number + new_debug_metadata.end_character_number = self.end_character_number + elif self.end_line_number < dm.end_line_number: + new_debug_metadata.end_line_number = dm.end_line_number + new_debug_metadata.end_character_number = dm.end_character_number + else: + var max_scn = min(self.end_character_number, dm.end_character_number) + new_debug_metadata.end_line_number = self.end_line_number + new_debug_metadata.end_character_number = max_scn + + return new_debug_metadata + +# () -> String +func _to_string() -> String: + if file_name != null: + return str("line ", start_line_number, " of ", file_name) + else: + return str("line ", start_line_number) + +# ############################################################################ # +# GDScript extra methods +# ############################################################################ # + +func is_ink_class(type: String) -> bool: + return type == "DebugMetadata" || super.is_ink_class(type) + +func get_ink_class() -> String: + return "DebugMetadata" + +static func DebugMetadata(): + return load("res://addons/inkgd/runtime/debug_metadata.gd") diff --git a/addons/inkgd/runtime/extra/function_result.gd b/addons/inkgd/runtime/extra/function_result.gd new file mode 100644 index 0000000..68d7cd2 --- /dev/null +++ b/addons/inkgd/runtime/extra/function_result.gd @@ -0,0 +1,24 @@ +# warning-ignore-all:shadowed_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends RefCounted + +class_name InkFunctionResult + +# ############################################################################ # + +var text_output: String = "" +var return_value = null + +# ############################################################################ # + +func _init(text_output: String, return_value): + self.text_output = text_output + self.return_value = return_value diff --git a/addons/inkgd/runtime/extra/ink_key_value_pair.gd b/addons/inkgd/runtime/extra/ink_key_value_pair.gd new file mode 100644 index 0000000..8d015bc --- /dev/null +++ b/addons/inkgd/runtime/extra/ink_key_value_pair.gd @@ -0,0 +1,39 @@ +# warning-ignore-all:shadowed_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends RefCounted + +class_name InkKeyValuePair + +# ############################################################################ # + +var key = null +var value = null + +# ############################################################################ # + +# TODO: Use _init instead of _init_with_key_value. +func _init(): + pass + +func _init_with_key_value(key, value): + self.key = key + self.value = value + +func _to_string(): + return ("[KeyValuePair (%s, %s)]" % [key, value]) + +# ############################################################################ # + +static func new_with_key_value(key, value) -> InkKeyValuePair: + var key_value_pair = InkKeyValuePair.new() + key_value_pair._init_with_key_value(key, value) + + return key_value_pair diff --git a/addons/inkgd/runtime/extra/state_element.gd b/addons/inkgd/runtime/extra/state_element.gd new file mode 100644 index 0000000..59fddc3 --- /dev/null +++ b/addons/inkgd/runtime/extra/state_element.gd @@ -0,0 +1,50 @@ +# warning-ignore-all:shadowed_variable +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +# ############################################################################ # +# !! VALUE TYPE +# ############################################################################ # + +# This element is only used during JSON parsing and is never duplicated / passed +# around so it doesn't need to be either immutable or have a 'duplicate' method. + +class_name InkStateElement + +# ############################################################################ # + +enum State { + NONE, + OBJECT, + ARRAY, + PROPERTY, + PROPERTY_NAME, + STRING, +} + +# ############################################################################ # + +var type: int = State.NONE # State +var child_count: int = 0 + +# ############################################################################ # + +func _init(type: int): + self.type = type + +# ############################################################################ # +# GDScript extra methods +# ############################################################################ # + +func is_ink_class(type) -> bool: + return type == "StateElement" + +func get_ink_class() -> String: + return "StateElement" diff --git a/addons/inkgd/runtime/extra/stopwatch.gd b/addons/inkgd/runtime/extra/stopwatch.gd new file mode 100644 index 0000000..8d7244d --- /dev/null +++ b/addons/inkgd/runtime/extra/stopwatch.gd @@ -0,0 +1,34 @@ +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +# Simple replacement of the Stopwatch class from the .NET Framework. +# Less accurate than the original implemntation, but good enough for +# the use-case. + +class_name InkStopWatch + +# ############################################################################ # + +var _start_time: int = -1 + +var elapsed_milliseconds : get = get_elapsed_milliseconds +func get_elapsed_milliseconds() -> int: + if _start_time == -1: + return 0 + + return Time.get_ticks_msec() - _start_time + +# ############################################################################ # + +func start() -> void: + _start_time = Time.get_ticks_msec() + +func stop() -> void: + _start_time = -1 diff --git a/addons/inkgd/runtime/extra/story_error.gd b/addons/inkgd/runtime/extra/story_error.gd new file mode 100644 index 0000000..2faeb19 --- /dev/null +++ b/addons/inkgd/runtime/extra/story_error.gd @@ -0,0 +1,31 @@ + # ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +# An object tha represents a "Story Error", which is equivalent in certain +# context to upstream's StoryException. + +class_name StoryError + +# ############################################################################ # +# Properties +# ############################################################################ # + +var message: String +var use_end_line_number: bool +var metadata # StoryErrorMetadata | null + +# ############################################################################ # +# Initialization +# ############################################################################ # + +@warning_ignore("shadowed_variable") +func _init(message: String, use_end_line_number: bool, metadata): + self.message = message + self.use_end_line_number = use_end_line_number + self.metadata = metadata diff --git a/addons/inkgd/runtime/extra/story_error_metadata.gd b/addons/inkgd/runtime/extra/story_error_metadata.gd new file mode 100644 index 0000000..9145676 --- /dev/null +++ b/addons/inkgd/runtime/extra/story_error_metadata.gd @@ -0,0 +1,30 @@ + # ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +# An object that keeps track of the Debug Metadata and current pointer at the +# exact moment an error was raised, so that they can be processed and reported +# later. It's required because GDScript doesn't support exceptions and +# errors don't bubble up the stack. + +class_name StoryErrorMetadata + +# ############################################################################ # +# Properties +# ############################################################################ # + +var debug_metadata # InkDebugMetadata | null +var pointer: InkPointer + +# ############################################################################ # +# Initialization +# ############################################################################ # + +func _init(debug_metadata: InkDebugMetadata, pointer: InkPointer): + self.debug_metadata = debug_metadata + self.pointer = pointer diff --git a/addons/inkgd/runtime/extra/string_set.gd b/addons/inkgd/runtime/extra/string_set.gd new file mode 100644 index 0000000..2d430f9 --- /dev/null +++ b/addons/inkgd/runtime/extra/string_set.gd @@ -0,0 +1,63 @@ + # ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +# Using an dictionary as the backing structure for a not-too-bad, super-simple +# set. The Ink runtime doesn't use C#'s HashSet full potential, so this trick +# should be good enough for the use-case. + +# This simple set is designed to hold Strings only. + +extends RefCounted + +class_name InkStringSet + +# ############################################################################ # +# Self-reference +# ############################################################################ # + +static func InkStringSet() -> GDScript: + return load("res://addons/inkgd/runtime/extra/string_set.gd") as GDScript + +# ############################################################################ # + +var _dictionary: Dictionary = {} + +# ############################################################################ # + +func clear() -> void: + _dictionary.clear() + +func duplicate() -> InkStringSet: + var set = InkStringSet().new() + set._dictionary = _dictionary.duplicate() + return set + +func enumerate() -> Array: + return _dictionary.keys() + +func is_empty() -> bool: + return _dictionary.is_empty() + +func contains(element: String) -> bool: + return _dictionary.has(element) + +func contains_all(elements: Array) -> bool: + return _dictionary.has_all(elements) + +func size() -> int: + return _dictionary.size() + +func to_array() -> Array: + return _dictionary.keys() + +func append(value: String) -> void: + _dictionary[value] = null + +func erase(value: String) -> bool: + return _dictionary.erase(value) diff --git a/addons/inkgd/runtime/extra/string_writer.gd b/addons/inkgd/runtime/extra/string_writer.gd new file mode 100644 index 0000000..62c2c57 --- /dev/null +++ b/addons/inkgd/runtime/extra/string_writer.gd @@ -0,0 +1,33 @@ +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +# Simple replacement of the StringWriter class from the .NET Framework. +# It has none of the optimisations of original class and merely wraps +# a plain old string. + + +class_name InkStringWriter + +# ############################################################################ # + +var _internal_string: String = "" + +# ############################################################################ # + +func _init(): + pass + +# ############################################################################ # + +func write(s: String) -> void: + _internal_string += str(s) + +func _to_string() -> String: + return _internal_string diff --git a/addons/inkgd/runtime/extra/try_get_result.gd b/addons/inkgd/runtime/extra/try_get_result.gd new file mode 100644 index 0000000..80899cd --- /dev/null +++ b/addons/inkgd/runtime/extra/try_get_result.gd @@ -0,0 +1,25 @@ +# warning-ignore-all:shadowed_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + + +extends RefCounted + +class_name InkTryGetResult + +# ############################################################################ # + +var exists: bool = false # Bool +var result = null # Variant + +# ############################################################################ # + +func _init(exists: bool, result): + self.exists = exists + self.result = result diff --git a/addons/inkgd/runtime/extra/utils.gd b/addons/inkgd/runtime/extra/utils.gd new file mode 100644 index 0000000..69bf42d --- /dev/null +++ b/addons/inkgd/runtime/extra/utils.gd @@ -0,0 +1,272 @@ +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends RefCounted + +class_name InkUtils + +# ############################################################################ # +# Imports +# ############################################################################ # + +const ValueType = preload("res://addons/inkgd/runtime/values/value_type.gd").ValueType + +# ############################################################################ # +# Exceptions +# ############################################################################ # + +static func throw_exception(message: String) -> void: + InkRuntime().handle_exception(message) + +static func throw_story_exception( + message: String, + use_end_line_number = false, + metadata = null +) -> void: + InkRuntime().handle_story_exception(message, use_end_line_number, metadata) + +static func throw_argument_exception(message: String) -> void: + InkRuntime().handle_argument_exception(message) + +# ############################################################################ # +# Assertions +# ############################################################################ # + +static func __assert__(condition: bool, message = "") -> void: + if !condition && message != "": + printerr(message) + + assert(condition) + +# ############################################################################ # +# Type Assertion +# ############################################################################ # + +static func as_or_null(variant, name_of_class: String): + if ( + is_ink_class(variant, name_of_class) || + (name_of_class == "Dictionary" && variant is Dictionary) || + (name_of_class == "Array" && variant is Array) + ): + return variant + else: + return null + +static func cast(variant, name_of_class: String): + if is_ink_class(variant, name_of_class): + return variant + else: + push_error( + "Original implementation threw a RuntimeException here, because of a " + + "cast issue. Undefined behaviors should be expected." + ) + + assert(false) + return null + +static func as_INamedContent_or_null(variant): + var properties = variant.get_property_list() + + var has_has_valid_name = false + var has_name = false + + for property in properties: + if property["name"] == "has_valid_name": + has_has_valid_name = true + + if has_has_valid_name && has_name: + return variant + elif property["name"] == "name": + has_name = true + + if has_has_valid_name && has_name: + return variant + + return null + +static func is_ink_class(object: Variant, name_of_class: String) -> bool: + return (object is Object) && object.is_ink_class(name_of_class) + +static func are_of_same_type(object1: Variant, object2: Variant) -> bool: + if (object1 is Object) && (object2 is Object): + return object1.get_ink_class() == object2.get_ink_class() + + return typeof(object1) == typeof(object2) + +static func value_type_name(value_type: int) -> String: + match value_type: + ValueType.BOOL: return "Boolean" + + ValueType.INT: return "Int" + ValueType.FLOAT: return "Float" + ValueType.LIST: return "List" + ValueType.STRING: return "String" + + ValueType.DIVERT_TARGET: return "Divert Target" + ValueType.VARIABLE_POINTER: return "Variable Pointer" + + _: return "unknown" + +static func typename_of(variant) -> String: + match typeof(variant): + TYPE_NIL: return "null" + TYPE_BOOL: return "bool" + TYPE_INT: return "int" + TYPE_FLOAT: return "float" + TYPE_STRING: return "String" + TYPE_VECTOR2: return "Vector2" + TYPE_RECT2: return "Rect2" + TYPE_VECTOR3: return "Vector3" + TYPE_TRANSFORM2D: return "Transform2D" + TYPE_PLANE: return "Plane" + TYPE_QUATERNION: return "Quaternion" + TYPE_AABB: return "AABB" + TYPE_BASIS: return "Basis" + TYPE_TRANSFORM3D: return "Transform3D" + TYPE_COLOR: return "Color" + TYPE_NODE_PATH: return "NodePath" + TYPE_RID: return "RID" + TYPE_OBJECT: return variant.get_ink_class() + TYPE_DICTIONARY: return "Dictionary" + TYPE_ARRAY: return "Array" + TYPE_PACKED_BYTE_ARRAY: return "PackedByteArray" + TYPE_PACKED_INT32_ARRAY: return "PackedInt32Array" + TYPE_PACKED_FLOAT32_ARRAY: return "PackedFloat32Array" + TYPE_PACKED_STRING_ARRAY: return "PackedStringArray" + TYPE_PACKED_VECTOR2_ARRAY: return "PackedVector2Array" + TYPE_PACKED_VECTOR3_ARRAY: return "PackedVector3Array" + TYPE_PACKED_COLOR_ARRAY: return "PackedColorArray" + _: return "unknown" + +# ############################################################################ # +# String Utils +# ############################################################################ # + +static func trim(string_to_trim: String, characters = []) -> String: + if characters.is_empty(): + return string_to_trim.strip_edges() + + var length = string_to_trim.length() + var beginning = 0 + var end = length + + var i = 0 + while i < string_to_trim.length(): + var character = string_to_trim[i] + if characters.find(character) != -1: + beginning += 1 + else: + break + + i += 1 + + i = string_to_trim.length() - 1 + while i >= 0: + var character = string_to_trim[i] + if characters.find(character) != -1: + end -= 1 + else: + break + + i -= 1 + + if beginning == 0 && end == length: + return string_to_trim + + return string_to_trim.substr(beginning, end - beginning) + +# ############################################################################ # +# Array Utils +# ############################################################################ # + +static func join(joiner: String, array: Array) -> String: + var joined_string = "" + + var i = 0 + for element in array: + var element_string + if is_ink_class(element, "InkBase"): + element_string = element._to_string() + else: + element_string = str(element) + + joined_string += element_string + + if i >= 0 && i < array.size() - 1: + joined_string += joiner + + i += 1 + + return joined_string + +static func get_range(array: Array, index: int, count: int) -> Array: + if !(index >= 0 && index < array.size()): + printerr("get_range: index (%d) is out of bounds." % index) + return array.duplicate() + + if index + count > array.size(): + printerr("get_range: [index (%d) + count (%d)] is out of bounds." % [index, count]) + return array.duplicate() + + var new_array = [] + var i = index + var c = 0 + + while (c < count): + new_array.append(array[i + c]) + c += 1 + + return new_array + +static func remove_range(array: Array, index: int, count: int) -> void: + if !(index >= 0 && index < array.size()): + printerr("get_range: index (%d) is out of bounds." % index) + return + + if index + count > array.size(): + printerr("get_range: [index (%d) + count (%d)] is out of bounds." % [index, count]) + return + + var i = index + var c = 0 + + while (c < count): + array.remove_at(i) + c += 1 + +static func array_equal(a1: Array, a2: Array, use_equals = false) -> bool: + if a1.size() != a2.size(): + return false + + var i = 0 + while (i < a1.size()): + var first_element = a1[i] + var second_element = a2[i] + + if use_equals: + if !first_element.equals(second_element): + return false + else: + i += 1 + continue + else: + if first_element != second_element: + return false + else: + i += 1 + continue + + i += 1 + + return true + +# ############################################################################ # + +static func InkRuntime(): + return Engine.get_main_loop().root.get_node("__InkRuntime") diff --git a/addons/inkgd/runtime/flow.gd b/addons/inkgd/runtime/flow.gd new file mode 100644 index 0000000..3f9e238 --- /dev/null +++ b/addons/inkgd/runtime/flow.gd @@ -0,0 +1,154 @@ +# warning-ignore-all:shadowed_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkBase + +class_name InkFlow + +# ############################################################################ # +# Imports +# ############################################################################ # + +var CallStack = load("res://addons/inkgd/runtime/callstack.gd") + +# ############################################################################ # +# Self-reference +# ############################################################################ # + +static func Flow(): + return load("res://addons/inkgd/runtime/flow.gd") + +# ############################################################################ # + +var name # string +var callstack # CallStack +var output_stream # Array +var current_choices # Array + +func _init(static_json = null): + get_static_json(static_json) + +# (String, Story) -> Flow +func _init_with_name(name, story): + self.name = name + self.callstack = CallStack.new(story, self.StaticJSON) + self.output_stream = [] + self.current_choices = [] + +# (String, Story, Dictionary) -> Flow +func _init_with_name_and_jobject(name, story, jobject): + self.name = name + self.callstack = CallStack.new(story, self.StaticJSON) + self.callstack.set_json_token(jobject["callstack"], story) + self.output_stream = self.StaticJSON.jarray_to_runtime_obj_list(jobject["outputStream"]) + self.current_choices = self.StaticJSON.jarray_to_runtime_obj_list(jobject["currentChoices"]) + + # jchoice_threads_obj is null if 'choiceThreads' doesn't exist. + var jchoice_threads_obj = jobject.get("choiceThreads"); + self.load_flow_choice_threads(jchoice_threads_obj, story) + +# (SimpleJson.Writer) -> void +func write_json(writer): + writer.write_object_start() + writer.write_property("callstack", Callable(self.callstack, "write_json")) + writer.write_property( + "outputStream", + Callable(self, "_anonymous_write_property_output_stream") + ) + + var has_choice_threads = false + for c in self.current_choices: + c.original_thread_index = c.thread_at_generation.thread_index + + if self.callstack.thread_with_index(c.original_thread_index) == null: + if !has_choice_threads: + has_choice_threads = true + writer.write_property_start("choiceThreads") + writer.write_object_start() + + writer.write_property_start(c.original_thread_index) + c.thread_at_generation.write_json(writer) + writer.write_property_end() + + if has_choice_threads: + writer.write_object_end() + writer.write_property_end() + + writer.write_property( + "currentChoices", + Callable(self, "_anonymous_write_property_current_choices") + ) + + writer.write_object_end() + +# (Dictionary, Story) -> void +func load_flow_choice_threads(jchoice_threads, story): + for choice in self.current_choices: + var found_active_thread = self.callstack.thread_with_index(choice.original_thread_index) + if found_active_thread != null: + choice.thread_at_generation = found_active_thread.copy() + else: + var jsaved_choice_thread = jchoice_threads[str(choice.original_thread_index)] + choice.thread_at_generation = CallStack.InkThread.new_with(jsaved_choice_thread, story) + +# (SimpleJson.Writer) -> void +func _anonymous_write_property_output_stream(w): + self.StaticJSON.write_list_runtime_objs(w, self.output_stream) + +# (SimpleJson.Writer) -> void +func _anonymous_write_property_current_choices(w): + w.write_array_start() + for c in self.current_choices: + self.StaticJSON.write_choice(w, c) + w.write_array_end() + +func equals(ink_base) -> bool: + return false + +func _to_string() -> String: + return str(self) + +# ############################################################################ # +# GDScript extra methods +# ############################################################################ # + +func is_ink_class(type): + return type == "Flow" || super.is_ink_class(type) + +func get_ink_class(): + return "Flow" + +static func new_with_name(name, story, static_json = null): + var flow = Flow().new(static_json) + flow._init_with_name(name, story) + return flow + +static func new_with_name_and_jobject(name, story, jobject, static_json = null): + var flow = Flow().new(static_json) + flow._init_with_name_and_jobject(name, story, jobject) + return flow + +# ############################################################################ # +var StaticJSON: InkStaticJSON: + get: return _static_json.get_ref() + +var _static_json = WeakRef.new() + +func get_static_json(static_json = null): + if static_json != null: + _static_json = weakref(static_json) + return + + var InkRuntime = Engine.get_main_loop().root.get_node("__InkRuntime") + + InkUtils.__assert__(InkRuntime != null, + str("[InkFlow] Could not retrieve 'InkRuntime' singleton from the scene tree.")) + + _static_json = weakref(InkRuntime.json) diff --git a/addons/inkgd/runtime/ink_path.gd b/addons/inkgd/runtime/ink_path.gd new file mode 100644 index 0000000..fc239fd --- /dev/null +++ b/addons/inkgd/runtime/ink_path.gd @@ -0,0 +1,294 @@ +# warning-ignore-all:shadowed_variable +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkBase + +class_name InkPath + +# ############################################################################ # + +const parent_id = "^" + +# ############################################################################ # + +class Component extends InkBase: + var index: int = 0 + + + var name = null # String? + + + var is_index: bool: + get: return index >= 0 + + + var is_parent: bool: + get: return name == parent_id + + + # ######################################################################## # + + func _init(index_or_name): + if index_or_name is int: + var index = index_or_name + assert(index >= 0) + self.index = index + self.name = null + elif index_or_name is String: + var name = index_or_name + assert(name != null && name.length() > 0) + self.name = name + self.index = -1 + + + # () -> Component + static func to_parent() -> Component: + return Component.new(parent_id) + + + # () -> String + func _to_string() -> String: + if self.is_index: + return str(index) + else: + return name + + + # (Component) -> bool + func equals(other_comp) -> bool: + # Simple test to make sure the object is of the right type. + if !(other_comp is Object && other_comp.is_ink_class("InkPath.Component")): return false + + if other_comp.is_index == self.is_index: + if self.is_index: + return index == other_comp.index + else: + return name == other_comp.name + + return false + + + # ######################################################################## # + # GDScript extra methods + # ######################################################################## # + + func is_ink_class(type): + return type == "InkPath.Component" || super.is_ink_class(type) + + + func get_ink_class(): + return "InkPath.Component" + + +# ############################################################################ # + +func get_component(index: int) -> InkPath.Component: + return self._components[index] + + +var is_relative: bool = false + + +var head: InkPath.Component: + get: + if _components.size() > 0: + return _components.front() + else: + return null + + +# TODO: Make inspectable +var tail: InkPath: + get: + if _components.size() >= 2: + var tail_comps = _components.duplicate() + tail_comps.pop_front() + + return InkPath().new_with_components(tail_comps) + else: + return InkPath().__self() + + +var length: int: + get: return _components.size() + + +var last_component: InkPath.Component: + get: + if _components.size() > 0: + return _components.back() + else: + return null + + +var contains_named_component: bool: + get: + for comp in _components: + if !comp.is_index: + return true + + return false + + +func _init(): + self._components = [] + + +func _init_with_head_tail(head, tail): + self._components = [] + self._components.append(head) + self._components = self._components + self.tail._components + + +func _init_with_components(components, relative = false): + self._components = [] + self._components = self._components + components + self.is_relative = relative + + +func _init_with_components_string(components_string): + self._components = [] + self.components_string = components_string + + +# () -> InkPath +static func __self() -> InkPath: + var path = InkPath().new() + path.is_relative = true + return path + + +# (InkPath) -> InkPath +func path_by_appending_path(path_to_append): + var p = InkPath().new() + + var upward_moves = 0 + + var i = 0 + while(i < path_to_append._components.size()): + if path_to_append._components[i].is_parent: + upward_moves += 1 + else: + break + i += 1 + + i = 0 + while(i < self._components.size() - upward_moves): + p._components.append(self._components[i]) + i += 1 + + i = upward_moves + while(i < path_to_append._components.size()): + p._components.append(path_to_append._components[i]) + i += 1 + + return p + + +# (Component) -> InkPath +func path_by_appending_component(c): + var p = InkPath().new() + p._components = p._components + self._components + p._components.append(c) + return p + + +var components_string: String: + get: + if _components_string == null: + _components_string = InkUtils.join(".", _components) + if self.is_relative: + _components_string = "." + _components_string + + return _components_string + + + set(value): + _components.clear() + _components_string = value + + if (_components_string == null || _components_string.length() == 0): + return + + if _components_string[0] == '.': + self.is_relative = true + _components_string = _components_string.substr(1, _components_string.length() - 1) + else: + self.is_relative = false + + var components_strings = _components_string.split(".") + for _str in components_strings: + if _str.is_valid_int(): + _components.append(Component.new(int(_str))) + else: + _components.append(Component.new(_str)) + + +var _components_string # String + + +func _to_string() -> String: + return self.components_string + + +# (Component) -> bool +func equals(other_path): + # Simple test to make sure the object is of the right type. + if !(other_path is Object && other_path.is_ink_class("InkPath")): return false + + if other_path._components.size() != self._components.size(): + return false + + if other_path.is_relative != self.is_relative: + return false + + return InkUtils.array_equal(other_path._components, self._components, true) + + +var _components = null # Array + + +# ############################################################################ # +# GDScript extra methods +# ############################################################################ # + +static func new_with_head_tail(head, tail): + var path = InkPath().new() + path._init_with_head_tail(head, tail) + return path + + +static func new_with_components(components, relative = false): + var path = InkPath().new() + path._init_with_components(components, relative) + return path + + +static func new_with_components_string(components_string): + var path = InkPath().new() + path._init_with_components_string(components_string) + return path + + +# ############################################################################ # +# GDScript extra methods +# ############################################################################ # + +func is_ink_class(type): + return type == "InkPath" || super.is_ink_class(type) + + +func get_ink_class(): + return "InkPath" + + +static func InkPath(): + return load("res://addons/inkgd/runtime/ink_path.gd") diff --git a/addons/inkgd/runtime/lists/ink_list.gd b/addons/inkgd/runtime/lists/ink_list.gd new file mode 100644 index 0000000..a70d137 --- /dev/null +++ b/addons/inkgd/runtime/lists/ink_list.gd @@ -0,0 +1,522 @@ +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkObject + +class_name InkList + +# ############################################################################ # + +# (Dictionary, Array, Array) +func _init_from_csharp(items: Dictionary, origin_names: Array, origins: Array): + _dictionary = items + _origin_names = origin_names + self.origins = origins + + +# (InkList) -> InkList +func _init_with_ink_list(other_list: InkList): + _dictionary = other_list._dictionary.duplicate() + var other_origin_names = other_list.origin_names + if other_origin_names != null: + _origin_names = other_list.origin_names.duplicate() + + if other_list.origins != null: + self.origins = other_list.origins.duplicate() + + +# (string, Story) -> InkList +func _init_with_origin(single_origin_list_name: String, origin_story: InkStory): + set_initial_origin_name(single_origin_list_name) + + var def: InkTryGetResult = origin_story.list_definitions.try_list_get_definition(single_origin_list_name) + if def.exists: + origins = [def.result] + else: + InkUtils.throw_exception( + "InkList origin could not be found in story when constructing new list: %s" \ + % single_origin_list_name + ) + + +# (InkListItem, int) -> InkList +func _init_with_single_item(single_item: InkListItem, single_value: int): + set_item(single_item, single_value) + + +# (string, Story) -> InkList +static func from_string(my_list_item: String, origin_story: InkStory) -> InkList: + var list_value: InkListValue = origin_story.list_definitions.find_single_item_list_with_name(my_list_item) + if list_value: + return InkList.new_with_ink_list(list_value.value) + else: + InkUtils.throw_exception( + "Could not find the InkListItem from the string '%s' to create an InkList because " + + "it doesn't exist in the original list definition in ink." % my_list_item + ) + return null + + +func add_item(item: InkListItem) -> void: + if item.origin_name == null: + add_item(item.item_name) + return + + for origin in self.origins: + if origin.name == item.origin_name: + var int_val: InkTryGetResult = origin.try_get_value_for_item(item) + if int_val.exists: + set_item(item, int_val.result) + return + else: + InkUtils.throw_exception( + "Could not add the item '%s' to this list because it doesn't exist in the " + + "original list definition in ink." % item._to_string() + ) + return + + InkUtils.throw_exception( + "Failed to add item to list because the item was from a new list definition that " + + "wasn't previously known to this list. Only items from previously known lists can " + + "be used, so that the int value can be found." + ) + + +func add_item_by_string(item_name: String) -> void: + var found_list_def: InkListDefinition = null + + for origin in self.origins: + if origin.contains_item_with_name(item_name): + if found_list_def != null: + InkUtils.throw_exception( + "Could not add the item " + item_name + " to this list because it could " + + "come from either " + origin.name + " or " + found_list_def.name + ) + return + else: + found_list_def = origin + + if found_list_def == null: + InkUtils.throw_exception( + "Could not add the item " + item_name + " to this list because it isn't known " + + "to any list definitions previously associated with this list." + ) + return + + var item = InkListItem.new_with_origin_name(found_list_def.name, item_name) + var item_val: int = found_list_def.value_for_item(item) + set_item(item, item_val) + + +func contains_item_named(item_name: String) -> bool: + for item_key in keys(): + if item_key.item_name == item_name: + return true + + return false + + +# Array +var origins = null +var origin_of_max_item: InkListDefinition: get = get_origin_of_max_item +func get_origin_of_max_item() -> InkListDefinition: + if self.origins == null: + return null + + var max_origin_name = self.max_item.key.origin_name + for origin in self.origins: + if origin.name == max_origin_name: + return origin + + return null + + +# Array +var origin_names : get = get_origin_names +func get_origin_names(): + if self.size() > 0: + if _origin_names == null && self.size() > 0: + _origin_names = [] + else: + _origin_names.clear() + + for item_key in keys(): + _origin_names.append(item_key.origin_name) + + return _origin_names + + +var _origin_names = null # Array +func set_initial_origin_name(initial_origin_name: String) -> void: + _origin_names = [ initial_origin_name ] + + +# (Array) -> void +func set_initial_origin_names(initial_origin_names) -> void: + if initial_origin_names == null: + _origin_names = null + else: + _origin_names = initial_origin_names.duplicate() + + +# TODO: Make inspectable +var max_item: InkKeyValuePair: # InkKeyValuePair + get: + var _max_item: InkKeyValuePair = InkKeyValuePair.new_with_key_value(InkListItem.null_item, 0) + for k in keys(): + if (_max_item.key.is_null || get_item(k) > _max_item.value): + _max_item = InkKeyValuePair.new_with_key_value(k, get_item(k)) + + return _max_item + + +# TODO: Make inspectable +var min_item: InkKeyValuePair: # InkKeyValuePair + get: + var _min_item: InkKeyValuePair = InkKeyValuePair.new_with_key_value(InkListItem.null_item, 0) + for k in keys(): + if (_min_item.key.is_null || get_item(k) < _min_item.value): + _min_item = InkKeyValuePair.new_with_key_value(k, get_item(k)) + + return _min_item + + +# TODO: Make inspectable +var inverse: InkList: get = get_inverse +func get_inverse() -> InkList: + var list: InkList = InkList.new() + if self.origins != null: + for origin in self.origins: + for serialized_item_key in origin.items: + if !_dictionary.has(serialized_item_key): + list._dictionary[serialized_item_key] = origin.items[serialized_item_key] + + return list + + +# TODO: Make inspectable +var all: InkList: get = get_all +func get_all() -> InkList: + var list: InkList = InkList.new() + if self.origins != null: + for origin in self.origins: + for serialized_item_key in origin.items: + list._dictionary[serialized_item_key] = origin.items[serialized_item_key] + + return list + + +# TODO: Make inspectable +func union(other_list: InkList) -> InkList: + var union: InkList = InkList.new_with_ink_list(self) + for key in other_list._dictionary: + union._dictionary[key] = other_list._dictionary[key] + return union + + +# TODO: Make inspectable +func intersection(other_list: InkList) -> InkList: + var intersection: InkList = InkList.new() + for key in other_list._dictionary: + if self._dictionary.has(key): + intersection._dictionary[key] = other_list._dictionary[key] + return intersection + + +func has_intersection(other_list: InkList) -> bool: + for key in other_list._dictionary: + if self._dictionary.has(key): + return true + return false + + +# TODO: Make inspectable +func without(list_to_remove: InkList) -> InkList: + var result = InkList.new_with_ink_list(self) + for key in list_to_remove._dictionary: + result._dictionary.erase(key) + return result + + +func contains(other_list: InkList) -> bool: + if other_list._dictionary.is_empty() || self._dictionary.is_empty(): + return false + + for key in other_list._dictionary: + if !_dictionary.has(key): + return false + + return true + + +# In the original source code 'list_item_name' is of type (String | null), +# but the method doesn't need to allow null names. +func contains_item(list_item_name: String) -> bool: + for key in self._dictionary: + var list_item = InkListItem.from_serialized_key(key) + if list_item.item_name == list_item_name: + return true + + return false + + +func greater_than(other_list: InkList) -> bool: + if size() == 0: + return false + if other_list.size() == 0: + return true + + return self.min_item.value > other_list.max_item.value + + +func greater_than_or_equals(other_list: InkList) -> bool: + if size() == 0: + return false + if other_list.size() == 0: + return true + + return ( + self.min_item.value >= other_list.min_item.value && + self.max_item.value >= other_list.max_item.value + ) + + +func less_than(other_list: InkList) -> bool: + if other_list.size() == 0: + return false + if size() == 0: + return true + + return self.max_item.value < other_list.min_item.value + + +func less_than_or_equals(other_list: InkList) -> bool: + if other_list.size() == 0: + return false + if size() == 0: + return true + + return ( + self.max_item.value <= other_list.max_item.value && + self.min_item.value <= other_list.min_item.value + ) + + +func max_as_list() -> InkList: + if size() > 0: + var _max_item: InkKeyValuePair = self.max_item + return InkList.new_with_single_item(_max_item.key, _max_item.value) + else: + return InkList.new() + + +func min_as_list() -> InkList: + if size() > 0: + var _min_item: InkKeyValuePair = self.min_item + return InkList.new_with_single_item(_min_item.key, _min_item.value) + else: + return InkList.new() + + +# (Variant, Variant) -> InkList +func list_with_sub_range(min_bound, max_bound) -> InkList: + if size() == 0: + return InkList.new() + + var ordered: Array = self.ordered_items + + var min_value: int = 0 + var max_value: int = 9_223_372_036_854_775_807 # MAX_INT + + if min_bound is int: + min_value = min_bound + else: + if min_bound.is_ink_class("InkList") && min_bound.size() > 0: + min_value = min_bound.min_item.value + + if max_bound is int: + max_value = max_bound + else: + if min_bound.is_ink_class("InkList") && min_bound.size() > 0: + max_value = max_bound.max_item.value + + var sub_list = InkList.new() + sub_list.set_initial_origin_names(self.origin_names) + + for item in ordered: + if item.value >= min_value && item.value <= max_value: + sub_list.set_item(item.key, item.value) + + return sub_list + + +func equals(other: InkBase) -> bool: + var other_raw_list: InkList = other + # Simple test to make sure the object is of the right type. + if !(other_raw_list is Object): + return false + if !(other_raw_list.is_ink_class("InkList")): + return false + + if other_raw_list.size() != self.size(): + return false + + for key in keys(): + if (!other_raw_list.has_item(key)): + return false + + return true + + +var ordered_items: Array: # Array> + get: + var ordered: Array = [] + for key in keys(): + ordered.append(InkKeyValuePair.new_with_key_value(key, get_item(key))) + + ordered.sort_custom(Callable(KeyValueInkListItemSorter, "sort")) + return ordered + + +func _to_string() -> String: + var ordered: Array = self.ordered_items + + var description: String = "" + var i: int = 0 + while (i < ordered.size()): + if i > 0: + description += ", " + + var item = ordered[i].key + description += item.item_name + i += 1 + + return description + + +static func new_with_dictionary(other_dictionary: Dictionary) -> InkList: + var ink_list: InkList = InkList.new() + ink_list._init_with_dictionary(other_dictionary) + return ink_list + + +static func new_with_ink_list(other_list: InkList) -> InkList: + var ink_list: InkList = InkList.new() + ink_list._init_with_ink_list(other_list) + return ink_list + + +static func new_with_origin(single_origin_list_name: String, origin_story) -> InkList: + var ink_list: InkList = InkList.new() + ink_list._init_with_origin(single_origin_list_name, origin_story) + return ink_list + + +static func new_with_single_item(single_item: InkListItem, single_value: int) -> InkList: + var ink_list: InkList = InkList.new() + ink_list._init_with_single_item(single_item, single_value) + return ink_list + + +class KeyValueInkListItemSorter: + static func sort(a, b): + if a.value == b.value: + return a.key.origin_name.nocasecmp_to(b.key.origin_name) <= 0 + else: + return a.value <= b.value + + +# ############################################################################ # +# Originally, this class would inherit Dictionary. This isn't possible in +# GDScript. Instead, this class will encapsulate a dictionary and forward +# needed calls. +# ############################################################################ # + +var _dictionary: Dictionary = {} + + +# Name set_item instead of set to prevent shadowing 'Object.set'. +func set_item(key: InkListItem, value: int) -> void: + _dictionary[key.serialized()] = value + + +# Name get_item instead of get to prevent shadowing 'Object.get'. +func get_item(key: InkListItem, default = null): + return _dictionary.get(key.serialized(), default) + + +# Name has_item instead of has to prevent shadowing 'Object.get'. +func has_item(key: InkListItem) -> bool: + return _dictionary.has(key.serialized()) + + +func keys() -> Array: + var deserialized_keys = [] + for key in _dictionary.keys(): + deserialized_keys.append(InkListItem.from_serialized_key(key)) + + return deserialized_keys + + +func size() -> int: + return _dictionary.size() + + +# ############################################################################ # +# Additional methods +# ############################################################################ # + +func set_raw(key: String, value: int) -> void: + if OS.is_debug_build() && !(key is String): + print("Warning: Expected serialized key in InkList.set_raw().") + + _dictionary[key] = value + + +func erase_raw(key: String) -> bool: + if OS.is_debug_build() && !(key is String): + print("Warning: Expected serialized key in InkList.erase_raw().") + + return _dictionary.erase(key) + + +func get_raw(key: String, default = null): + if OS.is_debug_build() && !(key is String): + print("Warning: Expected serialized key in InkList.get_raw().") + + return _dictionary.get(key, default) + + +func has_raw(key: String) -> bool: + if OS.is_debug_build() && !(key is String): + print("Warning: Expected serialized key in InkList.has_raw().") + + return _dictionary.has(key) + + +func has_all_raw(keys: Array) -> bool: + return _dictionary.has_all(keys) + + +func raw_keys() -> Array: + return _dictionary.keys() + + +# ############################################################################ # +# GDScript extra methods +# ############################################################################ # + +func is_ink_class(type: String) -> bool: + return type == "InkList" || super.is_ink_class(type) + + +func get_ink_class() -> String: + return "InkList" + diff --git a/addons/inkgd/runtime/lists/list_definition.gd b/addons/inkgd/runtime/lists/list_definition.gd new file mode 100644 index 0000000..527457e --- /dev/null +++ b/addons/inkgd/runtime/lists/list_definition.gd @@ -0,0 +1,102 @@ +# warning-ignore-all:shadowed_variable +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkObject + +class_name InkListDefinition + +# ############################################################################ # +# Imports +# ############################################################################ # + +var InkTryGetResult = preload("res://addons/inkgd/runtime/extra/try_get_result.gd") + +# ############################################################################ # + +var name: String: get = get_name +func get_name() -> String: + return _name + +# Dictionary => Dictionary +# Note: 'InkListItem' should actually be serialized into a String, because it +# needs to be a value type. +var items: Dictionary: get = get_items +func get_items() -> Dictionary: + if _items == null: + _items = {} + for item_name_and_value_key in _item_name_to_values: + var item = InkListItem.new_with_origin_name(self.name, item_name_and_value_key) + _items[item.serialized()] = _item_name_to_values[item_name_and_value_key] + + return _items +var _items + +# ############################################################################ # + +func value_for_item(item: InkListItem) -> int: + if (_item_name_to_values.has(item.item_name)): + var intVal = _item_name_to_values[item.item_name] + return intVal + else: + return 0 + +func contains_item(item: InkListItem) -> bool: + if item.origin_name != self.name: + return false + + return _item_name_to_values.has(item.item_name) + +func contains_item_with_name(item_name: String) -> bool: + return _item_name_to_values.has(item_name) + +# (int) -> { result: InkListItem, exists: bool } +func try_get_item_with_value(val: int) -> InkTryGetResult: + for named_item_key in _item_name_to_values: + if (_item_name_to_values[named_item_key] == val): + return InkTryGetResult.new( + true, + InkListItem.new_with_origin_name(self.name, named_item_key) + ) + + return InkTryGetResult.new(false, InkListItem.null_item) + +# (InkListItem) -> { result: InkListItem, exists: bool } +func try_get_value_for_item(item: InkListItem) -> InkTryGetResult: + if !item.item_name: + return InkTryGetResult.new(false, 0) + + var value = _item_name_to_values.get(item.item_name) + + if (!value): + InkTryGetResult.new(false, 0) + + return InkTryGetResult.new(true, value) + +# (String name, Dictionary) -> InkListDefinition +func _init(name: String, items: Dictionary): + _name = name + _item_name_to_values = items + +var _name: String +var _item_name_to_values: Dictionary # Dictionary + +# ############################################################################ # +# GDScript extra methods +# ############################################################################ # + +func is_ink_class(type: String) -> bool: + return type == "InkListDefinition" || super.is_ink_class(type) + +func get_ink_class() -> String: + return "InkListDefinition" + +func _to_string() -> String: + return "[InkListDefinition \"%s\"]" % get_name() diff --git a/addons/inkgd/runtime/lists/list_definitions_origin.gd b/addons/inkgd/runtime/lists/list_definitions_origin.gd new file mode 100644 index 0000000..4009fc2 --- /dev/null +++ b/addons/inkgd/runtime/lists/list_definitions_origin.gd @@ -0,0 +1,86 @@ +# warning-ignore-all:shadowed_variable +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkObject + +class_name InkListDefinitionsOrigin + +# ############################################################################ # +# Imports +# ############################################################################ # + +var InkTryGetResult = preload("res://addons/inkgd/runtime/extra/try_get_result.gd") + +var InkListValue = load("res://addons/inkgd/runtime/values/list_value.gd") + +# ############################################################################ # + +# Array +var lists: Array: get = get_lists +func get_lists() -> Array: + var list_of_lists = [] + for named_list_key in _lists: + list_of_lists.append(_lists[named_list_key]) + + return list_of_lists + +# ############################################################################ # + +# (Array) -> InkListDefinitionOrigin +func _init(lists: Array): + _lists = {} # Dictionary + _all_unambiguous_list_value_cache = {} # Dictionary() + + for list in lists: + _lists[list.name] = list + + for item_with_value_key in list.items: + var item = InkListItem.from_serialized_key(item_with_value_key) + var val = list.items[item_with_value_key] + var list_value = InkListValue.new_with_single_item(item, val) + + _all_unambiguous_list_value_cache[item.item_name] = list_value + _all_unambiguous_list_value_cache[item.full_name] = list_value + + +# ############################################################################ # + +# (String) -> { result: String, exists: bool } +func try_list_get_definition(name: String) -> InkTryGetResult: + if name == null: + return InkTryGetResult.new(false, null) + + var definition = _lists.get(name) + if !definition: + return InkTryGetResult.new(false, null) + + return InkTryGetResult.new(true, definition) + +func find_single_item_list_with_name(name: String) -> InkListValue: + if _all_unambiguous_list_value_cache.has(name): + return _all_unambiguous_list_value_cache[name] + + return null + +# ############################################################################ # + +var _lists: Dictionary # Dictionary +var _all_unambiguous_list_value_cache: Dictionary # Dictionary + +# ############################################################################ # +# GDScript extra methods +# ############################################################################ # + +func is_ink_class(type: String) -> bool: + return type == "InkListDefinitionsOrigin" || super.is_ink_class(type) + +func get_ink_class() -> String: + return "InkListDefinitionsOrigin" diff --git a/addons/inkgd/runtime/lists/structs/ink_list_item.gd b/addons/inkgd/runtime/lists/structs/ink_list_item.gd new file mode 100644 index 0000000..7189006 --- /dev/null +++ b/addons/inkgd/runtime/lists/structs/ink_list_item.gd @@ -0,0 +1,159 @@ +# warning-ignore-all:shadowed_variable +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +# ############################################################################ # +# !! VALUE TYPE +# ############################################################################ # + +extends InkObject + +class_name InkListItem + +# ############################################################################ # + +# Originally these were simple variables, but they are turned into properties to +# make the object "immutable". That way it can be passed around without being +# duplicated. + +var origin_name: + get: return _origin_name +var _origin_name = null # String + +var item_name: + get: return _item_name +var _item_name = null # String + +# ############################################################################ # + +# (string, string) -> InkListItem +@warning_ignore("shadowed_variable") +func _init_with_origin_name(origin_name, item_name): + self._origin_name = origin_name + self._item_name = item_name + + +# (string) -> InkListItem +@warning_ignore("shadowed_variable") +func _init_with_full_name(full_name): + var name_parts = full_name.split(".") + self._origin_name = name_parts[0] + self._item_name = name_parts[1] + + +static var null_item: InkListItem: + get: return InkListItem.new_with_origin_name(null, null) + +# ############################################################################ # + +var is_null: bool: + get: + return self.origin_name == null && self.item_name == null + +# String +var full_name: + get: + # In C#, concatenating null produce nothing, in GDScript, it appends "Null". + return ( + (self.origin_name if self.origin_name else "?") + "." + + (self.item_name if self.item_name else "") + ) + +# ############################################################################ # + +# () -> String +func _to_string() -> String: + return self.full_name + + +# (InkObject) -> bool +func equals(obj: InkBase) -> bool: + if obj.is_ink_class("InkListItem"): + var other_item = obj + return ( + other_item.item_name == self.item_name && + self.other_item.origin_name == self.origin_name + ) + + return false + + +# ############################################################################ # + +# (string, string) -> InkListItem +@warning_ignore("shadowed_variable") +static func new_with_origin_name(origin_name, item_name) -> InkListItem: + var list_item = InkListItem.new() + list_item._init_with_origin_name(origin_name, item_name) + return list_item + + +# (string) -> InkListItem +@warning_ignore("shadowed_variable") +static func new_with_full_name(full_name) -> InkListItem: + var list_item = InkListItem.new() + list_item._init_with_full_name(full_name) + return list_item + + +# ############################################################################ # +# GDScript extra methods +# ############################################################################ # + +func is_ink_class(type: String) -> bool: + return type == "InkListItem" || super.is_ink_class(type) + + +func get_ink_class() -> String: + return "InkListItem" + +# ############################################################################ # +# These methods did not exist in the original C# code. Their purpose is to +# make `InkListItem` mimic the value-type semantics of the original +# struct, as well as offering a serialization mechanism to use `InkListItem` +# as keys in dictionaries. + +# Returns a `SerializedInkListItem` representing the current +# instance. The result is intended to be used as a key inside a Map. +func serialized() -> String: + # We are simply using a JSON representation as a value-typed key. + var json_print = JSON.stringify( + { "originName": self.origin_name, "itemName": self.item_name } + ) + return json_print + +# Reconstructs a `InkListItem` from the given SerializedInkListItem. +# +# (String) -> InkListItem +static func from_serialized_key(key: String) -> InkListItem: + var obj = JSON.parse_string(key) + if !InkListItem._is_like_ink_list_item(obj): + return InkListItem.null_item + + return InkListItem.new_with_origin_name(obj["originName"], obj["itemName"]) + +# Determines whether the given item is sufficiently `InkListItem`-like +# to be used as a template when reconstructing the InkListItem. +# +# (Variant) -> bool +static func _is_like_ink_list_item(item) -> bool: + if !(item is Dictionary): + return false + + if !(item.has("originName") && item.has("itemName")): + return false + + if !(item["originName"] is String): + return false + + if !(item["itemName"] is String): + return false + + return true diff --git a/addons/inkgd/runtime/profiler.gd b/addons/inkgd/runtime/profiler.gd new file mode 100644 index 0000000..e2ac0a6 --- /dev/null +++ b/addons/inkgd/runtime/profiler.gd @@ -0,0 +1,57 @@ +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkBase + +class_name InkProfiler + +func _init(): + pass + +# () -> String +func report() -> String: + return "" + +# () -> void +func pre_continue() -> void: + pass + +# () -> void +func post_continue() -> void: + pass + +# () -> void +func pre_step() -> void: + pass + +# (CallStack) -> void +func step(callstack: InkCallStack) -> void: + pass + +# () -> void +func post_step() -> void: + pass + +func step_length_record() -> String: + return "" + +func mega_log() -> String: + return "" + +func pre_snapshot() -> void: + pass + +func post_snapshot() -> void: + pass + +func millisecs(watch: InkStopWatch) -> float: + return 0.0 + +static func format_millisecs(num: float) -> String: + return "" diff --git a/addons/inkgd/runtime/search_result.gd b/addons/inkgd/runtime/search_result.gd new file mode 100644 index 0000000..ebe5402 --- /dev/null +++ b/addons/inkgd/runtime/search_result.gd @@ -0,0 +1,41 @@ +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +# ############################################################################ # +# !! VALUE TYPE +# ############################################################################ # + +# Search results are never duplicated / passed around so they don't need to +# be either immutable or have a 'duplicate' method. + +extends InkBase + +class_name InkSearchResult + +# ############################################################################ # + +var obj: InkObject = null +var approximate: bool = false + +var correct_obj: InkObject: + get: return null if approximate else obj + +var container: InkContainer: + get: return InkUtils.as_or_null(obj, "InkContainer") + +# ############################################################################ # +# GDScript extra methods +# ############################################################################ # + +func is_ink_class(type: String) -> bool: + return type == "SearchResult" || super.is_ink_class(type) + +func get_ink_class() -> String: + return "SearchResult" diff --git a/addons/inkgd/runtime/simple_json.gd b/addons/inkgd/runtime/simple_json.gd new file mode 100644 index 0000000..2bbce88 --- /dev/null +++ b/addons/inkgd/runtime/simple_json.gd @@ -0,0 +1,588 @@ +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkBase + +class_name InkSimpleJSON + +# ############################################################################ # + +# (String) -> Dictionary +static func text_to_dictionary(text: String) -> Dictionary: + return Reader.new(text).to_dictionary() + +# (String) -> Array +static func text_to_array(text: String) -> Array: + return Reader.new(text).to_array() + +class Reader extends InkBase: + # (String) -> Reader + func _init(text: String): + _text = text + _offset = 0 + + skip_whitespace() + + _root_object = read_object() + + # () -> Dictionary + func to_dictionary() -> Dictionary: + return _root_object + + # () -> Array + func to_array() -> Array: + return _root_object + + # (String) -> bool + func is_number_char(c: String) -> bool: + if c.length() > 1: + return false + + return c.is_valid_int() || c == "." || c == "-" || c == "+" || c == 'E' || c == 'e' + + # (String) -> bool + func is_first_number_char(c: String) -> bool: + if c.length() > 1: + return false + + return c.is_valid_int() || c == "-" || c == "+" + + # () -> Variant + func read_object(): + var current_char = _text[_offset] + + if current_char == "{": + return read_dictionary() + + elif current_char == "[": + return read_array() + + elif current_char == "\"": + return read_string() + + elif is_first_number_char(current_char): + return read_number() + + elif try_read("true"): + return true + + elif try_read("false"): + return false + + elif try_read("null"): + return null + + InkUtils.throw_exception("Unhandled object type in JSON: %s" % _text.substr(_offset, 30)) + return JsonError.new() + + # () -> Dictionary? + func read_dictionary(): + var dict = {} # Dictionary + + if !expect("{"): + return null + + skip_whitespace() + + if try_read("}"): + return dict + + var first_time = true + while first_time || try_read(","): + first_time = false + + skip_whitespace() + + var key = read_string() + if !expect(key != null, "dictionary key"): + return null + + skip_whitespace() + + if !expect(":"): + return null + + skip_whitespace() + + var val = read_object() + if !expect(val != null, "dictionary value"): + return null + + dict[key] = val + + skip_whitespace() + + if !expect("}"): + return null + + return dict + + # () -> Array? + func read_array(): + var list = [] + + if !expect("["): + return null + + skip_whitespace() + + if try_read("]"): + return list + + var first_time = true + while first_time || try_read(","): + first_time = false + + skip_whitespace() + + var val = read_object() + + list.append(val) + + skip_whitespace() + + if !expect("]"): + return null + + return list + + # () -> String? + func read_string(): + if !expect("\""): + return null + + var sb = "" + + while(_offset < _text.length()): + var c = _text[_offset] + + if c == "\\": + _offset += 1 + if _offset >= _text.length(): + InkUtils.throw_exception("Unexpected EOF while reading string") + return null + c = _text[_offset] + match c: + "\"", "\\", "/": + sb += c + "n": + sb += "\n" + "t": + sb += "\t" + "r", "b", "f": + pass + "u": + if _offset + 4 >= _text.length(): + InkUtils.throw_exception("Unexpected EOF while reading string") + return null + var digits = _text.substr(_offset + 1, 4) + + var test_json_conv = JSON.new() + test_json_conv.parse("\"\\u" + digits + "\"") + var json_parse_result = test_json_conv.get_data() + if json_parse_result.error != OK: + InkUtils.throw_exception("Invalid Unicode escape character at offset %d" % (_offset - 1)) + return null + + sb += json_parse_result.result + _offset += 4 + + break + _: + InkUtils.throw_exception("Invalid Unicode escape character at offset %d " % (_offset - 1)) + return null + elif c == "\"": + break + else: + sb += c + + _offset += 1 + + if !expect("\""): + return null + return sb + + # () -> Variant + func read_number(): + var start_offset = _offset + + var is_float = false + + while(_offset < _text.length()): + var c = _text[_offset] + if (c == "." || c == "e" || c == "E"): is_float = true + if is_number_char(c): + _offset += 1 + continue + else: + break + + _offset += 1 + + var num_str = _text.substr(start_offset, _offset - start_offset) + + if is_float: + if num_str.is_valid_float(): + return float(num_str) + else: + if num_str.is_valid_int(): + return int(num_str) + + InkUtils.throw_exception("Failed to parse number value: " + num_str) + return JsonError.new() + + # (String) -> bool + func try_read(text_to_read: String) -> bool: + if _offset + text_to_read.length() > _text.length(): + return false + + var i = 0 + while (i < text_to_read.length()): + if text_to_read[i] != _text[_offset + i]: + return false + + i += 1 + + + _offset += text_to_read.length() + + return true + + # (bool | String, String) -> bool + func expect(condition_or_expected_str, message = null) -> bool: + var _condition = false + + if condition_or_expected_str is String: + _condition = try_read(condition_or_expected_str) + elif condition_or_expected_str is bool: + _condition = condition_or_expected_str + + if !_condition: + if message == null: + message = "Unexpected token" + else: + message = "Expected " + message + + message += str(" at offset ", _offset) + + InkUtils.throw_exception(message) + return false + + return true + + func skip_whitespace(): + while _offset < _text.length(): + var c = _text[_offset] + if c == " " || c == "\t" || c == "\n" || c == "\r": + _offset += 1 + else: + break + + var _text = null # String + var _offset: int = 0 # int + + var _root_object # Variant + + # ######################################################################## # + # GDScript extra methods + # ######################################################################## # + + func is_ink_class(type: String) -> bool: + return type == "InkSimpleJSON.Reader" || super.is_ink_class(type) + + func get_ink_class() -> String: + return "InkSimpleJSON.Reader" + +class Writer extends InkBase: + # ######################################################################## # + # Imports + # ######################################################################## # + + var InkStringWriter := load("res://addons/inkgd/runtime/extra/string_writer.gd") as GDScript + var InkStateElement := load("res://addons/inkgd/runtime/extra/state_element.gd") as GDScript + + # (String) -> Writer + func _init(): + self._writer = InkStringWriter.new() + + # (Callable) -> void + func write_object(inner: Callable) -> void: + write_object_start() + inner.call(self) + write_object_end() + + func write_object_start() -> void: + start_new_object(true) + self._state_stack.push_front(InkStateElement.new(InkStateElement.State.OBJECT)) + self._writer.write("{") + + func write_object_end() -> void: + assert_that(self.state == InkStateElement.State.OBJECT) + self._writer.write("}") + self._state_stack.pop_front() + + # These two methods don't need to be implemented in GDScript. + # + # public void WriteProperty(string name, Action inner) + # public void WriteProperty(int id, Action inner) + + # Also include: + # void WriteProperty(T name, Action inner) + # (String, Variant) -> void + func write_property(name: String, content) -> void: + if (content is String || content is int || content is bool): + write_property_start(name) + write(content) + write_property_end() + elif content is Callable: + write_property_start(name) + content.call(self) + write_property_end() + else: + push_error("Wrong type for 'content': %s" % str(content)) + + # These two methods don't need to be implemented in GDScript. + # + # public void WritePropertyStart(string name) + # public void WritePropertyStart(int id) + + # () -> void + func write_property_end() -> void: + assert_that(self.state == InkStateElement.State.PROPERTY) + assert_that(self.child_count == 1) + self._state_stack.pop_front() + + # (String) -> void + func write_property_name_start() -> void: + assert_that(self.state == InkStateElement.State.OBJECT) + + if self.child_count > 0: + self._writer.write(',') + + self._writer.write('"') + + increment_child_count() + + self._state_stack.push_front(InkStateElement.new(InkStateElement.State.PROPERTY)) + self._state_stack.push_front(InkStateElement.new(InkStateElement.State.PROPERTY_NAME)) + + # () -> void + func write_property_name_end() -> void: + assert_that(self.state == InkStateElement.State.PROPERTY_NAME) + + self._writer.write('":') + + self._state_stack.pop_front() + + # (String) -> void + func write_property_name_inner(string: String) -> void: + assert_that(self.state == InkStateElement.State.PROPERTY_NAME) + self._writer.write(string) + + # (Variant) -> void + func write_property_start(name) -> void: + assert_that(self.state == InkStateElement.State.OBJECT) + + if self.child_count > 0: + self._writer.write(',') + + self._writer.write('"') + self._writer.write(str(name)) + self._writer.write('":') + + increment_child_count() + + _state_stack.push_front(InkStateElement.new(InkStateElement.State.PROPERTY)) + + # () -> void + func write_array_start() -> void: + start_new_object(true) + _state_stack.push_front(InkStateElement.new(InkStateElement.State.ARRAY)) + _writer.write("[") + + # () -> void + func write_array_end() -> void: + assert_that(self.state == InkStateElement.State.ARRAY) + _writer.write("]") + _state_stack.pop_front() + + # This method didn't exist as-is in the original implementation. + # (Variant) -> void + func write(content) -> void: + if content is int: + write_int(content) + elif content is float: + write_float(content) + elif content is String: + write_string(content) + elif content is bool: + write_bool(content) + else: + push_error("Wrong type for 'content': %s" % str(content)) + + # (int) -> void + func write_int(i: int) -> void: + start_new_object(false) + _writer.write(str(i)) + + # (float) -> void + func write_float(f: float) -> void: + start_new_object(false) + + var float_str = str(f) + + # We could probably use 3.402823e+38, but keeping + # ±3.4e+38 for compatibility with the reference implementation. + if float_str == "inf": + _writer.write("3.4e+38") + elif float_str == "-inf": + _writer.write("-3.4e+38") + elif float_str == "nan": + _writer.write("0.0") + else: + _writer.write(float_str) + # The exponent part is defensive as Godot doesn't seem to convert + # floats to string in such a way. + if !("." in float_str) && !("e" in float_str) && !("E" in float_str): + _writer.write(".0") + + # (String, bool) -> void + func write_string(string: String, escape: bool = true): + start_new_object(false) + _writer.write('"') + if escape: + write_escaped_string(string) + else: + _writer.write(string) + _writer.write('"') + + # (bool) -> void + func write_bool(b: bool) -> void: + start_new_object(false) + _writer.write("true" if b else "false") + + # () -> void + func write_null() -> void: + start_new_object(false) + _writer.write("null") + + # () -> void + func write_string_start() -> void: + start_new_object(true) + _state_stack.push_front(InkStateElement.new(InkStateElement.State.STRING)) + _writer.write('"') + + # () -> void + func write_string_end() -> void: + assert_that(state == InkStateElement.State.STRING) + _writer.write('"') + _state_stack.pop_front() + + # (string, bool) -> void + func write_string_inner(string: String, escape: bool = true) -> void: + assert_that(self.state == InkStateElement.State.STRING) + if escape: + write_escaped_string(string) + else: + _writer.write(string) + + # (String) -> void + func write_escaped_string(string: String) -> void: + for c in string: + if c < ' ': + match c: + "\n": + _writer.write("\\n") + "\t": + _writer.write("\\t") + else: + match c: + '\\', '"': + _writer.write("\\") + _writer.write(c) + _: + _writer.write(c) + + # (bool) -> void + func start_new_object(container: bool) -> void: + if container: + assert_that( + self.state == InkStateElement.State.NONE || + self.state == InkStateElement.State.PROPERTY || + self.state == InkStateElement.State.ARRAY + ) + else: + assert_that( + self.state == InkStateElement.State.PROPERTY || + self.state == InkStateElement.State.ARRAY + ) + + if self.state == InkStateElement.State.ARRAY && self.child_count > 0: + _writer.write(",") + + if self.state == InkStateElement.State.PROPERTY: + assert_that(self.child_count == 0) + + if ( + self.state == InkStateElement.State.ARRAY || + self.state == InkStateElement.State.PROPERTY + ): + increment_child_count() + + var state: int: # StateElement.State + get: + if _state_stack.size() > 0: + return _state_stack.front().type + else: + return InkStateElement.State.NONE + + var child_count: int: # int + get: + if _state_stack.size() > 0: + return _state_stack.front().child_count + else: + return 0 + + # () -> void + func increment_child_count() -> void: + assert_that(_state_stack.size() > 0) + var curr_el = _state_stack.pop_front() + curr_el.child_count += 1 + _state_stack.push_front(curr_el) + + # (bool) -> void + func assert_that(condition: bool) -> void: + if OS.is_debug_build(): + return + + if !condition: + push_error("Assert failed while writing JSON") + assert(condition) + + # () -> String + func _to_string() -> String: + return _writer._to_string() + + var _state_stack: Array = [] # Array + var _writer: InkStringWriter + + # ######################################################################## # + # GDScript extra methods + # ######################################################################## # + + func is_ink_class(type: String) -> bool: + return type == "InkSimpleJSON.Writer" || super.is_ink_class(type) + + func get_ink_class() -> String: + return "InkSimpleJSON.Writer" + + +class JsonError: + func init(): + pass diff --git a/addons/inkgd/runtime/state_patch.gd b/addons/inkgd/runtime/state_patch.gd new file mode 100644 index 0000000..9f6eeff --- /dev/null +++ b/addons/inkgd/runtime/state_patch.gd @@ -0,0 +1,105 @@ +# warning-ignore-all:shadowed_variable +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkBase + +class_name InkStatePatch + +# ############################################################################ # +# Imports +# ############################################################################ # + +var InkTryGetResult := preload("res://addons/inkgd/runtime/extra/try_get_result.gd") as GDScript +var InkStringSet := preload("res://addons/inkgd/runtime/extra/string_set.gd") as GDScript + +# ############################################################################ # + +# Dictionary +var globals: Dictionary: get = get_globals +func get_globals() -> Dictionary: + return _globals + +# StringSet +var changed_variables: InkStringSet: get = get_changed_variables +func get_changed_variables() -> InkStringSet: + return _changed_variables + +# Dictionary +var visit_counts: Dictionary: get = get_visit_counts +func get_visit_counts() -> Dictionary: + return _visit_counts + +# Dictionary +var turn_indices : get = get_turn_indices +func get_turn_indices() -> Dictionary: + return _turn_indices + +# ############################################################################ # + +func _init(to_copy: InkStatePatch): + if to_copy != null: + _globals = to_copy._globals.duplicate() + _changed_variables = to_copy._changed_variables.duplicate() + _visit_counts = to_copy._visit_counts.duplicate() + _turn_indices = to_copy._turn_indices.duplicate() + else: + _globals = {} + _changed_variables = InkStringSet.new() + _visit_counts = {} + _turn_indices = {} + +# (String) -> { exists: bool, result: InkObject } +func try_get_global(name) -> InkTryGetResult: + if _globals.has(name): + return InkTryGetResult.new(true, _globals[name]) + + return InkTryGetResult.new(false, null) + +func set_global(name: String, value: InkObject) -> void: + _globals[name] = value + +func add_changed_variable(name: String) -> void: + _changed_variables.append(name) + +# (InkContainer) -> { exists: bool, result: int } +func try_get_visit_count(container) -> InkTryGetResult: + if _visit_counts.has(container): + return InkTryGetResult.new(true, _visit_counts[container]) + + return InkTryGetResult.new(false, 0) + +func set_visit_count(container: InkContainer, index: int) -> void: + _visit_counts[container] = index + +func set_turn_index(container: InkContainer, index: int) -> void: + _turn_indices[container] = index + +# (InkContainer) -> { exists: bool, result: int } +func try_get_turn_index(container) -> InkTryGetResult: + if _turn_indices.has(container): + return InkTryGetResult.new(true, _turn_indices[container]) + + return InkTryGetResult.new(false, 0) + +var _globals: Dictionary +var _changed_variables: InkStringSet +var _visit_counts: Dictionary +var _turn_indices: Dictionary + +# ############################################################################ # +# GDScript extra methods +# ############################################################################ # + +func is_ink_class(type: String) -> bool: + return type == "StatePatch" || super.is_ink_class(type) + +func get_ink_class() -> String: + return "StatePatch" diff --git a/addons/inkgd/runtime/static/ink_runtime.gd b/addons/inkgd/runtime/static/ink_runtime.gd new file mode 100644 index 0000000..70bc57b --- /dev/null +++ b/addons/inkgd/runtime/static/ink_runtime.gd @@ -0,0 +1,200 @@ +# warning-ignore-all:unused_class_variable +# warning-ignore-all:shadowed_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends Node + +# Hiding this type to prevent registration of "private" nodes. +# See https://github.com/godotengine/godot-proposals/issues/1047 +# class_name InkRuntimeNode + +# Expected to be added to the SceneTree as a singleton object. + +# ############################################################################ # +# Imports +# ############################################################################ # + +var InkStaticJSON := load("res://addons/inkgd/runtime/static/json.gd") as GDScript +var InkStaticNativeFunctionCall := load("res://addons/inkgd/runtime/static/native_function_call.gd") as GDScript + +# ############################################################################ # +# Signals +# ############################################################################ # + +## Emitted when the runtime encountered an exception. Exception are not +## recoverable and may corrupt the state. They are the consequence of either +## a programmer error or a bug in the runtime. +signal exception_raised(message, stack_trace) + +# ############################################################################ # +# Properties +# ############################################################################ # + +# Skips saving global values that remain equal to the initial values that were +# declared in Ink. +var dont_save_default_values: bool = true + +## Uses `assert` instead of `push_error` to report critical errors, thus +## making them more explicit during development. +var stop_execution_on_exception: bool = true + +## Uses `assert` instead of `push_error` to report story errors, thus +## making them more explicit during development. +var stop_execution_on_error: bool = true + +# ############################################################################ # + +var should_pause_execution_on_runtime_error: bool: get = get_speore, set = set_speore +func get_speore() -> bool: + printerr( + "'should_pause_execution_on_runtime_error' is deprecated, " + + "use 'stop_execution_on_exception' instead." + ) + return stop_execution_on_exception +func set_speore(value: bool): + printerr( + "'should_pause_execution_on_runtime_error' is deprecated, " + + "use 'stop_execution_on_exception' instead." + ) + stop_execution_on_exception = value + +var should_pause_execution_on_story_error: bool: get = get_speose, set = set_speose +func get_speose() -> bool: + printerr( + "'should_pause_execution_on_story_error' is deprecated, " + + "use 'stop_execution_on_error' instead." + ) + return stop_execution_on_error +func set_speose(value: bool): + printerr( + "'should_pause_execution_on_story_error' is deprecated, " + + "use 'stop_execution_on_error' instead." + ) + stop_execution_on_error = value + +# ############################################################################ # +# "Static" Properties +# ############################################################################ # + +var native_function_call: InkStaticNativeFunctionCall = InkStaticNativeFunctionCall.new() +var json: InkStaticJSON = InkStaticJSON.new(native_function_call) + +# ############################################################################ # +# Internal Properties +# ############################################################################ # + +# Recorded exceptions don't emit the 'exception' signal, since they are +# expected to be processed by the story and emitted through 'on_error'. +var record_story_exceptions: bool = false +var current_story_exceptions: Array = [] + +var _argument_exception_raised: bool +var _exception_raised: bool + +# ############################################################################ # +# Overrides +# ############################################################################ # + +func _init(): + name = "__InkRuntime" + +# ############################################################################ # +# Internal Methods +# ############################################################################ # + +func clear_raised_exceptions() -> bool: + if _argument_exception_raised: + _argument_exception_raised = false + return true + + if _argument_exception_raised: + _argument_exception_raised = false + return true + + return false + + +func handle_exception(message: String) -> void: + var exception_message = "EXCEPTION: %s" % message + var stack_trace = _get_stack_trace() + + _handle_generic_exception( + exception_message, + stop_execution_on_exception, + stack_trace + ) + + _exception_raised + emit_signal("exception_raised", exception_message, stack_trace) + +func handle_argument_exception(message: String) -> void: + var exception_message = "ARGUMENT EXCEPTION: %s" % message + var stack_trace = _get_stack_trace() + + _handle_generic_exception( + exception_message, + stop_execution_on_error, + stack_trace + ) + + _argument_exception_raised = true + emit_signal("exception_raised", exception_message, stack_trace) + +func handle_story_exception(message: String, use_end_line_number: bool, metadata) -> void: + # When exceptions are "recorded", they are not reported immediately. + # 'Story' will take care of that at the end of the step. + if record_story_exceptions: + current_story_exceptions.append(StoryError.new(message, use_end_line_number, metadata)) + else: + var exception_message = "STORY EXCEPTION: %s" % message + var stack_trace = _get_stack_trace() + + _handle_generic_exception(exception_message, stop_execution_on_error, stack_trace) + + emit_signal("exception_raised", exception_message, stack_trace) + +# ############################################################################ # +# Private Methods +# ############################################################################ # + +func _handle_generic_exception( + message: String, + should_pause_execution: bool, + stack_trace: PackedStringArray +) -> void: + if OS.is_debug_build(): + if should_pause_execution: + assert(false, message) + elif Engine.is_editor_hint(): + printerr(message) + if stack_trace.size() > 0: + printerr("Stack trace:") + for line in stack_trace: + printerr(line) + else: + push_error(message) + +func _get_stack_trace() -> PackedStringArray: + var trace := PackedStringArray() + + var i = 1 + for stack_element in get_stack(): + if i <= 3: + i += 1 + continue + + trace.append(str( + " ", (i - 3), " - ", stack_element["source"], ":", + stack_element["line"], " - at function: ", stack_element["function"] + )) + + i += 1 + + return trace diff --git a/addons/inkgd/runtime/static/json.gd b/addons/inkgd/runtime/static/json.gd new file mode 100644 index 0000000..b8aaaf6 --- /dev/null +++ b/addons/inkgd/runtime/static/json.gd @@ -0,0 +1,623 @@ +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkBase + +class_name InkStaticJSON + +# In the C# code this class has only static methods. In the GDScript, it will rather +# be a unique object, added to the InkRuntime singleton. + +# ############################################################################ # + +var InkValue = load("res://addons/inkgd/runtime/values/value.gd") +var InkStringValue = load("res://addons/inkgd/runtime/values/string_value.gd") +var InkDivertTargetValue = load("res://addons/inkgd/runtime/values/divert_target_value.gd") +var InkVariablePointerValue = load("res://addons/inkgd/runtime/values/variable_pointer_value.gd") +var InkListValue = load("res://addons/inkgd/runtime/values/list_value.gd") + +var InkList = load("res://addons/inkgd/runtime/lists/ink_list.gd") +var InkListDefinition = load("res://addons/inkgd/runtime/lists/list_definition.gd") +var InkListDefinitionsOrigin = load("res://addons/inkgd/runtime/lists/list_definitions_origin.gd") + + +# ############################################################################ # + +# (Array, bool) -> Array +func jarray_to_runtime_obj_list(jarray: Array, skip_last = false) -> Array: + var count = jarray.size() + if skip_last: + count -= 1 + + var list = [] + var i = 0 + while (i < count): + var jtok = jarray[i] + var runtime_obj = jtoken_to_runtime_object(jtok) + list.append(runtime_obj) + + i += 1 + + return list + +# (self.Json.Writer, Dictionary) -> void +func write_dictionary_runtime_objs(writer, dictionary: Dictionary) -> void: + writer.write_object_start() + for key in dictionary: + writer.write_property_start(key) + write_runtime_object(writer, dictionary[key]) + writer.write_property_end() + writer.write_object_end() + +# (self.Json.Writer, Array) -> void +func write_list_runtime_objs(writer, list: Array) -> void: + writer.write_array_start() + for val in list: + write_runtime_object(writer, val) + writer.write_array_end() + +# (self.Json.Writer, Array) -> void +func write_int_dictionary(writer, dict: Dictionary) -> void: + writer.write_object_start() + for key in dict: + writer.write_property(key, dict[key]) + writer.write_object_end() + +# (self.Json.Writer, InkObject) -> void +func write_runtime_object(writer, obj: InkObject) -> void: + var container = InkUtils.as_or_null(obj, "InkContainer") + if container: + write_runtime_container(writer, container) + return + + var divert = InkUtils.as_or_null(obj, "Divert") + if divert: + var div_type_key = "->" # String + if divert.is_external: + div_type_key = "x()" + elif divert.pushes_to_stack: + if divert.stack_push_type == Ink.PushPopType.FUNCTION: + div_type_key = "f()" + elif divert.stackPushType == Ink.PushPopType.TUNNEL: + div_type_key = "->t->" + + var target_str = null # String + if divert.has_variable_target: + target_str = divert.variable_divert_name + else: + target_str = divert.target_path_string + + writer.write_object_start() + + writer.write_property(div_type_key, target_str) + + if divert.has_variable_target: + writer.write_property("var", true) + + if divert.is_conditional: + writer.write_property("c", true) + + if divert.external_args > 0: + writer.write_property("exArgs", divert.external_args) + + writer.write_object_end() + return + + var choice_point = InkUtils.as_or_null(obj, "ChoicePoint") + if choice_point: + writer.write_object_start() + writer.write_property("*", choice_point.path_string_on_choice) + writer.write_property("flg", choice_point.flags) + writer.write_object_end() + return + + var bool_val = InkUtils.as_or_null(obj, "BoolValue") + if bool_val: + writer.write(bool_val.value) + return + + var int_val = InkUtils.as_or_null(obj, "IntValue") + if int_val: + writer.write(int_val.value) + return + + var float_val = InkUtils.as_or_null(obj, "FloatValue") + if float_val: + writer.write(float_val.value) + return + + var str_val = InkUtils.as_or_null(obj, "StringValue") + if str_val: + if str_val.is_newline: + writer.write_string("\\n", false) + else: + writer.write_string_start() + writer.write_string_inner("^") + writer.write_string_inner(str_val.value) + writer.write_string_end() + return + + var list_val = InkUtils.as_or_null(obj, "ListValue") + if list_val: + write_ink_list(writer, list_val) + return + + var div_target_val = InkUtils.as_or_null(obj, "DivertTargetValue") + if div_target_val: + writer.write_object_start() + writer.write_property("^->", div_target_val.value.components_string) + writer.write_object_end() + return + + var var_ptr_val = InkUtils.as_or_null(obj, "VariablePointerValue") + if var_ptr_val: + writer.write_object_start() + writer.write_property("^var", var_ptr_val.value) + writer.write_property("ci", var_ptr_val.context_index) + writer.write_object_end() + return + + var glue = InkUtils.as_or_null(obj, "Glue") + if glue: + writer.write("<>") + return + + var control_cmd = InkUtils.as_or_null(obj, "ControlCommand") + if control_cmd: + writer.write(self._control_command_names[control_cmd.command_type]) + return + + var native_func = InkUtils.as_or_null(obj, "NativeFunctionCall") + if native_func: + var name = native_func.name + + if name == "^": name = "L^" + + writer.write(name) + return + + var var_ref = InkUtils.as_or_null(obj, "VariableReference") + if var_ref: + writer.write_object_start() + + var read_count_path = var_ref.path_string_for_count + if read_count_path != null: + writer.write_property(["CNT?"], read_count_path) + else: + writer.write_property(["VAR?"], var_ref.name) + + writer.write_object_end() + return + + var var_ass = InkUtils.as_or_null(obj, "VariableAssignment") + if var_ass: + writer.write_object_start() + + var key = "VAR=" if var_ass.is_global else "temp=" + writer.write_property(key, var_ass.variable_name) + + if !var_ass.is_new_declaration: + writer.write_property("re", true) + + writer.write_object_end() + + return + + var void_obj = InkUtils.as_or_null(obj, "Void") + if void_obj: + writer.write("void") + return + + # Legacy Tags (replaced in 1.1+) + var tag = InkUtils.as_or_null(obj, "Tag") + if tag: + writer.write_object_start() + writer.write_property("#", tag.text) + writer.write_object_end() + return + + var choice = InkUtils.as_or_null(obj, "Choice") + if choice: + write_choice(writer, choice) + return + + InkUtils.throw_exception("Failed to convert runtime object to Json token: %s" % obj) + return + +# (Dictionary) -> Dictionary +func jobject_to_dictionary_runtime_objs(jobject: Dictionary) -> Dictionary: + var dict = {} + + for key in jobject: + dict[key] = jtoken_to_runtime_object(jobject[key]) + + return dict + +# (Dictionary) -> Dictionary +func jobject_to_int_dictionary(jobject: Dictionary) -> Dictionary: + var dict = {} + for key in jobject: + dict[key] = int(jobject[key]) + + return dict + +# (Variant) -> InkObject +func jtoken_to_runtime_object(token) -> InkObject: + + if token is int || token is float || token is bool: + return InkValue.create(token) + + if token is String: + var _str = token + + var first_char = _str[0] + if first_char == "^": + return InkStringValue.new_with(_str.substr(1, _str.length() - 1)) + elif first_char == "\n" && _str.length() == 1: + return InkStringValue.new_with("\n") + + if _str == "<>": return InkGlue.new() + + var i = 0 + while (i < _control_command_names.size()): + var cmd_name = _control_command_names[i] + if _str == cmd_name: + return InkControlCommand.new(i) + i += 1 + + if _str == "L^": _str = "^" + if _static_native_function_call.call_exists_with_name(_str): + return InkNativeFunctionCall.call_with_name(_str, _static_native_function_call) + + if _str == "->->": + return InkControlCommand.pop_tunnel() + elif _str == "~ret": + return InkControlCommand.pop_function() + + if _str == "void": + return InkVoid.new() + + if token is Dictionary: + var obj = token + var prop_value + + if obj.has("^->"): + prop_value = obj["^->"] + return InkDivertTargetValue.new_with( + InkPath.new_with_components_string(str(prop_value)) + ) + + if obj.has("^var"): + prop_value = obj["^var"] + var var_ptr = InkVariablePointerValue.new_with_context(str(prop_value)) + if (obj.has("ci")): + prop_value = obj["ci"] + var_ptr.context_index = int(prop_value) + return var_ptr + + var is_divert = false + var pushes_to_stack = false + var div_push_type = Ink.PushPopType.FUNCTION + var external = false + + if obj.has("->"): + prop_value = obj["->"] + is_divert = true + elif obj.has("f()"): + prop_value = obj["f()"] + is_divert = true + pushes_to_stack = true + div_push_type = Ink.PushPopType.FUNCTION + elif obj.has("->t->"): + prop_value = obj["->t->"] + is_divert = true + pushes_to_stack = true + div_push_type = Ink.PushPopType.TUNNEL + elif obj.has("x()"): + prop_value = obj["x()"] + is_divert = true + external = true + pushes_to_stack = false + div_push_type = Ink.PushPopType.FUNCTION + + if is_divert: + var divert = InkDivert.new() + divert.pushes_to_stack = pushes_to_stack + divert.stack_push_type = div_push_type + divert.is_external = external + + var target = str(prop_value) + + if obj.has("var"): + prop_value = obj["var"] + divert.variable_divert_name = target + else: + divert.target_path_string = target + + divert.is_conditional = obj.has("c") + #if divert.is_conditional: prop_value = obj["c"] + + if external: + if obj.has("exArgs"): + prop_value = obj["exArgs"] + divert.external_args = int(prop_value) + + return divert + + if obj.has("*"): + prop_value = obj["*"] + var choice = InkChoicePoint.new() + choice.path_string_on_choice = str(prop_value) + + if obj.has("flg"): + prop_value = obj["flg"] + choice.flags = int(prop_value) + + return choice + + if obj.has("VAR?"): + prop_value = obj["VAR?"] + return InkVariableReference.new(str(prop_value)) + elif obj.has("CNT?"): + prop_value = obj["CNT?"] + var read_count_var_ref = InkVariableReference.new() + read_count_var_ref.path_string_for_count = str(prop_value) + return read_count_var_ref + + var is_var_ass = false + var is_global_var = false + if obj.has("VAR="): + prop_value = obj["VAR="] + is_var_ass = true + is_global_var = true + elif obj.has("temp="): + prop_value = obj["temp="] + is_var_ass = true + is_global_var = false + + if is_var_ass: + var var_name = str(prop_value) + var is_new_decl = !obj.has("re") + var var_ass = InkVariableAssignment.new_with(var_name, is_new_decl) + var_ass.is_global = is_global_var + return var_ass + + # Legacy Tags with texts (replaced in 1.1+) + if obj.has("#"): + prop_value = obj["#"] + return InkTag.new(str(prop_value)) + + if obj.has("list"): + prop_value = obj["list"] + var list_content = prop_value + var raw_list = InkList.new() + if obj.has("origins"): + prop_value = obj["origins"] + var names_as_objs = prop_value + raw_list.set_initial_origin_names(names_as_objs) + + for name_to_val_key in list_content: + var item = InkListItem.new_with_full_name(name_to_val_key) + var val = list_content[name_to_val_key] + raw_list.set_item(item, val) + + return InkListValue.new_with(raw_list) + + if obj.has("originalChoicePath"): + return jobject_to_choice(obj) + + if token is Array: + var container = jarray_to_container(token) + return container + + if token == null: + return null + + InkUtils.throw_exception("Failed to convert token to runtime object: %s" % str(token)) + return null + +# (self.Json.Writer, InkContainer, Bool) -> void +func write_runtime_container(writer, container: InkContainer, without_name = false) -> void: + writer.write_array_start() + + for c in container.content: + write_runtime_object(writer, c) + + var named_only_content = container.named_only_content + var count_flags = container.count_flags + var has_name_property = (container.name != null) && !without_name + + var has_terminator = named_only_content != null || count_flags > 0 || has_name_property + + if has_terminator: + writer.write_object_start() + + if named_only_content != null: + for named_content_key in named_only_content: + var name = named_content_key + var named_container = InkUtils.as_or_null(named_only_content[named_content_key], "InkContainer") + writer.write_property_start(name) + write_runtime_container(writer, named_container, true) + writer.write_property_end() + + if count_flags > 0: + writer.write_property("#f", count_flags) + + if has_name_property: + writer.write_property("#n", container.name) + + if has_terminator: + writer.write_object_end() + else: + writer.write_null() + + writer.write_array_end() + +# (Array) -> InkContainer +func jarray_to_container(jarray: Array) -> InkContainer: + var container = InkContainer.new() + container.content = jarray_to_runtime_obj_list(jarray, true) + + var terminating_obj = InkUtils.as_or_null(jarray.back(), "Dictionary") # Dictionary + if terminating_obj != null: + var named_only_content = {} # new Dictionary + + for key in terminating_obj: + if key == "#f": + container.count_flags = int(terminating_obj[key]) + elif key == "#n": + container.name = str(terminating_obj[key]) + else: + var named_content_item = jtoken_to_runtime_object(terminating_obj[key]) + var named_sub_container = InkUtils.as_or_null(named_content_item, "InkContainer") + if named_sub_container: + named_sub_container.name = key + named_only_content[key] = named_content_item + + container.named_only_content = named_only_content + + return container + +# (Dictionary) -> Choice +func jobject_to_choice(jobj: Dictionary) -> InkChoice: + var choice = InkChoice.new() + choice.text = str(jobj["text"]) + choice.index = int(jobj["index"]) + choice.source_path = str(jobj["originalChoicePath"]) + choice.original_thread_index = int(jobj["originalThreadIndex"]) + choice.path_string_on_choice = str(jobj["targetPath"]) + return choice + +# (self.Json.Writer, Choice) -> Void +func write_choice(writer, choice: InkChoice) -> void: + writer.write_object_start() + writer.write_property("text", choice.text) + writer.write_property("index", choice.index) + writer.write_property("originalChoicePath", choice.source_path) + writer.write_property("originalThreadIndex", choice.original_thread_index) + writer.write_property("targetPath", choice.path_string_on_choice) + writer.write_object_end() + +# (self.Json.Writer, ListValue) -> Void +func write_ink_list(writer, list_val): + var raw_list = list_val.value + + writer.write_object_start() + + writer.write_property_start("list") + + writer.write_object_start() + + for item_key in raw_list.raw_keys(): + var item = InkListItem.from_serialized_key(item_key) + var item_val = raw_list.get_raw(item_key) + + writer.write_property_name_start() + writer.write_property_name_inner(item.origin_name if item.origin_name else "?") + writer.write_property_name_inner(".") + writer.write_property_name_inner(item.item_name) + writer.write_property_name_end() + + writer.write(item_val) + + writer.write_property_end() + + writer.write_object_end() + + writer.write_property_end() + + if raw_list.size() == 0 && raw_list.origin_names != null && raw_list.origin_names.size() > 0: + writer.write_property_start("origins") + writer.write_array_start() + for name in raw_list.origin_names: + writer.write(name) + writer.write_array_end() + writer.write_property_end() + + writer.write_object_end() + +# (ListDefinitionsOrigin) -> Dictionary +func list_definitions_to_jtoken (origin): + var result = {} # Dictionary + for def in origin.lists: + var list_def_json = {} # Dictionary + for item_to_val_key in def.items: + var item = InkListItem.from_serialized_key(item_to_val_key) + var val = def.items[item_to_val_key] + list_def_json[item.item_name] = val + + result[def.name] = list_def_json + + return result + +# (Variant) -> ListDefinitionsOrigin +func jtoken_to_list_definitions(obj): + var defs_obj = obj + + var all_defs = [] # Array + + for k in defs_obj: + var name = str(k) # String + var list_def_json = defs_obj[k] # Dictionary + + + var items = {} # Dictionary + for name_value_key in list_def_json: + items[name_value_key] = int(list_def_json[name_value_key]) + + var def = InkListDefinition.new(name, items) + all_defs.append(def) + + return InkListDefinitionsOrigin.new(all_defs) + +func _init(native_function_call): + _static_native_function_call = native_function_call + + _control_command_names = [] + + _control_command_names.append("ev") # EVAL_START + _control_command_names.append("out") # EVAL_OUTPUT + _control_command_names.append("/ev") # EVAL_END + _control_command_names.append("du") # DUPLICATE + _control_command_names.append("pop") # POP_EVALUATED_VALUE + _control_command_names.append("~ret") # POP_FUNCTION + _control_command_names.append("->->") # POP_TUNNEL + _control_command_names.append("str") # BEGIN_STRING + _control_command_names.append("/str") # END_STRING + _control_command_names.append("nop") # NO_OP + _control_command_names.append("choiceCnt") # CHOICE_COUNT + _control_command_names.append("turn") # TURNS + _control_command_names.append("turns") # TURNS_SINCE + _control_command_names.append("readc") # READ_COUNT + _control_command_names.append("rnd") # RANDOM + _control_command_names.append("srnd") # SEED_RANDOM + _control_command_names.append("visit") # VISIT_INDEX + _control_command_names.append("seq") # SEQUENCE_SHUFFLE_INDEX + _control_command_names.append("thread") # START_THREAD + _control_command_names.append("done") # DONE + _control_command_names.append("end") # END + _control_command_names.append("listInt") # LIST_FROM_INT + _control_command_names.append("range") # LIST_RANGE + _control_command_names.append("lrnd") # LIST_RANDOM + _control_command_names.append("#") # BEGIN_TAG + _control_command_names.append("/#") # END_TAG + + var i = 0 + while i < InkControlCommand.CommandType.TOTAL_VALUES: + if _control_command_names[i] == null: + InkUtils.throw_exception("Control command not accounted for in serialisation") + i += 1 + +# Array +var _control_command_names = null + +# ############################################################################ # + +# Eventually a pointer to InkRuntime.StaticJson +var _static_native_function_call = null diff --git a/addons/inkgd/runtime/static/native_function_call.gd b/addons/inkgd/runtime/static/native_function_call.gd new file mode 100644 index 0000000..e586252 --- /dev/null +++ b/addons/inkgd/runtime/static/native_function_call.gd @@ -0,0 +1,284 @@ +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends RefCounted + +class_name InkStaticNativeFunctionCall + +# ############################################################################ # +# Imports +# ############################################################################ # + +const ValueType = preload("res://addons/inkgd/runtime/values/value_type.gd").ValueType + +# ############################################################################ # + +const ADD = "+" +const SUBTRACT = "-" +const DIVIDE = "/" +const MULTIPLY = "*" +const MOD = "%" +const NEGATE = "_" +const EQUALS = "==" +const GREATER = ">" +const LESS = "<" +const GREATER_THAN_OR_EQUALS = ">=" +const LESS_THAN_OR_EQUALS = "<=" +const NOT_EQUALS = "!=" +const NOT = "!" +const AND = "&&" +const OR = "||" +const MIN = "MIN" +const MAX = "MAX" +const POW = "POW" +const FLOOR = "FLOOR" +const CEILING = "CEILING" +const INT = "INT" +const FLOAT = "FLOAT" +const HAS = "?" +const HASNT = "!?" +const INTERSECT = "^" +const LIST_MIN = "LIST_MIN" +const LIST_MAX = "LIST_MAX" +const ALL = "LIST_ALL" +const COUNT = "LIST_COUNT" +const VALUE_OF_LIST = "LIST_VALUE" +const INVERT = "LIST_INVERT" + +# ############################################################################ # + +var native_functions = null # Dictionary + +# ############################################################################ # + +# (String) -> Bool +func call_exists_with_name(function_name): + generate_native_functions_if_necessary() + return native_functions.has(function_name) + +# () -> void +func generate_native_functions_if_necessary(): + if native_functions == null: + native_functions = {} + + add_int_binary_op(ADD, "int_binary_op_add") + add_int_binary_op(SUBTRACT, "int_binary_op_substract") + add_int_binary_op(MULTIPLY, "int_binary_op_multiply") + add_int_binary_op(DIVIDE, "int_binary_op_divide") + add_int_binary_op(MOD, "int_binary_op_mod") + add_int_unary_op (NEGATE, "int_unary_op_negate") + + add_int_binary_op(EQUALS, "int_binary_op_equals") + add_int_binary_op(GREATER, "int_binary_op_greater") + add_int_binary_op(LESS, "int_binary_op_less") + add_int_binary_op(GREATER_THAN_OR_EQUALS, "int_binary_op_greater_than_or_equals") + add_int_binary_op(LESS_THAN_OR_EQUALS, "int_binary_op_less_than_or_equals") + add_int_binary_op(NOT_EQUALS, "int_binary_op_not_equals") + add_int_unary_op (NOT, "int_unary_op_not") + + add_int_binary_op(AND, "int_binary_op_and") + add_int_binary_op(OR, "int_binary_op_or") + + add_int_binary_op(MAX, "int_binary_op_max") + add_int_binary_op(MIN, "int_binary_op_min") + + add_int_binary_op(POW, "int_binary_op_pow") + add_int_unary_op (FLOOR, "int_unary_op_floor") + add_int_unary_op (CEILING, "int_unary_op_ceiling") + add_int_unary_op (INT, "int_unary_op_int") + add_int_unary_op (FLOAT, "int_unary_op_float") + + add_float_binary_op(ADD, "float_binary_op_add") + add_float_binary_op(SUBTRACT, "float_binary_op_substract") + add_float_binary_op(MULTIPLY, "float_binary_op_multiply") + add_float_binary_op(DIVIDE, "float_binary_op_divide") + add_float_binary_op(MOD, "float_binary_op_mod") + add_float_unary_op (NEGATE, "float_unary_op_negate") + + add_float_binary_op(EQUALS, "float_binary_op_equals") + add_float_binary_op(GREATER, "float_binary_op_greater") + add_float_binary_op(LESS, "float_binary_op_less") + add_float_binary_op(GREATER_THAN_OR_EQUALS, "float_binary_op_greater_than_or_equals") + add_float_binary_op(LESS_THAN_OR_EQUALS, "float_binary_op_less_than_or_equals") + add_float_binary_op(NOT_EQUALS, "float_binary_op_not_equals") + add_float_unary_op (NOT, "float_unary_op_not") + + add_float_binary_op(AND, "float_binary_op_and") + add_float_binary_op(OR, "float_binary_op_or") + + add_float_binary_op(MAX, "float_binary_op_max") + add_float_binary_op(MIN, "float_binary_op_min") + + add_float_binary_op(POW, "float_binary_op_pow") + add_float_unary_op (FLOOR, "float_unary_op_floor") + add_float_unary_op (CEILING, "float_unary_op_ceiling") + add_float_unary_op (INT, "float_unary_op_int") + add_float_unary_op (FLOAT, "float_unary_op_float") + + add_string_binary_op(ADD, "string_binary_op_add") + add_string_binary_op(EQUALS, "string_binary_op_equals") + add_string_binary_op(NOT_EQUALS, "string_binary_op_not_equals") + add_string_binary_op(HAS, "string_binary_op_has") + add_string_binary_op(HASNT, "string_binary_op_hasnt") + + add_list_binary_op (ADD, "list_binary_op_add") + add_list_binary_op (SUBTRACT, "list_binary_op_substract") + add_list_binary_op (HAS, "list_binary_op_has") + add_list_binary_op (HASNT, "list_binary_op_hasnt") + add_list_binary_op (INTERSECT, "list_binary_op_intersect") + + add_list_binary_op (EQUALS, "list_binary_op_equals") + add_list_binary_op (GREATER, "list_binary_op_greater") + add_list_binary_op (LESS, "list_binary_op_less") + add_list_binary_op (GREATER_THAN_OR_EQUALS, "list_binary_op_greater_than_or_equals") + add_list_binary_op (LESS_THAN_OR_EQUALS, "list_binary_op_less_than_or_equals") + add_list_binary_op (NOT_EQUALS, "list_binary_op_not_equals") + + add_list_binary_op (AND, "list_binary_op_and") + add_list_binary_op (OR, "list_binary_op_or") + + add_list_unary_op (NOT, "list_unary_op_not") + + add_list_unary_op (INVERT, "list_unary_op_invert") + add_list_unary_op (ALL, "list_unary_op_all") + add_list_unary_op (LIST_MIN, "list_unary_op_list_min") + add_list_unary_op (LIST_MAX, "list_unary_op_list_max") + add_list_unary_op (COUNT, "list_unary_op_count") + add_list_unary_op (VALUE_OF_LIST, "list_unary_op_value_of_list") + + add_op_to_native_func(EQUALS, 2, ValueType.DIVERT_TARGET, + "native_func_divert_targets_equal") + add_op_to_native_func(NOT_EQUALS, 2, ValueType.DIVERT_TARGET, + "native_func_divert_targets_not_equal") + +# (String, int, ValueType, Variant) +func add_op_to_native_func(name, args, val_type, op): + var native_func = null # NativeFunctionCall + if native_functions.has(name): + native_func = native_functions[name] + else: + native_func = InkNativeFunctionCall.new_with_name_and_number_of_parameters(name, args, self) + native_functions[name] = native_func + + native_func.add_op_func_for_type(val_type, op) + +func add_int_binary_op(name, op_function_name): + add_op_to_native_func(name, 2, ValueType.INT, op_function_name) + +func add_int_unary_op(name, op_function_name): + add_op_to_native_func(name, 1, ValueType.INT, op_function_name) + +func add_float_binary_op(name, op_function_name): + add_op_to_native_func(name, 2, ValueType.FLOAT, op_function_name) + +func add_float_unary_op(name, op_function_name): + add_op_to_native_func(name, 1, ValueType.FLOAT, op_function_name) + +func add_string_binary_op(name, op_function_name): + add_op_to_native_func(name, 2, ValueType.STRING, op_function_name) + +func add_list_binary_op(name, op_function_name): + add_op_to_native_func(name, 2, ValueType.LIST, op_function_name) + +func add_list_unary_op(name, op_function_name): + add_op_to_native_func(name, 1, ValueType.LIST, op_function_name) + +# ############################################################################ # + +func int_binary_op_add(x, y): return x + y +func int_binary_op_substract(x, y): return x - y +func int_binary_op_multiply(x, y): return x * y +func int_binary_op_divide(x, y): return x / y +func int_binary_op_mod(x, y): return x % y +func int_unary_op_negate(x): return -x + +func int_binary_op_equals(x, y): return x == y +func int_binary_op_greater(x, y): return x > y +func int_binary_op_less(x, y): return x < y +func int_binary_op_greater_than_or_equals(x, y): return x >= y +func int_binary_op_less_than_or_equals(x, y): return x <= y +func int_binary_op_not_equals(x, y): return x != y +func int_unary_op_not(x): return x == 0 + +func int_binary_op_and(x, y): return x != 0 && y != 0 +func int_binary_op_or(x, y): return x != 0 || y != 0 + +func int_binary_op_max(x, y): return max(x, y) +func int_binary_op_min(x, y): return min(x, y) + +func int_binary_op_pow(x, y): return pow(float(x), float(y)) +func int_unary_op_floor(x): return x +func int_unary_op_ceiling(x): return x +func int_unary_op_int(x): return x +func int_unary_op_float(x): return float(x) + +func float_binary_op_add(x, y): return x + y +func float_binary_op_substract(x, y): return x - y +func float_binary_op_multiply(x, y): return x * y +func float_binary_op_divide(x, y): return x / y +func float_binary_op_mod(x, y): return fmod(x, y) +func float_unary_op_negate(x): return -x + +func float_binary_op_equals(x, y): return x == y +func float_binary_op_greater(x, y): return x > y +func float_binary_op_less(x, y): return x < y +func float_binary_op_greater_than_or_equals(x, y): return x >= y +func float_binary_op_less_than_or_equals(x, y): return x <= y +func float_binary_op_not_equals(x, y): return x != y +func float_unary_op_not(x): return x == 0.0 + +func float_binary_op_and(x, y): return x != 0.0 && y != 0.0 +func float_binary_op_or(x, y): return x != 0.0 || y != 0.0 + +func float_binary_op_max(x, y): return max(x, y) +func float_binary_op_min(x, y): return min(x, y) + +func float_binary_op_pow(x, y): return pow(x, y) +func float_unary_op_floor(x): return floor(x) +func float_unary_op_ceiling(x): return ceil(x) +func float_unary_op_int(x): return int(x) +func float_unary_op_float(x): return x + +func string_binary_op_add(x, y): return str(x, y) +func string_binary_op_equals(x, y): return x == y +func string_binary_op_not_equals(x, y): return x != y + +# Note: The Content Test (in) operator does not returns true when testing +# against the empty string, unlike the behaviour of the original C# runtime. +func string_binary_op_has(x, y): return y == "" || (y in x) +func string_binary_op_hasnt(x, y): return !(y in x) && y != "" + +func list_binary_op_add(x, y): return x.union(y) +func list_binary_op_substract(x, y): return x.without(y) +func list_binary_op_has(x, y): return x.contains(y) +func list_binary_op_hasnt(x, y): return !x.contains(y) +func list_binary_op_intersect(x, y): return x.intersection(y) + +func list_binary_op_equals(x, y): return x.equals(y) +func list_binary_op_greater(x, y): return x.greater_than(y) +func list_binary_op_less(x, y): return x.less_than(y) +func list_binary_op_greater_than_or_equals(x, y): return x.greater_than_or_equals(y) +func list_binary_op_less_than_or_equals(x, y): return x.less_than_or_equals(y) +func list_binary_op_not_equals(x, y): return !x.equals(y) + +func list_binary_op_and(x, y): return x.size() > 0 && y.size() > 0 +func list_binary_op_or(x, y): return x.size() > 0 || y.size() > 0 + +func list_unary_op_not(x): return 1 if x.size() == 0 else 0 + +func list_unary_op_invert(x): return x.inverse +func list_unary_op_all(x): return x.all +func list_unary_op_list_min(x): return x.min_as_list() +func list_unary_op_list_max(x): return x.max_as_list() +func list_unary_op_count(x): return x.size() +func list_unary_op_value_of_list(x): return x.max_item.value + +func native_func_divert_targets_equal(d1, d2): return d1.equals(d2) +func native_func_divert_targets_not_equal(d1, d2): return !d1.equals(d2) diff --git a/addons/inkgd/runtime/story.gd b/addons/inkgd/runtime/story.gd new file mode 100644 index 0000000..b7bc799 --- /dev/null +++ b/addons/inkgd/runtime/story.gd @@ -0,0 +1,2095 @@ +# warning-ignore-all:shadowed_variable +# warning-ignore-all:unused_class_variable +# warning-ignore-all:unused_signal +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkObject + +class_name InkStory + +const INK_VERSION_CURRENT := 21 +const INK_VERSION_MINIMUM_COMPATIBLE := 18 + +# ############################################################################ # +# Imports +# ############################################################################ # + +var InkStopWatch := preload("res://addons/inkgd/runtime/extra/stopwatch.gd") as GDScript +var InkProfiler := preload("res://addons/inkgd/runtime/profiler.gd") as GDScript + +var InkSimpleJSON := preload("res://addons/inkgd/runtime/simple_json.gd") as GDScript +var InkStringSet := preload("res://addons/inkgd/runtime/extra/string_set.gd") as GDScript +var InkListDefinitionsOrigin := preload("res://addons/inkgd/runtime/lists/list_definitions_origin.gd") as GDScript + +var InkPointer := preload("res://addons/inkgd/runtime/structs/pointer.gd") as GDScript + +var StoryErrorMetadata := preload("res://addons/inkgd/runtime/extra/story_error_metadata.gd") as GDScript + +# ############################################################################ # + +var InkValue := load("res://addons/inkgd/runtime/values/value.gd") as GDScript +var InkIntValue := load("res://addons/inkgd/runtime/values/int_value.gd") as GDScript +var InkStringValue := load("res://addons/inkgd/runtime/values/string_value.gd") as GDScript +var InkVariablePointerValue := load("res://addons/inkgd/runtime/values/variable_pointer_value.gd") as GDScript +var InkListValue := load("res://addons/inkgd/runtime/values/list_value.gd") as GDScript + +var InkList := load("res://addons/inkgd/runtime/lists/ink_list.gd") as GDScript + +var InkStoryState := load("res://addons/inkgd/runtime/story_state.gd") as GDScript + +# ############################################################################ # + +var current_choices: Array: # Array + get: + var choices: Array = [] # Array + + for c in self._state.current_choices: + if !c.is_invisible_default: + c.index = choices.size() + choices.append(c) + + return choices + + +var current_text: # String? + get: + if async_we_cant("call currentText since it's a work in progress"): + return null + + return self.state.current_text + +# Array? +var current_tags: # Array + get: + if async_we_cant("call currentTags since it's a work in progress"): + return null + + return self.state.current_tags + +var current_errors: # Array? + get: return self.state.current_errors + +var current_warnings: # Array? + get: return self.state.current_warnings + +var current_flow_name: String: + get: return self.state.current_flow_name + +var has_error: bool: + get: return self.state.has_error + +var has_warning: bool: + get: return self.state.has_warning + +var variables_state: InkVariablesState: + get: return self.state.variables_state + +var list_definitions: # ListDefinitionsOrigin? + get: return self._list_definitions + +var state: InkStoryState: + get: return self._state + +signal on_error(message, type) + +signal on_did_continue() + +signal on_make_choice(choice) + +signal on_evaluate_function(function_name, arguments) + +signal on_complete_evaluate_function(function_name, arguments, text_output, result) + +signal on_choose_path_string(path, arguments) + + +func start_profiling() -> InkProfiler: + if async_we_cant ("Start Profiling"): + return null + + _profiler = InkProfiler.new() + return _profiler + + +func end_profiling() -> void: + _profiler = null + + +# (InkContainer, Array) -> void +func _init_with(content_container: InkContainer, lists = null, runtime = null): + _initialize_runtime(runtime) + self._main_content_container = content_container + + if lists != null: + self._list_definitions = InkListDefinitionsOrigin.new(lists) + + self._externals = {} # Dictionary + + +func _init(json_string: String, runtime = null): + _init_with(null, null, runtime) + + var root_object = InkSimpleJSON.text_to_dictionary(json_string) + + var version_obj = root_object["inkVersion"] + if version_obj == null: + InkUtils.throw_exception( + "ink version number not found. " + + "Are you sure it's a valid .ink.json file?" + ) + return + + var format_from_file = int(version_obj) + if format_from_file > INK_VERSION_CURRENT: + InkUtils.throw_exception( + "Version of ink used to build story was newer " + + "than the current version of the engine" + ) + return + elif format_from_file < INK_VERSION_MINIMUM_COMPATIBLE: + InkUtils.throw_exception( + "Version of ink used to build story is too old " + + "to be loaded by this version of the engine" + ) + return + elif format_from_file != INK_VERSION_CURRENT: + print( + "[Ink] [WARNING] Version of ink used to build story doesn't match " + + "current version of engine. Non-critical, but recommend synchronising." + ) + + var root_token = root_object["root"] + if root_token == null: + InkUtils.throw_exception( + "Root node for ink not found. Are you sure it's a valid .ink.json file?" + ) + return + + if root_object.has("listDefs"): + self._list_definitions = self.StaticJSON.jtoken_to_list_definitions(root_object["listDefs"]) + + self._main_content_container = InkUtils.as_or_null( + self.StaticJSON.jtoken_to_runtime_object(root_token), + "InkContainer" + ) + + self.reset_state() + + +# () -> String +func to_json() -> String: + var writer: InkSimpleJSON.Writer = InkSimpleJSON.Writer.new() + to_json_with_writer(writer) + return writer._to_string() + + +func write_root_property(writer: InkSimpleJSON.Writer) -> void: + self.StaticJSON.write_runtime_container(writer, self._main_content_container) + + +func to_json_with_writer(writer: InkSimpleJSON.Writer) -> void: + writer.write_object_start() + + writer.write_property("inkVersion", INK_VERSION_CURRENT) + + writer.write_property("root", Callable(self, "write_root_property")) + + if self._list_definitions != null: + writer.write_property_start("listDefs") + writer.write_object_start() + + for def in self._list_definitions.lists: + writer.write_property_start(def.name) + writer.write_object_start() + + for item_to_val_key in def.items: + var item = InkListItem.from_serialized_key(item_to_val_key) + var val = def.items[item_to_val_key] + writer.write_property(item.item_name, val) + + writer.write_object_end() + writer.write_property_end() + + writer.write_object_end() + writer.write_property_end() + + writer.write_object_end() + + +# () -> void +func reset_state() -> void: + if async_we_cant ("ResetState"): + return + + self._state = InkStoryState.new(self, self._ink_runtime) + self._state.variables_state.connect("variable_changed", Callable(self, "variable_state_did_change_event")) + + self.reset_globals() + + +# () -> void +func reset_errors() -> void: + self._state.reset_errors() + + +# () -> void +func reset_callstack() -> void: + if async_we_cant("ResetCallstack"): + return + + self._state.force_end() + + +# () -> void +func reset_globals() -> void: + if (self._main_content_container.named_content.has("global decl")): + var original_pointer = self.state.current_pointer + + self.choose_path(InkPath.new_with_components_string("global decl"), false) + + self.continue_internal() + + self.state.current_pointer = original_pointer + + self.state.variables_state.snapshot_default_globals() + + +func switch_flow(flow_name: String) -> void: + if async_we_cant("SwitchFlow"): + return + + if self._async_saving: + InkUtils.throw_exception("Story is already in background saving mode, can't switch flow to " + flow_name) + + self.state.switch_flow_internal(flow_name) + + +func remove_flow(flow_name: String) -> void: + self.state.remove_flow_internal(flow_name) + + +func switch_to_default_flow() -> void: + self.state.switch_to_default_flow_internal() + + +func continue_story() -> String: + self.continue_async(0) + return self.current_text + + +var can_continue: bool: get = get_continue +func get_continue() -> bool: + return self.state.can_continue + + +var async_continue_complete: bool: get = get_async_continue_complete +func get_async_continue_complete() -> bool: + return !self._async_continue_active + + +func continue_async(millisecs_limit_async: float): + if !self._has_validated_externals: + self.validate_external_bindings() + + continue_internal(millisecs_limit_async) + + +func continue_internal(millisecs_limit_async: float = 0) -> void: + if _profiler != null: + _profiler.pre_continue() + + var is_async_time_limited = millisecs_limit_async > 0 + + self._recursive_continue_count += 1 + + if !self._async_continue_active: + self._async_continue_active = is_async_time_limited + + if !self.can_continue: + InkUtils.throw_exception("Can't continue - should check canContinue before calling Continue") + return + + self._state.did_safe_exit = false + self._state.reset_output() + + if self._recursive_continue_count == 1: + self._state.variables_state.batch_observing_variable_changes = true + + var duration_stopwatch = InkStopWatch.new() + duration_stopwatch.start() + + var output_stream_ends_in_newline = false + self._saw_lookahead_unsafe_function_after_newline = false + + # In the original code, exceptions raised during 'continue_single_step()' + # are catched and added to the error array. Since exceptions don't exist + # in GDScript, they are recorded instead. See 'ink_runtime.gd' for more + # information. + self._enable_story_exception_recording(true) + var first_time = true + while (first_time || self.can_continue): + first_time = false + + output_stream_ends_in_newline = self.continue_single_step() + var recorded_exceptions = _get_and_clear_recorded_story_exceptions() + if recorded_exceptions.size() > 0: + for error in recorded_exceptions: + add_story_error(error) + break + + if output_stream_ends_in_newline: + break + + if _async_continue_active && duration_stopwatch.elapsed_milliseconds > millisecs_limit_async: + break + + self._enable_story_exception_recording(false) + duration_stopwatch.stop() + + if output_stream_ends_in_newline || !self.can_continue: + + if self._state_snapshot_at_last_newline != null: + self.restore_state_snapshot() + + if !self.can_continue: + if self.state.callstack.can_pop_thread: + add_error("Thread available to pop, threads should always be flat by the end of evaluation?") + + if self.state.generated_choices.size() == 0 && !self.state.did_safe_exit && self._temporary_evaluation_container == null: + if self.state.callstack.can_pop_type(Ink.PushPopType.TUNNEL): + add_error("unexpectedly reached end of content. Do you need a '->->' to return from a tunnel?") + elif self.state.callstack.can_pop_type(Ink.PushPopType.FUNCTION): + add_error("unexpectedly reached end of content. Do you need a '~ return'?") + elif !self.state.callstack.can_pop: + add_error("ran out of content. Do you need a '-> DONE' or '-> END'?") + else: + add_error("unexpectedly reached end of content for unknown reason. Please debug compiler!") + + self.state.did_safe_exit = false + self._saw_lookahead_unsafe_function_after_newline = false + + if _recursive_continue_count == 1: + _state.variables_state.batch_observing_variable_changes = false + + self._async_continue_active = false + emit_signal("on_did_continue") + + self._recursive_continue_count -= 1 + + if _profiler != null: + _profiler.post_continue() + + if self.state.has_error || self.state.has_warning: + if !self.get_signal_connection_list("on_error").is_empty(): + if self.state.has_error: + for err in self.state.current_errors: + emit_signal("on_error", err, Ink.ErrorType.ERROR) + + if self.state.has_warning: + for err in self.state.current_warnings: + emit_signal("on_error", err, Ink.ErrorType.WARNING) + + self.reset_errors() + else: + var exception = "Ink had " + + if self.state.has_error: + exception += str(self.state.current_errors.size()) + exception += " error" if self.state.current_errors.size() == 1 else " errors" + if self.state.has_warning: + exception += " and " + + if self.state.has_warning: + exception += str(self.state.current_warnings.size()) + exception += " warning" if self.state.current_warnings.size() == 1 else " warnings" + + exception += ". It is strongly suggested that you assign an error handler to story.onError. The first issue was: " + exception += self.state.current_errors[0] if self.state.has_error else self.state.current_warnings[0] + + # If you get this exception, please connect an error handler to the appropriate signal: "on_error". + self._throw_story_exception(exception) + + +func continue_single_step() -> bool: + if _profiler != null: + _profiler.pre_step() + + self.step() + + if _profiler != null: + _profiler.post_step() + + + if !self.can_continue && !self.state.callstack.element_is_evaluate_from_game: + self.try_follow_default_invisible_choice() + + + if _profiler != null: + _profiler.pre_snapshot() + + if !self.state.in_string_evaluation: + if self._state_snapshot_at_last_newline != null: + + var change = calculate_newline_output_state_change( + self._state_snapshot_at_last_newline.current_text, self.state.current_text, + self._state_snapshot_at_last_newline.current_tags.size(), self.state.current_tags.size() + ) + + if change == OutputStateChange.EXTENDED_BEYOND_NEWLINE || self._saw_lookahead_unsafe_function_after_newline: + self.restore_state_snapshot() + + return true + elif change == OutputStateChange.NEWLINE_REMOVED: + self.discard_snapshot() + + if self.state.output_stream_ends_in_newline: + if self.can_continue: + if self._state_snapshot_at_last_newline == null: + self.state_snapshot() + else: + self.discard_snapshot() + + if _profiler != null: + _profiler.post_snapshot() + + return false + + +enum OutputStateChange { + NO_CHANGE, + EXTENDED_BEYOND_NEWLINE, + NEWLINE_REMOVED +} + + +# (String, String, int, int) -> OutputStateChange +func calculate_newline_output_state_change( + prev_text: String, + curr_text: String, + prev_tag_count: int, + curr_tag_count: int +) -> int: + var newline_still_exists = curr_text.length() >= prev_text.length() && prev_text.length() > 0 && curr_text[prev_text.length() - 1] == "\n" + if (prev_tag_count == curr_tag_count && prev_text.length() == curr_text.length() && newline_still_exists): + return OutputStateChange.NO_CHANGE + + if !newline_still_exists: + return OutputStateChange.NEWLINE_REMOVED + + if curr_tag_count > prev_tag_count: + return OutputStateChange.EXTENDED_BEYOND_NEWLINE + + var i = prev_text.length() + while i < curr_text.length(): + var c = curr_text[i] + + if c != " " && c != "\t": + return OutputStateChange.EXTENDED_BEYOND_NEWLINE + + i += 1 + + return OutputStateChange.NO_CHANGE + + +func continue_story_maximally() -> String: + if async_we_cant("ContinueMaximally"): + return "" + + var _str = "" + + while (self.can_continue): + _str += self.continue_story() + + return _str + + +func content_at_path(path: InkPath) -> InkSearchResult: + return self.main_content_container.content_at_path(path) + + +func knot_container_with_name(name: String) -> InkContainer: + if self.main_content_container.named_content.has(name): + return InkUtils.as_or_null(self.main_content_container.named_content[name], "InkContainer") + + return null + + +func pointer_at_path(path: InkPath) -> InkPointer: + if (path.length == 0): + return InkPointer.null_pointer + + var p = InkPointer.new() + + var path_length_to_use = path.length + + var result = null # SearchResult + if (path.last_component.is_index): + path_length_to_use = path.length - 1 + result = self.main_content_container.content_at_path(path, 0, path_length_to_use) + p = InkPointer.new(result.container, path.last_component.index) + else: + result = self.main_content_container.content_at_path(path) + p = InkPointer.new(result.container, -1) + + if result.obj == null || result.obj == self.main_content_container && path_length_to_use > 0: + error( + "Failed to find content at path '%s', " % path._to_string() + + "and no approximation of it was possible." + ) + elif result.approximate: + warning( + "Failed to find content at path '%s', " % path + + "so it was approximated to: '%s'." % result.obj.path._to_string() + ) + + return p + + +func state_snapshot() -> void: + self._state_snapshot_at_last_newline = self._state + self._state = self._state.copy_and_start_patching() + + +func restore_state_snapshot() -> void: + self._state_snapshot_at_last_newline.restore_after_patch() + + self._state = self._state_snapshot_at_last_newline + self._state_snapshot_at_last_newline = null + + if !self._async_saving: + self._state.apply_any_patch() + + +func discard_snapshot() -> void: + if !self._async_saving: + self._state.apply_any_patch() + + self._state_snapshot_at_last_newline = null + + +func copy_state_for_background_thread_save() -> InkStoryState: + if async_we_cant("start saving on a background thread"): + return null + + if self._async_saving: + InkUtils.throw_exception( + "Story is already in background saving mode, " + + "can't call CopyStateForBackgroundThreadSave again!" + ) + return null + + var state_to_save = self._state + self._state = self._state.copy_and_start_patching() + self._async_saving = true + + return state_to_save + + +func background_save_complete() -> void: + if self._state_snapshot_at_last_newline == null: + _state.apply_any_patch() + + self._async_saving = false + + +func step() -> void: + var should_add_to_stream = true + + var pointer = self.state.current_pointer + if pointer.is_null: + return + + var container_to_enter = InkUtils.as_or_null(pointer.resolve(), "InkContainer") + while (container_to_enter): + self.visit_container(container_to_enter, true) + + if container_to_enter.content.size() == 0: + break + + pointer = InkPointer.start_of(container_to_enter) + container_to_enter = InkUtils.as_or_null(pointer.resolve(), "InkContainer") + + self.state.current_pointer = pointer + + if _profiler != null: + _profiler.step(state.callstack) + + var current_content_obj = pointer.resolve() + var is_logic_or_flow_control = perform_logic_and_flow_control(current_content_obj) + + if self.state.current_pointer.is_null: + return + + if is_logic_or_flow_control: + should_add_to_stream = false + + var choice_point = InkUtils.as_or_null(current_content_obj, "ChoicePoint") + if choice_point: + var choice = process_choice(choice_point) + if choice: + self.state.generated_choices.append(choice) + + current_content_obj = null + should_add_to_stream = false + + if InkUtils.is_ink_class(current_content_obj, "InkContainer"): + should_add_to_stream = false + + if should_add_to_stream: + var var_pointer = InkUtils.as_or_null(current_content_obj, "VariablePointerValue") + if var_pointer && var_pointer.context_index == -1: + var context_idx = self.state.callstack.context_for_variable_named(var_pointer.variable_name) + current_content_obj = InkVariablePointerValue.new_with_context(var_pointer.variable_name, context_idx) + + if self.state.in_expression_evaluation: + self.state.push_evaluation_stack(current_content_obj) + else: + self.state.push_to_output_stream(current_content_obj) + + self.next_content() + + var control_cmd = InkUtils.as_or_null(current_content_obj, "ControlCommand") + if control_cmd && control_cmd.command_type == InkControlCommand.CommandType.START_THREAD: + self.state.callstack.push_thread() + + +func visit_container(container: InkContainer, at_start: bool) -> void: + if !container.counting_at_start_only || at_start: + if container.visits_should_be_counted: + self.state.increment_visit_count_for_container(container) + + if container.turn_index_should_be_counted: + self.state.record_turn_index_visit_to_container(container) + + +var _prev_containers = [] # Array +func visit_changed_containers_due_to_divert() -> void: + var previous_pointer = self.state.previous_pointer + var pointer = self.state.current_pointer + + if pointer.is_null || pointer.index == -1: + return + + self._prev_containers.clear() + if !previous_pointer.is_null: + var prev_ancestor = InkUtils.as_or_null(previous_pointer.resolve(), "InkContainer") + prev_ancestor = prev_ancestor if prev_ancestor else InkUtils.as_or_null(previous_pointer.container, "InkContainer") + while prev_ancestor: + self._prev_containers.append(prev_ancestor) + prev_ancestor = InkUtils.as_or_null(prev_ancestor.parent, "InkContainer") + + var current_child_of_container = pointer.resolve() + + if current_child_of_container == null: return + + var current_container_ancestor = InkUtils.as_or_null(current_child_of_container.parent, "InkContainer") + + var all_children_entered_at_start = true + while current_container_ancestor && (self._prev_containers.find(current_container_ancestor) < 0 || current_container_ancestor.counting_at_start_only): + + var entering_at_start = (current_container_ancestor.content.size() > 0 && + current_child_of_container == current_container_ancestor.content[0] && + all_children_entered_at_start) + + if !entering_at_start: + all_children_entered_at_start = false + + self.visit_container(current_container_ancestor, entering_at_start) + + current_child_of_container = current_container_ancestor + current_container_ancestor = InkUtils.as_or_null(current_container_ancestor.parent, "InkContainer") + + +# The original implementation would return the choice string and update the +# array of tags passed in parameter. Since in/out (ref) parameters are not supported +# in GDScript, the method returns a tuple (array) instead. +# (Array) -> [String, Array] +func pop_choice_string_and_tags(tags) -> Array: + var choice_only_str_val = InkUtils.cast(self.state.pop_evaluation_stack(), "StringValue") + + while self.state.evaluation_stack.size() > 0 and InkUtils.is_ink_class(state.peek_evaluation_stack(), "Tag"): + if tags == null: + tags = [] + var tag = InkUtils.cast(self.state.pop_evaluation_stack(), "Tag") + tags.insert(0, tag.text) + + return [choice_only_str_val.value, tags] + + +func process_choice(choice_point: InkChoicePoint) -> InkChoice: + var show_choice := true + + if choice_point.has_condition: + var condition_value = self.state.pop_evaluation_stack() + if !self.is_truthy(condition_value): + show_choice = false + + var start_text := "" + var choice_only_text := "" + var tags = null + + if choice_point.has_choice_only_content: + var choice_strings_and_tags = self.pop_choice_string_and_tags(tags) + choice_only_text = choice_strings_and_tags[0] + tags = choice_strings_and_tags[1] + + if choice_point.has_start_content: + var choice_strings_and_tags = self.pop_choice_string_and_tags(tags) + start_text = choice_strings_and_tags[0] + tags = choice_strings_and_tags[1] + + if choice_point.once_only: + var visit_count = self.state.visit_count_for_container(choice_point.choice_target) + if visit_count > 0: + show_choice = false + + if !show_choice: + return null + + var choice = InkChoice.new() + choice.target_path = choice_point.path_on_choice + choice.source_path = choice_point.path._to_string() + choice.is_invisible_default = choice_point.is_invisible_default + choice.tags = tags + choice.thread_at_generation = self.state.callstack.fork_thread() + + choice.text = InkUtils.trim(start_text + choice_only_text, [" ", "\t"]) + + return choice + + +func is_truthy(obj: InkObject) -> bool: + var truthy = false + if InkUtils.is_ink_class(obj, "Value"): + var val = obj + + if InkUtils.is_ink_class(obj, "DivertTargetValue"): + var div_target = val + error(str("Shouldn't use a divert target (to ", div_target.target_path._to_string(), + ") as a conditional value. Did you intend a function call 'likeThis()'", + " or a read count check 'likeThis'? (no arrows)")) + return false + + return val.is_truthy + + return truthy + + +func perform_logic_and_flow_control(content_obj: InkObject) -> bool: + if (content_obj == null): + return false + + if InkUtils.is_ink_class(content_obj, "Divert"): + var current_divert = content_obj + + if current_divert.is_conditional: + var condition_value = self.state.pop_evaluation_stack() + + if !self.is_truthy(condition_value): + return true + + if current_divert.has_variable_target: + var var_name = current_divert.variable_divert_name + var var_contents = self.state.variables_state.get_variable_with_name(var_name) + + if var_contents == null: + error(str("Tried to divert using a target from a variable that could not be found (", + var_name, ")")) + return false + elif !InkUtils.is_ink_class(var_contents, "DivertTargetValue"): + var int_content = InkUtils.as_or_null(var_contents, "IntValue") + + var error_message = str("Tried to divert to a target from a variable,", + "but the variable (", var_name, + ") didn't contain a divert target, it ") + if int_content && int_content.value == 0: + error_message += "was empty/null (the value 0)." + else: + error_message += "contained '" + var_contents + "'." + + error(error_message) + return false + + var target = var_contents + self.state.diverted_pointer = self.pointer_at_path(target.target_path) + + elif current_divert.is_external: + call_external_function(current_divert.target_path_string, current_divert.external_args) + return true + else: + self.state.diverted_pointer = current_divert.target_pointer + + if current_divert.pushes_to_stack: + self.state.callstack.push( + current_divert.stack_push_type, + 0, + self.state.output_stream.size() + ) + + if self.state.diverted_pointer.is_null && !current_divert.is_external: + if current_divert && current_divert.debug_metadata != null && current_divert.debug_metadata.source_name != null: + error("Divert target doesn't exist: " + current_divert.debug_metadata.source_name) + return false + else: + error("Divert resolution failed: " + current_divert._to_string()) + return false + + return true + elif InkUtils.is_ink_class(content_obj, "ControlCommand"): + var eval_command = content_obj + + match eval_command.command_type: + + InkControlCommand.CommandType.EVAL_START: + self.__assert__( + self.state.in_expression_evaluation == false, + "Already in expression evaluation?" + ) + self.state.in_expression_evaluation = true + + InkControlCommand.CommandType.EVAL_END: + self.__assert__( + self.state.in_expression_evaluation == true, + "Not in expression evaluation mode" + ) + self.state.in_expression_evaluation = false + + InkControlCommand.CommandType.EVAL_OUTPUT: + if self.state.evaluation_stack.size() > 0: + var output = self.state.pop_evaluation_stack() + + if !InkUtils.as_or_null(output, "Void"): + var text = InkStringValue.new_with(output._to_string()) + self.state.push_to_output_stream(text) + + InkControlCommand.CommandType.NO_OP: + pass + + InkControlCommand.CommandType.DUPLICATE: + self.state.push_evaluation_stack(self.state.peek_evaluation_stack()) + + InkControlCommand.CommandType.POP_EVALUATED_VALUE: + self.state.pop_evaluation_stack() + + InkControlCommand.CommandType.POP_FUNCTION, InkControlCommand.CommandType.POP_TUNNEL: + var is_pop_function = ( + eval_command.command_type == InkControlCommand.CommandType.POP_FUNCTION + ) + var pop_type = Ink.PushPopType.FUNCTION if is_pop_function else Ink.PushPopType.TUNNEL + + var override_tunnel_return_target = null # DivertTargetValue + if pop_type == Ink.PushPopType.TUNNEL: + var popped = self.state.pop_evaluation_stack() + override_tunnel_return_target = InkUtils.as_or_null(popped, "DivertTargetValue") + if override_tunnel_return_target == null: + self.__assert__( + InkUtils.is_ink_class(popped, "Void"), + "Expected void if ->-> doesn't override target" + ) + + if self.state.try_exit_function_evaluation_from_game(): + pass + elif self.state.callstack.current_element.type != pop_type || !self.state.callstack.can_pop: + var names = {} # Dictionary + names[Ink.PushPopType.FUNCTION] = "function return statement (~ return)" + names[Ink.PushPopType.TUNNEL] = "tunnel onwards statement (->->)" + + var expected = names[self.state.callstack.current_element.type] + if !self.state.callstack.can_pop: + expected = "end of flow (-> END or choice)" + + var error_msg = "Found %s, when expected %s" % [names[pop_type], expected] + + error(error_msg) + else: + self.state.pop_callstack() + + if override_tunnel_return_target: + self.state.diverted_pointer = self.pointer_at_path(override_tunnel_return_target.target_path) + + InkControlCommand.CommandType.BEGIN_STRING: + self.state.push_to_output_stream(eval_command) + + self.__assert__( + self.state.in_expression_evaluation == true, + "Expected to be in an expression when evaluating a string" + ) + self.state.in_expression_evaluation = false + + InkControlCommand.CommandType.BEGIN_TAG: + self.state.push_to_output_stream(eval_command) + + InkControlCommand.CommandType.END_TAG: + if self.state.in_string_evaluation: + var content_stack_for_tag := [] # Stack + var output_count_consumed := 0 + + var i = self.state.output_stream.size() - 1 + while i >= 0: + var obj = self.state.output_stream[i] + + output_count_consumed += 1 + + var command = InkUtils.as_or_null(obj, "ControlCommand") + if command != null: + if command.command_type == InkControlCommand.CommandType.BEGIN_TAG: + break + else: + self.error("Unexpected ControlCommand while extracting tag from choice") + break + + if InkUtils.is_ink_class(obj, "StringValue"): + content_stack_for_tag.push_front(obj) + + i -= 1 + + self.state.pop_from_output_stream(output_count_consumed) + + var sb = "" + for str_val in content_stack_for_tag: + sb += str_val.value + + var choice_tag = InkTag.new(self.state.clean_output_whitespace(sb)) + + self.state.push_evaluation_stack(choice_tag) + else: + self.state.push_to_output_stream(eval_command) + + + InkControlCommand.CommandType.END_STRING: + var content_stack_for_string := [] # Stack + var content_to_retain := [] # Stack + + var output_count_consumed := 0 + var i = self.state.output_stream.size() - 1 + while (i >= 0): + var obj = self.state.output_stream[i] + + output_count_consumed += 1 + + var command = InkUtils.as_or_null(obj, "ControlCommand") + if (command != null && + command.command_type == InkControlCommand.CommandType.BEGIN_STRING): + break + + if InkUtils.is_ink_class(obj, "Tag"): + content_to_retain.push_front(obj) + + if InkUtils.is_ink_class(obj, "StringValue"): + content_stack_for_string.push_front(obj) + + i -= 1 + + self.state.pop_from_output_stream(output_count_consumed) + + for rescued_tag in content_to_retain: + state.push_to_output_stream(rescued_tag) + + var _str := "" + for c in content_stack_for_string: + _str += c._to_string() + + self.state.in_expression_evaluation = true + self.state.push_evaluation_stack(InkStringValue.new_with(_str)) + + InkControlCommand.CommandType.CHOICE_COUNT: + var choice_count = self.state.generated_choices.size() + self.state.push_evaluation_stack(InkIntValue.new_with(choice_count)) + + InkControlCommand.CommandType.TURNS: + self.state.push_evaluation_stack(InkIntValue.new_with(self.state.current_turn_index + 1)) + + InkControlCommand.CommandType.TURNS_SINCE, InkControlCommand.CommandType.READ_COUNT: + var target = self.state.pop_evaluation_stack() + if !InkUtils.is_ink_class(target, "DivertTargetValue"): + var extra_note = "" + if InkUtils.is_ink_class(target, "IntValue"): + extra_note = ". Did you accidentally pass a read count ('knot_name') instead of a target ('-> knot_name')?" + error(str("TURNS_SINCE expected a divert target (knot, stitch, label name), but saw ", + target, extra_note)) + return false + + var divert_target = InkUtils.as_or_null(target, "DivertTargetValue") + var container = InkUtils.as_or_null(self.content_at_path(divert_target.target_path).correct_obj, "InkContainer") + + var either_count = 0 + if container != null: + if eval_command.command_type == InkControlCommand.CommandType.TURNS_SINCE: + either_count = self.state.turns_since_for_container(container) + else: + either_count = self.state.visit_count_for_container(container) + else: + if eval_command.command_type == InkControlCommand.CommandType.TURNS_SINCE: + either_count = -1 + else: + either_count = 0 + + warning(str("Failed to find container for ", eval_command._to_string(), + " lookup at ", divert_target.target_path._to_string())) + + self.state.push_evaluation_stack(InkIntValue.new_with(either_count)) + + InkControlCommand.CommandType.RANDOM: + var max_int = InkUtils.as_or_null(self.state.pop_evaluation_stack(), "IntValue") + var min_int = InkUtils.as_or_null(self.state.pop_evaluation_stack(), "IntValue") + + if min_int == null: + error("Invalid value for minimum parameter of RANDOM(min, max)") + return false + + if max_int == null: + error("Invalid value for maximum parameter of RANDOM(min, max)") + return false + + var random_range + if max_int.value == (1 << 63) - 1 && min_int.value == 0: + random_range = max_int.value + error(str("RANDOM was called with a range that exceeds the size that ink numbers can use.")) + return false + else: + random_range = max_int.value - min_int.value + 1 + if random_range <= 0: + error(str("RANDOM was called with minimum as ", min_int.value, + " and maximum as ", max_int.value, ". The maximum must be larger")) + return false + + var result_seed = self.state.story_seed + self.state.previous_random + seed(result_seed) + + var next_random = randi() + var chosen_value = (next_random % random_range) + min_int.value + self.state.push_evaluation_stack(InkIntValue.new_with(chosen_value)) + + self.state.previous_random = next_random + + InkControlCommand.CommandType.SEED_RANDOM: + var _seed = InkUtils.as_or_null(self.state.pop_evaluation_stack(), "IntValue") + if _seed == null: + error("Invalid value passed to SEED_RANDOM") + return false + + self.state.story_seed = _seed.value + self.state.previous_random = 0 + + self.state.push_evaluation_stack(InkVoid.new()) + + InkControlCommand.CommandType.VISIT_INDEX: + var count = self.state.visit_count_for_container(self.state.current_pointer.container) - 1 + self.state.push_evaluation_stack(InkIntValue.new_with(count)) + + InkControlCommand.CommandType.SEQUENCE_SHUFFLE_INDEX: + var shuffle_index = self.next_sequence_shuffle_index() + self.state.push_evaluation_stack(InkIntValue.new_with(shuffle_index)) + + InkControlCommand.CommandType.START_THREAD: + pass + + InkControlCommand.CommandType.DONE: + if self.state.callstack.can_pop_thread: + self.state.callstack.pop_thread() + else: + self.state.did_safe_exit = true + self.state.current_pointer = InkPointer.null_pointer + + InkControlCommand.CommandType.END: + self.state.force_end() + + InkControlCommand.CommandType.LIST_FROM_INT: + var int_val = InkUtils.as_or_null(self.state.pop_evaluation_stack(), "IntValue") + var list_name_val = InkUtils.as_or_null(self.state.pop_evaluation_stack(), "StringValue") + + if int_val == null: + self._throw_story_exception( + "Passed non-integer when creating a list element from a numerical value." + ) + return false + + var generated_list_value = null # ListValue + + var found_list_def: InkTryGetResult = self.list_definitions.try_list_get_definition(list_name_val.value) + if found_list_def.exists: + var found_item: InkTryGetResult = found_list_def.result.try_get_item_with_value(int_val.value) + if found_item.exists: + generated_list_value = InkListValue.new_with_single_item( + found_item.result, + int_val.value + ) + else: + self._throw_story_exception("Failed to find LIST called %s" % list_name_val.value) + return false + + if generated_list_value == null: + generated_list_value = InkListValue.new() + + self.state.push_evaluation_stack(generated_list_value) + + InkControlCommand.CommandType.LIST_RANGE: + var max_value = InkUtils.as_or_null(self.state.pop_evaluation_stack(), "Value") + var min_value = InkUtils.as_or_null(self.state.pop_evaluation_stack(), "Value") + + var target_list = InkUtils.as_or_null(self.state.pop_evaluation_stack(), "ListValue") + + if target_list == null || min_value == null || max_value == null: + self._throw_story_exception("Expected list, minimum and maximum for LIST_RANGE") + return false + + var result = target_list.value.list_with_sub_range(min_value.value_object, max_value.value_object) + + self.state.push_evaluation_stack(InkListValue.new_with(result)) + + InkControlCommand.CommandType.LIST_RANDOM: + + var list_val = InkUtils.as_or_null(self.state.pop_evaluation_stack(), "ListValue") + if list_val == null: + self._throw_story_exception("Expected list for LIST_RANDOM") + return false + + var list = list_val.value + + var new_list = null # InkList + + if list.size() == 0: + new_list = InkList.new() + else: + var result_seed = self.state.story_seed + self.state.previous_random + seed(result_seed) + + var next_random = randi() + var list_item_index = next_random % list.size() + + # Iterator-based code in replaced with this code: + if list_item_index < 0: list_item_index = 0 + if list_item_index >= list.size(): list_item_index = list.size() - 1 + + var raw_random_item = list.raw_keys()[list_item_index] + var random_item = InkListItem.from_serialized_key(raw_random_item) + var random_item_value = list.get_raw(raw_random_item) + + new_list = InkList.new_with_origin(random_item.origin_name, self) + new_list.set_raw(raw_random_item, random_item_value) + + self.state.previous_random = next_random + + self.state.push_evaluation_stack(InkListValue.new_with(new_list)) + + _: + error("unhandled ControlCommand: " + eval_command._to_string()) + return false + + return true + + elif InkUtils.as_or_null(content_obj, "VariableAssignment"): + var var_ass = content_obj + var assigned_val = self.state.pop_evaluation_stack() + + # This does not exist in the original codebase. + # It ensures the type is correct, so we execution + # isn't stopped when the argument has an incorrect + # type. (In the original codebase, this is handled + # through exceptions.) + if !InkUtils.is_ink_class(assigned_val, "InkObject"): + return false + + self.state.variables_state.assign(var_ass, assigned_val) + + return true + + elif InkUtils.as_or_null(content_obj, "VariableReference"): + var var_ref = content_obj + var found_value = null # InkValue + + if var_ref.path_for_count != null: + var container = var_ref.container_for_count + var count = self.state.visit_count_for_container(container) + found_value = InkIntValue.new_with(count) + else: + found_value = self.state.variables_state.get_variable_with_name(var_ref.name) + + if found_value == null: + warning(str("Variable not found: '", var_ref.name, + "', using default value of 0 (false). this can ", + "happen with temporary variables if the declaration ", + "hasn't yet been hit. Globals are always given a default ", + "value on load if a value doesn't exist in the save state.")) + found_value = InkIntValue.new_with(0) + + self.state.push_evaluation_stack(found_value) + return true + + elif InkUtils.as_or_null(content_obj, "NativeFunctionCall"): + var function = content_obj + var func_params = self.state.pop_evaluation_stack(function.number_of_parameters) + var result = function.call_with_parameters(func_params, _make_story_error_metadata()) + self.state.push_evaluation_stack(result) + return true + + return false + +# (String, bool, Array) -> void +func choose_path_string(path, reset_callstack = true, arguments = null): + if async_we_cant("call ChoosePathString right now"): + return + + emit_signal("on_choose_path_string", path, arguments) + + if reset_callstack: + self.reset_callstack() + else: + if self.state.callstack.current_element.type == Ink.PushPopType.FUNCTION: + var func_detail = "" + var container = self.state.callstack.current_element.current_pointer.container + if container != null: + func_detail = "(" + container.path._to_string() + ") " + + InkUtils.throw_exception( + ("Story was running a function %s" % func_detail) + + ("when you called ChoosePathString(%s) " % path) + + "- this is almost certainly not not what you want! Full stack trace: \n" + + self.state.callstack.callstack_trace + ) + + return + + self.state.pass_arguments_to_evaluation_stack(arguments) + self.choose_path(InkPath.new_with_components_string(path)) + + +func async_we_cant(activity_str): + if self._async_continue_active: + InkUtils.throw_exception( + "Can't %s. Story is in the middle of a ContinueAsync(). " % activity_str + + "Make more ContinueAsync() calls or a single Continue() call beforehand." + ) + + return _async_continue_active + + +# (InkPath, bool) +func choose_path(p, incrementing_turn_index = true): + self.state.set_chosen_path(p, incrementing_turn_index) + + self.visit_changed_containers_due_to_divert() + + +# (int) -> void +func choose_choice_index(choice_idx): + var choices = self.current_choices + self.__assert__( + choice_idx >= 0 && choice_idx < choices.size(), + "choice out of range" + ) + + var choice_to_choose = choices[choice_idx] + emit_signal("on_make_choice", choice_to_choose) + + self.state.callstack.current_thread = choice_to_choose.thread_at_generation + + choose_path(choice_to_choose.target_path) + + +# (String) -> bool +func has_function(function_name: String) -> bool: + return knot_container_with_name(function_name) != null + + +# (String, Array, bool) -> Variant +func evaluate_function( + function_name: String, + arguments = null, + return_text_output: bool = false +): + # Like inkjs, evaluate_function behaves differently than the C# version. + # In C#, you can pass a (second) parameter `out textOutput` to get the + # text outputted by the function. Instead, we maintain the regular signature, + # plus an optional third parameter return_text_output. If set to true, we will + # return both the text_output and the returned value, as a Dictionary. + + emit_signal("on_evaluate_function", function_name, arguments) + if async_we_cant("evaluate a function"): + return + + if function_name == null: + InkUtils.throw_exception("Function is null") + return null + elif function_name == "" || InkUtils.trim(function_name) == "": + InkUtils.throw_exception("Function is empty or white space.") + return null + + var func_container = knot_container_with_name(function_name) + if func_container == null: + InkUtils.throw_exception("Function doesn't exist: '%s'" % function_name) + return null + + var output_stream_before = self.state.output_stream.duplicate() # Array + _state.reset_output() + + self.state.start_function_evaluation_from_game(func_container, arguments) + + # TODO: Add comment - This code did not exist in upstream. + if self._ink_runtime.clear_raised_exceptions(): + return null + + var string_output = "" + while self.can_continue: + string_output += self.continue_story() + + var text_output = string_output + + _state.reset_output(output_stream_before) + + var result = self.state.complete_function_evaluation_from_game() + + emit_signal("on_complete_evaluate_function", function_name, arguments, text_output, result) + if return_text_output: + return { "result": result, "output": text_output } + else: + return result + + +# (InkContainer) -> InkObject +func evaluate_expression(expr_container: InkContainer) -> InkObject: + var start_callstack_height = self.state.callstack.elements.size() + + self.state.callstack.push(Ink.PushPopType.TUNNEL) + + _temporary_evaluation_container = expr_container + + self.state.go_to_start() + + var eval_stack_height = self.state.evaluation_stack.size() + + self.continue_story() + + _temporary_evaluation_container = null + + if self.state.callstack.elements.size() > start_callstack_height: + self.state.pop_callstack() + + var end_stack_height = self.state.evaluation_stack.size() + if end_stack_height > eval_stack_height: + return self.state.pop_evaluation_stack() + else: + return null + +var allow_external_function_fallbacks = false # bool + + +# (String, int) -> void +func call_external_function(func_name: String, number_of_arguments: int) -> void: + var _func_def = null # ExternalFunctionDef + var fallback_function_container = null # InkContainer + + if self._externals.has(func_name): + _func_def = self._externals.get(func_name) + if _func_def != null && !_func_def.lookahead_safe && self._state_snapshot_at_last_newline != null: + self._saw_lookahead_unsafe_function_after_newline = true + return + + if _func_def == null: + if allow_external_function_fallbacks: + fallback_function_container = self.knot_container_with_name(func_name) + self.__assert__( + fallback_function_container != null, + "Trying to call EXTERNAL function '%s' " % func_name + + "which has not been bound, and fallback ink function" + + "could not be found." + ) + + self.state.callstack.push( + Ink.PushPopType.FUNCTION, + 0, + self.state.output_stream.size() + ) + + self.state.diverted_pointer = InkPointer.start_of(fallback_function_container) + return + else: + self.__assert__( + false, + "Trying to call EXTERNAL function '%s' " % func_name + + "which has not been bound (and ink fallbacks disabled)." + ) + return + + var arguments = [] # Array + var i = 0 + while i < number_of_arguments: + var popped_obj = InkUtils.as_or_null(self.state.pop_evaluation_stack(), "Value") + var value_obj = popped_obj.value_object + arguments.append(value_obj) + + i += 1 + + arguments.reverse() + + var func_result = _func_def.execute(arguments) + + var return_obj = null + if func_result != null: + return_obj = InkValue.create(func_result) + self.__assert__( + return_obj != null, + "Could not create ink value from returned object of type %s" % \ + InkUtils.typename_of(typeof(func_result)) + ) + else: + return_obj = InkVoid.new() + + self.state.push_evaluation_stack(return_obj) + + +# (String, Variant, ExternalFunctionDef, bool) -> void +func bind_external_function_general( + func_name: String, + object, + method: String, + lookahead_safe: bool = true +) -> void: + if async_we_cant("bind an external function"): + return + + self.__assert__( + !_externals.has(func_name), + "Function '%s' has already been bound." % func_name + ) + + _externals[func_name] = ExternalFunctionDef.new(object, method, lookahead_safe) + + +# try_coerce not needed. + + +# (String, Variant, String, bool) -> void +func bind_external_function( + func_name: String, + object, + method_name: String, + lookahead_safe: bool = false +) -> void: + self.__assert__( + object != null || method_name != null, + "Can't bind a null function" + ) + + bind_external_function_general(func_name, object, method_name, lookahead_safe) + + +func unbind_external_function(func_name: String) -> void: + if async_we_cant("unbind an external a function"): + return + + self.__assert__( + _externals.has(func_name), + "Function '%s' has not been bound." % func_name + ) + _externals.erase(func_name) + + +func validate_external_bindings() -> void: + var missing_externals: InkStringSet = InkStringSet.new() + + validate_external_bindings_with(_main_content_container, missing_externals) + _has_validated_externals = true + + if missing_externals.size() == 0: + _has_validated_externals = true + else: + var message: String = "ERROR: Missing function binding for external %s: '%s' %s" % [ + "s" if missing_externals.size() > 1 else "", + "', '", InkUtils.join("', '", missing_externals.to_array()), + ", and no fallback ink function found." if allow_external_function_fallbacks else " (ink fallbacks disabled)" + ] + + error(message) + + +func validate_external_bindings_with(o: InkObject, missing_externals: InkStringSet) -> void: + var container = InkUtils.as_or_null(o, "InkContainer") + if container: + for inner_content in o.content: + var inner_container = InkUtils.as_or_null(inner_content, "InkContainer") + if inner_container == null || !inner_container.has_valid_name: + validate_external_bindings_with(inner_content, missing_externals) + + for inner_key in o.named_content: + validate_external_bindings_with( + InkUtils.as_or_null(o.named_content[inner_key], "InkObject"), + missing_externals + ) + return + + var divert = InkUtils.as_or_null(o, "Divert") + if divert && divert.is_external: + var name = divert.target_path_string + + if !_externals.has(name): + if allow_external_function_fallbacks: + var fallback_found = self.main_content_container.named_content.has(name) + if !fallback_found: + missing_externals.append(name) + else: + missing_externals.append(name) + + +# (String, Object, String) -> void +func observe_variable(variable_name: String, object, method_name: String) -> void: + if async_we_cant("observe a new variable"): + return + + if _variable_observers == null: + _variable_observers = {} + + if !self.state.variables_state.global_variable_exists_with_name(variable_name): + InkUtils.throw_exception( + "Cannot observe variable '%s'" % variable_name + + "because it wasn't declared in the ink story." + ) + return + + if _variable_observers.has(variable_name): + _variable_observers[variable_name].connect("variable_changed", Callable(object, method_name)) + else: + var new_observer = VariableObserver.new(variable_name) + new_observer.connect("variable_changed", Callable(object, method_name)) + + _variable_observers[variable_name] = new_observer + + +# (Array, Object, String) -> void +func observe_variables(variable_names: Array, object, method_name: String) -> void: + for var_name in variable_names: + observe_variable(var_name, object, method_name) + + +# (Object, String, String) -> void +# TODO: Rewrite this poor documentation and improve method beyond what +# upstream offers. +# +# Potential cases: +# - specific_variable_name is null, but object and method_name are both present +# -> all signals, pointing to object & method_name and regardless of the +# variable they listen to, are disconnected. +# +# - specific_variable_name is present, but both object and method_name are null +# -> all signals listening to changes of specific_variable_name are disconnected. +# +# - object and method_name have mismatched presence +# -> this is an unsuported case at the moment. +func remove_variable_observer(object = null, method_name = null, specific_variable_name = null): + if async_we_cant("remove a variable observer"): + return + + if _variable_observers == null: + return + + if specific_variable_name != null: + if _variable_observers.has(specific_variable_name): + var observer = _variable_observers[specific_variable_name] + if object != null && method_name != null: + observer.disconnect("variable_changed", Callable(object, method_name)) + + if observer.get_signal_connection_list("variable_changed").is_empty(): + _variable_observers.erase(specific_variable_name) + else: + var connections = observer.get_signal_connection_list("variable_changed"); + for connection in connections: + observer.disconnect(connection.signal.get_name(), connection.callable) + + _variable_observers.erase(specific_variable_name) + + elif object != null && method_name != null: + var keys_to_remove = [] + for observer_key in _variable_observers: + var observer = _variable_observers[observer_key] + if observer.is_connected("variable_changed", Callable(object, method_name)): + observer.disconnect("variable_changed", Callable(object, method_name)) + + if observer.get_signal_connection_list("variable_changed").is_empty(): + keys_to_remove.append(observer_key) + + for key in keys_to_remove: + _variable_observers.erase(key) + + +func variable_state_did_change_event(variable_name: String, new_value_obj: InkObject) -> void: + if _variable_observers == null: + return + + if _variable_observers.has(variable_name): + var observer = _variable_observers[variable_name] + + if !InkUtils.is_ink_class(new_value_obj, "Value"): + InkUtils.throw_exception("Tried to get the value of a variable that isn't a standard type") + return + + var val = new_value_obj + + observer.emit_signal("variable_changed", variable_name, val.value_object) + + +var global_tags: # Array + get: + return self.tags_at_start_of_flow_container_with_path_string("") + +# (String) -> Array? +func tags_for_content_at_path(path: String): + return self.tags_at_start_of_flow_container_with_path_string(path) + +# (String) -> Array? +func tags_at_start_of_flow_container_with_path_string(path_string: String): + var path = InkPath.new_with_components_string(path_string) + + var flow_container = content_at_path(path).container + while (true): + var first_content = flow_container.content[0] + if InkUtils.is_ink_class(first_content, "InkContainer"): + flow_container = first_content + else: break + + var in_tag := false + var tags = null # Array + for c in flow_container.content: + var command = InkUtils.as_or_null(c, "ControlCommand") + if command != null: + if command.command_type == InkControlCommand.CommandType.BEGIN_TAG: + in_tag = true + elif command.command_type == InkControlCommand.CommandType.END_TAG: + in_tag = false + elif in_tag: + var _str = InkUtils.as_or_null(c, "StringValue") + if _str != null: + if tags == null: + tags = [] # Array + tags.append(_str.value) + print(str("\"", _str.value, "\"")) + else: + self.error(str( + "Tag contained non-text content. Only plain text is allowed when using ", + "globalTags or TagsAtContentPath. If you want to evaluate dynamic ", + "content, you need to use story.Continue()." + )) + else: + break + + return tags + + +func build_string_of_container() -> String: + # TODO: Implement + return "" + + +func build_string_of_container_with(container: InkContainer) -> String: + # TODO: Implement + return "" + + +func next_content() -> void: + + self.state.previous_pointer = self.state.current_pointer + + if !self.state.diverted_pointer.is_null: + + self.state.current_pointer = self.state.diverted_pointer + self.state.diverted_pointer = InkPointer.null_pointer + + self.visit_changed_containers_due_to_divert() + + if !self.state.current_pointer.is_null: + return + + var successful_pointer_increment = self.increment_content_pointer() + + if !successful_pointer_increment: + var did_pop = false + + if self.state.callstack.can_pop_type(Ink.PushPopType.FUNCTION): + + self.state.pop_callstack(Ink.PushPopType.FUNCTION) + + if self.state.in_expression_evaluation: + self.state.push_evaluation_stack(InkVoid.new()) + + did_pop = true + elif self.state.callstack.can_pop_thread: + self.state.callstack.pop_thread() + + did_pop = true + else: + self.state.try_exit_function_evaluation_from_game() + + if did_pop && !self.state.current_pointer.is_null: + self.next_content() + + +func increment_content_pointer() -> bool: + var successful_increment = true + + var pointer = self.state.callstack.current_element.current_pointer + pointer = InkPointer.new(pointer.container, pointer.index + 1) + + while pointer.index >= pointer.container.content.size(): + + successful_increment = false + + var next_ancestor = InkUtils.as_or_null(pointer.container.parent, "InkContainer") + if !next_ancestor: + break + + var index_in_ancestor = next_ancestor.content.find(pointer.container) + if index_in_ancestor == -1: + break + + pointer = InkPointer.new(next_ancestor, index_in_ancestor + 1) + + successful_increment = true + + if !successful_increment: pointer = InkPointer.null_pointer + + var current_element = self.state.callstack.current_element + current_element.current_pointer = pointer + + return successful_increment + + +func try_follow_default_invisible_choice() -> bool: + var all_choices = _state.current_choices + + var invisible_choices = [] + for c in all_choices: + if c.is_invisible_default: + invisible_choices.append(c) + + if invisible_choices.size() == 0 || all_choices.size() > invisible_choices.size(): + return false + + var choice = invisible_choices[0] + + var callstack = self.state.callstack + callstack.current_thread = choice.thread_at_generation + + if self._state_snapshot_at_last_newline != null: + self.state.callstack.current_thread = self.state.callstack.fork_thread() + + choose_path(choice.target_path, false) + + return true + + +func next_sequence_shuffle_index() -> int: + var num_elements_int_val = InkUtils.as_or_null(self.state.pop_evaluation_stack(), "IntValue") + if num_elements_int_val == null: + error("expected number of elements in sequence for shuffle index") + return 0 + + var seq_container = self.state.current_pointer.container + + var num_elements = num_elements_int_val.value + + var seq_count_val = InkUtils.as_or_null(self.state.pop_evaluation_stack(), "IntValue") + var seq_count = seq_count_val.value + var loop_index = seq_count / num_elements + var iteration_index = seq_count % num_elements + + var seq_path_str = seq_container.path._to_string() + var sequence_hash = 0 + for c in seq_path_str: + sequence_hash += int(c) + + var random_seed = sequence_hash + loop_index + self.state.story_seed + seed(random_seed) + + var unpicked_indices = [] # Array + var i = 0 + while (i < num_elements): + unpicked_indices.append(i) + i += 1 + + i = 0 + while (i <= iteration_index): + var chosen = randi() % unpicked_indices.size() + var chosen_index = unpicked_indices[chosen] + unpicked_indices.remove_at(chosen) + + if i == iteration_index: + return chosen_index + + i += 1 + + InkUtils.throw_exception("Should never reach here") + return -1 + + +# (String, bool) -> void +func error(message: String, use_end_line_number: bool = false) -> void: + InkUtils.throw_story_exception(message, use_end_line_number, _make_story_error_metadata()) + + +# (String) -> void +func warning(message: String) -> void: + add_error(message, true) + + +# (String, bool, bool) -> void +func add_error(message: String, is_warning: bool = false, use_end_line_number: bool = false) -> void: + # This method differs from upstream, because GDScript doesn't support exceptions. + # Error formatting is handled by add_error_with_metadata, because there's a new + # method `add_story_error` used by `continue_internal` to report errors + # that occured during the step. + _add_error_with_metadata( + message, + is_warning, + use_end_line_number, + self.current_debug_metadata, + self.state.current_pointer + ) + + +# (StoryError) -> void +# +# This method doesn't exist in upstream. It's used by `continue_internal` to +# report error that occured during the step. +func add_story_error(story_error: StoryError) -> void: + _add_error_with_metadata( + story_error.message, + false, + story_error.use_end_line_number, + story_error.metadata.debug_metadata, + story_error.metadata.pointer + ) + + +# (bool, String?, Array?) -> void +func __assert__(condition: bool, message = null, format_params = null) -> void: + if condition == false: + if message == null: + message = "Story assert" + + if format_params != null && format_params.size() > 0: + message = message % format_params + + if self.current_debug_metadata != null: + InkUtils.throw_exception("%s %s" % [message, str(self.current_debug_metadata)]) + else: + InkUtils.throw_exception(message) + + +var current_debug_metadata: InkDebugMetadata: get = get_current_debug_metadata +func get_current_debug_metadata() -> InkDebugMetadata: + var dm # DebugMetadata + + var pointer = self.state.current_pointer + if !pointer.is_null: + dm = pointer.resolve().debug_metadata + if dm != null: + return dm + + var i = self.state.callstack.elements.size() - 1 + while (i >= 0): + pointer = self.state.callstack.elements[i].current_pointer + if !pointer.is_null && pointer.resolve() != null: + dm = pointer.resolve().debug_metadata + if dm != null: + return dm + + i -= 1 + + i = self.state.output_stream.size() - 1 + while(i >= 0): + var output_obj = self.state.output_stream[i] + dm = output_obj.debug_metadata + if dm != null: + return dm + + i -= 1 + + return null + + +var current_line_number: int: get = get_current_line_number +func get_current_line_number() -> int: + var dm = self.current_debug_metadata + if dm != null: + return dm.start_line_number + + return 0 + + +# InkContainer? +var main_content_container : get = get_main_content_container +func get_main_content_container(): + if _temporary_evaluation_container: + return _temporary_evaluation_container + else: + return _main_content_container + + +# InkContainer? +var _main_content_container = null +# ListDefinitionsOrigin? +var _list_definitions = null + +# Dictionary? +var _externals = null +# Dictionary? +var _variable_observers = null + +var _has_validated_externals: bool = false + +# InkContainer? +var _temporary_evaluation_container = null + +# StoryState? +var _state = null + +var _async_continue_active: bool = false +# StoryState? +var _state_snapshot_at_last_newline = null +var _saw_lookahead_unsafe_function_after_newline: bool = false # bool + +var _recursive_continue_count: int = 0 + +var _async_saving: bool = false + +# Profiler? +var _profiler = null + +# ############################################################################ # +# GDScript extra methods +# ############################################################################ # + +func is_ink_class(type: String) -> bool: + return type == "Story" || super.is_ink_class(type) + + +func get_ink_class() -> String: + return "Story" + + +func connect_exception(target: Object, method: String, binds = [], flags = 0) -> int: + var runtime = self._ink_runtime + if runtime == null: + return ERR_UNAVAILABLE + + if runtime.is_connected("exception_raised", Callable(target, method)): + return OK + + return runtime.connect("exception_raised", Callable(target, method).bind(binds), flags) + + +func _enable_story_exception_recording(enable: bool) -> void: + var runtime = self._ink_runtime + if runtime != null: + runtime.record_story_exceptions = enable + + +func _get_and_clear_recorded_story_exceptions() -> Array: + var runtime = self._ink_runtime + if runtime == null: + return [] + + var exceptions = runtime.current_story_exceptions + runtime.current_story_exceptions = [] + + return exceptions + + +func _add_error_with_metadata( + message: String, + is_warning: bool = false, + use_end_line_number: bool = false, + dm = null, + current_pointer = InkPointer.null_pointer +) -> void: + var error_type_str = "WARNING" if is_warning else "ERROR" + + if dm != null: + var line_num = dm.end_line_number if use_end_line_number else dm.start_line_number + message = "RUNTIME %s: '%s' line %s: %s" % [error_type_str, dm.file_name, line_num, message] + elif !current_pointer.is_null: + message = "RUNTIME %s: (%s): %s" % [error_type_str, current_pointer.path._to_string(), message] + else: + message = "RUNTIME " + error_type_str + ": " + message + + self.state.add_error(message, is_warning) + + if !is_warning: + self.state.force_end() + + +func _throw_story_exception(message: String): + InkUtils.throw_story_exception(message, false, _make_story_error_metadata()) + + +# This method is used to ensure that the debug metadata and pointer used +# to report errors are the ones at the moment the error occured (and not +# the current one). Since GDScript doesn't have exceptions, errors may be +# stored until they can be processed at the end of `continue_internal`. +func _make_story_error_metadata(): + return StoryErrorMetadata.new(self.current_debug_metadata, self.state.current_pointer) + + +# ############################################################################ # + +var StaticJSON: InkStaticJSON: + get: return self._ink_runtime.json + +var _ink_runtime: + get: return _weak_ink_runtime.get_ref() +var _weak_ink_runtime: WeakRef + +var _error_raised_during_step = [] + +func _initialize_runtime(ink_runtime = null): + if ink_runtime != null: + _weak_ink_runtime = weakref(ink_runtime) + else: + var runtime = Engine.get_main_loop().root.get_node("__InkRuntime") + + InkUtils.__assert__( + runtime != null, + str("[InkStory] Could not retrieve 'InkRuntime' singleton from the scene tree.") + ) + + _weak_ink_runtime = weakref(runtime) + +# ############################################################################ # + +class VariableObserver extends RefCounted: + var variable_name: String + + signal variable_changed(variable_name, new_value) + + func _init(variable_name: String): + self.variable_name = variable_name + + +class ExternalFunctionDef extends InkBase: + var object: Object + var method: String + var lookahead_safe: bool + + func _init(object: Object, method: String, lookahead_safe: bool): + # If object is not a reference, you're responsible to ensure it's + # still allocated. + self.object = weakref(object) + self.method = method + self.lookahead_safe = lookahead_safe + + # (Array) -> Variant + func execute(params: Array): + var object_ref = object.get_ref() + if object_ref != null: + return object_ref.callv(method, params) + else: + InkUtils.throw_exception( + "Object binded to %s has been deallocated, cannot execute." % method + ) + return null diff --git a/addons/inkgd/runtime/story_state.gd b/addons/inkgd/runtime/story_state.gd new file mode 100644 index 0000000..1c6da94 --- /dev/null +++ b/addons/inkgd/runtime/story_state.gd @@ -0,0 +1,1144 @@ +# warning-ignore-all:shadowed_variable +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkBase + +class_name InkStoryState + +var ValueType = preload("res://addons/inkgd/runtime/values/value_type.gd").ValueType + +var InkPointer = preload("res://addons/inkgd/runtime/structs/pointer.gd") +var InkPath = preload("res://addons/inkgd/runtime/ink_path.gd") + +# ############################################################################ # + +var InkValue = load("res://addons/inkgd/runtime/values/value.gd") +var InkStringValue = load("res://addons/inkgd/runtime/values/string_value.gd") + +var InkSimpleJSON = preload("res://addons/inkgd/runtime/simple_json.gd") +var InkStatePatch = preload("res://addons/inkgd/runtime/state_patch.gd") + +var InkCallStack = load("res://addons/inkgd/runtime/callstack.gd") +var InkVariablesState = load("res://addons/inkgd/runtime/variables_state.gd") +var InkFlow = load("res://addons/inkgd/runtime/flow.gd") + +# ############################################################################ # +# Self-reference +# ############################################################################ # + +static func InkStoryState() -> GDScript: + return load("res://addons/inkgd/runtime/story_state.gd") as GDScript + +# ############################################################################ # + +const INK_SAVE_STATE_VERSION: int = 10 +const MIN_COMPATIBLE_LOAD_VERSION: int = 8 + +# ############################################################################ # + +signal on_did_load_state() + +# ############################################################################ # + +func to_json() -> String: + var writer: InkSimpleJSON.Writer = InkSimpleJSON.Writer.new() + write_json(writer) + return writer._to_string() + +func load_json(json: String) -> void: + var jobject: Dictionary = InkSimpleJSON.text_to_dictionary(json) + load_json_obj(jobject) + emit_signal("on_did_load_state") + +func visit_count_at_path_string(path_string: String) -> int: + if self._patch != null: + var path = InkPath.new_with_components_string(path_string) + var container: InkContainer = self.story.content_at_path(path).container + if container == null: + InkUtils.throw_exception("Content at path not found: %s" % path_string) + return 0 + + var visit_count: InkTryGetResult = self._patch.try_get_visit_count(container) + if visit_count.exists: + return visit_count.result + + if self._visit_counts.has(path_string): + return self._visit_counts[path_string] + + return 0 + +func visit_count_for_container(container: InkContainer) -> int: + if !container.visits_should_be_counted: + self.story.error( + "Read count for target (%s - on %s) " % [container.name, container.debugMetadata] + + "unknown. The story may need to be compiled with countAllVisits flag (-c)." + ) + return 0 + + var count: int = 0 + + if self._patch != null: + var visit_count: InkTryGetResult = self._patch.try_get_visit_count(container) + if visit_count.exists: + return visit_count.result + + var container_path_str: String = container.path._to_string() + + if self._visit_counts.has(container_path_str): + count = self._visit_counts[container_path_str] + + return count + +func increment_visit_count_for_container(container: InkContainer) -> void: + if self._patch != null: + var curr_count: int = visit_count_for_container(container) + curr_count += 1 + self._patch.set_visit_count(container, curr_count) + return + + var count: int = 0 + var container_path_str: String = container.path._to_string() + if self._visit_counts.has(container_path_str): + count = self._visit_counts[container_path_str] + count += 1 + + self._visit_counts[container_path_str] = count + +func record_turn_index_visit_to_container(container: InkContainer) -> void: + if self._patch != null: + self._patch.set_turn_index(container, self.current_turn_index) + return + + var container_path_str: String = container.path._to_string() + + self._turn_indices[container_path_str] = self.current_turn_index + +# (InkContainer) -> int +func turns_since_for_container(container: InkContainer) -> int: + if !container.turn_index_should_be_counted: + self.story.error( + "TURNS_SINCE() for target (%s - on %s) " \ + % [container.name, container.debugMetadata] + + "unknown. The story may need to be compiled with countAllVisits flag (-c)." + ) + return 0 + + if self._patch != null: + var turn_index: InkTryGetResult = self._patch.try_get_turn_index(container) + if turn_index.exists: + return self.current_turn_index - turn_index.result + + var container_path_str: String = container.path._to_string() + if self._turn_indices.has(container_path_str): + return self.current_turn_index - self._turn_indices[container_path_str] + else: + return -1 + +var callstack_depth: int: + get: + return self.callstack.depth + +var output_stream: Array: # Array + get: + return self._current_flow.output_stream + +var current_choices: Array: # Array + get: + if self.can_continue: + return [] + return self._current_flow.current_choices + +var generated_choices: Array: # Array + get: + return self._current_flow.current_choices + +# Array +var current_errors = null + +# Array +var current_warnings = null + +# InkVariablesState +var variables_state + +var callstack: InkCallStack: get = get_callstack +func get_callstack() -> InkCallStack: + return self._current_flow.callstack + +# Array +var evaluation_stack: Array + +# Pointer +var diverted_pointer: InkPointer = InkPointer.null_pointer + +var current_turn_index: int = 0 +var story_seed: int = 0 +var previous_random: int = 0 +var did_safe_exit: bool = false + +var story : get = get_story +func get_story(): + return _story.get_ref() +var _story = WeakRef.new() + +# String? +var current_path_string : get = get_current_path_string +func get_current_path_string(): + var pointer = self.current_pointer + if pointer.is_null: + return null + else: + return pointer.path._to_string() + +var current_pointer: InkPointer: get = get_current_pointer, set = set_current_pointer +func get_current_pointer() -> InkPointer: + var pointer = self.callstack.current_element.current_pointer + return self.callstack.current_element.current_pointer + +func set_current_pointer(value: InkPointer): + var current_element = self.callstack.current_element + current_element.current_pointer = value + +var previous_pointer: InkPointer: get = get_previous_pointer, set = set_previous_pointer +func get_previous_pointer() -> InkPointer: + return self.callstack.current_thread.previous_pointer + +func set_previous_pointer(value: InkPointer): + var current_thread = self.callstack.current_thread + current_thread.previous_pointer = value + +var can_continue: bool: get = get_can_continue +func get_can_continue() -> bool: + return !self.current_pointer.is_null && !self.has_error + +var has_error: bool: get = get_has_error +func get_has_error() -> bool: + return self.current_errors != null && self.current_errors.size() > 0 + +var has_warning: bool: get = get_has_warning +func get_has_warning() -> bool: + return self.current_warnings != null && self.current_warnings.size() > 0 + +var current_text: String: get = get_current_text +func get_current_text(): + if self._output_stream_text_dirty: + var _str := "" + + var in_tag := false + for output_obj in self.output_stream: + var text_content = InkUtils.as_or_null(output_obj, "StringValue") + if !in_tag && text_content != null: + _str += text_content.value + else: + var control_command = InkUtils.as_or_null(output_obj, "ControlCommand") + if control_command != null: + if control_command.command_type == InkControlCommand.CommandType.BEGIN_TAG: + in_tag = true + elif control_command.command_type == InkControlCommand.CommandType.END_TAG: + in_tag = false + + self._current_text = self.clean_output_whitespace(_str) + + self._output_stream_text_dirty = false + + return self._current_text + +var _current_text: String = "" + +# (String) -> String +func clean_output_whitespace(str_to_clean: String) -> String: + var _str: String = "" + + var current_whitespace_start: int = -1 + var start_of_line: int = 0 + + var i: int = 0 + while(i < str_to_clean.length()): + var c: String = str_to_clean[i] + + var is_inline_whitespace: bool = (c == " " || c == "\t") + + if is_inline_whitespace && current_whitespace_start == -1: + current_whitespace_start = i + + if !is_inline_whitespace: + if (c != "\n" && current_whitespace_start > 0 && current_whitespace_start != start_of_line): + _str += " " + + current_whitespace_start = -1 + + if c == "\n": + start_of_line = i + 1 + + if !is_inline_whitespace: + _str += c + + i += 1 + + return _str + +# Array +var current_tags: Array: get = get_current_tags +func get_current_tags(): + if self._output_stream_tags_dirty: + self._current_tags = [] + + var in_tag := false + var sb := "" + + for output_obj in self.output_stream: + var control_command = InkUtils.as_or_null(output_obj, "ControlCommand") + + if control_command != null: + if control_command.command_type == InkControlCommand.CommandType.BEGIN_TAG: + if in_tag && sb.length() > 0: + var txt = self.clean_output_whitespace(sb) + self._current_tags.append(txt) + sb = "" + in_tag = true + elif control_command.command_type == InkControlCommand.CommandType.END_TAG: + if sb.length() > 0: + var txt = self.clean_output_whitespace(sb) + self._current_tags.append(txt) + sb = "" + in_tag = false + elif in_tag: + var str_val = InkUtils.as_or_null(output_obj, "StringValue") + if str_val != null: + sb += str_val.value + else: + var tag = InkUtils.as_or_null(output_obj, "Tag") + if tag != null && tag.text != null && !tag.text.is_empty(): + self._current_tags.append(tag.text) + + if !sb.is_empty(): + var txt = self.clean_output_whitespace(sb) + self._current_tags.append(txt) + sb = "" + + self._output_stream_tags_dirty = false + + return self._current_tags + +# Array +var _current_tags: Array = [] + +var current_flow_name: String: get = get_current_flow_name +func get_current_flow_name() -> String: + return self._current_flow.name + +var current_flow_is_default_flow: bool: get = get_current_flow_is_default_flow +func get_current_flow_is_default_flow() -> bool: + return self._current_flow.name == DEFAULT_FLOW_NAME + +var alive_flow_names: Array: get = get_alive_flow_names +func get_alive_flow_names() -> Array: + if self._alive_flow_names_dirty: + self._alive_flow_names = [] + + if self._named_flows != null: + for flow_name in self._named_flows.keys(): + if flow_name != DEFAULT_FLOW_NAME: + self._alive_flow_names.append(flow_name) + + self._alive_flow_names_dirty = false + + return self._alive_flow_names + +var _alive_flow_names: Array = [] + +var in_expression_evaluation: bool: + get: + return self.callstack.current_element.in_expression_evaluation + set(value): + var current_element = self.callstack.current_element + current_element.in_expression_evaluation = value + +# (InkStory) -> InkStoryState +func _init(story, ink_runtime = null): + find_static_objects(ink_runtime) + + self._story = weakref(story) + + self._current_flow = InkFlow.new_with_name(DEFAULT_FLOW_NAME, story, self.StaticJSON) + self.output_stream_dirty() + self._alive_flow_names_dirty = true + + self.evaluation_stack = [] + + self.variables_state = InkVariablesState.new(self.callstack, self.story.list_definitions, self._ink_runtime) + + self._visit_counts = {} + self._turn_indices = {} + self.current_turn_index = -1 + + randomize() + self.story_seed = randi() % 100 + self.previous_random = 0 + + self.go_to_start() + + +func go_to_start() -> void: + var current_element = self.callstack.current_element + current_element.current_pointer = InkPointer.start_of(self.story.main_content_container) + + +func switch_flow_internal(flow_name: String) -> void: + if flow_name == null: + InkUtils.throw_exception("Must pass a non-null string to Story.SwitchFlow") + + if self._named_flows == null: + self._named_flows = {} # Dictionary + self._named_flows[DEFAULT_FLOW_NAME] = self._current_flow + + if flow_name == self._current_flow.name: + return + + var flow + if self._named_flows.has(flow_name): + flow = self._named_flows[flow_name] + else: + flow = InkFlow.new_with_name(flow_name, self.story, self.StaticJSON) + self._named_flows[flow_name] = flow + self._alive_flow_names_dirty = true + + self._current_flow = flow + self.variables_state.callstack = self._current_flow.callstack + + self.output_stream_dirty() + + +func switch_to_default_flow_internal() -> void: + if self._named_flows == null: + return + + self.switch_flow_internal(DEFAULT_FLOW_NAME) + + +func remove_flow_internal(flow_name: String) -> void: + if flow_name == null: + InkUtils.throw_exception("Must pass a non-null string to Story.DestroyFlow") + return + + if flow_name == DEFAULT_FLOW_NAME: + InkUtils.throw_exception("Cannot destroy default flow") + return + + if self._current_flow.name == flow_name: + self.switch_to_default_flow_internal() + + self._named_flows.erase(flow_name) + self._alive_flow_names_dirty = true + +# () -> InkStoryState +func copy_and_start_patching(): + var copy = InkStoryState().new(self.story) + + copy._patch = InkStatePatch.new(self._patch) + + copy._current_flow.name = self._current_flow.name + copy._current_flow.callstack = InkCallStack.new(self._current_flow.callstack, self.StaticJSON) + copy._current_flow.current_choices += self._current_flow.current_choices + copy._current_flow.output_stream += self._current_flow.output_stream + copy.output_stream_dirty() + + if self._named_flows != null: + copy._named_flows = {} # Dictionary + for named_flow_key in self._named_flows.keys(): + var named_flow_value = self._named_flows[named_flow_key] + copy._named_flows[named_flow_key] = named_flow_value + copy._named_flows[self._current_flow.name] = copy._current_flow + copy._alive_flow_names_dirty = true + + if self.has_error: + copy.current_errors = [] # Array + copy.current_errors += self.current_errors + + if self.has_warning: + copy.current_warnings = [] # Array + copy.current_warnings += self.current_warnings + + copy.variables_state = variables_state + copy.variables_state.callstack = copy.callstack + copy.variables_state.patch = copy._patch + + copy.evaluation_stack += self.evaluation_stack + + if !diverted_pointer.is_null: + copy.diverted_pointer = self.diverted_pointer + + copy.previous_pointer = self.previous_pointer + + copy._visit_counts = self._visit_counts + copy._turn_indices = self._turn_indices + copy.current_turn_index = self.current_turn_index + copy.story_seed = self.story_seed + copy.previous_random = self.previous_random + + copy.did_safe_exit = self.did_safe_exit + + return copy + + +func restore_after_patch() -> void: + self.variables_state.callstack = self.callstack + self.variables_state.patch = self._patch + + +func apply_any_patch() -> void: + if self._patch == null: + return + + self.variables_state.apply_patch() + + for path_to_count_key in self._patch.visit_counts: + apply_count_changes(path_to_count_key, self._patch.visit_counts[path_to_count_key], true) + + for path_to_index_key in self._patch.turn_indices: + apply_count_changes(path_to_index_key, self._patch.turn_indices[path_to_index_key], false) + + self._patch = null + + +func apply_count_changes(container: InkContainer, new_count: int, is_visit: bool) -> void: + var counts = self._visit_counts if is_visit else self._turn_indices + counts[container.path._to_string()] = new_count + + +func write_json(writer: InkSimpleJSON.Writer) -> void: + writer.write_object_start() + + writer.write_property_start("flows") + writer.write_object_start() + + if self._named_flows != null: + for named_flow_key in self._named_flows.keys(): + var named_flow_value = self._named_flows[named_flow_key] + writer.write_property(named_flow_key, Callable(named_flow_value, "write_json")) + else: + writer.write_property(self._current_flow.name, Callable(self._current_flow, "write_json")) + + writer.write_object_end() + writer.write_property_end() + + writer.write_property("currentFlowName", self._current_flow.name) + writer.write_property("variablesState", Callable(self.variables_state, "write_json")) + writer.write_property("evalStack", Callable(self, "_anonymous_write_property_eval_stack")) + + if !self.diverted_pointer.is_null: + writer.write_property("currentDivertTarget", self.diverted_pointer.path.components_string) + + writer.write_property("visitCounts", Callable(self, "_anonymous_write_property_visit_counts")) + writer.write_property("turnIndices", Callable(self, "_anonymous_write_property_turn_indices")) + + writer.write_property("turnIdx", self.current_turn_index) + writer.write_property("storySeed", self.story_seed) + writer.write_property("previousRandom", self.previous_random) + + writer.write_property("inkSaveVersion", INK_SAVE_STATE_VERSION) + writer.write_property("inkFormatVersion", self.story.INK_VERSION_CURRENT) + writer.write_object_end() + + +func load_json_obj(jobject: Dictionary) -> void: + var jsave_version = null # Variant + if !jobject.has("inkSaveVersion"): + InkUtils.throw_exception("ink save format incorrect, can't load.") + return + else: + jsave_version = int(jobject["inkSaveVersion"]) + if jsave_version < MIN_COMPATIBLE_LOAD_VERSION: + InkUtils.throw_exception( + "Ink save format isn't compatible with the current version (saw " + + "'%d', but minimum is %d " % [jsave_version, MIN_COMPATIBLE_LOAD_VERSION] + + "), so can't load." + ) + return + + if jobject.has("flows"): + var flows_obj_dict = jobject["flows"] + + if flows_obj_dict.size() == 1: + self._named_flows = null + elif self._named_flows == null: + self._named_flows = {} # Dictionary + else: + self._named_flows.clear() + + for named_flow_obj_key in flows_obj_dict.keys(): + var name = named_flow_obj_key + var flow_obj = flows_obj_dict[named_flow_obj_key] + + var flow = InkFlow.new_with_name_and_jobject(name, self.story, flow_obj, self.StaticJSON) + + if flows_obj_dict.size() == 1: + self._current_flow = InkFlow.new_with_name_and_jobject(name, self.story, flow_obj, self.StaticJSON) + else: + self._named_flows[name] = flow + + if self._named_flows != null && self._named_flows.size() > 1: + var curr_flow_name = jobject["currentFlowName"] + self._current_flow = self._named_flows[curr_flow_name] + else: + self._named_flows = null + self._current_flow.name = DEFAULT_FLOW_NAME + self._current_flow.callstack.set_json_token(jobject["callstackThreads"], self.story) + self._current_flow.output_stream = self.StaticJSON.jarray_to_runtime_obj_list(jobject["outputStream"]) + self._current_flow.current_choices = self.StaticJSON.jarray_to_runtime_obj_list(jobject["currentChoices"]) + + var jchoice_threads_obj = jobject["choiceThreads"] if jobject.has("choiceThreads") else null + self._current_flow.load_flow_choice_threads(jchoice_threads_obj, self.story) + + self.output_stream_dirty() + self._alive_flow_names_dirty = true + + self.variables_state.set_json_token(jobject["variablesState"]) + self.variables_state.callstack = self._current_flow.callstack + + self.evaluation_stack = self.StaticJSON.jarray_to_runtime_obj_list(jobject["evalStack"]) + + if jobject.has("currentDivertTarget"): + var current_divert_target_path = jobject["currentDivertTarget"] + var divert_path = InkPath.new_with_components_string(current_divert_target_path._to_string()) + self.diverted_pointer = self.story.pointer_at_path(divert_path) + + self._visit_counts = self.StaticJSON.jobject_to_int_dictionary(jobject["visitCounts"]) + self._turn_indices = self.StaticJSON.jobject_to_int_dictionary(jobject["turnIndices"]) + self.current_turn_index = int(jobject["turnIdx"]) + self.story_seed = int(jobject["storySeed"]) + + # inkjs bug + if jobject.has("previousRandom"): + self.previous_random = int(jobject["previousRandom"]) + else: + self.previous_random = 0 + + +# () -> void +func reset_errors() -> void: + self.current_errors = null + self.current_warnings = null + + +# (Array?) -> void +func reset_output(objs = null) -> void: + self.output_stream.clear() + if objs != null: self.output_stream += objs + self.output_stream_dirty() + + +func push_to_output_stream(obj: InkObject) -> void: + var text = InkUtils.as_or_null(obj, "StringValue") + if text: + var list_text = self.try_splitting_head_tail_whitespace(text) + if list_text != null: + for text_obj in list_text: + self.push_to_output_stream_individual(text_obj) + + self.output_stream_dirty() + return + + self.push_to_output_stream_individual(obj) + self.output_stream_dirty() + + +func pop_from_output_stream(count: int) -> void: + InkUtils.remove_range(self.output_stream, self.output_stream.size() - count, count) + self.output_stream_dirty() + + +func try_splitting_head_tail_whitespace(single: InkStringValue): # Array + var _str = single.value + + var head_first_newline_idx = -1 + var head_last_newline_idx = -1 + + var i = 0 + while (i < _str.length()): + var c = _str[i] + if (c == "\n"): + if head_first_newline_idx == -1: + head_first_newline_idx = i + head_last_newline_idx = i + elif c == " " || c == "\t": + i += 1 + continue + else: + break + i += 1 + + + var tail_last_newline_idx = -1 + var tail_first_newline_idx = -1 + + var j = _str.length() - 1 + while (j >= 0): + var c = _str[j] + if (c == "\n"): + if tail_last_newline_idx == -1: + tail_last_newline_idx = j + tail_first_newline_idx = j + elif c == ' ' || c == '\t': + j -= 1 + continue + else: + break + j -= 1 + + if head_first_newline_idx == -1 && tail_last_newline_idx == -1: + return null + + var list_texts = [] # Array + var inner_str_start = 0 + var inner_str_end = _str.length() + + if head_first_newline_idx != -1: + if head_first_newline_idx > 0: + var leading_spaces = InkStringValue.new_with(_str.substr(0, head_first_newline_idx)) + list_texts.append(leading_spaces) + + list_texts.append(InkStringValue.new_with("\n")) + inner_str_start = head_last_newline_idx + 1 + + if tail_last_newline_idx != -1: + inner_str_end = tail_first_newline_idx + + if inner_str_end > inner_str_start: + var inner_str_text = _str.substr(inner_str_start, inner_str_end - inner_str_start) + list_texts.append(InkStringValue.new(inner_str_text)) + + if tail_last_newline_idx != -1 && tail_first_newline_idx > head_last_newline_idx: + list_texts.append(InkStringValue.new("\n")) + if tail_last_newline_idx < _str.length() - 1: + var num_spaces = (_str.length() - tail_last_newline_idx) - 1 + var trailing_spaces = InkStringValue.new(_str.substr(tail_last_newline_idx + 1, num_spaces)) + list_texts.append(trailing_spaces) + + return list_texts + + +func push_to_output_stream_individual(obj: InkObject) -> void: + var glue = InkUtils.as_or_null(obj, "Glue") + var text = InkUtils.as_or_null(obj, "StringValue") + + var include_in_output = true + + if glue: + self.trim_newlines_from_output_stream() + include_in_output = true + elif text: + var function_trim_index = -1 + var curr_el = self.callstack.current_element + if curr_el.type == Ink.PushPopType.FUNCTION: + function_trim_index = curr_el.function_start_in_ouput_stream + + var glue_trim_index = -1 + var i = self.output_stream.size() - 1 + while (i >= 0): + var o = self.output_stream[i] + var c = InkUtils.as_or_null(o, "ControlCommand") + var g = InkUtils.as_or_null(o, "Glue") + + if g: + glue_trim_index = i + break + elif c && c.command_type == InkControlCommand.CommandType.BEGIN_STRING: + if i >= function_trim_index: + function_trim_index = -1 + + break + + i -= 1 + + var trim_index = -1 + if glue_trim_index != -1 && function_trim_index != -1: + trim_index = min(function_trim_index, glue_trim_index) + elif glue_trim_index != -1: + trim_index = glue_trim_index + else: + trim_index = function_trim_index + + if trim_index != -1: + if text.is_newline: + include_in_output = false + elif text.is_non_whitespace: + + if glue_trim_index > -1: + self.remove_existing_glue() + + if function_trim_index > -1: + var callstack_elements = self.callstack.elements + var j = callstack_elements.size() - 1 + while j >= 0: + var el = callstack_elements[j] + if el.type == Ink.PushPopType.FUNCTION: + el.function_start_in_ouput_stream = -1 + else: + break + + j -= 1 + elif text.is_newline: + if self.output_stream_ends_in_newline || !self.output_stream_contains_content: + include_in_output = false + + if include_in_output: + self.output_stream.append(obj) + self.output_stream_dirty() + + +func trim_newlines_from_output_stream() -> void: + var remove_whitespace_from = -1 # int + + var i = self.output_stream.size() - 1 + while i >= 0: + var obj = self.output_stream[i] + var cmd = InkUtils.as_or_null(obj, "ControlCommand") + var txt = InkUtils.as_or_null(obj, "StringValue") + + if cmd || (txt && txt.is_non_whitespace): + break + elif txt && txt.is_newline: + remove_whitespace_from = i + + i -= 1 + + if remove_whitespace_from >= 0: + i = remove_whitespace_from + while i < self.output_stream.size(): + var text = InkUtils.as_or_null(self.output_stream[i], "StringValue") + if text: + self.output_stream.remove_at(i) + else: + i += 1 + + self.output_stream_dirty() + + +func remove_existing_glue() -> void: + var i = self.output_stream.size() - 1 + while (i >= 0): + var c = self.output_stream[i] + if InkUtils.is_ink_class(c, "Glue"): + self.output_stream.remove_at(i) + elif InkUtils.is_ink_class(c, "ControlCommand"): + break + + i -= 1 + + self.output_stream_dirty() + + +var output_stream_ends_in_newline: bool: get = get_output_stream_ends_in_newline +func get_output_stream_ends_in_newline() -> bool: + if self.output_stream.size() > 0: + var i = self.output_stream.size() - 1 + while (i >= 0): + var obj = self.output_stream[i] + if InkUtils.is_ink_class(obj, "ControlCommand"): + break + var text = InkUtils.as_or_null(self.output_stream[i], "StringValue") + if text: + if text.is_newline: + return true + elif text.is_non_whitespace: + break + + i -= 1 + + return false + + +var output_stream_contains_content: bool: get = get_output_stream_contains_content +func get_output_stream_contains_content() -> bool: + for content in self.output_stream: + if InkUtils.is_ink_class(content, "StringValue"): + return true + + return false + + +var in_string_evaluation: bool: get = get_in_string_evaluation +func get_in_string_evaluation() -> bool: + var i = self.output_stream.size() - 1 + + while (i >= 0): + var cmd = InkUtils.as_or_null(self.output_stream[i], "ControlCommand") + if cmd && cmd.command_type == InkControlCommand.CommandType.BEGIN_STRING: + return true + + i -= 1 + + return false + + +# (InkObject) -> void +func push_evaluation_stack(obj: InkObject) -> void: + var list_value = InkUtils.as_or_null(obj, "ListValue") + if list_value: + var raw_list = list_value.value + if raw_list.origin_names != null: + if raw_list.origins == null: raw_list.origins = [] # Array + raw_list.origins.clear() + + for n in raw_list.origin_names: + var def: InkTryGetResult = self.story.list_definitions.try_list_get_definition(n) + + if raw_list.origins.find(def.result) < 0: + raw_list.origins.append(def.result) + + self.evaluation_stack.append(obj) + + +# () -> InkObject +func peek_evaluation_stack() -> InkObject: + return self.evaluation_stack.back() + + +# This method combines both methods found in upstream. +# (int) -> InkObject | Array +func pop_evaluation_stack(number_of_objects: int = -1): + if number_of_objects == -1: + # This code raises an exception to match the behaviour of upstream. + # `pop_back` doesn't raise an error on an empty collection. + if self.evaluation_stack.size() == 0: + InkUtils.throw_exception("trying to pop an empty evaluation stack") + else : + return self.evaluation_stack.pop_back() + + if number_of_objects > self.evaluation_stack.size(): + InkUtils.throw_exception("trying to pop too many objects") + return [] + + var popped = InkUtils.get_range(self.evaluation_stack, + self.evaluation_stack.size() - number_of_objects, + number_of_objects) + + InkUtils.remove_range( + self.evaluation_stack, + self.evaluation_stack.size() - number_of_objects, number_of_objects + ) + return popped + + +# () -> void +func force_end() -> void: + self.callstack.reset() + + self._current_flow.current_choices.clear() + + self.current_pointer = InkPointer.null_pointer + self.previous_pointer = InkPointer.null_pointer + + self.did_safe_exit = true + + +func trim_whitespace_from_function_end() -> void: + assert(self.callstack.current_element.type == Ink.PushPopType.FUNCTION) + + var function_start_point = self.callstack.current_element.function_start_in_ouput_stream + + if function_start_point == -1: + function_start_point = 0 + + var i = self.output_stream.size() - 1 + while (i >= function_start_point): + var obj = self.output_stream[i] + var txt = InkUtils.as_or_null(obj, "StringValue") + var cmd = InkUtils.as_or_null(obj, "ControlCommand") + if !txt: + i -= 1 + continue + if cmd: break + + if txt.is_newline || txt.is_inline_whitespace: + self.output_stream.remove_at(i) + self.output_stream_dirty() + else: + break + + i -= 1 + + +# (Ink.PushPopType?) -> void +func pop_callstack(pop_type = null) -> void: + if (self.callstack.current_element.type == Ink.PushPopType.FUNCTION): + self.trim_whitespace_from_function_end() + + self.callstack.pop(pop_type) + + +# (InkPath, bool) -> void +func set_chosen_path(path: InkPath, incrementing_turn_index: bool) -> void: + self._current_flow.current_choices.clear() + + var new_pointer = self.story.pointer_at_path(path) + + if !new_pointer.is_null && new_pointer.index == -1: + new_pointer = InkPointer.new(new_pointer.container, 0) + + self.current_pointer = new_pointer + + if incrementing_turn_index: + self.current_turn_index += 1 + + +# (InkContainer, Array?) -> void +func start_function_evaluation_from_game(func_container: InkContainer, arguments) -> void: + self.callstack.push(Ink.PushPopType.FUNCTION_EVALUATION_FROM_GAME, self.evaluation_stack.size()) + var current_element = self.callstack.current_element + current_element.current_pointer = InkPointer.start_of(func_container) + + self.pass_arguments_to_evaluation_stack(arguments) + + +# (Array?) -> void +func pass_arguments_to_evaluation_stack(arguments) -> void: + if arguments != null: + var i = 0 + while (i < arguments.size()): + if !(arguments[i] is int || arguments[i] is float || arguments[i] is String || arguments[i] is bool || ((arguments[i] is Object) && arguments[i].is_ink_class("InkList"))): + InkUtils.throw_argument_exception( + "ink arguments when calling EvaluateFunction / " + + "ChoosePathStringWithParameters must be int, " + + "float, string, bool or InkList. Argument was " + + ("null" if arguments[i] == null else InkUtils.typename_of(arguments[i])) + ) + return + + push_evaluation_stack(InkValue.create(arguments[i])) + + i += 1 + + +# () -> bool +func try_exit_function_evaluation_from_game() -> bool: + if self.callstack.current_element.type == Ink.PushPopType.FUNCTION_EVALUATION_FROM_GAME: + self.current_pointer = InkPointer.null_pointer + self.did_safe_exit = true + return true + + return false + + +# () -> Variant +func complete_function_evaluation_from_game(): + if self.callstack.current_element.type != Ink.PushPopType.FUNCTION_EVALUATION_FROM_GAME: + InkUtils.throw_exception( + "Expected external function evaluation to be complete. Stack trace: %s" % \ + self.callstack_trace + ) + return null + + var original_evaluation_stack_height = self.callstack.current_element.evaluation_stack_height_when_pushed + + var returned_obj = null + while (self.evaluation_stack.size() > original_evaluation_stack_height): + var popped_obj = self.pop_evaluation_stack() + if returned_obj == null: + returned_obj = popped_obj + + self.pop_callstack(Ink.PushPopType.FUNCTION_EVALUATION_FROM_GAME) + + if returned_obj: + if InkUtils.is_ink_class(returned_obj, "Void"): + return null + + var return_val = InkUtils.as_or_null(returned_obj, "Value") + + if return_val.value_type == ValueType.DIVERT_TARGET: + return return_val.value_object._to_string() + + return return_val.value_object + + return null + + +func add_error(message: String, is_warning: bool) -> void: + if !is_warning: + if self.current_errors == null: + self.current_errors = [] # Array + self.current_errors.append(message) + else: + if self.current_warnings == null: + self.current_warnings = [] # Array + self.current_warnings.append(message) + + +func output_stream_dirty() -> void: + self._output_stream_text_dirty = true + self._output_stream_tags_dirty = true + +# ############################################################################ # + +# Dictionary +var _visit_counts: Dictionary + +# Dictionary +var _turn_indices: Dictionary + +var _output_stream_text_dirty: bool = true # bool +var _output_stream_tags_dirty: bool = true # bool + +var _patch # StatePatch? + +var _current_flow = null # Flow? +var _named_flows = null # Dictionary? +const DEFAULT_FLOW_NAME: String = "DEFAULT_FLOW" # String +var _alive_flow_names_dirty := true + + +# C# Actions & Delegates ##################################################### # + +func _anonymous_write_property_eval_stack(writer) -> void: + self.StaticJSON.write_list_runtime_objs(writer, self.evaluation_stack) + +func _anonymous_write_property_visit_counts(writer) -> void: + self.StaticJSON.write_int_dictionary(writer, self._visit_counts) + +func _anonymous_write_property_turn_indices(writer) -> void: + self.StaticJSON.write_int_dictionary(writer, self._turn_indices) + + +# ############################################################################ # +# GDScript extra methods +# ############################################################################ # + +func is_ink_class(type: String) -> bool: + return type == "StoryState" || super.is_ink_class(type) + +func get_ink_class() -> String: + return "StoryState" + + +# ############################################################################ # + +var StaticJSON: InkStaticJSON: + get: return self._ink_runtime.json + +var _ink_runtime: + get: return _weak_ink_runtime.get_ref() +var _weak_ink_runtime: WeakRef + +func find_static_objects(ink_runtime = null): + if ink_runtime != null: + _weak_ink_runtime = weakref(ink_runtime) + return + + var runtime = Engine.get_main_loop().root.get_node("__InkRuntime") + + InkUtils.__assert__( + runtime != null, + "[StoryState] Could not retrieve 'InkRuntime' singleton from the scene tree." + ) + + _weak_ink_runtime = weakref(runtime) + diff --git a/addons/inkgd/runtime/structs/pointer.gd b/addons/inkgd/runtime/structs/pointer.gd new file mode 100644 index 0000000..e7da392 --- /dev/null +++ b/addons/inkgd/runtime/structs/pointer.gd @@ -0,0 +1,125 @@ +# warning-ignore-all:shadowed_variable +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +# ############################################################################ # +# !! VALUE TYPE +# ############################################################################ # + +# Pointers are passed around a lot, to prevent duplicating them all the time +# and confusing the inspector when the debugger is attached, they are +# immutable rather than being duplicated. + +extends InkBase + +class_name InkPointer + +# ############################################################################ # + +# InkContainer +# Encapsulating container into a weak ref. +var container: InkContainer: + get: + return self._container.get_ref() + + set(value): + assert(false, "Pointer is immutable, cannot set container.") + +var _container: WeakRef = WeakRef.new() + +var index: int: + get: + return _index + + set(value): + assert(false, "Pointer is immutable, cannot set index.") + +var _index: int = 0 # int + + +# (InkContainer, int) -> InkPointer +func _init(container: InkContainer = null, index: int = 0): + if container == null: + self._container = WeakRef.new() + else: + self._container = weakref(container) + + self._index = index + + +# () -> InkContainer +func resolve(): + if self.index < 0: return self.container + if self.container == null: return null + if self.container.content.size() == 0: return self.container + if self.index >= self.container.content.size(): return null + + return self.container.content[self.index] + + +# ############################################################################ # + +# () -> bool +var is_null: bool: get = get_is_null +func get_is_null() -> bool: + return self.container == null + + +# ############################################################################ # + +# TODO: Make inspectable +# () -> InkPath +var path: InkPath: + get: + if self.is_null: + return null + + if self.index >= 0: + return self.container.path.path_by_appending_component( + InkPath.Component.new(self.index) + ) + else: + return self.container.path + + +############################################################################# # + +func _to_string() -> String: + if self.container == null: + return "Ink Pointer (null)" + + return "Ink Pointer -> %s -- index %d" % [self.container.path._to_string(), self.index] + + +# (InkContainer) -> InkPointer +static func start_of(container: InkContainer) -> InkPointer: + return InkPointer.new(container, 0) + +# ############################################################################ # + +# () -> InkPointer +static var null_pointer: InkPointer: + get: return InkPointer.new(null, -1) + + +# ############################################################################ # +# GDScript extra methods +# ############################################################################ # + +func is_ink_class(type: String) -> bool: + return type == "InkPointer" || super.is_ink_class(type) + + +func get_ink_class() -> String: + return "InkPointer" + + +func duplicate() -> InkPointer: + return InkPointer.new(self.container, self.index) diff --git a/addons/inkgd/runtime/values/bool_value.gd b/addons/inkgd/runtime/values/bool_value.gd new file mode 100644 index 0000000..783eccb --- /dev/null +++ b/addons/inkgd/runtime/values/bool_value.gd @@ -0,0 +1,62 @@ +# warning-ignore-all:shadowed_variable +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkValue + +class_name InkBoolValue + +# ############################################################################ # + +func get_value_type() -> int: + return ValueType.BOOL + +func get_is_truthy() -> bool: + return value + +func _init(): + value = false + +# The method takes a `StoryErrorMetadata` object as a parameter that +# doesn't exist in upstream. The metadat are used in case an 'exception' +# is raised. For more information, see story.gd. +func cast(new_type, metadata = null): + if new_type == self.value_type: + return self + + if new_type == ValueType.INT: + return IntValue().new_with(1 if value else 0) + + if new_type == ValueType.FLOAT: + return FloatValue().new_with(1.0 if value else 0.0) + + if new_type == ValueType.STRING: + return StringValue().new_with("true" if value else "false") + + InkUtils.throw_story_exception(bad_cast_exception_message(new_type), false, metadata) + return null + +func _to_string() -> String: + return "true" if value else "false" + +# ######################################################################## # +# GDScript extra methods +# ######################################################################## # + +func is_ink_class(type): + return type == "BoolValue" || super.is_ink_class(type) + +func get_ink_class(): + return "BoolValue" + +static func new_with(val): + var value = BoolValue().new() + value._init_with(val) + return value diff --git a/addons/inkgd/runtime/values/divert_target_value.gd b/addons/inkgd/runtime/values/divert_target_value.gd new file mode 100644 index 0000000..e828348 --- /dev/null +++ b/addons/inkgd/runtime/values/divert_target_value.gd @@ -0,0 +1,60 @@ +# warning-ignore-all:shadowed_variable +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkValue + +class_name InkDivertTargetValue + +# ############################################################################ # + +var target_path : get = get_target_path, set = set_target_path # InkPath +func get_target_path(): + return value +func set_target_path(value): + self.value = value + +func get_value_type(): + return ValueType.DIVERT_TARGET + +func get_is_truthy(): + InkUtils.throw_exception("Shouldn't be checking the truthiness of a divert target") + return false + +func _init(): + value = null + +# The method takes a `StoryErrorMetadata` object as a parameter that +# doesn't exist in upstream. The metadat are used in case an 'exception' +# is raised. For more information, see story.gd. +func cast(new_type, metadata = null): + if new_type == self.value_type: + return self + + InkUtils.throw_story_exception(bad_cast_exception_message(new_type), false, metadata) + return null + +func _to_string() -> String: + return "DivertTargetValue(" + self.target_path._to_string() + ")" + +# ######################################################################## # +# GDScript extra methods +# ######################################################################## # + +func is_ink_class(type): + return type == "DivertTargetValue" || super.is_ink_class(type) + +func get_ink_class(): + return "DivertTargetValue" + +static func new_with(val): + var value = DivertTargetValue().new() + value._init_with(val) + return value diff --git a/addons/inkgd/runtime/values/float_value.gd b/addons/inkgd/runtime/values/float_value.gd new file mode 100644 index 0000000..877d658 --- /dev/null +++ b/addons/inkgd/runtime/values/float_value.gd @@ -0,0 +1,59 @@ +# warning-ignore-all:shadowed_variable +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkValue + +class_name InkFloatValue + +# ############################################################################ # + +func get_value_type(): + return ValueType.FLOAT + +func get_is_truthy(): + return value != 0.0 + +func _init(): + value = 0.0 + +# The method takes a `StoryErrorMetadata` object as a parameter that +# doesn't exist in upstream. The metadat are used in case an 'exception' +# is raised. For more information, see story.gd. +func cast(new_type, metadata = null): + if new_type == self.value_type: + return self + + if new_type == ValueType.BOOL: + return BoolValue().new_with(false if value == 0 else true) + + if new_type == ValueType.INT: + return IntValue().new_with(int(value)) + + if new_type == ValueType.STRING: + return StringValue().new_with(str(value)) # TODO: Check formating + + InkUtils.throw_story_exception(bad_cast_exception_message(new_type), false, metadata) + return null + +# ######################################################################## # +# GDScript extra methods +# ######################################################################## # + +func is_ink_class(type): + return type == "FloatValue" || super.is_ink_class(type) + +func get_ink_class(): + return "FloatValue" + +static func new_with(val): + var value = FloatValue().new() + value._init_with(val) + return value diff --git a/addons/inkgd/runtime/values/int_value.gd b/addons/inkgd/runtime/values/int_value.gd new file mode 100644 index 0000000..66f5b99 --- /dev/null +++ b/addons/inkgd/runtime/values/int_value.gd @@ -0,0 +1,59 @@ +# warning-ignore-all:shadowed_variable +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkValue + +class_name InkIntValue + +# ############################################################################ # + +func get_value_type(): + return ValueType.INT + +func get_is_truthy(): + return value != 0 + +func _init(): + value = 0 + +# The method takes a `StoryErrorMetadata` object as a parameter that +# doesn't exist in upstream. The metadat are used in case an 'exception' +# is raised. For more information, see story.gd. +func cast(new_type, metadata = null): + if new_type == self.value_type: + return self + + if new_type == ValueType.BOOL: + return BoolValue().new_with(false if value == 0 else true) + + if new_type == ValueType.FLOAT: + return FloatValue().new_with(float(value)) + + if new_type == ValueType.STRING: + return StringValue().new_with(str(value)) + + InkUtils.throw_story_exception(bad_cast_exception_message(new_type), false, metadata) + return null + +# ######################################################################## # +# GDScript extra methods +# ######################################################################## # + +func is_ink_class(type): + return type == "IntValue" || super.is_ink_class(type) + +func get_ink_class(): + return "IntValue" + +static func new_with(val): + var value = IntValue().new() + value._init_with(val) + return value diff --git a/addons/inkgd/runtime/values/list_value.gd b/addons/inkgd/runtime/values/list_value.gd new file mode 100644 index 0000000..0df0901 --- /dev/null +++ b/addons/inkgd/runtime/values/list_value.gd @@ -0,0 +1,90 @@ +# warning-ignore-all:shadowed_variable +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkValue + +class_name InkListValue + +# ############################################################################ # + +func get_value_type(): + return ValueType.LIST + +func get_is_truthy(): + return value.size() > 0 + +# The method takes a `StoryErrorMetadata` object as a parameter that +# doesn't exist in upstream. The metadat are used in case an 'exception' +# is raised. For more information, see story.gd. +func cast(new_type, metadata = null): + if new_type == ValueType.INT: + var max_item = value.max_item + if max_item.key.is_null: + return IntValue().new_with(0) + else: + return IntValue().new_with(max_item.value) + + elif new_type == ValueType.FLOAT: + var max_item = value.max_item + if max_item.key.is_null: + return FloatValue().new_with(0.0) + else: + return FloatValue().new_with(float(max_item.value)) + + elif new_type == ValueType.STRING: + var max_item = value.max_item + if max_item.key.is_null: + return StringValue().new_with("") + else: + return StringValue().new_with(max_item.key._to_string()) + + if new_type == self.value_type: + return self + + InkUtils.throw_story_exception(bad_cast_exception_message(new_type), false, metadata) + return null + +func _init(): + value = InkList.new() + +func _init_with_list(list): + value = InkList.new_with_ink_list(list) + +func _init_with_single_item(single_item, single_value): + value = InkList.new_with_single_item(single_item, single_value) + +# (InkObject, InkObject) -> void +static func retain_list_origins_for_assignment(old_value, new_value): + var old_list = InkUtils.as_or_null(old_value, "ListValue") + var new_list = InkUtils.as_or_null(new_value, "ListValue") + + if old_list && new_list && new_list.value.size() == 0: + new_list.value.set_initial_origin_names(old_list.value.origin_names) + +# ############################################################################ # +# GDScript extra methods +# ############################################################################ # + +func is_ink_class(type): + return type == "ListValue" || super.is_ink_class(type) + +func get_ink_class(): + return "ListValue" + +static func new_with(list): + var value = ListValue().new() + value._init_with_list(list) + return value + +static func new_with_single_item(single_item, single_value): + var value = ListValue().new() + value._init_with_single_item(single_item, single_value) + return value diff --git a/addons/inkgd/runtime/values/string_value.gd b/addons/inkgd/runtime/values/string_value.gd new file mode 100644 index 0000000..c357ac7 --- /dev/null +++ b/addons/inkgd/runtime/values/string_value.gd @@ -0,0 +1,82 @@ +# warning-ignore-all:shadowed_variable +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkValue + +class_name InkStringValue + +# ############################################################################ # + +func get_value_type(): + return ValueType.STRING + +func get_is_truthy(): + return value.length() > 0 + +var is_newline: bool +var is_inline_whitespace: bool +var is_non_whitespace: bool: + get: + return !is_newline && !is_inline_whitespace + +func _init(): + value = "" + self._sanitize_value() + +func _init_with(val): + super._init_with(val) + self._sanitize_value() + +# The method takes a `StoryErrorMetadata` object as a parameter that +# doesn't exist in upstream. The metadat are used in case an 'exception' +# is raised. For more information, see story.gd. +func cast(new_type, metadata = null): + if new_type == self.value_type: + return self + + if new_type == ValueType.INT: + if self.value.is_valid_int(): + return IntValue().new_with(int(self.value)) + else: + return null + + if new_type == ValueType.FLOAT: + if self.value.is_valid_float(): + return FloatValue().new_with(float(self.value)) + else: + return null + + InkUtils.throw_story_exception(bad_cast_exception_message(new_type), false, metadata) + return null + +# ######################################################################## # +# GDScript extra methods +# ######################################################################## # + +func is_ink_class(type): + return type == "StringValue" || super.is_ink_class(type) + +func get_ink_class(): + return "StringValue" + +func _sanitize_value(): + is_newline = (self.value == "\n") + is_inline_whitespace = true + + for c in self.value: + if c != ' ' && c != "\t": + is_inline_whitespace = false + break + +static func new_with(val): + var value = StringValue().new() + value._init_with(val) + return value diff --git a/addons/inkgd/runtime/values/value.gd b/addons/inkgd/runtime/values/value.gd new file mode 100644 index 0000000..7c82ae4 --- /dev/null +++ b/addons/inkgd/runtime/values/value.gd @@ -0,0 +1,131 @@ +# warning-ignore-all:shadowed_variable +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkObject + +# This is a merge of the original Value class and its Value subclass. +class_name InkValue + +# ############################################################################ # +# IMPORTS +# ############################################################################ # + +const ValueType = preload("res://addons/inkgd/runtime/values/value_type.gd").ValueType +var InkList = load("res://addons/inkgd/runtime/lists/ink_list.gd") + +# ############################################################################ # +# STATIC REFERENCE +# ############################################################################ # + +# TODO: Remove +#static func Utils(): +# return load("res://addons/inkgd/runtime/extra/InkUtils.gd") +# +#static func Value(): +# return load("res://addons/inkgd/runtime/values/value.gd") + +static func BoolValue(): + return load("res://addons/inkgd/runtime/values/bool_value.gd") + +static func IntValue(): + return load("res://addons/inkgd/runtime/values/int_value.gd") + +static func FloatValue(): + return load("res://addons/inkgd/runtime/values/float_value.gd") + +static func StringValue(): + return load("res://addons/inkgd/runtime/values/string_value.gd") + +static func DivertTargetValue(): + return load("res://addons/inkgd/runtime/values/divert_target_value.gd") + +static func VariablePointerValue(): + return load("res://addons/inkgd/runtime/values/variable_pointer_value.gd") + +static func ListValue(): + return load("res://addons/inkgd/runtime/values/list_value.gd") + +# ############################################################################ # + +var value # Variant + +# ValueType +var value_type: int: get = get_value_type +func get_value_type() -> int: + return -1 + +var is_truthy: bool: get = get_is_truthy +func get_is_truthy() -> bool: + return false + +# ############################################################################ # + +# (ValueType) -> ValueType +func cast(new_type: int) -> InkValue: + return null + +var value_object: # Variant + get: return value + +# ############################################################################ # + +# (Variant) -> Value +func _init_with(val): + value = val + +# (Variant) -> Value +static func create(val) -> InkValue: + # Original code lost precision from double to float. + # But it's not applicable here. + + if val is bool: + return BoolValue().new_with(val) + if val is int: + return IntValue().new_with(val) + elif val is float: + return FloatValue().new_with(val) + elif val is String: + return StringValue().new_with(val) + elif InkUtils.is_ink_class(val, "InkPath"): + return DivertTargetValue().new_with(val) + elif InkUtils.is_ink_class(val, "InkList"): + return ListValue().new_with(val) + + return null + +func copy() -> InkValue: + return create(self.value_object) + +# (Ink.ValueType) -> StoryException +func bad_cast_exception_message(target_ink_class) -> String: + return "Can't cast " + self.value_object + " from " + self.value_type + " to " + target_ink_class + +# () -> String +func _to_string() -> String: + if value is int || value is float || value is String: + return str(value) + else: + return value._to_string() + +# ############################################################################ # +# GDScript extra methods +# ############################################################################ # + +func is_ink_class(type) -> bool: + return type == "Value" || super.is_ink_class(type) + +func get_ink_class() -> String: + return "Value" + +static func new_with(val) -> InkValue: + var value = InkValue.new() + value._init_with(val) + return value diff --git a/addons/inkgd/runtime/values/value_type.gd b/addons/inkgd/runtime/values/value_type.gd new file mode 100644 index 0000000..c2db154 --- /dev/null +++ b/addons/inkgd/runtime/values/value_type.gd @@ -0,0 +1,23 @@ +# warning-ignore-all:shadowed_variable +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + + +enum ValueType { + BOOL = -1, + + INT, + FLOAT, + LIST, + STRING, + + DIVERT_TARGET, + VARIABLE_POINTER +} diff --git a/addons/inkgd/runtime/values/variable_pointer_value.gd b/addons/inkgd/runtime/values/variable_pointer_value.gd new file mode 100644 index 0000000..010d5a2 --- /dev/null +++ b/addons/inkgd/runtime/values/variable_pointer_value.gd @@ -0,0 +1,69 @@ +# warning-ignore-all:shadowed_variable +# warning-ignore-all:unused_class_variable +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkValue + +class_name InkVariablePointerValue + +# ############################################################################ # + +var variable_name : get = get_variable_name, set = set_variable_name # InkPath +func get_variable_name(): + return value +func set_variable_name(value): + self.value = value + +func get_value_type(): + return ValueType.VARIABLE_POINTER + +func get_is_truthy(): + InkUtils.throw_exception("Shouldn't be checking the truthiness of a variable pointer") + return false + +var context_index = 0 # int + +func _init_with_context(variable_name, context_index = -1): + super._init_with(variable_name) + self.context_index = context_index + +func _init(): + value = null + +# The method takes a `StoryErrorMetadata` object as a parameter that +# doesn't exist in upstream. The metadat are used in case an 'exception' +# is raised. For more information, see story.gd. +func cast(new_type, metadata = null): + if new_type == self.value_type: + return self + + InkUtils.throw_story_exception(bad_cast_exception_message(new_type), false, metadata) + return null + +func _to_string() -> String: + return "VariablePointerValue(" + self.variable_name + ")" + +func copy(): + return VariablePointerValue().new_with_context(self.variable_name, context_index) + +# ######################################################################## # +# GDScript extra methods +# ######################################################################## # + +func is_ink_class(type): + return type == "VariablePointerValue" || super.is_ink_class(type) + +func get_ink_class(): + return "VariablePointerValue" + +static func new_with_context(variable_name, context_index = -1): + var value = VariablePointerValue().new() + value._init_with_context(variable_name, context_index) + return value diff --git a/addons/inkgd/runtime/variables_state.gd b/addons/inkgd/runtime/variables_state.gd new file mode 100644 index 0000000..f1787e6 --- /dev/null +++ b/addons/inkgd/runtime/variables_state.gd @@ -0,0 +1,373 @@ +# warning-ignore-all:shadowed_variable +# warning-ignore-all:unused_class_variable +# warning-ignore-all:return_value_discarded +# ############################################################################ # +# Copyright © 2015-2021 inkle Ltd. +# Copyright © 2019-2022 Frédéric Maquin +# All Rights Reserved +# +# This file is part of inkgd. +# inkgd is licensed under the terms of the MIT license. +# ############################################################################ # + +extends InkBase + +class_name InkVariablesState + +# ############################################################################ # +# Imports +# ############################################################################ # + +var InkTryGetResult := preload("res://addons/inkgd/runtime/extra/try_get_result.gd") as GDScript +var InkStringSet := preload("res://addons/inkgd/runtime/extra/string_set.gd") as GDScript + +var InkValue := load("res://addons/inkgd/runtime/values/value.gd") as GDScript +var InkListValue := load("res://addons/inkgd/runtime/values/list_value.gd") as GDScript +var InkVariablePointerValue := load("res://addons/inkgd/runtime/values/variable_pointer_value.gd") as GDScript + +# ############################################################################ # + +# (String, InkObject) +signal variable_changed(variable_name, new_value) + +# ############################################################################ # + +var patch: InkStatePatch # StatePatch + +var batch_observing_variable_changes: bool: + get: + return _batch_observing_variable_changes + + set(value): + _batch_observing_variable_changes = value + if value: + _changed_variables_for_batch_obs = InkStringSet.new() + else: + if _changed_variables_for_batch_obs != null: + for variable_name in _changed_variables_for_batch_obs.enumerate(): + var current_value = _global_variables[variable_name] + emit_signal("variable_changed", variable_name, current_value) + + _changed_variables_for_batch_obs = null + +var _batch_observing_variable_changes: bool = false + +var callstack: InkCallStack: get = get_callstack, set = set_callstack +func get_callstack() -> InkCallStack: + return _callstack + +func set_callstack(value: InkCallStack): + _callstack = value + +# (String) -> Variant +func get_variable(variable_name: String): + if self.patch != null: + var global: InkTryGetResult = patch.try_get_global(variable_name) + if global.exists: + return global.result.value_object + + if _global_variables.has(variable_name): + return _global_variables[variable_name].value_object + elif _default_global_variables.has(variable_name): + return _default_global_variables[variable_name].value_object + else: + return null + +# (String, Variant) -> void +func set_variable(variable_name: String, value) -> void: + if !_default_global_variables.has(variable_name): + InkUtils.throw_story_exception( + "Cannot assign to a variable (%s) that hasn't been declared in the story" \ + % variable_name + ) + return + + var val: InkValue = InkValue.create(value) + if val == null: + if value == null: + InkUtils.throw_exception("Cannot pass null to VariableState") + else: + InkUtils.throw_exception("Invalid value passed to VariableState: %s" % str(value)) + return + + set_global(variable_name, val) + +func enumerate() -> Array: + return _global_variables.keys() + +func _init(callstack: InkCallStack, list_defs_origin: InkListDefinitionsOrigin, ink_runtime = null): + find_static_objects(ink_runtime) + + _global_variables = {} + _callstack = callstack + _list_defs_origin = list_defs_origin + +# () -> void +func apply_patch() -> void: + for named_var_key in self.patch.globals: + _global_variables[named_var_key] = self.patch.globals[named_var_key] + + if _changed_variables_for_batch_obs != null: + for name in self.patch.changed_variables.enumerate(): + _changed_variables_for_batch_obs.append(name) + + patch = null + +# (Dictionary) -> void +func set_json_token(jtoken: Dictionary) -> void: + _global_variables.clear() + + for var_val_key in _default_global_variables: + if jtoken.has(var_val_key): + var loaded_token = jtoken[var_val_key] + _global_variables[var_val_key] = self.StaticJSON.jtoken_to_runtime_object(loaded_token) + else: + _global_variables[var_val_key] = _default_global_variables[var_val_key] + +func write_json(writer: InkSimpleJSON.Writer) -> void: + writer.write_object_start() + for key in _global_variables: + var name: String = key + var val: InkObject = _global_variables[key] + + if self._ink_runtime.dont_save_default_values: + if self._default_global_variables.has(name): + if runtime_objects_equal(val, self._default_global_variables[name]): + continue + + writer.write_property_start(name) + self.StaticJSON.write_runtime_object(writer, val) + writer.write_property_end() + writer.write_object_end() + +func runtime_objects_equal(obj1: InkObject, obj2: InkObject) -> bool: + if !InkUtils.are_of_same_type(obj1, obj2): + return false + + var bool_val: InkBoolValue = InkUtils.as_or_null(obj1, "BoolValue") + if bool_val != null: + return bool_val.value == InkUtils.cast(obj2, "BoolValue").value + + var int_val: InkIntValue = InkUtils.as_or_null(obj1, "IntValue") + if int_val != null: + return int_val.value == InkUtils.cast(obj2, "IntValue").value + + var float_val: InkFloatValue = InkUtils.as_or_null(obj1, "FloatValue") + if float_val != null: + return float_val.value == InkUtils.cast(obj2, "FloatValue").value + + var val1: InkValue = InkUtils.as_or_null(obj1, "Value") + var val2: InkValue = InkUtils.as_or_null(obj2, "Value") + + if val1 != null: + if val1.value_object is Object && val2.value_object is Object: + return val1.value_object.equals(val2.value_object) + else: + return val1.value_object == val2.value_object + + InkUtils.throw_exception( + "FastRoughDefinitelyEquals: Unsupported runtime object type: %s" \ + % obj1.get_ink_class() + ) + + return false + +func get_variable_with_name(name: String, context_index = -1) -> InkObject: + var var_value: InkObject = get_raw_variable_with_name(name, context_index) + + var var_pointer: InkVariablePointerValue = InkUtils.as_or_null(var_value, "VariablePointerValue") + if var_pointer: + var_value = value_at_variable_pointer(var_pointer) + + return var_value + +# (String) -> { exists: bool, result: InkObject } +func try_get_default_variable_value(name: String) -> InkTryGetResult: + if _default_global_variables.has(name): + return InkTryGetResult.new(true, _default_global_variables[name]) + else: + return InkTryGetResult.new(false, null) + +func global_variable_exists_with_name(name: String) -> bool: + return ( + _global_variables.has(name) || + _default_global_variables != null && _default_global_variables.has(name) + ) + +func get_raw_variable_with_name(name: String, context_index: int) -> InkObject: + var var_value: InkObject = null + + if context_index == 0 || context_index == -1: + if self.patch != null: + var try_result: InkTryGetResult = self.patch.try_get_global(name) + if try_result.exists: return try_result.result + + if _global_variables.has(name): + return _global_variables[name] + + if self._default_global_variables != null: + if self._default_global_variables.has(name): + return self._default_global_variables[name] + + var list_item_value: InkListValue = _list_defs_origin.find_single_item_list_with_name(name) + + if list_item_value: + return list_item_value + + var_value = _callstack.get_temporary_variable_with_name(name, context_index) + + return var_value + +# (InkVariablePointerValue) -> InkObject +func value_at_variable_pointer(pointer: InkVariablePointerValue) -> InkObject: + return get_variable_with_name(pointer.variable_name, pointer.context_index) + +# (InkVariableAssignment, InkObject) -> void +func assign(var_ass: InkVariableAssignment, value: InkObject) -> void: + var name: String = var_ass.variable_name + var context_index: int = -1 + + var set_global: bool = false + if var_ass.is_new_declaration: + set_global = var_ass.is_global + else: + set_global = global_variable_exists_with_name(name) + + if var_ass.is_new_declaration: + var var_pointer: InkVariablePointerValue = InkUtils.as_or_null(value, "VariablePointerValue") + if var_pointer: + var fully_resolved_variable_pointer: InkObject = resolve_variable_pointer(var_pointer) + value = fully_resolved_variable_pointer + else: + var existing_pointer: InkVariablePointerValue = null # VariablePointerValue + var first_time: bool = true + while existing_pointer || first_time: + first_time = false + existing_pointer = InkUtils.as_or_null( + get_raw_variable_with_name(name, context_index), + "VariablePointerValue" + ) + if existing_pointer: + name = existing_pointer.variable_name + context_index = existing_pointer.context_index + set_global = (context_index == 0) + + if set_global: + set_global(name, value) + else: + _callstack.set_temporary_variable(name, value, var_ass.is_new_declaration, context_index) + +# () -> void +func snapshot_default_globals(): + _default_global_variables = _global_variables.duplicate() + +# (InkObject, InkObject) -> void +func retain_list_origins_for_assignment(old_value, new_value) -> void: + var old_list: InkListValue = InkUtils.as_or_null(old_value, "ListValue") + var new_list: InkListValue = InkUtils.as_or_null(new_value, "ListValue") + + if old_list && new_list && new_list.value.size() == 0: + new_list.value.set_initial_origin_names(old_list.value.origin_names) + +# (String, InkObject) -> void +func set_global(variable_name: String, value: InkObject) -> void: + var old_value = null # InkObject + + # Slightly different structure from upstream, since we can't use + # try_get_global in the conditional. + if patch != null: + var patch_value: InkTryGetResult = patch.try_get_global(variable_name) + if patch_value.exists: + old_value = patch_value.result + + if old_value == null: + if self._global_variables.has(variable_name): + old_value = self._global_variables[variable_name] + + InkListValue.retain_list_origins_for_assignment(old_value, value) + + if patch != null: + self.patch.set_global(variable_name, value) + else: + self._global_variables[variable_name] = value + + if !value.equals(old_value): + if _batch_observing_variable_changes: + if patch != null: + patch.add_changed_variable(variable_name) + elif self._changed_variables_for_batch_obs != null: + _changed_variables_for_batch_obs.append(variable_name) + else: + emit_signal("variable_changed", variable_name, value) + +# (VariablePointerValue) -> VariablePointerValue +func resolve_variable_pointer(var_pointer: InkVariablePointerValue) -> InkVariablePointerValue: + var context_index: int = var_pointer.context_index + + if context_index == -1: + context_index = get_context_index_of_variable_named(var_pointer.variable_name) + + var value_of_variable_pointed_to = get_raw_variable_with_name( + var_pointer.variable_name, context_index + ) + + var double_redirection_pointer: InkVariablePointerValue = InkUtils.as_or_null( + value_of_variable_pointed_to, "VariablePointerValue" + ) + + if double_redirection_pointer: + return double_redirection_pointer + else: + return InkVariablePointerValue.new_with_context(var_pointer.variable_name, context_index) + +# ############################################################################ # + +# (String) -> int +func get_context_index_of_variable_named(var_name): + if global_variable_exists_with_name(var_name): + return 0 + + return _callstack.current_element_index + +# Dictionary +var _global_variables: Dictionary +var _default_global_variables = null # Dictionary + +var _callstack: InkCallStack +var _changed_variables_for_batch_obs: InkStringSet = null +var _list_defs_origin: InkListDefinitionsOrigin + +# ############################################################################ # +# GDScript extra methods +# ############################################################################ # + +func is_ink_class(type: String) -> bool: + return type == "VariableState" || super.is_ink_class(type) + +func get_ink_class() -> String: + return "VariableState" + +# ############################################################################ # +# Static Properties +# ############################################################################ # + +var StaticJSON: InkStaticJSON: + get: return self._ink_runtime.json + +var _ink_runtime: + get: return _weak_ink_runtime.get_ref() +var _weak_ink_runtime: WeakRef + +func find_static_objects(ink_runtime = null): + if ink_runtime != null: + _weak_ink_runtime = weakref(ink_runtime) + return + + var runtime = Engine.get_main_loop().root.get_node("__InkRuntime") + + InkUtils.__assert__( + runtime != null, + "[InkVariableStates] Could not retrieve 'InkRuntime' singleton from the scene tree." + ) + + _weak_ink_runtime = weakref(runtime) diff --git a/audio/Ambiente.ogg b/audio/Ambiente.ogg new file mode 100644 index 0000000..230fdbf --- /dev/null +++ b/audio/Ambiente.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2204427765f41ea1181ff20d066cda33eeb86454dc6927e594b63036c9fc036 +size 2201728 diff --git a/audio/Ambiente.ogg.import b/audio/Ambiente.ogg.import new file mode 100644 index 0000000..d1d963d --- /dev/null +++ b/audio/Ambiente.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://3hulnd5c5me5" +path="res://.godot/imported/Ambiente.ogg-d8268c600c8aca0de710e563231cd1c8.oggvorbisstr" + +[deps] + +source_file="res://audio/Ambiente.ogg" +dest_files=["res://.godot/imported/Ambiente.ogg-d8268c600c8aca0de710e563231cd1c8.oggvorbisstr"] + +[params] + +loop=true +loop_offset=0.0 +bpm=0.0 +beat_count=0 +bar_beats=4 diff --git a/audio/Sounds/destruirFoto.ogg b/audio/Sounds/destruirFoto.ogg new file mode 100644 index 0000000..d1ded80 --- /dev/null +++ b/audio/Sounds/destruirFoto.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:65e0e84f8efed95823f71ac640257e6c50398a5ec5aed4d4037f29e3a2ef07d9 +size 11249 diff --git a/audio/Sounds/destruirFoto.ogg.import b/audio/Sounds/destruirFoto.ogg.import new file mode 100644 index 0000000..4dcf625 --- /dev/null +++ b/audio/Sounds/destruirFoto.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://dhsmuwctlffx3" +path="res://.godot/imported/destruirFoto.ogg-878cf88b69c394e8e6694aaab3378b09.oggvorbisstr" + +[deps] + +source_file="res://audio/Sounds/destruirFoto.ogg" +dest_files=["res://.godot/imported/destruirFoto.ogg-878cf88b69c394e8e6694aaab3378b09.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/audio/Sounds/foto1.ogg b/audio/Sounds/foto1.ogg new file mode 100644 index 0000000..2f08587 --- /dev/null +++ b/audio/Sounds/foto1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e04011e824731f947817805a32fa31bb3857dd78d164eaf56912029c1bf92d1 +size 7713 diff --git a/audio/Sounds/foto1.ogg.import b/audio/Sounds/foto1.ogg.import new file mode 100644 index 0000000..7d39123 --- /dev/null +++ b/audio/Sounds/foto1.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://bmklkfkvhbqj3" +path="res://.godot/imported/foto1.ogg-36056204bf01bcdc61f148a233e7d4f4.oggvorbisstr" + +[deps] + +source_file="res://audio/Sounds/foto1.ogg" +dest_files=["res://.godot/imported/foto1.ogg-36056204bf01bcdc61f148a233e7d4f4.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/audio/Sounds/foto2.ogg b/audio/Sounds/foto2.ogg new file mode 100644 index 0000000..5d004bb --- /dev/null +++ b/audio/Sounds/foto2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3168f515a06e66c1f25f350818e4160145ed84c5b9231f547afb3df424dea73e +size 6528 diff --git a/audio/Sounds/foto2.ogg.import b/audio/Sounds/foto2.ogg.import new file mode 100644 index 0000000..fbe37e3 --- /dev/null +++ b/audio/Sounds/foto2.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://bpdxgs2rajtu3" +path="res://.godot/imported/foto2.ogg-701d578016228e4acbf3830754955c67.oggvorbisstr" + +[deps] + +source_file="res://audio/Sounds/foto2.ogg" +dest_files=["res://.godot/imported/foto2.ogg-701d578016228e4acbf3830754955c67.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/audio/Sounds/foto3.ogg b/audio/Sounds/foto3.ogg new file mode 100644 index 0000000..30b31a7 --- /dev/null +++ b/audio/Sounds/foto3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9efccb10b328aaf6caed6d876c773e7436b6685d89593fd8520d806ff3f5914d +size 6310 diff --git a/audio/Sounds/foto3.ogg.import b/audio/Sounds/foto3.ogg.import new file mode 100644 index 0000000..8ddbcb6 --- /dev/null +++ b/audio/Sounds/foto3.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://brxiyyvq1xmee" +path="res://.godot/imported/foto3.ogg-5c5b7a7366e1a19c02f578a33949258d.oggvorbisstr" + +[deps] + +source_file="res://audio/Sounds/foto3.ogg" +dest_files=["res://.godot/imported/foto3.ogg-5c5b7a7366e1a19c02f578a33949258d.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/audio/Sounds/paso1.ogg b/audio/Sounds/paso1.ogg new file mode 100644 index 0000000..bf1f91f --- /dev/null +++ b/audio/Sounds/paso1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e74f068be1638c6a8b50f4578f114d470d08188577aabcdeafc29addbc9ee254 +size 7095 diff --git a/audio/Sounds/paso1.ogg.import b/audio/Sounds/paso1.ogg.import new file mode 100644 index 0000000..8cb1093 --- /dev/null +++ b/audio/Sounds/paso1.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://46j621ps13q5" +path="res://.godot/imported/paso1.ogg-da6a2b03e172d88164090da0465f629a.oggvorbisstr" + +[deps] + +source_file="res://audio/Sounds/paso1.ogg" +dest_files=["res://.godot/imported/paso1.ogg-da6a2b03e172d88164090da0465f629a.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/audio/Sounds/paso2.ogg b/audio/Sounds/paso2.ogg new file mode 100644 index 0000000..e9679fe --- /dev/null +++ b/audio/Sounds/paso2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:44b1b392f7f75c5abf32276ce3283401b8d89c37c3adf5e41fab689700082e01 +size 6748 diff --git a/audio/Sounds/paso2.ogg.import b/audio/Sounds/paso2.ogg.import new file mode 100644 index 0000000..f045582 --- /dev/null +++ b/audio/Sounds/paso2.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://xewhqnhm0sdj" +path="res://.godot/imported/paso2.ogg-33138f69eecccbd97a16c55195769aef.oggvorbisstr" + +[deps] + +source_file="res://audio/Sounds/paso2.ogg" +dest_files=["res://.godot/imported/paso2.ogg-33138f69eecccbd97a16c55195769aef.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/audio/Sounds/paso3.ogg b/audio/Sounds/paso3.ogg new file mode 100644 index 0000000..1d05b98 --- /dev/null +++ b/audio/Sounds/paso3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:04fd2d682b116698f0640e30ee6ea517b0fa22441fabf22971586a48d77fe214 +size 6940 diff --git a/audio/Sounds/paso3.ogg.import b/audio/Sounds/paso3.ogg.import new file mode 100644 index 0000000..8d46cb8 --- /dev/null +++ b/audio/Sounds/paso3.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://dor368npw2rit" +path="res://.godot/imported/paso3.ogg-83857a38da9db11631212b397bc92644.oggvorbisstr" + +[deps] + +source_file="res://audio/Sounds/paso3.ogg" +dest_files=["res://.godot/imported/paso3.ogg-83857a38da9db11631212b397bc92644.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/audio/Sounds/paso4.ogg b/audio/Sounds/paso4.ogg new file mode 100644 index 0000000..7a7125a --- /dev/null +++ b/audio/Sounds/paso4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bff93c0801acaeb95646c345862aafe0d1cec7cbd14b8dc466c2cda7952671c0 +size 6848 diff --git a/audio/Sounds/paso4.ogg.import b/audio/Sounds/paso4.ogg.import new file mode 100644 index 0000000..11afd5e --- /dev/null +++ b/audio/Sounds/paso4.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://uej45wpo8nar" +path="res://.godot/imported/paso4.ogg-5bec0b0118580d6564e3cb6e4d028e78.oggvorbisstr" + +[deps] + +source_file="res://audio/Sounds/paso4.ogg" +dest_files=["res://.godot/imported/paso4.ogg-5bec0b0118580d6564e3cb6e4d028e78.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/audio/Sounds/texto1.ogg b/audio/Sounds/texto1.ogg new file mode 100644 index 0000000..7c2ba52 --- /dev/null +++ b/audio/Sounds/texto1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:86e18144799c5fee8613b3c0d1c357c9241360c49c694d0154728ec787e0c962 +size 5265 diff --git a/audio/Sounds/texto1.ogg.import b/audio/Sounds/texto1.ogg.import new file mode 100644 index 0000000..78bc734 --- /dev/null +++ b/audio/Sounds/texto1.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://dhmmw4qlm4e8j" +path="res://.godot/imported/texto1.ogg-1b8282c91256b605f637bdf5cfbd299e.oggvorbisstr" + +[deps] + +source_file="res://audio/Sounds/texto1.ogg" +dest_files=["res://.godot/imported/texto1.ogg-1b8282c91256b605f637bdf5cfbd299e.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/audio/Sounds/texto2.ogg b/audio/Sounds/texto2.ogg new file mode 100644 index 0000000..e1c3af9 --- /dev/null +++ b/audio/Sounds/texto2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a0ba33f8db3beb500cdb586826317ef22eb7901e77ed9a8b95983dc6cdc8020 +size 5295 diff --git a/audio/Sounds/texto2.ogg.import b/audio/Sounds/texto2.ogg.import new file mode 100644 index 0000000..6ee0e61 --- /dev/null +++ b/audio/Sounds/texto2.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://dhy0px04e6s0e" +path="res://.godot/imported/texto2.ogg-34f17b42f11f4c5ef1d4d931e6302367.oggvorbisstr" + +[deps] + +source_file="res://audio/Sounds/texto2.ogg" +dest_files=["res://.godot/imported/texto2.ogg-34f17b42f11f4c5ef1d4d931e6302367.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/audio/Sounds/texto3.ogg b/audio/Sounds/texto3.ogg new file mode 100644 index 0000000..68bd5c6 --- /dev/null +++ b/audio/Sounds/texto3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b1c2c0d71be8c8d7279dabf6ca5eec1cb5ff36bed0a3b600dd83cf18494a8e83 +size 4828 diff --git a/audio/Sounds/texto3.ogg.import b/audio/Sounds/texto3.ogg.import new file mode 100644 index 0000000..ed1dffb --- /dev/null +++ b/audio/Sounds/texto3.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://dw4dm5f6375ou" +path="res://.godot/imported/texto3.ogg-5c6854c83ad5622514814d8796c6e690.oggvorbisstr" + +[deps] + +source_file="res://audio/Sounds/texto3.ogg" +dest_files=["res://.godot/imported/texto3.ogg-5c6854c83ad5622514814d8796c6e690.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/audio/Sounds/texto4.ogg b/audio/Sounds/texto4.ogg new file mode 100644 index 0000000..5f4e129 --- /dev/null +++ b/audio/Sounds/texto4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dfde98962f4904db92bbe0450b5471b58f4f9e084fe9fce5f71c598a1188e829 +size 4743 diff --git a/audio/Sounds/texto4.ogg.import b/audio/Sounds/texto4.ogg.import new file mode 100644 index 0000000..9bb906f --- /dev/null +++ b/audio/Sounds/texto4.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://6ghqfd2weeam" +path="res://.godot/imported/texto4.ogg-90261adad95f2513a8c769ad681ccc45.oggvorbisstr" + +[deps] + +source_file="res://audio/Sounds/texto4.ogg" +dest_files=["res://.godot/imported/texto4.ogg-90261adad95f2513a8c769ad681ccc45.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/audio/Sounds/texto5.ogg b/audio/Sounds/texto5.ogg new file mode 100644 index 0000000..d58ec64 --- /dev/null +++ b/audio/Sounds/texto5.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f0e01a56aaea02b247f0e53f56a33eb7cfbcf132228ffcc0629b5ccd20ff79cf +size 5087 diff --git a/audio/Sounds/texto5.ogg.import b/audio/Sounds/texto5.ogg.import new file mode 100644 index 0000000..0474cc5 --- /dev/null +++ b/audio/Sounds/texto5.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://cihform6l2xq4" +path="res://.godot/imported/texto5.ogg-d35ca1edfabdaa4969433b78dc76d904.oggvorbisstr" + +[deps] + +source_file="res://audio/Sounds/texto5.ogg" +dest_files=["res://.godot/imported/texto5.ogg-d35ca1edfabdaa4969433b78dc76d904.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/audio/Sounds/texto6.ogg b/audio/Sounds/texto6.ogg new file mode 100644 index 0000000..a838a80 --- /dev/null +++ b/audio/Sounds/texto6.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e1a6ef42d679d7c561c60c4af2ea416cb438af452ea5eca5c4d79423a1017b8e +size 4663 diff --git a/audio/Sounds/texto6.ogg.import b/audio/Sounds/texto6.ogg.import new file mode 100644 index 0000000..632e661 --- /dev/null +++ b/audio/Sounds/texto6.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://crw2wxeiwu2xo" +path="res://.godot/imported/texto6.ogg-e9d3cf3117ecb54f17d2e1e1f8ff12a9.oggvorbisstr" + +[deps] + +source_file="res://audio/Sounds/texto6.ogg" +dest_files=["res://.godot/imported/texto6.ogg-e9d3cf3117ecb54f17d2e1e1f8ff12a9.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/audio/gameplay01.ogg b/audio/gameplay01.ogg new file mode 100644 index 0000000..b22917e --- /dev/null +++ b/audio/gameplay01.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f2b4de94bd22aabcf6412af82544c8ac190e1bfe23f7716c86dfb64553974e9 +size 560115 diff --git a/audio/gameplay01.ogg.import b/audio/gameplay01.ogg.import new file mode 100644 index 0000000..0bcd34f --- /dev/null +++ b/audio/gameplay01.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://21sp8tcwcdkb" +path="res://.godot/imported/gameplay01.ogg-759284fad58cb50704a6d913d2af1d94.oggvorbisstr" + +[deps] + +source_file="res://audio/gameplay01.ogg" +dest_files=["res://.godot/imported/gameplay01.ogg-759284fad58cb50704a6d913d2af1d94.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/audio/gameplay02L.ogg b/audio/gameplay02L.ogg new file mode 100644 index 0000000..a926535 --- /dev/null +++ b/audio/gameplay02L.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c165e3ab60836e2dcd697210520acd2f745b03726ff30d9506c185cf9106931e +size 493256 diff --git a/audio/gameplay02L.ogg.import b/audio/gameplay02L.ogg.import new file mode 100644 index 0000000..8f26127 --- /dev/null +++ b/audio/gameplay02L.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://brokebpvawfm4" +path="res://.godot/imported/gameplay02L.ogg-b24785457c0ed78a61039f4dbf015433.oggvorbisstr" + +[deps] + +source_file="res://audio/gameplay02L.ogg" +dest_files=["res://.godot/imported/gameplay02L.ogg-b24785457c0ed78a61039f4dbf015433.oggvorbisstr"] + +[params] + +loop=true +loop_offset=0.0 +bpm=0.0 +beat_count=0 +bar_beats=4 diff --git a/audio/gameplay03.ogg b/audio/gameplay03.ogg new file mode 100644 index 0000000..5db9c25 --- /dev/null +++ b/audio/gameplay03.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:122e8a2d0804ad3cb1b6928cc91b64a740fb1a76ce601f97ecb1c4101bdff957 +size 1000235 diff --git a/audio/gameplay03.ogg.import b/audio/gameplay03.ogg.import new file mode 100644 index 0000000..7681bb9 --- /dev/null +++ b/audio/gameplay03.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://bpwbfgn50emy8" +path="res://.godot/imported/gameplay03.ogg-717d09133d00827e7e5c33eed3e45a5d.oggvorbisstr" + +[deps] + +source_file="res://audio/gameplay03.ogg" +dest_files=["res://.godot/imported/gameplay03.ogg-717d09133d00827e7e5c33eed3e45a5d.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/audio/gameplay04L.ogg b/audio/gameplay04L.ogg new file mode 100644 index 0000000..53a3e57 --- /dev/null +++ b/audio/gameplay04L.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b5eefd774280d708ad4d53f23103fd52198a85c089fd3ee8fae2d0d6d57934b0 +size 488547 diff --git a/audio/gameplay04L.ogg.import b/audio/gameplay04L.ogg.import new file mode 100644 index 0000000..353589b --- /dev/null +++ b/audio/gameplay04L.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://8gprrjf2cy0n" +path="res://.godot/imported/gameplay04L.ogg-6bdd719eb6dc41c5a64565082e559d50.oggvorbisstr" + +[deps] + +source_file="res://audio/gameplay04L.ogg" +dest_files=["res://.godot/imported/gameplay04L.ogg-6bdd719eb6dc41c5a64565082e559d50.oggvorbisstr"] + +[params] + +loop=true +loop_offset=0.0 +bpm=0.0 +beat_count=0 +bar_beats=4 diff --git a/audio/gameplay05.ogg b/audio/gameplay05.ogg new file mode 100644 index 0000000..7565f5d --- /dev/null +++ b/audio/gameplay05.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a8b05e9e1b6095b225fbbd877a6161bdfa0d331b84515351e9b615c9c159d6ec +size 914808 diff --git a/audio/gameplay05.ogg.import b/audio/gameplay05.ogg.import new file mode 100644 index 0000000..e56c91e --- /dev/null +++ b/audio/gameplay05.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://douhpj8nvhj7k" +path="res://.godot/imported/gameplay05.ogg-c93516a2b9635e49198c5eeecf9aaaba.oggvorbisstr" + +[deps] + +source_file="res://audio/gameplay05.ogg" +dest_files=["res://.godot/imported/gameplay05.ogg-c93516a2b9635e49198c5eeecf9aaaba.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/audio/gameplay06.ogg b/audio/gameplay06.ogg new file mode 100644 index 0000000..5455423 --- /dev/null +++ b/audio/gameplay06.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2bfec31b2212de3f9e961b62e55dd77efae11c3f6f1acb90fa520448139d79e1 +size 623162 diff --git a/audio/gameplay06.ogg.import b/audio/gameplay06.ogg.import new file mode 100644 index 0000000..ef06893 --- /dev/null +++ b/audio/gameplay06.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://purp2re1tgco" +path="res://.godot/imported/gameplay06.ogg-b030ef11748f0d7e1d9971cfb5042eaa.oggvorbisstr" + +[deps] + +source_file="res://audio/gameplay06.ogg" +dest_files=["res://.godot/imported/gameplay06.ogg-b030ef11748f0d7e1d9971cfb5042eaa.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/audio/gameplay07L.ogg b/audio/gameplay07L.ogg new file mode 100644 index 0000000..20d5804 --- /dev/null +++ b/audio/gameplay07L.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a6439051383308f709ec05d79f544d5afaaa493a583f40699aca2dbc463a65ef +size 140300 diff --git a/audio/gameplay07L.ogg.import b/audio/gameplay07L.ogg.import new file mode 100644 index 0000000..a12d976 --- /dev/null +++ b/audio/gameplay07L.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://clik4nqt5iosa" +path="res://.godot/imported/gameplay07L.ogg-575f4943c348424cb34008ffbda68907.oggvorbisstr" + +[deps] + +source_file="res://audio/gameplay07L.ogg" +dest_files=["res://.godot/imported/gameplay07L.ogg-575f4943c348424cb34008ffbda68907.oggvorbisstr"] + +[params] + +loop=true +loop_offset=0.0 +bpm=0.0 +beat_count=0 +bar_beats=4 diff --git a/audio/gameplay08.ogg b/audio/gameplay08.ogg new file mode 100644 index 0000000..0196a41 --- /dev/null +++ b/audio/gameplay08.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ebde7088c7a570623294dcd7f48a2209e11f4b1ab36cb6904e9b2083fcee80a1 +size 750812 diff --git a/audio/gameplay08.ogg.import b/audio/gameplay08.ogg.import new file mode 100644 index 0000000..89b423d --- /dev/null +++ b/audio/gameplay08.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://c2nnwn0rdgy7q" +path="res://.godot/imported/gameplay08.ogg-c7dcbed2b5bc752d71548896d75b86c3.oggvorbisstr" + +[deps] + +source_file="res://audio/gameplay08.ogg" +dest_files=["res://.godot/imported/gameplay08.ogg-c7dcbed2b5bc752d71548896d75b86c3.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/dialogues/character1.ink b/dialogues/character1.ink new file mode 100644 index 0000000..f40cd25 --- /dev/null +++ b/dialogues/character1.ink @@ -0,0 +1,40 @@ +INCLUDE variables.ink + +NO SÉ CÓMO OS PUEDEN GUSTAR LOS DÍAS NUBLADOS A ALGUNOS +{ + - Foto1 == true: + -> has_photo + - else: + -> hasnt_photo +} + +=== has_photo === +* ¿QUÉ HA PASADO? + ... TÚ ME DIRÁS... COBARDE... + -> END +* ESTÁN BIEN + JE JE, PERO SI TE PONES TRISTONCIO SIEMPRE QUE LLUEVE, Y LUEGO SOY YO LA QUE SE COME TUS MENSAJES TRISTES. + VOY A LA COLINA PORQUE AQUÍ PARECE QUE CAERÁ UN CHAPARRÓN. Y OYE, NO EMPIECES CON LO MISMO DE SIEMPRE... CANSA UN POCO... + -> END +* ENSÉÑALE LA FOTO + ... ME ALEGRO MUCHO DE QUE SIEMPRE CUENTES CONMIGO, DE VERDAD. + Y PUEDE QUE SÍ ESTÉ HARTA A VECES... PERO NO DE TI... SINO DE VERTE ASÍ... + SÉ QUE NO SOY TAN ANIMADA COMO BUC, PERO CREO QUE HABLARLO ES MUCHO MEJOR QUE PASARLO POR ALTO Y NO PENSAR EN ELLO... + AL FINAL UNO ESTALLA SI HAC-... BUENO, QUÉ TE VOY A DECIR... + ... Y LO SIENTO POR LLAMARTE COBARDE. NO ES QUE QUIERAS EL CAMINO FÁCIL ES QUE NO PUEDES MÁS, Y LO ENTIENDO, PERO... + ... EL CASO, YO SIEMPRE ESTARÉ AQUÍ, NO LO OLVIDES POR FAVOR... + { + - Character1 == false: + ~time_to_add = 10 + ~Character1 = true + } + -> END + +=== hasnt_photo === +* ¿QUÉ HA PASADO? + ... TÚ ME DIRÁS... COBARDE... + -> END +* ESTÁN BIEN + JE JE, PERO SI TE PONES TRISTONCIO SIEMPRE QUE LLUEVE, Y LUEGO SOY YO LA QUE SE COME TUS MENSAJES TRISTES. + VOY A LA COLINA PORQUE AQUÍ PARECE QUE CAERÁ UN CHAPARRÓN. Y OYE, NO EMPIECES CON LO MISMO DE SIEMPRE... CANSA UN POCO... + -> END \ No newline at end of file diff --git a/dialogues/character1.ink.import b/dialogues/character1.ink.import new file mode 100644 index 0000000..a39fa32 --- /dev/null +++ b/dialogues/character1.ink.import @@ -0,0 +1,14 @@ +[remap] + +importer="inkgd.ink" +type="Resource" +uid="uid://cui71s43lx8ru" +path="res://.godot/imported/character1.ink-cbf7f3ca9c08657839572006fe0f8e8e.res" + +[deps] + +source_file="res://dialogues/character1.ink" +dest_files=["res://.godot/imported/character1.ink-cbf7f3ca9c08657839572006fe0f8e8e.res"] + +[params] + diff --git a/dialogues/character1.json b/dialogues/character1.json new file mode 100644 index 0000000..71038ce --- /dev/null +++ b/dialogues/character1.json @@ -0,0 +1 @@ +{"inkVersion":21,"root":[["\n","^NO SÉ CÓMO OS PUEDEN GUSTAR LOS DÍAS NUBLADOS A ALGUNOS","\n",["ev",{"VAR?":"Foto1"},true,"==","/ev",{"->":".^.b","c":true},{"b":["\n",{"->":"has_photo"},{"->":"0.5"},null]}],[{"->":".^.b"},{"b":["\n",{"->":"hasnt_photo"},{"->":"0.5"},null]}],"nop","\n",["done",{"#f":5,"#n":"g-0"}],null],"done",{"has_photo":[[["ev",{"^->":"has_photo.0.0.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-0","flg":18},{"s":["^¿QUÉ HA PASADO?",{"->":"$r","var":true},null]}],["ev",{"^->":"has_photo.0.1.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-1","flg":18},{"s":["^ESTÁN BIEN",{"->":"$r","var":true},null]}],["ev",{"^->":"has_photo.0.2.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-2","flg":18},{"s":["^ENSÉÑALE LA FOTO",{"->":"$r","var":true},null]}],{"c-0":["ev",{"^->":"has_photo.0.c-0.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.0.s"},[{"#n":"$r2"}],"\n","^... TÚ ME DIRÁS... COBARDE...","\n","end",{"#f":5}],"c-1":["ev",{"^->":"has_photo.0.c-1.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.1.s"},[{"#n":"$r2"}],"\n","^JE JE, PERO SI TE PONES TRISTONCIO SIEMPRE QUE LLUEVE, Y LUEGO SOY YO LA QUE SE COME TUS MENSAJES TRISTES.","\n","^VOY A LA COLINA PORQUE AQUÍ PARECE QUE CAERÁ UN CHAPARRÓN. Y OYE, NO EMPIECES CON LO MISMO DE SIEMPRE... CANSA UN POCO...","\n","end",{"#f":5}],"c-2":["ev",{"^->":"has_photo.0.c-2.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.2.s"},[{"#n":"$r2"}],"\n","^... ME ALEGRO MUCHO DE QUE SIEMPRE CUENTES CONMIGO, DE VERDAD.","\n","^Y PUEDE QUE SÍ ESTÉ HARTA A VECES... PERO NO DE TI... SINO DE VERTE ASÍ...","\n","^SÉ QUE NO SOY TAN ANIMADA COMO BUC, PERO CREO QUE HABLARLO ES MUCHO MEJOR QUE PASARLO POR ALTO Y NO PENSAR EN ELLO...","\n","^AL FINAL UNO ESTALLA SI HAC-... BUENO, QUÉ TE VOY A DECIR...","\n","^... Y LO SIENTO POR LLAMARTE COBARDE. NO ES QUE QUIERAS EL CAMINO FÁCIL ES QUE NO PUEDES MÁS, Y LO ENTIENDO, PERO...","\n","^... EL CASO, YO SIEMPRE ESTARÉ AQUÍ, NO LO OLVIDES POR FAVOR...","\n",["ev",{"VAR?":"Character1"},false,"==","/ev",{"->":".^.b","c":true},{"b":["\n","ev",10,"/ev",{"VAR=":"time_to_add","re":true},"ev",true,"/ev",{"VAR=":"Character1","re":true},{"->":".^.^.^.20"},null]}],"nop","\n","end",{"#f":5}]}],{"#f":1}],"hasnt_photo":[[["ev",{"^->":"hasnt_photo.0.0.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-0","flg":18},{"s":["^¿QUÉ HA PASADO?",{"->":"$r","var":true},null]}],["ev",{"^->":"hasnt_photo.0.1.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-1","flg":18},{"s":["^ESTÁN BIEN",{"->":"$r","var":true},null]}],{"c-0":["ev",{"^->":"hasnt_photo.0.c-0.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.0.s"},[{"#n":"$r2"}],"\n","^... TÚ ME DIRÁS... COBARDE...","\n","end",{"#f":5}],"c-1":["ev",{"^->":"hasnt_photo.0.c-1.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.1.s"},[{"#n":"$r2"}],"\n","^JE JE, PERO SI TE PONES TRISTONCIO SIEMPRE QUE LLUEVE, Y LUEGO SOY YO LA QUE SE COME TUS MENSAJES TRISTES.","\n","^VOY A LA COLINA PORQUE AQUÍ PARECE QUE CAERÁ UN CHAPARRÓN. Y OYE, NO EMPIECES CON LO MISMO DE SIEMPRE... CANSA UN POCO...","\n","end",{"#f":5}]}],{"#f":1}],"parte_comun":["^Hola soy una parte comun","\n","done",{"#f":1}],"global decl":["ev",false,{"VAR=":"Foto1"},false,{"VAR=":"Foto2"},false,{"VAR=":"Foto3"},false,{"VAR=":"Foto4"},false,{"VAR=":"Foto5"},0,{"VAR=":"time_to_add"},false,{"VAR=":"Character1"},false,{"VAR=":"Character2"},false,{"VAR=":"Character3"},false,{"VAR=":"Character4"},false,{"VAR=":"Character5"},"/ev","end",null],"#f":1}],"listDefs":{}} \ No newline at end of file diff --git a/dialogues/character1.json.import b/dialogues/character1.json.import new file mode 100644 index 0000000..d860e72 --- /dev/null +++ b/dialogues/character1.json.import @@ -0,0 +1,15 @@ +[remap] + +importer="inkgd.ink.json" +type="Resource" +uid="uid://6tqg6urrn6xk" +path="res://.godot/imported/character1.json-fe84c375df5ef0e4e1e832b63d6ba58c.res" + +[deps] + +source_file="res://dialogues/character1.json" +dest_files=["res://.godot/imported/character1.json-fe84c375df5ef0e4e1e832b63d6ba58c.res"] + +[params] + +compress=true diff --git a/dialogues/character2.ink b/dialogues/character2.ink new file mode 100644 index 0000000..8335f93 --- /dev/null +++ b/dialogues/character2.ink @@ -0,0 +1,43 @@ +INCLUDE variables.ink + +¡PERO MIRA QUÉ BIEN, TE LEVANTASTE DE LA CAMA! ¿NECESITAS ALGO? +{ + - Foto2 == true: + -> has_photo + - else: + -> hasnt_photo +} + +=== has_photo === +* ¿QUIÉN ERES? + ... SABÍA... SABÍA QUE TENDRÍA QUE HABER SIDO MÁS FIRME... + -> END +* NO LO SÉ + HAS DE SABER ALGO, ¿NO? BUENO... ¿Y POR QUÉ NO QUEDAS CON ESA TAL MYD? + ASÍ TE ANIMAS, QUE SEGURO QUE LE HACES TILÍN, HEHE. AY, NO TE PONGAS ASÍ, ES QUE SIEMPRE ESTÁS IGUAL... + ARRASTRAS UN PROBLEMA MUY GRANDE, TIENES SUERTE DE QUE NO TE HAYA PEDIDO CITA PARA EL PSICÓLOGO, QUE CONOZCO UNO MUY BUENO, SÍ. + BUENO, YA VENDRÁS A LA COLINA CUANDO SEPAS ALGO, CARIÑO. + -> END +* ENSÉÑALE LA FOTO + MÍRATE... NO ERAS MÁS QUE UNA COSITA PEQUEÑITA Y MIRA LO GRANDE QUE TE HAS HECHO... + SÉ QUE NO PUEDO CONTROLAR LO QUE SIENTES, PERO INTENTO AYUDARTE COMO PUEDO, SE ME HACE MUY CUESTA ARRIBA ENTENDERTE TAMBIÉN, ¿SABES? + LO SIENTO SI A VECES SOY MUY IMPULSIVA O CABEZOTA, PERO QUIERO APROVECHAR TODO EL TIEMPO QUE PUEDA CONTIGO... + QUIERO QUE ESTÉS PREPARADO... + NO ME CULPES POR SER COMO SOY Y PREOCUPARME ASÍ, PORQUE ERES MI VIDA, TE QUIERO MUCHÍSIMO, CARIÑO MÍO... + { + - Character2 == false: + ~time_to_add = 10 + ~Character2 = true + } + -> END + +=== hasnt_photo === +* ¿QUIÉN ERES? + ... SABÍA... SABÍA QUE TENDRÍA QUE HABER SIDO MÁS FIRME... + -> END +* NO LO SÉ + HAS DE SABER ALGO, ¿NO? BUENO... ¿Y POR QUÉ NO QUEDAS CON ESA TAL MYD? + ASÍ TE ANIMAS, QUE SEGURO QUE LE HACES TILÍN, HEHE. AY, NO TE PONGAS ASÍ, ES QUE SIEMPRE ESTÁS IGUAL... + ARRASTRAS UN PROBLEMA MUY GRANDE, TIENES SUERTE DE QUE NO TE HAYA PEDIDO CITA PARA EL PSICÓLOGO, QUE CONOZCO UNO MUY BUENO, SÍ. + BUENO, YA VENDRÁS A LA COLINA CUANDO SEPAS ALGO, CARIÑO. + -> END \ No newline at end of file diff --git a/dialogues/character2.ink.import b/dialogues/character2.ink.import new file mode 100644 index 0000000..c188091 --- /dev/null +++ b/dialogues/character2.ink.import @@ -0,0 +1,14 @@ +[remap] + +importer="inkgd.ink" +type="Resource" +uid="uid://d3n2s78jxmi7d" +path="res://.godot/imported/character2.ink-2cfabda2f26e7eae2c4c85250bd7e93e.res" + +[deps] + +source_file="res://dialogues/character2.ink" +dest_files=["res://.godot/imported/character2.ink-2cfabda2f26e7eae2c4c85250bd7e93e.res"] + +[params] + diff --git a/dialogues/character2.json b/dialogues/character2.json new file mode 100644 index 0000000..21788f8 --- /dev/null +++ b/dialogues/character2.json @@ -0,0 +1 @@ +{"inkVersion":21,"root":[["\n","^¡PERO MIRA QUÉ BIEN, TE LEVANTASTE DE LA CAMA! ¿NECESITAS ALGO?","\n",["ev",{"VAR?":"Foto2"},true,"==","/ev",{"->":".^.b","c":true},{"b":["\n",{"->":"has_photo"},{"->":"0.5"},null]}],[{"->":".^.b"},{"b":["\n",{"->":"hasnt_photo"},{"->":"0.5"},null]}],"nop","\n",["done",{"#f":5,"#n":"g-0"}],null],"done",{"has_photo":[[["ev",{"^->":"has_photo.0.0.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-0","flg":18},{"s":["^¿QUIÉN ERES?",{"->":"$r","var":true},null]}],["ev",{"^->":"has_photo.0.1.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-1","flg":18},{"s":["^NO LO SÉ",{"->":"$r","var":true},null]}],["ev",{"^->":"has_photo.0.2.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-2","flg":18},{"s":["^ENSÉÑALE LA FOTO",{"->":"$r","var":true},null]}],{"c-0":["ev",{"^->":"has_photo.0.c-0.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.0.s"},[{"#n":"$r2"}],"\n","^... SABÍA... SABÍA QUE TENDRÍA QUE HABER SIDO MÁS FIRME...","\n","end",{"#f":5}],"c-1":["ev",{"^->":"has_photo.0.c-1.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.1.s"},[{"#n":"$r2"}],"\n","^HAS DE SABER ALGO, ¿NO? BUENO... ¿Y POR QUÉ NO QUEDAS CON ESA TAL MYD?","\n","^ASÍ TE ANIMAS, QUE SEGURO QUE LE HACES TILÍN, HEHE. AY, NO TE PONGAS ASÍ, ES QUE SIEMPRE ESTÁS IGUAL...","\n","^ARRASTRAS UN PROBLEMA MUY GRANDE, TIENES SUERTE DE QUE NO TE HAYA PEDIDO CITA PARA EL PSICÓLOGO, QUE CONOZCO UNO MUY BUENO, SÍ.","\n","^BUENO, YA VENDRÁS A LA COLINA CUANDO SEPAS ALGO, CARIÑO.","\n","end",{"#f":5}],"c-2":["ev",{"^->":"has_photo.0.c-2.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.2.s"},[{"#n":"$r2"}],"\n","^MÍRATE... NO ERAS MÁS QUE UNA COSITA PEQUEÑITA Y MIRA LO GRANDE QUE TE HAS HECHO...","\n","^SÉ QUE NO PUEDO CONTROLAR LO QUE SIENTES, PERO INTENTO AYUDARTE COMO PUEDO, SE ME HACE MUY CUESTA ARRIBA ENTENDERTE TAMBIÉN, ¿SABES?","\n","^LO SIENTO SI A VECES SOY MUY IMPULSIVA O CABEZOTA, PERO QUIERO APROVECHAR TODO EL TIEMPO QUE PUEDA CONTIGO...","\n","^QUIERO QUE ESTÉS PREPARADO...","\n","^NO ME CULPES POR SER COMO SOY Y PREOCUPARME ASÍ, PORQUE ERES MI VIDA, TE QUIERO MUCHÍSIMO, CARIÑO MÍO...","\n",["ev",{"VAR?":"Character2"},false,"==","/ev",{"->":".^.b","c":true},{"b":["\n","ev",10,"/ev",{"VAR=":"time_to_add","re":true},"ev",true,"/ev",{"VAR=":"Character2","re":true},{"->":".^.^.^.18"},null]}],"nop","\n","end",{"#f":5}]}],{"#f":1}],"hasnt_photo":[[["ev",{"^->":"hasnt_photo.0.0.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-0","flg":18},{"s":["^¿QUIÉN ERES?",{"->":"$r","var":true},null]}],["ev",{"^->":"hasnt_photo.0.1.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-1","flg":18},{"s":["^NO LO SÉ",{"->":"$r","var":true},null]}],{"c-0":["ev",{"^->":"hasnt_photo.0.c-0.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.0.s"},[{"#n":"$r2"}],"\n","^... SABÍA... SABÍA QUE TENDRÍA QUE HABER SIDO MÁS FIRME...","\n","end",{"#f":5}],"c-1":["ev",{"^->":"hasnt_photo.0.c-1.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.1.s"},[{"#n":"$r2"}],"\n","^HAS DE SABER ALGO, ¿NO? BUENO... ¿Y POR QUÉ NO QUEDAS CON ESA TAL MYD?","\n","^ASÍ TE ANIMAS, QUE SEGURO QUE LE HACES TILÍN, HEHE. AY, NO TE PONGAS ASÍ, ES QUE SIEMPRE ESTÁS IGUAL...","\n","^ARRASTRAS UN PROBLEMA MUY GRANDE, TIENES SUERTE DE QUE NO TE HAYA PEDIDO CITA PARA EL PSICÓLOGO, QUE CONOZCO UNO MUY BUENO, SÍ.","\n","^BUENO, YA VENDRÁS A LA COLINA CUANDO SEPAS ALGO, CARIÑO.","\n","end",{"#f":5}]}],{"#f":1}],"parte_comun":["^Hola soy una parte comun","\n","done",{"#f":1}],"global decl":["ev",false,{"VAR=":"Foto1"},false,{"VAR=":"Foto2"},false,{"VAR=":"Foto3"},false,{"VAR=":"Foto4"},false,{"VAR=":"Foto5"},0,{"VAR=":"time_to_add"},false,{"VAR=":"Character1"},false,{"VAR=":"Character2"},false,{"VAR=":"Character3"},false,{"VAR=":"Character4"},false,{"VAR=":"Character5"},"/ev","end",null],"#f":1}],"listDefs":{}} \ No newline at end of file diff --git a/dialogues/character2.json.import b/dialogues/character2.json.import new file mode 100644 index 0000000..d6ecd39 --- /dev/null +++ b/dialogues/character2.json.import @@ -0,0 +1,15 @@ +[remap] + +importer="inkgd.ink.json" +type="Resource" +uid="uid://cwuph50ai780s" +path="res://.godot/imported/character2.json-cb4b30460477e2e69861c3fb76050aab.res" + +[deps] + +source_file="res://dialogues/character2.json" +dest_files=["res://.godot/imported/character2.json-cb4b30460477e2e69861c3fb76050aab.res"] + +[params] + +compress=true diff --git a/dialogues/character3.ink b/dialogues/character3.ink new file mode 100644 index 0000000..b586c41 --- /dev/null +++ b/dialogues/character3.ink @@ -0,0 +1,36 @@ +INCLUDE variables.ink + +¡GUAU! (TE MIRA CON MUCHO ENTUSIASMO, PARECE QUE TE QUIERE MUCHO) +{ + - Foto3 == true: + -> has_photo + - else: + -> hasnt_photo +} + +=== has_photo === +* ... + GUAU... (PARECE DECEPCIONADO, ASUME QUE NUNCA TENDRÁS TIEMPO PARA ÉL) + -> END +* ACARICIA AL GARRETE + ¡GUAU! ¡GUAU! (SE PONE MUY CONTENTO, PARECE QUE TE VA A ESPERAR EN LA COLINA HASTA QUE ESTÉS LISTO) + -> END +* ENSÉÑALE LA FOTO + (SI PUDIERA HABLAR PROBABLEMENTE TE DIRÍA:) + (ES NORMAL NO PODER SACAR TIEMPO PARA TODO, TODOS NECESITAMOS NUESTRO TIEMPO E IR A NUESTRO RITMO) + (YO TE ESTARÉ ESPERANDO Y DISFRUTARÉ CADA MOMENTO QUE PASES CONMIGO, Y SI NO PUEDES...) + (PUES TE ACOMPAÑARÉ Y ESTARÉ AHÍ CUANDO NECESITES COMPAÑÍA) + { + - Character3 == false: + ~time_to_add = 10 + ~Character3 = true + } + -> END + +=== hasnt_photo === +* ... + GUAU... (PARECE DECEPCIONADO, ASUME QUE NUNCA TENDRÁS TIEMPO PARA ÉL) + -> END +* ACARICIA AL GARRETE + ¡GUAU! ¡GUAU! (SE PONE MUY CONTENTO, PARECE QUE TE VA A ESPERAR EN LA COLINA HASTA QUE ESTÉS LISTO) + -> END \ No newline at end of file diff --git a/dialogues/character3.ink.import b/dialogues/character3.ink.import new file mode 100644 index 0000000..ea4a4fb --- /dev/null +++ b/dialogues/character3.ink.import @@ -0,0 +1,14 @@ +[remap] + +importer="inkgd.ink" +type="Resource" +uid="uid://cnnxhj1fffoy" +path="res://.godot/imported/character3.ink-f96f6641c8d0dba4ea593961a91d22e6.res" + +[deps] + +source_file="res://dialogues/character3.ink" +dest_files=["res://.godot/imported/character3.ink-f96f6641c8d0dba4ea593961a91d22e6.res"] + +[params] + diff --git a/dialogues/character3.json b/dialogues/character3.json new file mode 100644 index 0000000..80610c4 --- /dev/null +++ b/dialogues/character3.json @@ -0,0 +1 @@ +{"inkVersion":21,"root":[["\n","^¡GUAU! (TE MIRA CON MUCHO ENTUSIASMO, PARECE QUE TE QUIERE MUCHO)","\n",["ev",{"VAR?":"Foto3"},true,"==","/ev",{"->":".^.b","c":true},{"b":["\n",{"->":"has_photo"},{"->":"0.5"},null]}],[{"->":".^.b"},{"b":["\n",{"->":"hasnt_photo"},{"->":"0.5"},null]}],"nop","\n",["done",{"#f":5,"#n":"g-0"}],null],"done",{"has_photo":[[["ev",{"^->":"has_photo.0.0.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-0","flg":18},{"s":["^...",{"->":"$r","var":true},null]}],["ev",{"^->":"has_photo.0.1.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-1","flg":18},{"s":["^ACARICIA AL GARRETE",{"->":"$r","var":true},null]}],["ev",{"^->":"has_photo.0.2.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-2","flg":18},{"s":["^ENSÉÑALE LA FOTO",{"->":"$r","var":true},null]}],{"c-0":["ev",{"^->":"has_photo.0.c-0.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.0.s"},[{"#n":"$r2"}],"\n","^GUAU... (PARECE DECEPCIONADO, ASUME QUE NUNCA TENDRÁS TIEMPO PARA ÉL)","\n","end",{"#f":5}],"c-1":["ev",{"^->":"has_photo.0.c-1.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.1.s"},[{"#n":"$r2"}],"\n","^¡GUAU! ¡GUAU! (SE PONE MUY CONTENTO, PARECE QUE TE VA A ESPERAR EN LA COLINA HASTA QUE ESTÉS LISTO)","\n","end",{"#f":5}],"c-2":["ev",{"^->":"has_photo.0.c-2.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.2.s"},[{"#n":"$r2"}],"\n","^(SI PUDIERA HABLAR PROBABLEMENTE TE DIRÍA:)","\n","^(ES NORMAL NO PODER SACAR TIEMPO PARA TODO, TODOS NECESITAMOS NUESTRO TIEMPO E IR A NUESTRO RITMO)","\n","^(YO TE ESTARÉ ESPERANDO Y DISFRUTARÉ CADA MOMENTO QUE PASES CONMIGO, Y SI NO PUEDES...)","\n","^(PUES TE ACOMPAÑARÉ Y ESTARÉ AHÍ CUANDO NECESITES COMPAÑÍA)","\n",["ev",{"VAR?":"Character3"},false,"==","/ev",{"->":".^.b","c":true},{"b":["\n","ev",10,"/ev",{"VAR=":"time_to_add","re":true},"ev",true,"/ev",{"VAR=":"Character3","re":true},{"->":".^.^.^.16"},null]}],"nop","\n","end",{"#f":5}]}],{"#f":1}],"hasnt_photo":[[["ev",{"^->":"hasnt_photo.0.0.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-0","flg":18},{"s":["^...",{"->":"$r","var":true},null]}],["ev",{"^->":"hasnt_photo.0.1.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-1","flg":18},{"s":["^ACARICIA AL GARRETE",{"->":"$r","var":true},null]}],{"c-0":["ev",{"^->":"hasnt_photo.0.c-0.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.0.s"},[{"#n":"$r2"}],"\n","^GUAU... (PARECE DECEPCIONADO, ASUME QUE NUNCA TENDRÁS TIEMPO PARA ÉL)","\n","end",{"#f":5}],"c-1":["ev",{"^->":"hasnt_photo.0.c-1.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.1.s"},[{"#n":"$r2"}],"\n","^¡GUAU! ¡GUAU! (SE PONE MUY CONTENTO, PARECE QUE TE VA A ESPERAR EN LA COLINA HASTA QUE ESTÉS LISTO)","\n","end",{"#f":5}]}],{"#f":1}],"parte_comun":["^Hola soy una parte comun","\n","done",{"#f":1}],"global decl":["ev",false,{"VAR=":"Foto1"},false,{"VAR=":"Foto2"},false,{"VAR=":"Foto3"},false,{"VAR=":"Foto4"},false,{"VAR=":"Foto5"},0,{"VAR=":"time_to_add"},false,{"VAR=":"Character1"},false,{"VAR=":"Character2"},false,{"VAR=":"Character3"},false,{"VAR=":"Character4"},false,{"VAR=":"Character5"},"/ev","end",null],"#f":1}],"listDefs":{}} \ No newline at end of file diff --git a/dialogues/character3.json.import b/dialogues/character3.json.import new file mode 100644 index 0000000..716d31c --- /dev/null +++ b/dialogues/character3.json.import @@ -0,0 +1,15 @@ +[remap] + +importer="inkgd.ink.json" +type="Resource" +uid="uid://cci0kxg58ci6a" +path="res://.godot/imported/character3.json-2fc2fe81364b191ed042804d13c279dc.res" + +[deps] + +source_file="res://dialogues/character3.json" +dest_files=["res://.godot/imported/character3.json-2fc2fe81364b191ed042804d13c279dc.res"] + +[params] + +compress=true diff --git a/dialogues/character4.ink b/dialogues/character4.ink new file mode 100644 index 0000000..236b932 --- /dev/null +++ b/dialogues/character4.ink @@ -0,0 +1,39 @@ +INCLUDE variables.ink + +¡WOW! ESTE MAR ES INMENSO... ¡VENGA! ¡A VER QUIÉN NADA MÁS ADENTRO! +{ + - Foto4 == true: + -> has_photo + - else: + -> hasnt_photo +} + +=== has_photo === +* ¿DÓNDE ESTOY? + ... A MI TAMBIÉN ME GUSTARÍA SABERLO... TE ECHO DE MENOS... + -> END +* NO ME APETECE + ¿OTRA VEZ? BUENO... ¡NO PASA NADA! ¿QUÉ TAL UNA CARRERA HASTA LA CIMA DE LA COLINA? + NADA DE EXCUSAS NI LÁGRIMAS, ¡EL PRIMERO EN LLEGAR ES UN HUEVO PODRIDO! + -> END +* ENSÉÑALE LA FOTO + ... ¿SABES? SIEMPRE ME PREGUNTO SI SOY UN BUEN AMIGO... + NUNCA ME PARECIÓ NECESARIO HABLAR DE NADA EN CONCRETO, SIEMPRE ESTAMOS A LO NUESTRO: JUGANDO, SALIENDO Y HACIENDO NUESTRAS TONTERÍAS. + Y PENSABA QUE ESO ERA SUFICIENTE. + PERO... PUEDE QUE HABLAR DE CÓMO ESTAMOS DE TANTO EN TANTO TAMBIÉN VAYA BIEN... + Y... PUEDE QUE YO TAMBIÉN LO NECESITE + { + - Character4 == false: + ~time_to_add = 10 + ~Character4 = true + } + -> END + +=== hasnt_photo === +* ¿DÓNDE ESTOY? + ... A MI TAMBIÉN ME GUSTARÍA SABERLO... TE ECHO DE MENOS... + -> END +* NO ME APETECE + ¿OTRA VEZ? BUENO... ¡NO PASA NADA! ¿QUÉ TAL UNA CARRERA HASTA LA CIMA DE LA COLINA? + NADA DE EXCUSAS NI LÁGRIMAS, ¡EL PRIMERO EN LLEGAR ES UN HUEVO PODRIDO! + -> END \ No newline at end of file diff --git a/dialogues/character4.ink.import b/dialogues/character4.ink.import new file mode 100644 index 0000000..577b1f1 --- /dev/null +++ b/dialogues/character4.ink.import @@ -0,0 +1,14 @@ +[remap] + +importer="inkgd.ink" +type="Resource" +uid="uid://bi8n5ee4xt7to" +path="res://.godot/imported/character4.ink-f5a5da6b6f01bc36e7c7e30470289f53.res" + +[deps] + +source_file="res://dialogues/character4.ink" +dest_files=["res://.godot/imported/character4.ink-f5a5da6b6f01bc36e7c7e30470289f53.res"] + +[params] + diff --git a/dialogues/character4.json b/dialogues/character4.json new file mode 100644 index 0000000..8a393cb --- /dev/null +++ b/dialogues/character4.json @@ -0,0 +1 @@ +{"inkVersion":21,"root":[["\n","^¡WOW! ESTE MAR ES INMENSO... ¡VENGA! ¡A VER QUIÉN NADA MÁS ADENTRO!","\n",["ev",{"VAR?":"Foto4"},true,"==","/ev",{"->":".^.b","c":true},{"b":["\n",{"->":"has_photo"},{"->":"0.5"},null]}],[{"->":".^.b"},{"b":["\n",{"->":"hasnt_photo"},{"->":"0.5"},null]}],"nop","\n",["done",{"#f":5,"#n":"g-0"}],null],"done",{"has_photo":[[["ev",{"^->":"has_photo.0.0.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-0","flg":18},{"s":["^¿DÓNDE ESTOY?",{"->":"$r","var":true},null]}],["ev",{"^->":"has_photo.0.1.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-1","flg":18},{"s":["^NO ME APETECE",{"->":"$r","var":true},null]}],["ev",{"^->":"has_photo.0.2.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-2","flg":18},{"s":["^ENSÉÑALE LA FOTO",{"->":"$r","var":true},null]}],{"c-0":["ev",{"^->":"has_photo.0.c-0.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.0.s"},[{"#n":"$r2"}],"\n","^... A MI TAMBIÉN ME GUSTARÍA SABERLO... TE ECHO DE MENOS...","\n","end",{"#f":5}],"c-1":["ev",{"^->":"has_photo.0.c-1.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.1.s"},[{"#n":"$r2"}],"\n","^¿OTRA VEZ? BUENO... ¡NO PASA NADA! ¿QUÉ TAL UNA CARRERA HASTA LA CIMA DE LA COLINA?","\n","^NADA DE EXCUSAS NI LÁGRIMAS, ¡EL PRIMERO EN LLEGAR ES UN HUEVO PODRIDO!","\n","end",{"#f":5}],"c-2":["ev",{"^->":"has_photo.0.c-2.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.2.s"},[{"#n":"$r2"}],"\n","^... ¿SABES? SIEMPRE ME PREGUNTO SI SOY UN BUEN AMIGO...","\n","^NUNCA ME PARECIÓ NECESARIO HABLAR DE NADA EN CONCRETO, SIEMPRE ESTAMOS A LO NUESTRO: JUGANDO, SALIENDO Y HACIENDO NUESTRAS TONTERÍAS.","\n","^Y PENSABA QUE ESO ERA SUFICIENTE.","\n","^PERO... PUEDE QUE HABLAR DE CÓMO ESTAMOS DE TANTO EN TANTO TAMBIÉN VAYA BIEN...","\n","^Y... PUEDE QUE YO TAMBIÉN LO NECESITE","\n",["ev",{"VAR?":"Character4"},false,"==","/ev",{"->":".^.b","c":true},{"b":["\n","ev",10,"/ev",{"VAR=":"time_to_add","re":true},"ev",true,"/ev",{"VAR=":"Character4","re":true},{"->":".^.^.^.18"},null]}],"nop","\n","end",{"#f":5}]}],{"#f":1}],"hasnt_photo":[[["ev",{"^->":"hasnt_photo.0.0.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-0","flg":18},{"s":["^¿DÓNDE ESTOY?",{"->":"$r","var":true},null]}],["ev",{"^->":"hasnt_photo.0.1.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-1","flg":18},{"s":["^NO ME APETECE",{"->":"$r","var":true},null]}],{"c-0":["ev",{"^->":"hasnt_photo.0.c-0.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.0.s"},[{"#n":"$r2"}],"\n","^... A MI TAMBIÉN ME GUSTARÍA SABERLO... TE ECHO DE MENOS...","\n","end",{"#f":5}],"c-1":["ev",{"^->":"hasnt_photo.0.c-1.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.1.s"},[{"#n":"$r2"}],"\n","^¿OTRA VEZ? BUENO... ¡NO PASA NADA! ¿QUÉ TAL UNA CARRERA HASTA LA CIMA DE LA COLINA?","\n","^NADA DE EXCUSAS NI LÁGRIMAS, ¡EL PRIMERO EN LLEGAR ES UN HUEVO PODRIDO!","\n","end",{"#f":5}]}],{"#f":1}],"parte_comun":["^Hola soy una parte comun","\n","done",{"#f":1}],"global decl":["ev",false,{"VAR=":"Foto1"},false,{"VAR=":"Foto2"},false,{"VAR=":"Foto3"},false,{"VAR=":"Foto4"},false,{"VAR=":"Foto5"},0,{"VAR=":"time_to_add"},false,{"VAR=":"Character1"},false,{"VAR=":"Character2"},false,{"VAR=":"Character3"},false,{"VAR=":"Character4"},false,{"VAR=":"Character5"},"/ev","end",null],"#f":1}],"listDefs":{}} \ No newline at end of file diff --git a/dialogues/character4.json.import b/dialogues/character4.json.import new file mode 100644 index 0000000..01878b9 --- /dev/null +++ b/dialogues/character4.json.import @@ -0,0 +1,15 @@ +[remap] + +importer="inkgd.ink.json" +type="Resource" +uid="uid://cve0godte3dr3" +path="res://.godot/imported/character4.json-e2a27e55c56afe18a617fe5652c8d472.res" + +[deps] + +source_file="res://dialogues/character4.json" +dest_files=["res://.godot/imported/character4.json-e2a27e55c56afe18a617fe5652c8d472.res"] + +[params] + +compress=true diff --git a/dialogues/character5.ink b/dialogues/character5.ink new file mode 100644 index 0000000..d85749c --- /dev/null +++ b/dialogues/character5.ink @@ -0,0 +1,45 @@ +INCLUDE variables.ink + +BUENAS TARDES GRUMETILLO. ¿QUÉ TAL FUÉ LA SIESTECILLA? JE, JE +{ + - Foto5 == true: + -> has_photo + - else: + -> hasnt_photo +} + +=== has_photo === +* ¿DÓNDE ESTOY? + ¿MMH? ¿CÓMO QUE DÓNDE ESTAMOS? PUES DÓNDE QUERÍAS IR, ¿DÓNDE SI NO? + -> END +* ¿QUIÉN ERES? + CAPITÁN D., D. EDUARD. TRABAJO COMO PESCADOR, PERO DE TANTO EN TANTO LLEVO PASAJEROS A SUS DESTINOS, ASÍ ENCUENTRO NUEVOS PECES, JEJE. + DE TODOS MODOS, YA QUE ESTÁS AQUÍ, PODRÍAS RECOGER UNAS FOTOS QUE SUELE HABER POR ESTAS ISLAS. + ES POSIBLE QUE INCLUSO ENCUENTRES A OTROS QUE TE OFREZCAN SU AYUDA. + MIRA POR DÓNDE, JUSTO AL FINAL DEL MUELLE HAY UNA FOTO. TRÁELA, ANDA, A VER DE QUÉ ES. + -> END +* ENSEÑALE LA FOTO + ¿A VER? ENSÉÑAME LA FOTO. + ... SE CREERÁ MUY GRACIOSO EL MERLUZO QUE ME HA HECHO LA FOTO... + EN CUANTO LO PILLE... + ... BUENO, DA IGUAL, ESTOY MUY VIEJO YA PARA ESTAS COSAS. + Y TÚ, DISFRUTA DE TU DESTINO TROPICAL, JEJE. AUNQUE AHORA QUE TE VEO... ¿ESTÁS BIEN? + TIENES CARA DE QUE TE VAS A DESPLOMAR DE SUEÑO EN CUALQUIER MOMENTO... NO TE QUERRÁS PERDER TODO LO QUE ESTA ISLA TIENE QUE OFRECER, ¿NO? + EXPLORA TODO LO QUE PUEDAS Y LUEGO VETE A LA CIMA DE ESA COLINA, ME PARECIÓ VER UNA CAMA MIENTRAS ATRACÁBAMOS. + { + - Character5 == false: + ~time_to_add = 10 + ~Character5 = true + } + -> END + +=== hasnt_photo === +* ¿DÓNDE ESTOY? + ¿MMH? ¿CÓMO QUE DÓNDE ESTAMOS? PUES DÓNDE QUERÍAS IR, ¿DÓNDE SI NO? + -> END +* ¿QUIÉN ERES? + CAPITÁN D., D. EDUARD. TRABAJO COMO PESCADOR, PERO DE TANTO EN TANTO LLEVO PASAJEROS A SUS DESTINOS, ASÍ ENCUENTRO NUEVOS PECES, JEJE. + DE TODOS MODOS, YA QUE ESTÁS AQUÍ, PODRÍAS RECOGER UNAS FOTOS QUE SUELE HABER POR ESTAS ISLAS. + ES POSIBLE QUE INCLUSO ENCUENTRES A OTROS QUE TE OFREZCAN SU AYUDA. + MIRA POR DÓNDE, JUSTO AL FINAL DEL MUELLE HAY UNA FOTO. TRÁELA, ANDA, A VER DE QUÉ ES. + -> END \ No newline at end of file diff --git a/dialogues/character5.ink.import b/dialogues/character5.ink.import new file mode 100644 index 0000000..2237dc7 --- /dev/null +++ b/dialogues/character5.ink.import @@ -0,0 +1,14 @@ +[remap] + +importer="inkgd.ink" +type="Resource" +uid="uid://dccfqvmykfg11" +path="res://.godot/imported/character5.ink-6e2eef496f8eb50e21e43e61eee158e2.res" + +[deps] + +source_file="res://dialogues/character5.ink" +dest_files=["res://.godot/imported/character5.ink-6e2eef496f8eb50e21e43e61eee158e2.res"] + +[params] + diff --git a/dialogues/character5.json b/dialogues/character5.json new file mode 100644 index 0000000..6d57a40 --- /dev/null +++ b/dialogues/character5.json @@ -0,0 +1 @@ +{"inkVersion":21,"root":[["\n","^BUENAS TARDES GRUMETILLO. ¿QUÉ TAL FUÉ LA SIESTECILLA? JE, JE","\n",["ev",{"VAR?":"Foto5"},true,"==","/ev",{"->":".^.b","c":true},{"b":["\n",{"->":"has_photo"},{"->":"0.5"},null]}],[{"->":".^.b"},{"b":["\n",{"->":"hasnt_photo"},{"->":"0.5"},null]}],"nop","\n",["done",{"#f":5,"#n":"g-0"}],null],"done",{"has_photo":[[["ev",{"^->":"has_photo.0.0.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-0","flg":18},{"s":["^¿DÓNDE ESTOY?",{"->":"$r","var":true},null]}],["ev",{"^->":"has_photo.0.1.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-1","flg":18},{"s":["^¿QUIÉN ERES?",{"->":"$r","var":true},null]}],["ev",{"^->":"has_photo.0.2.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-2","flg":18},{"s":["^ENSEÑALE LA FOTO",{"->":"$r","var":true},null]}],{"c-0":["ev",{"^->":"has_photo.0.c-0.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.0.s"},[{"#n":"$r2"}],"\n","^¿MMH? ¿CÓMO QUE DÓNDE ESTAMOS? PUES DÓNDE QUERÍAS IR, ¿DÓNDE SI NO?","\n","end",{"#f":5}],"c-1":["ev",{"^->":"has_photo.0.c-1.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.1.s"},[{"#n":"$r2"}],"\n","^CAPITÁN D., D. EDUARD. TRABAJO COMO PESCADOR, PERO DE TANTO EN TANTO LLEVO PASAJEROS A SUS DESTINOS, ASÍ ENCUENTRO NUEVOS PECES, JEJE.","\n","^DE TODOS MODOS, YA QUE ESTÁS AQUÍ, PODRÍAS RECOGER UNAS FOTOS QUE SUELE HABER POR ESTAS ISLAS.","\n","^ES POSIBLE QUE INCLUSO ENCUENTRES A OTROS QUE TE OFREZCAN SU AYUDA.","\n","^MIRA POR DÓNDE, JUSTO AL FINAL DEL MUELLE HAY UNA FOTO. TRÁELA, ANDA, A VER DE QUÉ ES.","\n","end",{"#f":5}],"c-2":["ev",{"^->":"has_photo.0.c-2.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.2.s"},[{"#n":"$r2"}],"\n","^¿A VER? ENSÉÑAME LA FOTO.","\n","^... SE CREERÁ MUY GRACIOSO EL MERLUZO QUE ME HA HECHO LA FOTO...","\n","^EN CUANTO LO PILLE...","\n","^... BUENO, DA IGUAL, ESTOY MUY VIEJO YA PARA ESTAS COSAS.","\n","^Y TÚ, DISFRUTA DE TU DESTINO TROPICAL, JEJE. AUNQUE AHORA QUE TE VEO... ¿ESTÁS BIEN?","\n","^TIENES CARA DE QUE TE VAS A DESPLOMAR DE SUEÑO EN CUALQUIER MOMENTO... NO TE QUERRÁS PERDER TODO LO QUE ESTA ISLA TIENE QUE OFRECER, ¿NO?","\n","^EXPLORA TODO LO QUE PUEDAS Y LUEGO VETE A LA CIMA DE ESA COLINA, ME PARECIÓ VER UNA CAMA MIENTRAS ATRACÁBAMOS.","\n",["ev",{"VAR?":"Character5"},false,"==","/ev",{"->":".^.b","c":true},{"b":["\n","ev",10,"/ev",{"VAR=":"time_to_add","re":true},"ev",true,"/ev",{"VAR=":"Character5","re":true},{"->":".^.^.^.22"},null]}],"nop","\n","end",{"#f":5}]}],{"#f":1}],"hasnt_photo":[[["ev",{"^->":"hasnt_photo.0.0.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-0","flg":18},{"s":["^¿DÓNDE ESTOY?",{"->":"$r","var":true},null]}],["ev",{"^->":"hasnt_photo.0.1.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","/ev",{"*":".^.^.c-1","flg":18},{"s":["^¿QUIÉN ERES?",{"->":"$r","var":true},null]}],{"c-0":["ev",{"^->":"hasnt_photo.0.c-0.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.0.s"},[{"#n":"$r2"}],"\n","^¿MMH? ¿CÓMO QUE DÓNDE ESTAMOS? PUES DÓNDE QUERÍAS IR, ¿DÓNDE SI NO?","\n","end",{"#f":5}],"c-1":["ev",{"^->":"hasnt_photo.0.c-1.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.1.s"},[{"#n":"$r2"}],"\n","^CAPITÁN D., D. EDUARD. TRABAJO COMO PESCADOR, PERO DE TANTO EN TANTO LLEVO PASAJEROS A SUS DESTINOS, ASÍ ENCUENTRO NUEVOS PECES, JEJE.","\n","^DE TODOS MODOS, YA QUE ESTÁS AQUÍ, PODRÍAS RECOGER UNAS FOTOS QUE SUELE HABER POR ESTAS ISLAS.","\n","^ES POSIBLE QUE INCLUSO ENCUENTRES A OTROS QUE TE OFREZCAN SU AYUDA.","\n","^MIRA POR DÓNDE, JUSTO AL FINAL DEL MUELLE HAY UNA FOTO. TRÁELA, ANDA, A VER DE QUÉ ES.","\n","end",{"#f":5}]}],{"#f":1}],"parte_comun":["^Hola soy una parte comun","\n","done",{"#f":1}],"global decl":["ev",false,{"VAR=":"Foto1"},false,{"VAR=":"Foto2"},false,{"VAR=":"Foto3"},false,{"VAR=":"Foto4"},false,{"VAR=":"Foto5"},0,{"VAR=":"time_to_add"},false,{"VAR=":"Character1"},false,{"VAR=":"Character2"},false,{"VAR=":"Character3"},false,{"VAR=":"Character4"},false,{"VAR=":"Character5"},"/ev","end",null],"#f":1}],"listDefs":{}} \ No newline at end of file diff --git a/dialogues/character5.json.import b/dialogues/character5.json.import new file mode 100644 index 0000000..28609b8 --- /dev/null +++ b/dialogues/character5.json.import @@ -0,0 +1,15 @@ +[remap] + +importer="inkgd.ink.json" +type="Resource" +uid="uid://cu0t1i7ys0ye4" +path="res://.godot/imported/character5.json-3be401746a437d5d4fb5785459f1591e.res" + +[deps] + +source_file="res://dialogues/character5.json" +dest_files=["res://.godot/imported/character5.json-3be401746a437d5d4fb5785459f1591e.res"] + +[params] + +compress=true diff --git a/dialogues/foto1.ink b/dialogues/foto1.ink new file mode 100644 index 0000000..83747b1 --- /dev/null +++ b/dialogues/foto1.ink @@ -0,0 +1,5 @@ +INCLUDE variables.ink + +UNA FOTO DE UNA CHICA JUGANDO A LA CONSOLA. +~Foto1 = true +-> END \ No newline at end of file diff --git a/dialogues/foto1.ink.import b/dialogues/foto1.ink.import new file mode 100644 index 0000000..affb7d3 --- /dev/null +++ b/dialogues/foto1.ink.import @@ -0,0 +1,14 @@ +[remap] + +importer="inkgd.ink" +type="Resource" +uid="uid://dyjmxa8fj7l0s" +path="res://.godot/imported/foto1.ink-ffbdd04acb82bebc82232d9ef4076e39.res" + +[deps] + +source_file="res://dialogues/foto1.ink" +dest_files=["res://.godot/imported/foto1.ink-ffbdd04acb82bebc82232d9ef4076e39.res"] + +[params] + diff --git a/dialogues/foto1.json b/dialogues/foto1.json new file mode 100644 index 0000000..8d6ac8f --- /dev/null +++ b/dialogues/foto1.json @@ -0,0 +1 @@ +{"inkVersion":21,"root":[["\n","^UNA FOTO DE UNA CHICA JUGANDO A LA CONSOLA.","\n","ev",true,"/ev",{"VAR=":"Foto1","re":true},"end",["done",{"#f":5,"#n":"g-0"}],null],"done",{"parte_comun":["^Hola soy una parte comun","\n","done",{"#f":1}],"global decl":["ev",false,{"VAR=":"Foto1"},false,{"VAR=":"Foto2"},false,{"VAR=":"Foto3"},false,{"VAR=":"Foto4"},false,{"VAR=":"Foto5"},0,{"VAR=":"time_to_add"},false,{"VAR=":"Character1"},false,{"VAR=":"Character2"},false,{"VAR=":"Character3"},false,{"VAR=":"Character4"},false,{"VAR=":"Character5"},"/ev","end",null],"#f":1}],"listDefs":{}} \ No newline at end of file diff --git a/dialogues/foto1.json.import b/dialogues/foto1.json.import new file mode 100644 index 0000000..093ea96 --- /dev/null +++ b/dialogues/foto1.json.import @@ -0,0 +1,15 @@ +[remap] + +importer="inkgd.ink.json" +type="Resource" +uid="uid://dadbbc2gurb4t" +path="res://.godot/imported/foto1.json-4a93a83acd3135ffdd62f92266b1d67a.res" + +[deps] + +source_file="res://dialogues/foto1.json" +dest_files=["res://.godot/imported/foto1.json-4a93a83acd3135ffdd62f92266b1d67a.res"] + +[params] + +compress=true diff --git a/dialogues/foto2.ink b/dialogues/foto2.ink new file mode 100644 index 0000000..984ad64 --- /dev/null +++ b/dialogues/foto2.ink @@ -0,0 +1,5 @@ +INCLUDE variables.ink + +UNA FOTO DE UNA MADRE CON SU BEBÉ. +~Foto2 = true +-> END \ No newline at end of file diff --git a/dialogues/foto2.ink.import b/dialogues/foto2.ink.import new file mode 100644 index 0000000..54b9f95 --- /dev/null +++ b/dialogues/foto2.ink.import @@ -0,0 +1,14 @@ +[remap] + +importer="inkgd.ink" +type="Resource" +uid="uid://dem8n60w7xs7g" +path="res://.godot/imported/foto2.ink-893d54b779c172413fb9bfd5415a2f5b.res" + +[deps] + +source_file="res://dialogues/foto2.ink" +dest_files=["res://.godot/imported/foto2.ink-893d54b779c172413fb9bfd5415a2f5b.res"] + +[params] + diff --git a/dialogues/foto2.json b/dialogues/foto2.json new file mode 100644 index 0000000..a545024 --- /dev/null +++ b/dialogues/foto2.json @@ -0,0 +1 @@ +{"inkVersion":21,"root":[["\n","^UNA FOTO DE UNA MADRE CON SU BEBÉ.","\n","ev",true,"/ev",{"VAR=":"Foto2","re":true},"end",["done",{"#f":5,"#n":"g-0"}],null],"done",{"parte_comun":["^Hola soy una parte comun","\n","done",{"#f":1}],"global decl":["ev",false,{"VAR=":"Foto1"},false,{"VAR=":"Foto2"},false,{"VAR=":"Foto3"},false,{"VAR=":"Foto4"},false,{"VAR=":"Foto5"},0,{"VAR=":"time_to_add"},false,{"VAR=":"Character1"},false,{"VAR=":"Character2"},false,{"VAR=":"Character3"},false,{"VAR=":"Character4"},false,{"VAR=":"Character5"},"/ev","end",null],"#f":1}],"listDefs":{}} \ No newline at end of file diff --git a/dialogues/foto2.json.import b/dialogues/foto2.json.import new file mode 100644 index 0000000..7c1c516 --- /dev/null +++ b/dialogues/foto2.json.import @@ -0,0 +1,15 @@ +[remap] + +importer="inkgd.ink.json" +type="Resource" +uid="uid://smyx6rnnkxfp" +path="res://.godot/imported/foto2.json-0278daae967264e66b8c7aafe648f53c.res" + +[deps] + +source_file="res://dialogues/foto2.json" +dest_files=["res://.godot/imported/foto2.json-0278daae967264e66b8c7aafe648f53c.res"] + +[params] + +compress=true diff --git a/dialogues/foto3.ink b/dialogues/foto3.ink new file mode 100644 index 0000000..199c76e --- /dev/null +++ b/dialogues/foto3.ink @@ -0,0 +1,5 @@ +INCLUDE variables.ink + +UNA FOTO DE TI SUJETANDO UN... ¿GATO? ¿PERRO? +~Foto3 = true +-> END \ No newline at end of file diff --git a/dialogues/foto3.ink.import b/dialogues/foto3.ink.import new file mode 100644 index 0000000..8e69696 --- /dev/null +++ b/dialogues/foto3.ink.import @@ -0,0 +1,14 @@ +[remap] + +importer="inkgd.ink" +type="Resource" +uid="uid://bleamk2m5pmiy" +path="res://.godot/imported/foto3.ink-378a7d926f36e1acd5dfe0c108452c84.res" + +[deps] + +source_file="res://dialogues/foto3.ink" +dest_files=["res://.godot/imported/foto3.ink-378a7d926f36e1acd5dfe0c108452c84.res"] + +[params] + diff --git a/dialogues/foto3.json b/dialogues/foto3.json new file mode 100644 index 0000000..cefb0e3 --- /dev/null +++ b/dialogues/foto3.json @@ -0,0 +1 @@ +{"inkVersion":21,"root":[["\n","^UNA FOTO DE TI SUJETANDO UN... ¿GATO? ¿PERRO?","\n","ev",true,"/ev",{"VAR=":"Foto3","re":true},"end",["done",{"#f":5,"#n":"g-0"}],null],"done",{"parte_comun":["^Hola soy una parte comun","\n","done",{"#f":1}],"global decl":["ev",false,{"VAR=":"Foto1"},false,{"VAR=":"Foto2"},false,{"VAR=":"Foto3"},false,{"VAR=":"Foto4"},false,{"VAR=":"Foto5"},0,{"VAR=":"time_to_add"},false,{"VAR=":"Character1"},false,{"VAR=":"Character2"},false,{"VAR=":"Character3"},false,{"VAR=":"Character4"},false,{"VAR=":"Character5"},"/ev","end",null],"#f":1}],"listDefs":{}} \ No newline at end of file diff --git a/dialogues/foto3.json.import b/dialogues/foto3.json.import new file mode 100644 index 0000000..dde0a77 --- /dev/null +++ b/dialogues/foto3.json.import @@ -0,0 +1,15 @@ +[remap] + +importer="inkgd.ink.json" +type="Resource" +uid="uid://djaohlxw0xe11" +path="res://.godot/imported/foto3.json-ceff5149ab738adfdfb6b2eb93bb5075.res" + +[deps] + +source_file="res://dialogues/foto3.json" +dest_files=["res://.godot/imported/foto3.json-ceff5149ab738adfdfb6b2eb93bb5075.res"] + +[params] + +compress=true diff --git a/dialogues/foto4.ink b/dialogues/foto4.ink new file mode 100644 index 0000000..fbb2769 --- /dev/null +++ b/dialogues/foto4.ink @@ -0,0 +1,5 @@ +INCLUDE variables.ink + +UNA FOTO DE TI Y ALGUIEN MÁS EN EL CAMPO. +~Foto4 = true +-> END \ No newline at end of file diff --git a/dialogues/foto4.ink.import b/dialogues/foto4.ink.import new file mode 100644 index 0000000..213e37b --- /dev/null +++ b/dialogues/foto4.ink.import @@ -0,0 +1,14 @@ +[remap] + +importer="inkgd.ink" +type="Resource" +uid="uid://pdcjgjjfl2hs" +path="res://.godot/imported/foto4.ink-a34ed36b75aea0fd70936a691e5e855b.res" + +[deps] + +source_file="res://dialogues/foto4.ink" +dest_files=["res://.godot/imported/foto4.ink-a34ed36b75aea0fd70936a691e5e855b.res"] + +[params] + diff --git a/dialogues/foto4.json b/dialogues/foto4.json new file mode 100644 index 0000000..abc6e1c --- /dev/null +++ b/dialogues/foto4.json @@ -0,0 +1 @@ +{"inkVersion":21,"root":[["\n","^UNA FOTO DE TI Y ALGUIEN MÁS EN EL CAMPO.","\n","ev",true,"/ev",{"VAR=":"Foto4","re":true},"end",["done",{"#f":5,"#n":"g-0"}],null],"done",{"parte_comun":["^Hola soy una parte comun","\n","done",{"#f":1}],"global decl":["ev",false,{"VAR=":"Foto1"},false,{"VAR=":"Foto2"},false,{"VAR=":"Foto3"},false,{"VAR=":"Foto4"},false,{"VAR=":"Foto5"},0,{"VAR=":"time_to_add"},false,{"VAR=":"Character1"},false,{"VAR=":"Character2"},false,{"VAR=":"Character3"},false,{"VAR=":"Character4"},false,{"VAR=":"Character5"},"/ev","end",null],"#f":1}],"listDefs":{}} \ No newline at end of file diff --git a/dialogues/foto4.json.import b/dialogues/foto4.json.import new file mode 100644 index 0000000..dfc9008 --- /dev/null +++ b/dialogues/foto4.json.import @@ -0,0 +1,15 @@ +[remap] + +importer="inkgd.ink.json" +type="Resource" +uid="uid://cont4lcyee00o" +path="res://.godot/imported/foto4.json-5dc8ae9562f8ab8d8ac82b526e8a96ff.res" + +[deps] + +source_file="res://dialogues/foto4.json" +dest_files=["res://.godot/imported/foto4.json-5dc8ae9562f8ab8d8ac82b526e8a96ff.res"] + +[params] + +compress=true diff --git a/dialogues/foto5.ink b/dialogues/foto5.ink new file mode 100644 index 0000000..5bed9c4 --- /dev/null +++ b/dialogues/foto5.ink @@ -0,0 +1,5 @@ +INCLUDE variables.ink + +UNA FOTO DEL VIEJO PESCADOR. +~Foto5 = true +-> END \ No newline at end of file diff --git a/dialogues/foto5.ink.import b/dialogues/foto5.ink.import new file mode 100644 index 0000000..3b70c67 --- /dev/null +++ b/dialogues/foto5.ink.import @@ -0,0 +1,14 @@ +[remap] + +importer="inkgd.ink" +type="Resource" +uid="uid://b0itpbhmnlxbx" +path="res://.godot/imported/foto5.ink-fffac6982041271fdf263261f13599ae.res" + +[deps] + +source_file="res://dialogues/foto5.ink" +dest_files=["res://.godot/imported/foto5.ink-fffac6982041271fdf263261f13599ae.res"] + +[params] + diff --git a/dialogues/foto5.json b/dialogues/foto5.json new file mode 100644 index 0000000..288ecd2 --- /dev/null +++ b/dialogues/foto5.json @@ -0,0 +1 @@ +{"inkVersion":21,"root":[["\n","^UNA FOTO DEL VIEJO PESCADOR.","\n","ev",true,"/ev",{"VAR=":"Foto5","re":true},"end",["done",{"#f":5,"#n":"g-0"}],null],"done",{"parte_comun":["^Hola soy una parte comun","\n","done",{"#f":1}],"global decl":["ev",false,{"VAR=":"Foto1"},false,{"VAR=":"Foto2"},false,{"VAR=":"Foto3"},false,{"VAR=":"Foto4"},false,{"VAR=":"Foto5"},0,{"VAR=":"time_to_add"},false,{"VAR=":"Character1"},false,{"VAR=":"Character2"},false,{"VAR=":"Character3"},false,{"VAR=":"Character4"},false,{"VAR=":"Character5"},"/ev","end",null],"#f":1}],"listDefs":{}} \ No newline at end of file diff --git a/dialogues/foto5.json.import b/dialogues/foto5.json.import new file mode 100644 index 0000000..378e84d --- /dev/null +++ b/dialogues/foto5.json.import @@ -0,0 +1,15 @@ +[remap] + +importer="inkgd.ink.json" +type="Resource" +uid="uid://dc8wcfl3q7j0u" +path="res://.godot/imported/foto5.json-70f8423d79fbce83f0788ee366612aea.res" + +[deps] + +source_file="res://dialogues/foto5.json" +dest_files=["res://.godot/imported/foto5.json-70f8423d79fbce83f0788ee366612aea.res"] + +[params] + +compress=true diff --git a/dialogues/variables.ink b/dialogues/variables.ink new file mode 100644 index 0000000..2f8e10d --- /dev/null +++ b/dialogues/variables.ink @@ -0,0 +1,17 @@ +VAR Foto1 = false +VAR Foto2 = false +VAR Foto3 = false +VAR Foto4 = false +VAR Foto5 = false + +VAR time_to_add = 0 + +VAR Character1 = false +VAR Character2 = false +VAR Character3 = false +VAR Character4 = false +VAR Character5 = false + +=== parte_comun === +Hola soy una parte comun +-> DONE \ No newline at end of file diff --git a/dialogues/variables.ink.import b/dialogues/variables.ink.import new file mode 100644 index 0000000..f1df5ee --- /dev/null +++ b/dialogues/variables.ink.import @@ -0,0 +1,14 @@ +[remap] + +importer="inkgd.ink" +type="Resource" +uid="uid://cse1mdghj4mg8" +path="res://.godot/imported/variables.ink-50c39a003cb53abf3529d68754289974.res" + +[deps] + +source_file="res://dialogues/variables.ink" +dest_files=["res://.godot/imported/variables.ink-50c39a003cb53abf3529d68754289974.res"] + +[params] + diff --git a/export_presets.cfg b/export_presets.cfg new file mode 100644 index 0000000..5156198 --- /dev/null +++ b/export_presets.cfg @@ -0,0 +1,61 @@ +[preset.0] + +name="Windows Desktop" +platform="Windows Desktop" +runnable=true +dedicated_server=false +custom_features="" +export_filter="all_resources" +include_filter="" +exclude_filter="" +export_path="C:/Users/ggasc/OneDrive/Escriptori/ISJ_Builds/Windows/FigmentsOfTheNight.exe" +encryption_include_filters="" +encryption_exclude_filters="" +encrypt_pck=false +encrypt_directory=false + +[preset.0.options] + +custom_template/debug="" +custom_template/release="" +debug/export_console_wrapper=0 +binary_format/embed_pck=true +texture_format/bptc=true +texture_format/s3tc=true +texture_format/etc=false +texture_format/etc2=false +binary_format/architecture="x86_32" +codesign/enable=false +codesign/timestamp=true +codesign/timestamp_server_url="" +codesign/digest_algorithm=1 +codesign/description="" +codesign/custom_options=PackedStringArray() +application/modify_resources=true +application/icon="res://icon.ico" +application/console_wrapper_icon="res://icon.ico" +application/icon_interpolation=4 +application/file_version="" +application/product_version="" +application/company_name="Froglake Studios" +application/product_name="Figments of the Night" +application/file_description="" +application/copyright="" +application/trademarks="" +ssh_remote_deploy/enabled=false +ssh_remote_deploy/host="user@host_ip" +ssh_remote_deploy/port="22" +ssh_remote_deploy/extra_args_ssh="" +ssh_remote_deploy/extra_args_scp="" +ssh_remote_deploy/run_script="Expand-Archive -LiteralPath '{temp_dir}\\{archive_name}' -DestinationPath '{temp_dir}' +$action = New-ScheduledTaskAction -Execute '{temp_dir}\\{exe_name}' -Argument '{cmd_args}' +$trigger = New-ScheduledTaskTrigger -Once -At 00:00 +$settings = New-ScheduledTaskSettingsSet +$task = New-ScheduledTask -Action $action -Trigger $trigger -Settings $settings +Register-ScheduledTask godot_remote_debug -InputObject $task -Force:$true +Start-ScheduledTask -TaskName godot_remote_debug +while (Get-ScheduledTask -TaskName godot_remote_debug | ? State -eq running) { Start-Sleep -Milliseconds 100 } +Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue" +ssh_remote_deploy/cleanup_script="Stop-ScheduledTask -TaskName godot_remote_debug -ErrorAction:SilentlyContinue +Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue +Remove-Item -Recurse -Force '{temp_dir}'" diff --git a/fonts/ReadexPro-Regular.ttf b/fonts/ReadexPro-Regular.ttf new file mode 100644 index 0000000..74b3a40 --- /dev/null +++ b/fonts/ReadexPro-Regular.ttf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:16b358be8f403e2e5d8d6a174de4986aa4fda035756bdd540cc416b819cef731 +size 101728 diff --git a/fonts/ReadexPro-Regular.ttf.import b/fonts/ReadexPro-Regular.ttf.import new file mode 100644 index 0000000..85e18b3 --- /dev/null +++ b/fonts/ReadexPro-Regular.ttf.import @@ -0,0 +1,33 @@ +[remap] + +importer="font_data_dynamic" +type="FontFile" +uid="uid://bkn6atcxj4ro" +path="res://.godot/imported/ReadexPro-Regular.ttf-07141b89650ce64d4be7e938b04cb279.fontdata" + +[deps] + +source_file="res://fonts/ReadexPro-Regular.ttf" +dest_files=["res://.godot/imported/ReadexPro-Regular.ttf-07141b89650ce64d4be7e938b04cb279.fontdata"] + +[params] + +Rendering=null +antialiasing=1 +generate_mipmaps=false +multichannel_signed_distance_field=false +msdf_pixel_range=8 +msdf_size=48 +allow_system_fallback=true +force_autohinter=false +hinting=1 +subpixel_positioning=1 +oversampling=0.0 +Fallbacks=null +fallbacks=[] +Compress=null +compress=true +preload=[] +language_support={} +script_support={} +opentype_features={} diff --git a/icon.ico b/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1b67d5d546581d7b67d5ab8fe825f85adda2c6a2 GIT binary patch literal 102443 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%0DoOE0I?@1_JlQdA7Ihubsd%dfXJ=> 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 literal 0 HcmV?d00001 diff --git a/icon.png b/icon.png new file mode 100644 index 0000000..30530c0 --- /dev/null +++ b/icon.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a0efbdc4b1f3f746bec1499a144808efcf1a6f4470227817a813dd576ade9ed9 +size 2775 diff --git a/icon.png.import b/icon.png.import new file mode 100644 index 0000000..7e99203 --- /dev/null +++ b/icon.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b5jktjrftbr1w" +path="res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.png" +dest_files=["res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.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 diff --git a/materials/MainTexture.tres b/materials/MainTexture.tres new file mode 100644 index 0000000..83a20b7 --- /dev/null +++ b/materials/MainTexture.tres @@ -0,0 +1,8 @@ +[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://de4aonyjg5cwy"] + +[ext_resource type="Texture2D" uid="uid://dayu6ic1qi2mv" path="res://materials/textures/Characters.png" id="1_qrymo"] + +[resource] +shading_mode = 0 +albedo_texture = ExtResource("1_qrymo") +texture_filter = 0 diff --git a/materials/MainTextureTransparent.tres b/materials/MainTextureTransparent.tres new file mode 100644 index 0000000..f69dbb3 --- /dev/null +++ b/materials/MainTextureTransparent.tres @@ -0,0 +1,10 @@ +[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://dtipax35uc41h"] + +[ext_resource type="Texture2D" uid="uid://dayu6ic1qi2mv" path="res://materials/textures/Characters.png" id="1_uifyr"] + +[resource] +transparency = 1 +cull_mode = 2 +shading_mode = 0 +albedo_texture = ExtResource("1_uifyr") +texture_filter = 0 diff --git a/materials/general_texture-Recovered.png.import b/materials/general_texture-Recovered.png.import new file mode 100644 index 0000000..cebc0e6 --- /dev/null +++ b/materials/general_texture-Recovered.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://comfunegkm5bx" +path="res://.godot/imported/general_texture-Recovered.png-c3b95a4db675f66ed56f27ffd69d765b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://materials/general_texture-Recovered.png" +dest_files=["res://.godot/imported/general_texture-Recovered.png-c3b95a4db675f66ed56f27ffd69d765b.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=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/materials/opaque_plane.tres b/materials/opaque_plane.tres new file mode 100644 index 0000000..8b5d8a1 --- /dev/null +++ b/materials/opaque_plane.tres @@ -0,0 +1,9 @@ +[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://dqyhokm6b8vmr"] + +[ext_resource type="Texture2D" uid="uid://cpp7j2036l5v1" path="res://materials/textures/dummy.png" id="1_7tout"] + +[resource] +transparency = 1 +shading_mode = 0 +albedo_texture = ExtResource("1_7tout") +texture_filter = 0 diff --git a/materials/opaque_terrains.tres b/materials/opaque_terrains.tres new file mode 100644 index 0000000..0886b83 --- /dev/null +++ b/materials/opaque_terrains.tres @@ -0,0 +1,8 @@ +[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://b7f7yeqtte3lu"] + +[ext_resource type="Texture2D" uid="uid://3ajuxfmywop8" path="res://materials/textures/vegetation_terrains.png" id="1_h3u26"] + +[resource] +shading_mode = 0 +albedo_texture = ExtResource("1_h3u26") +texture_filter = 0 diff --git a/materials/plants_opacity.tres b/materials/plants_opacity.tres new file mode 100644 index 0000000..72b25af --- /dev/null +++ b/materials/plants_opacity.tres @@ -0,0 +1,11 @@ +[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://dpbqh6a5wmp46"] + +[ext_resource type="Texture2D" uid="uid://3ajuxfmywop8" path="res://materials/textures/vegetation_terrains.png" id="1_8rj76"] + +[resource] +transparency = 1 +cull_mode = 2 +depth_draw_mode = 1 +shading_mode = 0 +albedo_texture = ExtResource("1_8rj76") +texture_filter = 0 diff --git a/materials/sol_sol.png.import b/materials/sol_sol.png.import new file mode 100644 index 0000000..f77eb6d --- /dev/null +++ b/materials/sol_sol.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://hx8gxo117hcu" +path="res://.godot/imported/sol_sol.png-bb98efddc4dc48fdc29143948aeae33c.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={} + +[deps] + +source_file="res://materials/sol_sol.png" +dest_files=["res://.godot/imported/sol_sol.png-bb98efddc4dc48fdc29143948aeae33c.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=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/materials/sun.tres b/materials/sun.tres new file mode 100644 index 0000000..c6b1d59 --- /dev/null +++ b/materials/sun.tres @@ -0,0 +1,11 @@ +[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://uv7r41t7owms"] + +[ext_resource type="Texture2D" uid="uid://hx8gxo117hcu" path="res://materials/sol_sol.png" id="1_u4e1q"] + +[resource] +resource_name = "Material" +cull_mode = 2 +shading_mode = 0 +vertex_color_use_as_albedo = true +albedo_texture = ExtResource("1_u4e1q") +texture_filter = 0 diff --git a/materials/sun_inner.tres b/materials/sun_inner.tres new file mode 100644 index 0000000..7c2d0c7 --- /dev/null +++ b/materials/sun_inner.tres @@ -0,0 +1,5 @@ +[gd_resource type="StandardMaterial3D" format=3 uid="uid://oqg772b8javk"] + +[resource] +shading_mode = 0 +albedo_color = Color(0.858824, 0.376471, 0.298039, 1) diff --git a/materials/sun_outer.tres b/materials/sun_outer.tres new file mode 100644 index 0000000..0ac9a3a --- /dev/null +++ b/materials/sun_outer.tres @@ -0,0 +1,5 @@ +[gd_resource type="StandardMaterial3D" format=3 uid="uid://10h0oba417ct"] + +[resource] +shading_mode = 0 +albedo_color = Color(0.694118, 0.2, 0.32549, 1) diff --git a/materials/textures/Characters.png b/materials/textures/Characters.png new file mode 100644 index 0000000..d86dd73 --- /dev/null +++ b/materials/textures/Characters.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:59c0b9707bfe6f104b7fd4649057f26ded043542196a9541c1d615f6a1cc6d36 +size 3137 diff --git a/materials/textures/Characters.png.import b/materials/textures/Characters.png.import new file mode 100644 index 0000000..c90ffcc --- /dev/null +++ b/materials/textures/Characters.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dayu6ic1qi2mv" +path="res://.godot/imported/Characters.png-ee3e122307ddd0c2aad42ddd68d3a54d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://materials/textures/Characters.png" +dest_files=["res://.godot/imported/Characters.png-ee3e122307ddd0c2aad42ddd68d3a54d.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=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/materials/textures/dummy.png b/materials/textures/dummy.png new file mode 100644 index 0000000..715bee5 --- /dev/null +++ b/materials/textures/dummy.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c3cdc213748bc698b0890beb4dc25403d3cd7397609bc6f4ad74fceab2d4d6b6 +size 85 diff --git a/materials/textures/dummy.png.import b/materials/textures/dummy.png.import new file mode 100644 index 0000000..4e14e47 --- /dev/null +++ b/materials/textures/dummy.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cpp7j2036l5v1" +path.s3tc="res://.godot/imported/dummy.png-e70deb8e01f7da13620f6180cfdca735.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://materials/textures/dummy.png" +dest_files=["res://.godot/imported/dummy.png-e70deb8e01f7da13620f6180cfdca735.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/materials/textures/hojas_1.png b/materials/textures/hojas_1.png new file mode 100644 index 0000000..ab3dcbe --- /dev/null +++ b/materials/textures/hojas_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ec9130dce5a773fb6203df7f9b54625194f79d1c11cc947c04641012d834c9b2 +size 1760 diff --git a/materials/textures/hojas_1.png.import b/materials/textures/hojas_1.png.import new file mode 100644 index 0000000..eee4cfa --- /dev/null +++ b/materials/textures/hojas_1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cr8cfbdijxt8g" +path="res://.godot/imported/hojas_1.png-c20b69bde68ccf8337cbf37f2f76ac96.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://materials/textures/hojas_1.png" +dest_files=["res://.godot/imported/hojas_1.png-c20b69bde68ccf8337cbf37f2f76ac96.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 diff --git a/materials/textures/hojas_2.png b/materials/textures/hojas_2.png new file mode 100644 index 0000000..62b365c --- /dev/null +++ b/materials/textures/hojas_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea3820f1a63a9fb48037385e804232ff3858d42084307650862498a7fb88d6ec +size 1071 diff --git a/materials/textures/hojas_2.png.import b/materials/textures/hojas_2.png.import new file mode 100644 index 0000000..1fc5d2f --- /dev/null +++ b/materials/textures/hojas_2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://vhbcn2wbbr5v" +path="res://.godot/imported/hojas_2.png-054db0d6b9ec9f544c7afa2ff184b917.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://materials/textures/hojas_2.png" +dest_files=["res://.godot/imported/hojas_2.png-054db0d6b9ec9f544c7afa2ff184b917.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=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/materials/textures/paleta2.png b/materials/textures/paleta2.png new file mode 100644 index 0000000..7fde9de --- /dev/null +++ b/materials/textures/paleta2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:73a535f9cc25fdc8194f35a0f86aeef619f7d05b2d9b6eb2cb7bedc480be0e6d +size 270 diff --git a/materials/textures/paleta2.png.import b/materials/textures/paleta2.png.import new file mode 100644 index 0000000..9f34f66 --- /dev/null +++ b/materials/textures/paleta2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c2fvoxexq88w8" +path="res://.godot/imported/paleta2.png-1e96677dd64f3ebd7fe5b247b01d0146.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://materials/textures/paleta2.png" +dest_files=["res://.godot/imported/paleta2.png-1e96677dd64f3ebd7fe5b247b01d0146.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 diff --git a/materials/textures/sol_sol.png b/materials/textures/sol_sol.png new file mode 100644 index 0000000..1d154c9 --- /dev/null +++ b/materials/textures/sol_sol.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ac494d1c7d20df50e310f6bd9b761157a5be2eae7c2f0b58a93b4d513df8649 +size 796 diff --git a/materials/textures/sol_sol.png.import b/materials/textures/sol_sol.png.import new file mode 100644 index 0000000..2ee3ff0 --- /dev/null +++ b/materials/textures/sol_sol.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d4btnnubme2qq" +path="res://.godot/imported/sol_sol.png-431ff2e51119d889023a256618b14138.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://materials/textures/sol_sol.png" +dest_files=["res://.godot/imported/sol_sol.png-431ff2e51119d889023a256618b14138.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 diff --git a/materials/textures/vegetation_terrains.png b/materials/textures/vegetation_terrains.png new file mode 100644 index 0000000..770cac0 --- /dev/null +++ b/materials/textures/vegetation_terrains.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5cf2c3da4317195710af91e7c6eb69725e88751920b5443d0cf1a517f55505e2 +size 5491 diff --git a/materials/textures/vegetation_terrains.png.import b/materials/textures/vegetation_terrains.png.import new file mode 100644 index 0000000..c61afd9 --- /dev/null +++ b/materials/textures/vegetation_terrains.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://3ajuxfmywop8" +path="res://.godot/imported/vegetation_terrains.png-e62290694e9fafeb68f937b6f672dfde.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://materials/textures/vegetation_terrains.png" +dest_files=["res://.godot/imported/vegetation_terrains.png-e62290694e9fafeb68f937b6f672dfde.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=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/materials/tree1.tres b/materials/tree1.tres new file mode 100644 index 0000000..ae881fc --- /dev/null +++ b/materials/tree1.tres @@ -0,0 +1,10 @@ +[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://b3flgkem8t4in"] + +[ext_resource type="Texture2D" uid="uid://vhbcn2wbbr5v" path="res://materials/textures/hojas_2.png" id="1_ups8d"] + +[resource] +transparency = 1 +cull_mode = 2 +shading_mode = 0 +albedo_texture = ExtResource("1_ups8d") +texture_filter = 0 diff --git a/models/Buc.glb b/models/Buc.glb new file mode 100644 index 0000000..8d859ea --- /dev/null +++ b/models/Buc.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9bd4f674b49ecdfdace82264099619cda7350b6452e87a99869d2534fbef4d6b +size 88532 diff --git a/models/Buc.glb.import b/models/Buc.glb.import new file mode 100644 index 0000000..2338b3e --- /dev/null +++ b/models/Buc.glb.import @@ -0,0 +1,3639 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://7lpmh02u4vah" +path="res://.godot/imported/Buc.glb-f337efe5a90fa7708afc40d740516ca7.scn" + +[deps] + +source_file="res://models/Buc.glb" +dest_files=["res://.godot/imported/Buc.glb-f337efe5a90fa7708afc40d740516ca7.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=0.2 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"animations": { +"idle": { +"save_to_file/enabled": false, +"save_to_file/keep_custom_tracks": "", +"save_to_file/path": "", +"settings/loop_mode": 1, +"slice_1/end_frame": 0, +"slice_1/loop_mode": 0, +"slice_1/name": "", +"slice_1/save_to_file/enabled": false, +"slice_1/save_to_file/keep_custom_tracks": false, +"slice_1/save_to_file/path": "", +"slice_1/start_frame": 0, +"slice_10/end_frame": 0, +"slice_10/loop_mode": 0, +"slice_10/name": "", +"slice_10/save_to_file/enabled": false, +"slice_10/save_to_file/keep_custom_tracks": false, +"slice_10/save_to_file/path": "", +"slice_10/start_frame": 0, +"slice_100/end_frame": 0, +"slice_100/loop_mode": 0, +"slice_100/name": "", +"slice_100/save_to_file/enabled": false, +"slice_100/save_to_file/keep_custom_tracks": false, +"slice_100/save_to_file/path": "", +"slice_100/start_frame": 0, +"slice_101/end_frame": 0, +"slice_101/loop_mode": 0, +"slice_101/name": "", +"slice_101/save_to_file/enabled": false, +"slice_101/save_to_file/keep_custom_tracks": false, +"slice_101/save_to_file/path": "", +"slice_101/start_frame": 0, +"slice_102/end_frame": 0, +"slice_102/loop_mode": 0, +"slice_102/name": "", +"slice_102/save_to_file/enabled": false, +"slice_102/save_to_file/keep_custom_tracks": false, +"slice_102/save_to_file/path": "", +"slice_102/start_frame": 0, +"slice_103/end_frame": 0, +"slice_103/loop_mode": 0, +"slice_103/name": "", +"slice_103/save_to_file/enabled": false, +"slice_103/save_to_file/keep_custom_tracks": false, +"slice_103/save_to_file/path": "", +"slice_103/start_frame": 0, +"slice_104/end_frame": 0, +"slice_104/loop_mode": 0, +"slice_104/name": "", +"slice_104/save_to_file/enabled": false, +"slice_104/save_to_file/keep_custom_tracks": false, +"slice_104/save_to_file/path": "", +"slice_104/start_frame": 0, +"slice_105/end_frame": 0, +"slice_105/loop_mode": 0, +"slice_105/name": "", +"slice_105/save_to_file/enabled": false, +"slice_105/save_to_file/keep_custom_tracks": false, +"slice_105/save_to_file/path": "", +"slice_105/start_frame": 0, +"slice_106/end_frame": 0, +"slice_106/loop_mode": 0, +"slice_106/name": "", +"slice_106/save_to_file/enabled": false, +"slice_106/save_to_file/keep_custom_tracks": false, +"slice_106/save_to_file/path": "", +"slice_106/start_frame": 0, +"slice_107/end_frame": 0, +"slice_107/loop_mode": 0, +"slice_107/name": "", +"slice_107/save_to_file/enabled": false, +"slice_107/save_to_file/keep_custom_tracks": false, +"slice_107/save_to_file/path": "", +"slice_107/start_frame": 0, +"slice_108/end_frame": 0, +"slice_108/loop_mode": 0, +"slice_108/name": "", +"slice_108/save_to_file/enabled": false, +"slice_108/save_to_file/keep_custom_tracks": false, +"slice_108/save_to_file/path": "", +"slice_108/start_frame": 0, +"slice_109/end_frame": 0, +"slice_109/loop_mode": 0, +"slice_109/name": "", +"slice_109/save_to_file/enabled": false, +"slice_109/save_to_file/keep_custom_tracks": false, +"slice_109/save_to_file/path": "", +"slice_109/start_frame": 0, +"slice_11/end_frame": 0, +"slice_11/loop_mode": 0, +"slice_11/name": "", +"slice_11/save_to_file/enabled": false, +"slice_11/save_to_file/keep_custom_tracks": false, +"slice_11/save_to_file/path": "", +"slice_11/start_frame": 0, +"slice_110/end_frame": 0, +"slice_110/loop_mode": 0, +"slice_110/name": "", +"slice_110/save_to_file/enabled": false, +"slice_110/save_to_file/keep_custom_tracks": false, +"slice_110/save_to_file/path": "", +"slice_110/start_frame": 0, +"slice_111/end_frame": 0, +"slice_111/loop_mode": 0, +"slice_111/name": "", +"slice_111/save_to_file/enabled": false, +"slice_111/save_to_file/keep_custom_tracks": false, +"slice_111/save_to_file/path": "", +"slice_111/start_frame": 0, +"slice_112/end_frame": 0, +"slice_112/loop_mode": 0, +"slice_112/name": "", +"slice_112/save_to_file/enabled": false, +"slice_112/save_to_file/keep_custom_tracks": false, +"slice_112/save_to_file/path": "", +"slice_112/start_frame": 0, +"slice_113/end_frame": 0, +"slice_113/loop_mode": 0, +"slice_113/name": "", +"slice_113/save_to_file/enabled": false, +"slice_113/save_to_file/keep_custom_tracks": false, +"slice_113/save_to_file/path": "", +"slice_113/start_frame": 0, +"slice_114/end_frame": 0, +"slice_114/loop_mode": 0, +"slice_114/name": "", +"slice_114/save_to_file/enabled": false, +"slice_114/save_to_file/keep_custom_tracks": false, +"slice_114/save_to_file/path": "", +"slice_114/start_frame": 0, +"slice_115/end_frame": 0, +"slice_115/loop_mode": 0, +"slice_115/name": "", +"slice_115/save_to_file/enabled": false, +"slice_115/save_to_file/keep_custom_tracks": false, +"slice_115/save_to_file/path": "", +"slice_115/start_frame": 0, +"slice_116/end_frame": 0, +"slice_116/loop_mode": 0, +"slice_116/name": "", +"slice_116/save_to_file/enabled": false, +"slice_116/save_to_file/keep_custom_tracks": false, +"slice_116/save_to_file/path": "", +"slice_116/start_frame": 0, +"slice_117/end_frame": 0, +"slice_117/loop_mode": 0, +"slice_117/name": "", +"slice_117/save_to_file/enabled": false, +"slice_117/save_to_file/keep_custom_tracks": false, +"slice_117/save_to_file/path": "", +"slice_117/start_frame": 0, +"slice_118/end_frame": 0, +"slice_118/loop_mode": 0, +"slice_118/name": "", +"slice_118/save_to_file/enabled": false, +"slice_118/save_to_file/keep_custom_tracks": false, +"slice_118/save_to_file/path": "", +"slice_118/start_frame": 0, +"slice_119/end_frame": 0, +"slice_119/loop_mode": 0, +"slice_119/name": "", +"slice_119/save_to_file/enabled": false, +"slice_119/save_to_file/keep_custom_tracks": false, +"slice_119/save_to_file/path": "", +"slice_119/start_frame": 0, +"slice_12/end_frame": 0, +"slice_12/loop_mode": 0, +"slice_12/name": "", +"slice_12/save_to_file/enabled": false, +"slice_12/save_to_file/keep_custom_tracks": false, +"slice_12/save_to_file/path": "", +"slice_12/start_frame": 0, +"slice_120/end_frame": 0, +"slice_120/loop_mode": 0, +"slice_120/name": "", +"slice_120/save_to_file/enabled": false, +"slice_120/save_to_file/keep_custom_tracks": false, +"slice_120/save_to_file/path": "", +"slice_120/start_frame": 0, +"slice_121/end_frame": 0, +"slice_121/loop_mode": 0, +"slice_121/name": "", +"slice_121/save_to_file/enabled": false, +"slice_121/save_to_file/keep_custom_tracks": false, +"slice_121/save_to_file/path": "", +"slice_121/start_frame": 0, +"slice_122/end_frame": 0, +"slice_122/loop_mode": 0, +"slice_122/name": "", +"slice_122/save_to_file/enabled": false, +"slice_122/save_to_file/keep_custom_tracks": false, +"slice_122/save_to_file/path": "", +"slice_122/start_frame": 0, +"slice_123/end_frame": 0, +"slice_123/loop_mode": 0, +"slice_123/name": "", +"slice_123/save_to_file/enabled": false, +"slice_123/save_to_file/keep_custom_tracks": false, +"slice_123/save_to_file/path": "", +"slice_123/start_frame": 0, +"slice_124/end_frame": 0, +"slice_124/loop_mode": 0, +"slice_124/name": "", +"slice_124/save_to_file/enabled": false, +"slice_124/save_to_file/keep_custom_tracks": false, +"slice_124/save_to_file/path": "", +"slice_124/start_frame": 0, +"slice_125/end_frame": 0, +"slice_125/loop_mode": 0, +"slice_125/name": "", +"slice_125/save_to_file/enabled": false, +"slice_125/save_to_file/keep_custom_tracks": false, +"slice_125/save_to_file/path": "", +"slice_125/start_frame": 0, +"slice_126/end_frame": 0, +"slice_126/loop_mode": 0, +"slice_126/name": "", +"slice_126/save_to_file/enabled": false, +"slice_126/save_to_file/keep_custom_tracks": false, +"slice_126/save_to_file/path": "", +"slice_126/start_frame": 0, +"slice_127/end_frame": 0, +"slice_127/loop_mode": 0, +"slice_127/name": "", +"slice_127/save_to_file/enabled": false, +"slice_127/save_to_file/keep_custom_tracks": false, +"slice_127/save_to_file/path": "", +"slice_127/start_frame": 0, +"slice_128/end_frame": 0, +"slice_128/loop_mode": 0, +"slice_128/name": "", +"slice_128/save_to_file/enabled": false, +"slice_128/save_to_file/keep_custom_tracks": false, +"slice_128/save_to_file/path": "", +"slice_128/start_frame": 0, +"slice_129/end_frame": 0, +"slice_129/loop_mode": 0, +"slice_129/name": "", +"slice_129/save_to_file/enabled": false, +"slice_129/save_to_file/keep_custom_tracks": false, +"slice_129/save_to_file/path": "", +"slice_129/start_frame": 0, +"slice_13/end_frame": 0, +"slice_13/loop_mode": 0, +"slice_13/name": "", +"slice_13/save_to_file/enabled": false, +"slice_13/save_to_file/keep_custom_tracks": false, +"slice_13/save_to_file/path": "", +"slice_13/start_frame": 0, +"slice_130/end_frame": 0, +"slice_130/loop_mode": 0, +"slice_130/name": "", +"slice_130/save_to_file/enabled": false, +"slice_130/save_to_file/keep_custom_tracks": false, +"slice_130/save_to_file/path": "", +"slice_130/start_frame": 0, +"slice_131/end_frame": 0, +"slice_131/loop_mode": 0, +"slice_131/name": "", +"slice_131/save_to_file/enabled": false, +"slice_131/save_to_file/keep_custom_tracks": false, +"slice_131/save_to_file/path": "", +"slice_131/start_frame": 0, +"slice_132/end_frame": 0, +"slice_132/loop_mode": 0, +"slice_132/name": "", +"slice_132/save_to_file/enabled": false, +"slice_132/save_to_file/keep_custom_tracks": false, +"slice_132/save_to_file/path": "", +"slice_132/start_frame": 0, +"slice_133/end_frame": 0, +"slice_133/loop_mode": 0, +"slice_133/name": "", +"slice_133/save_to_file/enabled": false, +"slice_133/save_to_file/keep_custom_tracks": false, +"slice_133/save_to_file/path": "", +"slice_133/start_frame": 0, +"slice_134/end_frame": 0, +"slice_134/loop_mode": 0, +"slice_134/name": "", +"slice_134/save_to_file/enabled": false, +"slice_134/save_to_file/keep_custom_tracks": false, +"slice_134/save_to_file/path": "", +"slice_134/start_frame": 0, +"slice_135/end_frame": 0, +"slice_135/loop_mode": 0, +"slice_135/name": "", +"slice_135/save_to_file/enabled": false, +"slice_135/save_to_file/keep_custom_tracks": false, +"slice_135/save_to_file/path": "", +"slice_135/start_frame": 0, +"slice_136/end_frame": 0, +"slice_136/loop_mode": 0, +"slice_136/name": "", +"slice_136/save_to_file/enabled": false, +"slice_136/save_to_file/keep_custom_tracks": false, +"slice_136/save_to_file/path": "", +"slice_136/start_frame": 0, +"slice_137/end_frame": 0, +"slice_137/loop_mode": 0, +"slice_137/name": "", +"slice_137/save_to_file/enabled": false, +"slice_137/save_to_file/keep_custom_tracks": false, +"slice_137/save_to_file/path": "", +"slice_137/start_frame": 0, +"slice_138/end_frame": 0, +"slice_138/loop_mode": 0, +"slice_138/name": "", +"slice_138/save_to_file/enabled": false, +"slice_138/save_to_file/keep_custom_tracks": false, +"slice_138/save_to_file/path": "", +"slice_138/start_frame": 0, +"slice_139/end_frame": 0, +"slice_139/loop_mode": 0, +"slice_139/name": "", +"slice_139/save_to_file/enabled": false, +"slice_139/save_to_file/keep_custom_tracks": false, +"slice_139/save_to_file/path": "", +"slice_139/start_frame": 0, +"slice_14/end_frame": 0, +"slice_14/loop_mode": 0, +"slice_14/name": "", +"slice_14/save_to_file/enabled": false, +"slice_14/save_to_file/keep_custom_tracks": false, +"slice_14/save_to_file/path": "", +"slice_14/start_frame": 0, +"slice_140/end_frame": 0, +"slice_140/loop_mode": 0, +"slice_140/name": "", +"slice_140/save_to_file/enabled": false, +"slice_140/save_to_file/keep_custom_tracks": false, +"slice_140/save_to_file/path": "", +"slice_140/start_frame": 0, +"slice_141/end_frame": 0, +"slice_141/loop_mode": 0, +"slice_141/name": "", +"slice_141/save_to_file/enabled": false, +"slice_141/save_to_file/keep_custom_tracks": false, +"slice_141/save_to_file/path": "", +"slice_141/start_frame": 0, +"slice_142/end_frame": 0, +"slice_142/loop_mode": 0, +"slice_142/name": "", +"slice_142/save_to_file/enabled": false, +"slice_142/save_to_file/keep_custom_tracks": false, +"slice_142/save_to_file/path": "", +"slice_142/start_frame": 0, +"slice_143/end_frame": 0, +"slice_143/loop_mode": 0, +"slice_143/name": "", +"slice_143/save_to_file/enabled": false, +"slice_143/save_to_file/keep_custom_tracks": false, +"slice_143/save_to_file/path": "", +"slice_143/start_frame": 0, +"slice_144/end_frame": 0, +"slice_144/loop_mode": 0, +"slice_144/name": "", +"slice_144/save_to_file/enabled": false, +"slice_144/save_to_file/keep_custom_tracks": false, +"slice_144/save_to_file/path": "", +"slice_144/start_frame": 0, +"slice_145/end_frame": 0, +"slice_145/loop_mode": 0, +"slice_145/name": "", +"slice_145/save_to_file/enabled": false, +"slice_145/save_to_file/keep_custom_tracks": false, +"slice_145/save_to_file/path": "", +"slice_145/start_frame": 0, +"slice_146/end_frame": 0, +"slice_146/loop_mode": 0, +"slice_146/name": "", +"slice_146/save_to_file/enabled": false, +"slice_146/save_to_file/keep_custom_tracks": false, +"slice_146/save_to_file/path": "", +"slice_146/start_frame": 0, +"slice_147/end_frame": 0, +"slice_147/loop_mode": 0, +"slice_147/name": "", +"slice_147/save_to_file/enabled": false, +"slice_147/save_to_file/keep_custom_tracks": false, +"slice_147/save_to_file/path": "", +"slice_147/start_frame": 0, +"slice_148/end_frame": 0, +"slice_148/loop_mode": 0, +"slice_148/name": "", +"slice_148/save_to_file/enabled": false, +"slice_148/save_to_file/keep_custom_tracks": false, +"slice_148/save_to_file/path": "", +"slice_148/start_frame": 0, +"slice_149/end_frame": 0, +"slice_149/loop_mode": 0, +"slice_149/name": "", +"slice_149/save_to_file/enabled": false, +"slice_149/save_to_file/keep_custom_tracks": false, +"slice_149/save_to_file/path": "", +"slice_149/start_frame": 0, +"slice_15/end_frame": 0, +"slice_15/loop_mode": 0, +"slice_15/name": "", +"slice_15/save_to_file/enabled": false, +"slice_15/save_to_file/keep_custom_tracks": false, +"slice_15/save_to_file/path": "", +"slice_15/start_frame": 0, +"slice_150/end_frame": 0, +"slice_150/loop_mode": 0, +"slice_150/name": "", +"slice_150/save_to_file/enabled": false, +"slice_150/save_to_file/keep_custom_tracks": false, +"slice_150/save_to_file/path": "", +"slice_150/start_frame": 0, +"slice_151/end_frame": 0, +"slice_151/loop_mode": 0, +"slice_151/name": "", +"slice_151/save_to_file/enabled": false, +"slice_151/save_to_file/keep_custom_tracks": false, +"slice_151/save_to_file/path": "", +"slice_151/start_frame": 0, +"slice_152/end_frame": 0, +"slice_152/loop_mode": 0, +"slice_152/name": "", +"slice_152/save_to_file/enabled": false, +"slice_152/save_to_file/keep_custom_tracks": false, +"slice_152/save_to_file/path": "", +"slice_152/start_frame": 0, +"slice_153/end_frame": 0, +"slice_153/loop_mode": 0, +"slice_153/name": "", +"slice_153/save_to_file/enabled": false, +"slice_153/save_to_file/keep_custom_tracks": false, +"slice_153/save_to_file/path": "", +"slice_153/start_frame": 0, +"slice_154/end_frame": 0, +"slice_154/loop_mode": 0, +"slice_154/name": "", +"slice_154/save_to_file/enabled": false, +"slice_154/save_to_file/keep_custom_tracks": false, +"slice_154/save_to_file/path": "", +"slice_154/start_frame": 0, +"slice_155/end_frame": 0, +"slice_155/loop_mode": 0, +"slice_155/name": "", +"slice_155/save_to_file/enabled": false, +"slice_155/save_to_file/keep_custom_tracks": false, +"slice_155/save_to_file/path": "", +"slice_155/start_frame": 0, +"slice_156/end_frame": 0, +"slice_156/loop_mode": 0, +"slice_156/name": "", +"slice_156/save_to_file/enabled": false, +"slice_156/save_to_file/keep_custom_tracks": false, +"slice_156/save_to_file/path": "", +"slice_156/start_frame": 0, +"slice_157/end_frame": 0, +"slice_157/loop_mode": 0, +"slice_157/name": "", +"slice_157/save_to_file/enabled": false, +"slice_157/save_to_file/keep_custom_tracks": false, +"slice_157/save_to_file/path": "", +"slice_157/start_frame": 0, +"slice_158/end_frame": 0, +"slice_158/loop_mode": 0, +"slice_158/name": "", +"slice_158/save_to_file/enabled": false, +"slice_158/save_to_file/keep_custom_tracks": false, +"slice_158/save_to_file/path": "", +"slice_158/start_frame": 0, +"slice_159/end_frame": 0, +"slice_159/loop_mode": 0, +"slice_159/name": "", +"slice_159/save_to_file/enabled": false, +"slice_159/save_to_file/keep_custom_tracks": false, +"slice_159/save_to_file/path": "", +"slice_159/start_frame": 0, +"slice_16/end_frame": 0, +"slice_16/loop_mode": 0, +"slice_16/name": "", +"slice_16/save_to_file/enabled": false, +"slice_16/save_to_file/keep_custom_tracks": false, +"slice_16/save_to_file/path": "", +"slice_16/start_frame": 0, +"slice_160/end_frame": 0, +"slice_160/loop_mode": 0, +"slice_160/name": "", +"slice_160/save_to_file/enabled": false, +"slice_160/save_to_file/keep_custom_tracks": false, +"slice_160/save_to_file/path": "", +"slice_160/start_frame": 0, +"slice_161/end_frame": 0, +"slice_161/loop_mode": 0, +"slice_161/name": "", +"slice_161/save_to_file/enabled": false, +"slice_161/save_to_file/keep_custom_tracks": false, +"slice_161/save_to_file/path": "", +"slice_161/start_frame": 0, +"slice_162/end_frame": 0, +"slice_162/loop_mode": 0, +"slice_162/name": "", +"slice_162/save_to_file/enabled": false, +"slice_162/save_to_file/keep_custom_tracks": false, +"slice_162/save_to_file/path": "", +"slice_162/start_frame": 0, +"slice_163/end_frame": 0, +"slice_163/loop_mode": 0, +"slice_163/name": "", +"slice_163/save_to_file/enabled": false, +"slice_163/save_to_file/keep_custom_tracks": false, +"slice_163/save_to_file/path": "", +"slice_163/start_frame": 0, +"slice_164/end_frame": 0, +"slice_164/loop_mode": 0, +"slice_164/name": "", +"slice_164/save_to_file/enabled": false, +"slice_164/save_to_file/keep_custom_tracks": false, +"slice_164/save_to_file/path": "", +"slice_164/start_frame": 0, +"slice_165/end_frame": 0, +"slice_165/loop_mode": 0, +"slice_165/name": "", +"slice_165/save_to_file/enabled": false, +"slice_165/save_to_file/keep_custom_tracks": false, +"slice_165/save_to_file/path": "", +"slice_165/start_frame": 0, +"slice_166/end_frame": 0, +"slice_166/loop_mode": 0, +"slice_166/name": "", +"slice_166/save_to_file/enabled": false, +"slice_166/save_to_file/keep_custom_tracks": false, +"slice_166/save_to_file/path": "", +"slice_166/start_frame": 0, +"slice_167/end_frame": 0, +"slice_167/loop_mode": 0, +"slice_167/name": "", +"slice_167/save_to_file/enabled": false, +"slice_167/save_to_file/keep_custom_tracks": false, +"slice_167/save_to_file/path": "", +"slice_167/start_frame": 0, +"slice_168/end_frame": 0, +"slice_168/loop_mode": 0, +"slice_168/name": "", +"slice_168/save_to_file/enabled": false, +"slice_168/save_to_file/keep_custom_tracks": false, +"slice_168/save_to_file/path": "", +"slice_168/start_frame": 0, +"slice_169/end_frame": 0, +"slice_169/loop_mode": 0, +"slice_169/name": "", +"slice_169/save_to_file/enabled": false, +"slice_169/save_to_file/keep_custom_tracks": false, +"slice_169/save_to_file/path": "", +"slice_169/start_frame": 0, +"slice_17/end_frame": 0, +"slice_17/loop_mode": 0, +"slice_17/name": "", +"slice_17/save_to_file/enabled": false, +"slice_17/save_to_file/keep_custom_tracks": false, +"slice_17/save_to_file/path": "", +"slice_17/start_frame": 0, +"slice_170/end_frame": 0, +"slice_170/loop_mode": 0, +"slice_170/name": "", +"slice_170/save_to_file/enabled": false, +"slice_170/save_to_file/keep_custom_tracks": false, +"slice_170/save_to_file/path": "", +"slice_170/start_frame": 0, +"slice_171/end_frame": 0, +"slice_171/loop_mode": 0, +"slice_171/name": "", +"slice_171/save_to_file/enabled": false, +"slice_171/save_to_file/keep_custom_tracks": false, +"slice_171/save_to_file/path": "", +"slice_171/start_frame": 0, +"slice_172/end_frame": 0, +"slice_172/loop_mode": 0, +"slice_172/name": "", +"slice_172/save_to_file/enabled": false, +"slice_172/save_to_file/keep_custom_tracks": false, +"slice_172/save_to_file/path": "", +"slice_172/start_frame": 0, +"slice_173/end_frame": 0, +"slice_173/loop_mode": 0, +"slice_173/name": "", +"slice_173/save_to_file/enabled": false, +"slice_173/save_to_file/keep_custom_tracks": false, +"slice_173/save_to_file/path": "", +"slice_173/start_frame": 0, +"slice_174/end_frame": 0, +"slice_174/loop_mode": 0, +"slice_174/name": "", +"slice_174/save_to_file/enabled": false, +"slice_174/save_to_file/keep_custom_tracks": false, +"slice_174/save_to_file/path": "", +"slice_174/start_frame": 0, +"slice_175/end_frame": 0, +"slice_175/loop_mode": 0, +"slice_175/name": "", +"slice_175/save_to_file/enabled": false, +"slice_175/save_to_file/keep_custom_tracks": false, +"slice_175/save_to_file/path": "", +"slice_175/start_frame": 0, +"slice_176/end_frame": 0, +"slice_176/loop_mode": 0, +"slice_176/name": "", +"slice_176/save_to_file/enabled": false, +"slice_176/save_to_file/keep_custom_tracks": false, +"slice_176/save_to_file/path": "", +"slice_176/start_frame": 0, +"slice_177/end_frame": 0, +"slice_177/loop_mode": 0, +"slice_177/name": "", +"slice_177/save_to_file/enabled": false, +"slice_177/save_to_file/keep_custom_tracks": false, +"slice_177/save_to_file/path": "", +"slice_177/start_frame": 0, +"slice_178/end_frame": 0, +"slice_178/loop_mode": 0, +"slice_178/name": "", +"slice_178/save_to_file/enabled": false, +"slice_178/save_to_file/keep_custom_tracks": false, +"slice_178/save_to_file/path": "", +"slice_178/start_frame": 0, +"slice_179/end_frame": 0, +"slice_179/loop_mode": 0, +"slice_179/name": "", +"slice_179/save_to_file/enabled": false, +"slice_179/save_to_file/keep_custom_tracks": false, +"slice_179/save_to_file/path": "", +"slice_179/start_frame": 0, +"slice_18/end_frame": 0, +"slice_18/loop_mode": 0, +"slice_18/name": "", +"slice_18/save_to_file/enabled": false, +"slice_18/save_to_file/keep_custom_tracks": false, +"slice_18/save_to_file/path": "", +"slice_18/start_frame": 0, +"slice_180/end_frame": 0, +"slice_180/loop_mode": 0, +"slice_180/name": "", +"slice_180/save_to_file/enabled": false, +"slice_180/save_to_file/keep_custom_tracks": false, +"slice_180/save_to_file/path": "", +"slice_180/start_frame": 0, +"slice_181/end_frame": 0, +"slice_181/loop_mode": 0, +"slice_181/name": "", +"slice_181/save_to_file/enabled": false, +"slice_181/save_to_file/keep_custom_tracks": false, +"slice_181/save_to_file/path": "", +"slice_181/start_frame": 0, +"slice_182/end_frame": 0, +"slice_182/loop_mode": 0, +"slice_182/name": "", +"slice_182/save_to_file/enabled": false, +"slice_182/save_to_file/keep_custom_tracks": false, +"slice_182/save_to_file/path": "", +"slice_182/start_frame": 0, +"slice_183/end_frame": 0, +"slice_183/loop_mode": 0, +"slice_183/name": "", +"slice_183/save_to_file/enabled": false, +"slice_183/save_to_file/keep_custom_tracks": false, +"slice_183/save_to_file/path": "", +"slice_183/start_frame": 0, +"slice_184/end_frame": 0, +"slice_184/loop_mode": 0, +"slice_184/name": "", +"slice_184/save_to_file/enabled": false, +"slice_184/save_to_file/keep_custom_tracks": false, +"slice_184/save_to_file/path": "", +"slice_184/start_frame": 0, +"slice_185/end_frame": 0, +"slice_185/loop_mode": 0, +"slice_185/name": "", +"slice_185/save_to_file/enabled": false, +"slice_185/save_to_file/keep_custom_tracks": false, +"slice_185/save_to_file/path": "", +"slice_185/start_frame": 0, +"slice_186/end_frame": 0, +"slice_186/loop_mode": 0, +"slice_186/name": "", +"slice_186/save_to_file/enabled": false, +"slice_186/save_to_file/keep_custom_tracks": false, +"slice_186/save_to_file/path": "", +"slice_186/start_frame": 0, +"slice_187/end_frame": 0, +"slice_187/loop_mode": 0, +"slice_187/name": "", +"slice_187/save_to_file/enabled": false, +"slice_187/save_to_file/keep_custom_tracks": false, +"slice_187/save_to_file/path": "", +"slice_187/start_frame": 0, +"slice_188/end_frame": 0, +"slice_188/loop_mode": 0, +"slice_188/name": "", +"slice_188/save_to_file/enabled": false, +"slice_188/save_to_file/keep_custom_tracks": false, +"slice_188/save_to_file/path": "", +"slice_188/start_frame": 0, +"slice_189/end_frame": 0, +"slice_189/loop_mode": 0, +"slice_189/name": "", +"slice_189/save_to_file/enabled": false, +"slice_189/save_to_file/keep_custom_tracks": false, +"slice_189/save_to_file/path": "", +"slice_189/start_frame": 0, +"slice_19/end_frame": 0, +"slice_19/loop_mode": 0, +"slice_19/name": "", +"slice_19/save_to_file/enabled": false, +"slice_19/save_to_file/keep_custom_tracks": false, +"slice_19/save_to_file/path": "", +"slice_19/start_frame": 0, +"slice_190/end_frame": 0, +"slice_190/loop_mode": 0, +"slice_190/name": "", +"slice_190/save_to_file/enabled": false, +"slice_190/save_to_file/keep_custom_tracks": false, +"slice_190/save_to_file/path": "", +"slice_190/start_frame": 0, +"slice_191/end_frame": 0, +"slice_191/loop_mode": 0, +"slice_191/name": "", +"slice_191/save_to_file/enabled": false, +"slice_191/save_to_file/keep_custom_tracks": false, +"slice_191/save_to_file/path": "", +"slice_191/start_frame": 0, +"slice_192/end_frame": 0, +"slice_192/loop_mode": 0, +"slice_192/name": "", +"slice_192/save_to_file/enabled": false, +"slice_192/save_to_file/keep_custom_tracks": false, +"slice_192/save_to_file/path": "", +"slice_192/start_frame": 0, +"slice_193/end_frame": 0, +"slice_193/loop_mode": 0, +"slice_193/name": "", +"slice_193/save_to_file/enabled": false, +"slice_193/save_to_file/keep_custom_tracks": false, +"slice_193/save_to_file/path": "", +"slice_193/start_frame": 0, +"slice_194/end_frame": 0, +"slice_194/loop_mode": 0, +"slice_194/name": "", +"slice_194/save_to_file/enabled": false, +"slice_194/save_to_file/keep_custom_tracks": false, +"slice_194/save_to_file/path": "", +"slice_194/start_frame": 0, +"slice_195/end_frame": 0, +"slice_195/loop_mode": 0, +"slice_195/name": "", +"slice_195/save_to_file/enabled": false, +"slice_195/save_to_file/keep_custom_tracks": false, +"slice_195/save_to_file/path": "", +"slice_195/start_frame": 0, +"slice_196/end_frame": 0, +"slice_196/loop_mode": 0, +"slice_196/name": "", +"slice_196/save_to_file/enabled": false, +"slice_196/save_to_file/keep_custom_tracks": false, +"slice_196/save_to_file/path": "", +"slice_196/start_frame": 0, +"slice_197/end_frame": 0, +"slice_197/loop_mode": 0, +"slice_197/name": "", +"slice_197/save_to_file/enabled": false, +"slice_197/save_to_file/keep_custom_tracks": false, +"slice_197/save_to_file/path": "", +"slice_197/start_frame": 0, +"slice_198/end_frame": 0, +"slice_198/loop_mode": 0, +"slice_198/name": "", +"slice_198/save_to_file/enabled": false, +"slice_198/save_to_file/keep_custom_tracks": false, +"slice_198/save_to_file/path": "", +"slice_198/start_frame": 0, +"slice_199/end_frame": 0, +"slice_199/loop_mode": 0, +"slice_199/name": "", +"slice_199/save_to_file/enabled": false, +"slice_199/save_to_file/keep_custom_tracks": false, +"slice_199/save_to_file/path": "", +"slice_199/start_frame": 0, +"slice_2/end_frame": 0, +"slice_2/loop_mode": 0, +"slice_2/name": "", +"slice_2/save_to_file/enabled": false, +"slice_2/save_to_file/keep_custom_tracks": false, +"slice_2/save_to_file/path": "", +"slice_2/start_frame": 0, +"slice_20/end_frame": 0, +"slice_20/loop_mode": 0, +"slice_20/name": "", +"slice_20/save_to_file/enabled": false, +"slice_20/save_to_file/keep_custom_tracks": false, +"slice_20/save_to_file/path": "", +"slice_20/start_frame": 0, +"slice_200/end_frame": 0, +"slice_200/loop_mode": 0, +"slice_200/name": "", +"slice_200/save_to_file/enabled": false, +"slice_200/save_to_file/keep_custom_tracks": false, +"slice_200/save_to_file/path": "", +"slice_200/start_frame": 0, +"slice_201/end_frame": 0, +"slice_201/loop_mode": 0, +"slice_201/name": "", +"slice_201/save_to_file/enabled": false, +"slice_201/save_to_file/keep_custom_tracks": false, +"slice_201/save_to_file/path": "", +"slice_201/start_frame": 0, +"slice_202/end_frame": 0, +"slice_202/loop_mode": 0, +"slice_202/name": "", +"slice_202/save_to_file/enabled": false, +"slice_202/save_to_file/keep_custom_tracks": false, +"slice_202/save_to_file/path": "", +"slice_202/start_frame": 0, +"slice_203/end_frame": 0, +"slice_203/loop_mode": 0, +"slice_203/name": "", +"slice_203/save_to_file/enabled": false, +"slice_203/save_to_file/keep_custom_tracks": false, +"slice_203/save_to_file/path": "", +"slice_203/start_frame": 0, +"slice_204/end_frame": 0, +"slice_204/loop_mode": 0, +"slice_204/name": "", +"slice_204/save_to_file/enabled": false, +"slice_204/save_to_file/keep_custom_tracks": false, +"slice_204/save_to_file/path": "", +"slice_204/start_frame": 0, +"slice_205/end_frame": 0, +"slice_205/loop_mode": 0, +"slice_205/name": "", +"slice_205/save_to_file/enabled": false, +"slice_205/save_to_file/keep_custom_tracks": false, +"slice_205/save_to_file/path": "", +"slice_205/start_frame": 0, +"slice_206/end_frame": 0, +"slice_206/loop_mode": 0, +"slice_206/name": "", +"slice_206/save_to_file/enabled": false, +"slice_206/save_to_file/keep_custom_tracks": false, +"slice_206/save_to_file/path": "", +"slice_206/start_frame": 0, +"slice_207/end_frame": 0, +"slice_207/loop_mode": 0, +"slice_207/name": "", +"slice_207/save_to_file/enabled": false, +"slice_207/save_to_file/keep_custom_tracks": false, +"slice_207/save_to_file/path": "", +"slice_207/start_frame": 0, +"slice_208/end_frame": 0, +"slice_208/loop_mode": 0, +"slice_208/name": "", +"slice_208/save_to_file/enabled": false, +"slice_208/save_to_file/keep_custom_tracks": false, +"slice_208/save_to_file/path": "", +"slice_208/start_frame": 0, +"slice_209/end_frame": 0, +"slice_209/loop_mode": 0, +"slice_209/name": "", +"slice_209/save_to_file/enabled": false, +"slice_209/save_to_file/keep_custom_tracks": false, +"slice_209/save_to_file/path": "", +"slice_209/start_frame": 0, +"slice_21/end_frame": 0, +"slice_21/loop_mode": 0, +"slice_21/name": "", +"slice_21/save_to_file/enabled": false, +"slice_21/save_to_file/keep_custom_tracks": false, +"slice_21/save_to_file/path": "", +"slice_21/start_frame": 0, +"slice_210/end_frame": 0, +"slice_210/loop_mode": 0, +"slice_210/name": "", +"slice_210/save_to_file/enabled": false, +"slice_210/save_to_file/keep_custom_tracks": false, +"slice_210/save_to_file/path": "", +"slice_210/start_frame": 0, +"slice_211/end_frame": 0, +"slice_211/loop_mode": 0, +"slice_211/name": "", +"slice_211/save_to_file/enabled": false, +"slice_211/save_to_file/keep_custom_tracks": false, +"slice_211/save_to_file/path": "", +"slice_211/start_frame": 0, +"slice_212/end_frame": 0, +"slice_212/loop_mode": 0, +"slice_212/name": "", +"slice_212/save_to_file/enabled": false, +"slice_212/save_to_file/keep_custom_tracks": false, +"slice_212/save_to_file/path": "", +"slice_212/start_frame": 0, +"slice_213/end_frame": 0, +"slice_213/loop_mode": 0, +"slice_213/name": "", +"slice_213/save_to_file/enabled": false, +"slice_213/save_to_file/keep_custom_tracks": false, +"slice_213/save_to_file/path": "", +"slice_213/start_frame": 0, +"slice_214/end_frame": 0, +"slice_214/loop_mode": 0, +"slice_214/name": "", +"slice_214/save_to_file/enabled": false, +"slice_214/save_to_file/keep_custom_tracks": false, +"slice_214/save_to_file/path": "", +"slice_214/start_frame": 0, +"slice_215/end_frame": 0, +"slice_215/loop_mode": 0, +"slice_215/name": "", +"slice_215/save_to_file/enabled": false, +"slice_215/save_to_file/keep_custom_tracks": false, +"slice_215/save_to_file/path": "", +"slice_215/start_frame": 0, +"slice_216/end_frame": 0, +"slice_216/loop_mode": 0, +"slice_216/name": "", +"slice_216/save_to_file/enabled": false, +"slice_216/save_to_file/keep_custom_tracks": false, +"slice_216/save_to_file/path": "", +"slice_216/start_frame": 0, +"slice_217/end_frame": 0, +"slice_217/loop_mode": 0, +"slice_217/name": "", +"slice_217/save_to_file/enabled": false, +"slice_217/save_to_file/keep_custom_tracks": false, +"slice_217/save_to_file/path": "", +"slice_217/start_frame": 0, +"slice_218/end_frame": 0, +"slice_218/loop_mode": 0, +"slice_218/name": "", +"slice_218/save_to_file/enabled": false, +"slice_218/save_to_file/keep_custom_tracks": false, +"slice_218/save_to_file/path": "", +"slice_218/start_frame": 0, +"slice_219/end_frame": 0, +"slice_219/loop_mode": 0, +"slice_219/name": "", +"slice_219/save_to_file/enabled": false, +"slice_219/save_to_file/keep_custom_tracks": false, +"slice_219/save_to_file/path": "", +"slice_219/start_frame": 0, +"slice_22/end_frame": 0, +"slice_22/loop_mode": 0, +"slice_22/name": "", +"slice_22/save_to_file/enabled": false, +"slice_22/save_to_file/keep_custom_tracks": false, +"slice_22/save_to_file/path": "", +"slice_22/start_frame": 0, +"slice_220/end_frame": 0, +"slice_220/loop_mode": 0, +"slice_220/name": "", +"slice_220/save_to_file/enabled": false, +"slice_220/save_to_file/keep_custom_tracks": false, +"slice_220/save_to_file/path": "", +"slice_220/start_frame": 0, +"slice_221/end_frame": 0, +"slice_221/loop_mode": 0, +"slice_221/name": "", +"slice_221/save_to_file/enabled": false, +"slice_221/save_to_file/keep_custom_tracks": false, +"slice_221/save_to_file/path": "", +"slice_221/start_frame": 0, +"slice_222/end_frame": 0, +"slice_222/loop_mode": 0, +"slice_222/name": "", +"slice_222/save_to_file/enabled": false, +"slice_222/save_to_file/keep_custom_tracks": false, +"slice_222/save_to_file/path": "", +"slice_222/start_frame": 0, +"slice_223/end_frame": 0, +"slice_223/loop_mode": 0, +"slice_223/name": "", +"slice_223/save_to_file/enabled": false, +"slice_223/save_to_file/keep_custom_tracks": false, +"slice_223/save_to_file/path": "", +"slice_223/start_frame": 0, +"slice_224/end_frame": 0, +"slice_224/loop_mode": 0, +"slice_224/name": "", +"slice_224/save_to_file/enabled": false, +"slice_224/save_to_file/keep_custom_tracks": false, +"slice_224/save_to_file/path": "", +"slice_224/start_frame": 0, +"slice_225/end_frame": 0, +"slice_225/loop_mode": 0, +"slice_225/name": "", +"slice_225/save_to_file/enabled": false, +"slice_225/save_to_file/keep_custom_tracks": false, +"slice_225/save_to_file/path": "", +"slice_225/start_frame": 0, +"slice_226/end_frame": 0, +"slice_226/loop_mode": 0, +"slice_226/name": "", +"slice_226/save_to_file/enabled": false, +"slice_226/save_to_file/keep_custom_tracks": false, +"slice_226/save_to_file/path": "", +"slice_226/start_frame": 0, +"slice_227/end_frame": 0, +"slice_227/loop_mode": 0, +"slice_227/name": "", +"slice_227/save_to_file/enabled": false, +"slice_227/save_to_file/keep_custom_tracks": false, +"slice_227/save_to_file/path": "", +"slice_227/start_frame": 0, +"slice_228/end_frame": 0, +"slice_228/loop_mode": 0, +"slice_228/name": "", +"slice_228/save_to_file/enabled": false, +"slice_228/save_to_file/keep_custom_tracks": false, +"slice_228/save_to_file/path": "", +"slice_228/start_frame": 0, +"slice_229/end_frame": 0, +"slice_229/loop_mode": 0, +"slice_229/name": "", +"slice_229/save_to_file/enabled": false, +"slice_229/save_to_file/keep_custom_tracks": false, +"slice_229/save_to_file/path": "", +"slice_229/start_frame": 0, +"slice_23/end_frame": 0, +"slice_23/loop_mode": 0, +"slice_23/name": "", +"slice_23/save_to_file/enabled": false, +"slice_23/save_to_file/keep_custom_tracks": false, +"slice_23/save_to_file/path": "", +"slice_23/start_frame": 0, +"slice_230/end_frame": 0, +"slice_230/loop_mode": 0, +"slice_230/name": "", +"slice_230/save_to_file/enabled": false, +"slice_230/save_to_file/keep_custom_tracks": false, +"slice_230/save_to_file/path": "", +"slice_230/start_frame": 0, +"slice_231/end_frame": 0, +"slice_231/loop_mode": 0, +"slice_231/name": "", +"slice_231/save_to_file/enabled": false, +"slice_231/save_to_file/keep_custom_tracks": false, +"slice_231/save_to_file/path": "", +"slice_231/start_frame": 0, +"slice_232/end_frame": 0, +"slice_232/loop_mode": 0, +"slice_232/name": "", +"slice_232/save_to_file/enabled": false, +"slice_232/save_to_file/keep_custom_tracks": false, +"slice_232/save_to_file/path": "", +"slice_232/start_frame": 0, +"slice_233/end_frame": 0, +"slice_233/loop_mode": 0, +"slice_233/name": "", +"slice_233/save_to_file/enabled": false, +"slice_233/save_to_file/keep_custom_tracks": false, +"slice_233/save_to_file/path": "", +"slice_233/start_frame": 0, +"slice_234/end_frame": 0, +"slice_234/loop_mode": 0, +"slice_234/name": "", +"slice_234/save_to_file/enabled": false, +"slice_234/save_to_file/keep_custom_tracks": false, +"slice_234/save_to_file/path": "", +"slice_234/start_frame": 0, +"slice_235/end_frame": 0, +"slice_235/loop_mode": 0, +"slice_235/name": "", +"slice_235/save_to_file/enabled": false, +"slice_235/save_to_file/keep_custom_tracks": false, +"slice_235/save_to_file/path": "", +"slice_235/start_frame": 0, +"slice_236/end_frame": 0, +"slice_236/loop_mode": 0, +"slice_236/name": "", +"slice_236/save_to_file/enabled": false, +"slice_236/save_to_file/keep_custom_tracks": false, +"slice_236/save_to_file/path": "", +"slice_236/start_frame": 0, +"slice_237/end_frame": 0, +"slice_237/loop_mode": 0, +"slice_237/name": "", +"slice_237/save_to_file/enabled": false, +"slice_237/save_to_file/keep_custom_tracks": false, +"slice_237/save_to_file/path": "", +"slice_237/start_frame": 0, +"slice_238/end_frame": 0, +"slice_238/loop_mode": 0, +"slice_238/name": "", +"slice_238/save_to_file/enabled": false, +"slice_238/save_to_file/keep_custom_tracks": false, +"slice_238/save_to_file/path": "", +"slice_238/start_frame": 0, +"slice_239/end_frame": 0, +"slice_239/loop_mode": 0, +"slice_239/name": "", +"slice_239/save_to_file/enabled": false, +"slice_239/save_to_file/keep_custom_tracks": false, +"slice_239/save_to_file/path": "", +"slice_239/start_frame": 0, +"slice_24/end_frame": 0, +"slice_24/loop_mode": 0, +"slice_24/name": "", +"slice_24/save_to_file/enabled": false, +"slice_24/save_to_file/keep_custom_tracks": false, +"slice_24/save_to_file/path": "", +"slice_24/start_frame": 0, +"slice_240/end_frame": 0, +"slice_240/loop_mode": 0, +"slice_240/name": "", +"slice_240/save_to_file/enabled": false, +"slice_240/save_to_file/keep_custom_tracks": false, +"slice_240/save_to_file/path": "", +"slice_240/start_frame": 0, +"slice_241/end_frame": 0, +"slice_241/loop_mode": 0, +"slice_241/name": "", +"slice_241/save_to_file/enabled": false, +"slice_241/save_to_file/keep_custom_tracks": false, +"slice_241/save_to_file/path": "", +"slice_241/start_frame": 0, +"slice_242/end_frame": 0, +"slice_242/loop_mode": 0, +"slice_242/name": "", +"slice_242/save_to_file/enabled": false, +"slice_242/save_to_file/keep_custom_tracks": false, +"slice_242/save_to_file/path": "", +"slice_242/start_frame": 0, +"slice_243/end_frame": 0, +"slice_243/loop_mode": 0, +"slice_243/name": "", +"slice_243/save_to_file/enabled": false, +"slice_243/save_to_file/keep_custom_tracks": false, +"slice_243/save_to_file/path": "", +"slice_243/start_frame": 0, +"slice_244/end_frame": 0, +"slice_244/loop_mode": 0, +"slice_244/name": "", +"slice_244/save_to_file/enabled": false, +"slice_244/save_to_file/keep_custom_tracks": false, +"slice_244/save_to_file/path": "", +"slice_244/start_frame": 0, +"slice_245/end_frame": 0, +"slice_245/loop_mode": 0, +"slice_245/name": "", +"slice_245/save_to_file/enabled": false, +"slice_245/save_to_file/keep_custom_tracks": false, +"slice_245/save_to_file/path": "", +"slice_245/start_frame": 0, +"slice_246/end_frame": 0, +"slice_246/loop_mode": 0, +"slice_246/name": "", +"slice_246/save_to_file/enabled": false, +"slice_246/save_to_file/keep_custom_tracks": false, +"slice_246/save_to_file/path": "", +"slice_246/start_frame": 0, +"slice_247/end_frame": 0, +"slice_247/loop_mode": 0, +"slice_247/name": "", +"slice_247/save_to_file/enabled": false, +"slice_247/save_to_file/keep_custom_tracks": false, +"slice_247/save_to_file/path": "", +"slice_247/start_frame": 0, +"slice_248/end_frame": 0, +"slice_248/loop_mode": 0, +"slice_248/name": "", +"slice_248/save_to_file/enabled": false, +"slice_248/save_to_file/keep_custom_tracks": false, +"slice_248/save_to_file/path": "", +"slice_248/start_frame": 0, +"slice_249/end_frame": 0, +"slice_249/loop_mode": 0, +"slice_249/name": "", +"slice_249/save_to_file/enabled": false, +"slice_249/save_to_file/keep_custom_tracks": false, +"slice_249/save_to_file/path": "", +"slice_249/start_frame": 0, +"slice_25/end_frame": 0, +"slice_25/loop_mode": 0, +"slice_25/name": "", +"slice_25/save_to_file/enabled": false, +"slice_25/save_to_file/keep_custom_tracks": false, +"slice_25/save_to_file/path": "", +"slice_25/start_frame": 0, +"slice_250/end_frame": 0, +"slice_250/loop_mode": 0, +"slice_250/name": "", +"slice_250/save_to_file/enabled": false, +"slice_250/save_to_file/keep_custom_tracks": false, +"slice_250/save_to_file/path": "", +"slice_250/start_frame": 0, +"slice_251/end_frame": 0, +"slice_251/loop_mode": 0, +"slice_251/name": "", +"slice_251/save_to_file/enabled": false, +"slice_251/save_to_file/keep_custom_tracks": false, +"slice_251/save_to_file/path": "", +"slice_251/start_frame": 0, +"slice_252/end_frame": 0, +"slice_252/loop_mode": 0, +"slice_252/name": "", +"slice_252/save_to_file/enabled": false, +"slice_252/save_to_file/keep_custom_tracks": false, +"slice_252/save_to_file/path": "", +"slice_252/start_frame": 0, +"slice_253/end_frame": 0, +"slice_253/loop_mode": 0, +"slice_253/name": "", +"slice_253/save_to_file/enabled": false, +"slice_253/save_to_file/keep_custom_tracks": false, +"slice_253/save_to_file/path": "", +"slice_253/start_frame": 0, +"slice_254/end_frame": 0, +"slice_254/loop_mode": 0, +"slice_254/name": "", +"slice_254/save_to_file/enabled": false, +"slice_254/save_to_file/keep_custom_tracks": false, +"slice_254/save_to_file/path": "", +"slice_254/start_frame": 0, +"slice_255/end_frame": 0, +"slice_255/loop_mode": 0, +"slice_255/name": "", +"slice_255/save_to_file/enabled": false, +"slice_255/save_to_file/keep_custom_tracks": false, +"slice_255/save_to_file/path": "", +"slice_255/start_frame": 0, +"slice_256/end_frame": 0, +"slice_256/loop_mode": 0, +"slice_256/name": "", +"slice_256/save_to_file/enabled": false, +"slice_256/save_to_file/keep_custom_tracks": false, +"slice_256/save_to_file/path": "", +"slice_256/start_frame": 0, +"slice_26/end_frame": 0, +"slice_26/loop_mode": 0, +"slice_26/name": "", +"slice_26/save_to_file/enabled": false, +"slice_26/save_to_file/keep_custom_tracks": false, +"slice_26/save_to_file/path": "", +"slice_26/start_frame": 0, +"slice_27/end_frame": 0, +"slice_27/loop_mode": 0, +"slice_27/name": "", +"slice_27/save_to_file/enabled": false, +"slice_27/save_to_file/keep_custom_tracks": false, +"slice_27/save_to_file/path": "", +"slice_27/start_frame": 0, +"slice_28/end_frame": 0, +"slice_28/loop_mode": 0, +"slice_28/name": "", +"slice_28/save_to_file/enabled": false, +"slice_28/save_to_file/keep_custom_tracks": false, +"slice_28/save_to_file/path": "", +"slice_28/start_frame": 0, +"slice_29/end_frame": 0, +"slice_29/loop_mode": 0, +"slice_29/name": "", +"slice_29/save_to_file/enabled": false, +"slice_29/save_to_file/keep_custom_tracks": false, +"slice_29/save_to_file/path": "", +"slice_29/start_frame": 0, +"slice_3/end_frame": 0, +"slice_3/loop_mode": 0, +"slice_3/name": "", +"slice_3/save_to_file/enabled": false, +"slice_3/save_to_file/keep_custom_tracks": false, +"slice_3/save_to_file/path": "", +"slice_3/start_frame": 0, +"slice_30/end_frame": 0, +"slice_30/loop_mode": 0, +"slice_30/name": "", +"slice_30/save_to_file/enabled": false, +"slice_30/save_to_file/keep_custom_tracks": false, +"slice_30/save_to_file/path": "", +"slice_30/start_frame": 0, +"slice_31/end_frame": 0, +"slice_31/loop_mode": 0, +"slice_31/name": "", +"slice_31/save_to_file/enabled": false, +"slice_31/save_to_file/keep_custom_tracks": false, +"slice_31/save_to_file/path": "", +"slice_31/start_frame": 0, +"slice_32/end_frame": 0, +"slice_32/loop_mode": 0, +"slice_32/name": "", +"slice_32/save_to_file/enabled": false, +"slice_32/save_to_file/keep_custom_tracks": false, +"slice_32/save_to_file/path": "", +"slice_32/start_frame": 0, +"slice_33/end_frame": 0, +"slice_33/loop_mode": 0, +"slice_33/name": "", +"slice_33/save_to_file/enabled": false, +"slice_33/save_to_file/keep_custom_tracks": false, +"slice_33/save_to_file/path": "", +"slice_33/start_frame": 0, +"slice_34/end_frame": 0, +"slice_34/loop_mode": 0, +"slice_34/name": "", +"slice_34/save_to_file/enabled": false, +"slice_34/save_to_file/keep_custom_tracks": false, +"slice_34/save_to_file/path": "", +"slice_34/start_frame": 0, +"slice_35/end_frame": 0, +"slice_35/loop_mode": 0, +"slice_35/name": "", +"slice_35/save_to_file/enabled": false, +"slice_35/save_to_file/keep_custom_tracks": false, +"slice_35/save_to_file/path": "", +"slice_35/start_frame": 0, +"slice_36/end_frame": 0, +"slice_36/loop_mode": 0, +"slice_36/name": "", +"slice_36/save_to_file/enabled": false, +"slice_36/save_to_file/keep_custom_tracks": false, +"slice_36/save_to_file/path": "", +"slice_36/start_frame": 0, +"slice_37/end_frame": 0, +"slice_37/loop_mode": 0, +"slice_37/name": "", +"slice_37/save_to_file/enabled": false, +"slice_37/save_to_file/keep_custom_tracks": false, +"slice_37/save_to_file/path": "", +"slice_37/start_frame": 0, +"slice_38/end_frame": 0, +"slice_38/loop_mode": 0, +"slice_38/name": "", +"slice_38/save_to_file/enabled": false, +"slice_38/save_to_file/keep_custom_tracks": false, +"slice_38/save_to_file/path": "", +"slice_38/start_frame": 0, +"slice_39/end_frame": 0, +"slice_39/loop_mode": 0, +"slice_39/name": "", +"slice_39/save_to_file/enabled": false, +"slice_39/save_to_file/keep_custom_tracks": false, +"slice_39/save_to_file/path": "", +"slice_39/start_frame": 0, +"slice_4/end_frame": 0, +"slice_4/loop_mode": 0, +"slice_4/name": "", +"slice_4/save_to_file/enabled": false, +"slice_4/save_to_file/keep_custom_tracks": false, +"slice_4/save_to_file/path": "", +"slice_4/start_frame": 0, +"slice_40/end_frame": 0, +"slice_40/loop_mode": 0, +"slice_40/name": "", +"slice_40/save_to_file/enabled": false, +"slice_40/save_to_file/keep_custom_tracks": false, +"slice_40/save_to_file/path": "", +"slice_40/start_frame": 0, +"slice_41/end_frame": 0, +"slice_41/loop_mode": 0, +"slice_41/name": "", +"slice_41/save_to_file/enabled": false, +"slice_41/save_to_file/keep_custom_tracks": false, +"slice_41/save_to_file/path": "", +"slice_41/start_frame": 0, +"slice_42/end_frame": 0, +"slice_42/loop_mode": 0, +"slice_42/name": "", +"slice_42/save_to_file/enabled": false, +"slice_42/save_to_file/keep_custom_tracks": false, +"slice_42/save_to_file/path": "", +"slice_42/start_frame": 0, +"slice_43/end_frame": 0, +"slice_43/loop_mode": 0, +"slice_43/name": "", +"slice_43/save_to_file/enabled": false, +"slice_43/save_to_file/keep_custom_tracks": false, +"slice_43/save_to_file/path": "", +"slice_43/start_frame": 0, +"slice_44/end_frame": 0, +"slice_44/loop_mode": 0, +"slice_44/name": "", +"slice_44/save_to_file/enabled": false, +"slice_44/save_to_file/keep_custom_tracks": false, +"slice_44/save_to_file/path": "", +"slice_44/start_frame": 0, +"slice_45/end_frame": 0, +"slice_45/loop_mode": 0, +"slice_45/name": "", +"slice_45/save_to_file/enabled": false, +"slice_45/save_to_file/keep_custom_tracks": false, +"slice_45/save_to_file/path": "", +"slice_45/start_frame": 0, +"slice_46/end_frame": 0, +"slice_46/loop_mode": 0, +"slice_46/name": "", +"slice_46/save_to_file/enabled": false, +"slice_46/save_to_file/keep_custom_tracks": false, +"slice_46/save_to_file/path": "", +"slice_46/start_frame": 0, +"slice_47/end_frame": 0, +"slice_47/loop_mode": 0, +"slice_47/name": "", +"slice_47/save_to_file/enabled": false, +"slice_47/save_to_file/keep_custom_tracks": false, +"slice_47/save_to_file/path": "", +"slice_47/start_frame": 0, +"slice_48/end_frame": 0, +"slice_48/loop_mode": 0, +"slice_48/name": "", +"slice_48/save_to_file/enabled": false, +"slice_48/save_to_file/keep_custom_tracks": false, +"slice_48/save_to_file/path": "", +"slice_48/start_frame": 0, +"slice_49/end_frame": 0, +"slice_49/loop_mode": 0, +"slice_49/name": "", +"slice_49/save_to_file/enabled": false, +"slice_49/save_to_file/keep_custom_tracks": false, +"slice_49/save_to_file/path": "", +"slice_49/start_frame": 0, +"slice_5/end_frame": 0, +"slice_5/loop_mode": 0, +"slice_5/name": "", +"slice_5/save_to_file/enabled": false, +"slice_5/save_to_file/keep_custom_tracks": false, +"slice_5/save_to_file/path": "", +"slice_5/start_frame": 0, +"slice_50/end_frame": 0, +"slice_50/loop_mode": 0, +"slice_50/name": "", +"slice_50/save_to_file/enabled": false, +"slice_50/save_to_file/keep_custom_tracks": false, +"slice_50/save_to_file/path": "", +"slice_50/start_frame": 0, +"slice_51/end_frame": 0, +"slice_51/loop_mode": 0, +"slice_51/name": "", +"slice_51/save_to_file/enabled": false, +"slice_51/save_to_file/keep_custom_tracks": false, +"slice_51/save_to_file/path": "", +"slice_51/start_frame": 0, +"slice_52/end_frame": 0, +"slice_52/loop_mode": 0, +"slice_52/name": "", +"slice_52/save_to_file/enabled": false, +"slice_52/save_to_file/keep_custom_tracks": false, +"slice_52/save_to_file/path": "", +"slice_52/start_frame": 0, +"slice_53/end_frame": 0, +"slice_53/loop_mode": 0, +"slice_53/name": "", +"slice_53/save_to_file/enabled": false, +"slice_53/save_to_file/keep_custom_tracks": false, +"slice_53/save_to_file/path": "", +"slice_53/start_frame": 0, +"slice_54/end_frame": 0, +"slice_54/loop_mode": 0, +"slice_54/name": "", +"slice_54/save_to_file/enabled": false, +"slice_54/save_to_file/keep_custom_tracks": false, +"slice_54/save_to_file/path": "", +"slice_54/start_frame": 0, +"slice_55/end_frame": 0, +"slice_55/loop_mode": 0, +"slice_55/name": "", +"slice_55/save_to_file/enabled": false, +"slice_55/save_to_file/keep_custom_tracks": false, +"slice_55/save_to_file/path": "", +"slice_55/start_frame": 0, +"slice_56/end_frame": 0, +"slice_56/loop_mode": 0, +"slice_56/name": "", +"slice_56/save_to_file/enabled": false, +"slice_56/save_to_file/keep_custom_tracks": false, +"slice_56/save_to_file/path": "", +"slice_56/start_frame": 0, +"slice_57/end_frame": 0, +"slice_57/loop_mode": 0, +"slice_57/name": "", +"slice_57/save_to_file/enabled": false, +"slice_57/save_to_file/keep_custom_tracks": false, +"slice_57/save_to_file/path": "", +"slice_57/start_frame": 0, +"slice_58/end_frame": 0, +"slice_58/loop_mode": 0, +"slice_58/name": "", +"slice_58/save_to_file/enabled": false, +"slice_58/save_to_file/keep_custom_tracks": false, +"slice_58/save_to_file/path": "", +"slice_58/start_frame": 0, +"slice_59/end_frame": 0, +"slice_59/loop_mode": 0, +"slice_59/name": "", +"slice_59/save_to_file/enabled": false, +"slice_59/save_to_file/keep_custom_tracks": false, +"slice_59/save_to_file/path": "", +"slice_59/start_frame": 0, +"slice_6/end_frame": 0, +"slice_6/loop_mode": 0, +"slice_6/name": "", +"slice_6/save_to_file/enabled": false, +"slice_6/save_to_file/keep_custom_tracks": false, +"slice_6/save_to_file/path": "", +"slice_6/start_frame": 0, +"slice_60/end_frame": 0, +"slice_60/loop_mode": 0, +"slice_60/name": "", +"slice_60/save_to_file/enabled": false, +"slice_60/save_to_file/keep_custom_tracks": false, +"slice_60/save_to_file/path": "", +"slice_60/start_frame": 0, +"slice_61/end_frame": 0, +"slice_61/loop_mode": 0, +"slice_61/name": "", +"slice_61/save_to_file/enabled": false, +"slice_61/save_to_file/keep_custom_tracks": false, +"slice_61/save_to_file/path": "", +"slice_61/start_frame": 0, +"slice_62/end_frame": 0, +"slice_62/loop_mode": 0, +"slice_62/name": "", +"slice_62/save_to_file/enabled": false, +"slice_62/save_to_file/keep_custom_tracks": false, +"slice_62/save_to_file/path": "", +"slice_62/start_frame": 0, +"slice_63/end_frame": 0, +"slice_63/loop_mode": 0, +"slice_63/name": "", +"slice_63/save_to_file/enabled": false, +"slice_63/save_to_file/keep_custom_tracks": false, +"slice_63/save_to_file/path": "", +"slice_63/start_frame": 0, +"slice_64/end_frame": 0, +"slice_64/loop_mode": 0, +"slice_64/name": "", +"slice_64/save_to_file/enabled": false, +"slice_64/save_to_file/keep_custom_tracks": false, +"slice_64/save_to_file/path": "", +"slice_64/start_frame": 0, +"slice_65/end_frame": 0, +"slice_65/loop_mode": 0, +"slice_65/name": "", +"slice_65/save_to_file/enabled": false, +"slice_65/save_to_file/keep_custom_tracks": false, +"slice_65/save_to_file/path": "", +"slice_65/start_frame": 0, +"slice_66/end_frame": 0, +"slice_66/loop_mode": 0, +"slice_66/name": "", +"slice_66/save_to_file/enabled": false, +"slice_66/save_to_file/keep_custom_tracks": false, +"slice_66/save_to_file/path": "", +"slice_66/start_frame": 0, +"slice_67/end_frame": 0, +"slice_67/loop_mode": 0, +"slice_67/name": "", +"slice_67/save_to_file/enabled": false, +"slice_67/save_to_file/keep_custom_tracks": false, +"slice_67/save_to_file/path": "", +"slice_67/start_frame": 0, +"slice_68/end_frame": 0, +"slice_68/loop_mode": 0, +"slice_68/name": "", +"slice_68/save_to_file/enabled": false, +"slice_68/save_to_file/keep_custom_tracks": false, +"slice_68/save_to_file/path": "", +"slice_68/start_frame": 0, +"slice_69/end_frame": 0, +"slice_69/loop_mode": 0, +"slice_69/name": "", +"slice_69/save_to_file/enabled": false, +"slice_69/save_to_file/keep_custom_tracks": false, +"slice_69/save_to_file/path": "", +"slice_69/start_frame": 0, +"slice_7/end_frame": 0, +"slice_7/loop_mode": 0, +"slice_7/name": "", +"slice_7/save_to_file/enabled": false, +"slice_7/save_to_file/keep_custom_tracks": false, +"slice_7/save_to_file/path": "", +"slice_7/start_frame": 0, +"slice_70/end_frame": 0, +"slice_70/loop_mode": 0, +"slice_70/name": "", +"slice_70/save_to_file/enabled": false, +"slice_70/save_to_file/keep_custom_tracks": false, +"slice_70/save_to_file/path": "", +"slice_70/start_frame": 0, +"slice_71/end_frame": 0, +"slice_71/loop_mode": 0, +"slice_71/name": "", +"slice_71/save_to_file/enabled": false, +"slice_71/save_to_file/keep_custom_tracks": false, +"slice_71/save_to_file/path": "", +"slice_71/start_frame": 0, +"slice_72/end_frame": 0, +"slice_72/loop_mode": 0, +"slice_72/name": "", +"slice_72/save_to_file/enabled": false, +"slice_72/save_to_file/keep_custom_tracks": false, +"slice_72/save_to_file/path": "", +"slice_72/start_frame": 0, +"slice_73/end_frame": 0, +"slice_73/loop_mode": 0, +"slice_73/name": "", +"slice_73/save_to_file/enabled": false, +"slice_73/save_to_file/keep_custom_tracks": false, +"slice_73/save_to_file/path": "", +"slice_73/start_frame": 0, +"slice_74/end_frame": 0, +"slice_74/loop_mode": 0, +"slice_74/name": "", +"slice_74/save_to_file/enabled": false, +"slice_74/save_to_file/keep_custom_tracks": false, +"slice_74/save_to_file/path": "", +"slice_74/start_frame": 0, +"slice_75/end_frame": 0, +"slice_75/loop_mode": 0, +"slice_75/name": "", +"slice_75/save_to_file/enabled": false, +"slice_75/save_to_file/keep_custom_tracks": false, +"slice_75/save_to_file/path": "", +"slice_75/start_frame": 0, +"slice_76/end_frame": 0, +"slice_76/loop_mode": 0, +"slice_76/name": "", +"slice_76/save_to_file/enabled": false, +"slice_76/save_to_file/keep_custom_tracks": false, +"slice_76/save_to_file/path": "", +"slice_76/start_frame": 0, +"slice_77/end_frame": 0, +"slice_77/loop_mode": 0, +"slice_77/name": "", +"slice_77/save_to_file/enabled": false, +"slice_77/save_to_file/keep_custom_tracks": false, +"slice_77/save_to_file/path": "", +"slice_77/start_frame": 0, +"slice_78/end_frame": 0, +"slice_78/loop_mode": 0, +"slice_78/name": "", +"slice_78/save_to_file/enabled": false, +"slice_78/save_to_file/keep_custom_tracks": false, +"slice_78/save_to_file/path": "", +"slice_78/start_frame": 0, +"slice_79/end_frame": 0, +"slice_79/loop_mode": 0, +"slice_79/name": "", +"slice_79/save_to_file/enabled": false, +"slice_79/save_to_file/keep_custom_tracks": false, +"slice_79/save_to_file/path": "", +"slice_79/start_frame": 0, +"slice_8/end_frame": 0, +"slice_8/loop_mode": 0, +"slice_8/name": "", +"slice_8/save_to_file/enabled": false, +"slice_8/save_to_file/keep_custom_tracks": false, +"slice_8/save_to_file/path": "", +"slice_8/start_frame": 0, +"slice_80/end_frame": 0, +"slice_80/loop_mode": 0, +"slice_80/name": "", +"slice_80/save_to_file/enabled": false, +"slice_80/save_to_file/keep_custom_tracks": false, +"slice_80/save_to_file/path": "", +"slice_80/start_frame": 0, +"slice_81/end_frame": 0, +"slice_81/loop_mode": 0, +"slice_81/name": "", +"slice_81/save_to_file/enabled": false, +"slice_81/save_to_file/keep_custom_tracks": false, +"slice_81/save_to_file/path": "", +"slice_81/start_frame": 0, +"slice_82/end_frame": 0, +"slice_82/loop_mode": 0, +"slice_82/name": "", +"slice_82/save_to_file/enabled": false, +"slice_82/save_to_file/keep_custom_tracks": false, +"slice_82/save_to_file/path": "", +"slice_82/start_frame": 0, +"slice_83/end_frame": 0, +"slice_83/loop_mode": 0, +"slice_83/name": "", +"slice_83/save_to_file/enabled": false, +"slice_83/save_to_file/keep_custom_tracks": false, +"slice_83/save_to_file/path": "", +"slice_83/start_frame": 0, +"slice_84/end_frame": 0, +"slice_84/loop_mode": 0, +"slice_84/name": "", +"slice_84/save_to_file/enabled": false, +"slice_84/save_to_file/keep_custom_tracks": false, +"slice_84/save_to_file/path": "", +"slice_84/start_frame": 0, +"slice_85/end_frame": 0, +"slice_85/loop_mode": 0, +"slice_85/name": "", +"slice_85/save_to_file/enabled": false, +"slice_85/save_to_file/keep_custom_tracks": false, +"slice_85/save_to_file/path": "", +"slice_85/start_frame": 0, +"slice_86/end_frame": 0, +"slice_86/loop_mode": 0, +"slice_86/name": "", +"slice_86/save_to_file/enabled": false, +"slice_86/save_to_file/keep_custom_tracks": false, +"slice_86/save_to_file/path": "", +"slice_86/start_frame": 0, +"slice_87/end_frame": 0, +"slice_87/loop_mode": 0, +"slice_87/name": "", +"slice_87/save_to_file/enabled": false, +"slice_87/save_to_file/keep_custom_tracks": false, +"slice_87/save_to_file/path": "", +"slice_87/start_frame": 0, +"slice_88/end_frame": 0, +"slice_88/loop_mode": 0, +"slice_88/name": "", +"slice_88/save_to_file/enabled": false, +"slice_88/save_to_file/keep_custom_tracks": false, +"slice_88/save_to_file/path": "", +"slice_88/start_frame": 0, +"slice_89/end_frame": 0, +"slice_89/loop_mode": 0, +"slice_89/name": "", +"slice_89/save_to_file/enabled": false, +"slice_89/save_to_file/keep_custom_tracks": false, +"slice_89/save_to_file/path": "", +"slice_89/start_frame": 0, +"slice_9/end_frame": 0, +"slice_9/loop_mode": 0, +"slice_9/name": "", +"slice_9/save_to_file/enabled": false, +"slice_9/save_to_file/keep_custom_tracks": false, +"slice_9/save_to_file/path": "", +"slice_9/start_frame": 0, +"slice_90/end_frame": 0, +"slice_90/loop_mode": 0, +"slice_90/name": "", +"slice_90/save_to_file/enabled": false, +"slice_90/save_to_file/keep_custom_tracks": false, +"slice_90/save_to_file/path": "", +"slice_90/start_frame": 0, +"slice_91/end_frame": 0, +"slice_91/loop_mode": 0, +"slice_91/name": "", +"slice_91/save_to_file/enabled": false, +"slice_91/save_to_file/keep_custom_tracks": false, +"slice_91/save_to_file/path": "", +"slice_91/start_frame": 0, +"slice_92/end_frame": 0, +"slice_92/loop_mode": 0, +"slice_92/name": "", +"slice_92/save_to_file/enabled": false, +"slice_92/save_to_file/keep_custom_tracks": false, +"slice_92/save_to_file/path": "", +"slice_92/start_frame": 0, +"slice_93/end_frame": 0, +"slice_93/loop_mode": 0, +"slice_93/name": "", +"slice_93/save_to_file/enabled": false, +"slice_93/save_to_file/keep_custom_tracks": false, +"slice_93/save_to_file/path": "", +"slice_93/start_frame": 0, +"slice_94/end_frame": 0, +"slice_94/loop_mode": 0, +"slice_94/name": "", +"slice_94/save_to_file/enabled": false, +"slice_94/save_to_file/keep_custom_tracks": false, +"slice_94/save_to_file/path": "", +"slice_94/start_frame": 0, +"slice_95/end_frame": 0, +"slice_95/loop_mode": 0, +"slice_95/name": "", +"slice_95/save_to_file/enabled": false, +"slice_95/save_to_file/keep_custom_tracks": false, +"slice_95/save_to_file/path": "", +"slice_95/start_frame": 0, +"slice_96/end_frame": 0, +"slice_96/loop_mode": 0, +"slice_96/name": "", +"slice_96/save_to_file/enabled": false, +"slice_96/save_to_file/keep_custom_tracks": false, +"slice_96/save_to_file/path": "", +"slice_96/start_frame": 0, +"slice_97/end_frame": 0, +"slice_97/loop_mode": 0, +"slice_97/name": "", +"slice_97/save_to_file/enabled": false, +"slice_97/save_to_file/keep_custom_tracks": false, +"slice_97/save_to_file/path": "", +"slice_97/start_frame": 0, +"slice_98/end_frame": 0, +"slice_98/loop_mode": 0, +"slice_98/name": "", +"slice_98/save_to_file/enabled": false, +"slice_98/save_to_file/keep_custom_tracks": false, +"slice_98/save_to_file/path": "", +"slice_98/start_frame": 0, +"slice_99/end_frame": 0, +"slice_99/loop_mode": 0, +"slice_99/name": "", +"slice_99/save_to_file/enabled": false, +"slice_99/save_to_file/keep_custom_tracks": false, +"slice_99/save_to_file/path": "", +"slice_99/start_frame": 0, +"slices/amount": null +}, +"walk": { +"save_to_file/enabled": false, +"save_to_file/keep_custom_tracks": "", +"save_to_file/path": "", +"settings/loop_mode": 1, +"slice_1/end_frame": 0, +"slice_1/loop_mode": 0, +"slice_1/name": "", +"slice_1/save_to_file/enabled": false, +"slice_1/save_to_file/keep_custom_tracks": false, +"slice_1/save_to_file/path": "", +"slice_1/start_frame": 0, +"slice_10/end_frame": 0, +"slice_10/loop_mode": 0, +"slice_10/name": "", +"slice_10/save_to_file/enabled": false, +"slice_10/save_to_file/keep_custom_tracks": false, +"slice_10/save_to_file/path": "", +"slice_10/start_frame": 0, +"slice_100/end_frame": 0, +"slice_100/loop_mode": 0, +"slice_100/name": "", +"slice_100/save_to_file/enabled": false, +"slice_100/save_to_file/keep_custom_tracks": false, +"slice_100/save_to_file/path": "", +"slice_100/start_frame": 0, +"slice_101/end_frame": 0, +"slice_101/loop_mode": 0, +"slice_101/name": "", +"slice_101/save_to_file/enabled": false, +"slice_101/save_to_file/keep_custom_tracks": false, +"slice_101/save_to_file/path": "", +"slice_101/start_frame": 0, +"slice_102/end_frame": 0, +"slice_102/loop_mode": 0, +"slice_102/name": "", +"slice_102/save_to_file/enabled": false, +"slice_102/save_to_file/keep_custom_tracks": false, +"slice_102/save_to_file/path": "", +"slice_102/start_frame": 0, +"slice_103/end_frame": 0, +"slice_103/loop_mode": 0, +"slice_103/name": "", +"slice_103/save_to_file/enabled": false, +"slice_103/save_to_file/keep_custom_tracks": false, +"slice_103/save_to_file/path": "", +"slice_103/start_frame": 0, +"slice_104/end_frame": 0, +"slice_104/loop_mode": 0, +"slice_104/name": "", +"slice_104/save_to_file/enabled": false, +"slice_104/save_to_file/keep_custom_tracks": false, +"slice_104/save_to_file/path": "", +"slice_104/start_frame": 0, +"slice_105/end_frame": 0, +"slice_105/loop_mode": 0, +"slice_105/name": "", +"slice_105/save_to_file/enabled": false, +"slice_105/save_to_file/keep_custom_tracks": false, +"slice_105/save_to_file/path": "", +"slice_105/start_frame": 0, +"slice_106/end_frame": 0, +"slice_106/loop_mode": 0, +"slice_106/name": "", +"slice_106/save_to_file/enabled": false, +"slice_106/save_to_file/keep_custom_tracks": false, +"slice_106/save_to_file/path": "", +"slice_106/start_frame": 0, +"slice_107/end_frame": 0, +"slice_107/loop_mode": 0, +"slice_107/name": "", +"slice_107/save_to_file/enabled": false, +"slice_107/save_to_file/keep_custom_tracks": false, +"slice_107/save_to_file/path": "", +"slice_107/start_frame": 0, +"slice_108/end_frame": 0, +"slice_108/loop_mode": 0, +"slice_108/name": "", +"slice_108/save_to_file/enabled": false, +"slice_108/save_to_file/keep_custom_tracks": false, +"slice_108/save_to_file/path": "", +"slice_108/start_frame": 0, +"slice_109/end_frame": 0, +"slice_109/loop_mode": 0, +"slice_109/name": "", +"slice_109/save_to_file/enabled": false, +"slice_109/save_to_file/keep_custom_tracks": false, +"slice_109/save_to_file/path": "", +"slice_109/start_frame": 0, +"slice_11/end_frame": 0, +"slice_11/loop_mode": 0, +"slice_11/name": "", +"slice_11/save_to_file/enabled": false, +"slice_11/save_to_file/keep_custom_tracks": false, +"slice_11/save_to_file/path": "", +"slice_11/start_frame": 0, +"slice_110/end_frame": 0, +"slice_110/loop_mode": 0, +"slice_110/name": "", +"slice_110/save_to_file/enabled": false, +"slice_110/save_to_file/keep_custom_tracks": false, +"slice_110/save_to_file/path": "", +"slice_110/start_frame": 0, +"slice_111/end_frame": 0, +"slice_111/loop_mode": 0, +"slice_111/name": "", +"slice_111/save_to_file/enabled": false, +"slice_111/save_to_file/keep_custom_tracks": false, +"slice_111/save_to_file/path": "", +"slice_111/start_frame": 0, +"slice_112/end_frame": 0, +"slice_112/loop_mode": 0, +"slice_112/name": "", +"slice_112/save_to_file/enabled": false, +"slice_112/save_to_file/keep_custom_tracks": false, +"slice_112/save_to_file/path": "", +"slice_112/start_frame": 0, +"slice_113/end_frame": 0, +"slice_113/loop_mode": 0, +"slice_113/name": "", +"slice_113/save_to_file/enabled": false, +"slice_113/save_to_file/keep_custom_tracks": false, +"slice_113/save_to_file/path": "", +"slice_113/start_frame": 0, +"slice_114/end_frame": 0, +"slice_114/loop_mode": 0, +"slice_114/name": "", +"slice_114/save_to_file/enabled": false, +"slice_114/save_to_file/keep_custom_tracks": false, +"slice_114/save_to_file/path": "", +"slice_114/start_frame": 0, +"slice_115/end_frame": 0, +"slice_115/loop_mode": 0, +"slice_115/name": "", +"slice_115/save_to_file/enabled": false, +"slice_115/save_to_file/keep_custom_tracks": false, +"slice_115/save_to_file/path": "", +"slice_115/start_frame": 0, +"slice_116/end_frame": 0, +"slice_116/loop_mode": 0, +"slice_116/name": "", +"slice_116/save_to_file/enabled": false, +"slice_116/save_to_file/keep_custom_tracks": false, +"slice_116/save_to_file/path": "", +"slice_116/start_frame": 0, +"slice_117/end_frame": 0, +"slice_117/loop_mode": 0, +"slice_117/name": "", +"slice_117/save_to_file/enabled": false, +"slice_117/save_to_file/keep_custom_tracks": false, +"slice_117/save_to_file/path": "", +"slice_117/start_frame": 0, +"slice_118/end_frame": 0, +"slice_118/loop_mode": 0, +"slice_118/name": "", +"slice_118/save_to_file/enabled": false, +"slice_118/save_to_file/keep_custom_tracks": false, +"slice_118/save_to_file/path": "", +"slice_118/start_frame": 0, +"slice_119/end_frame": 0, +"slice_119/loop_mode": 0, +"slice_119/name": "", +"slice_119/save_to_file/enabled": false, +"slice_119/save_to_file/keep_custom_tracks": false, +"slice_119/save_to_file/path": "", +"slice_119/start_frame": 0, +"slice_12/end_frame": 0, +"slice_12/loop_mode": 0, +"slice_12/name": "", +"slice_12/save_to_file/enabled": false, +"slice_12/save_to_file/keep_custom_tracks": false, +"slice_12/save_to_file/path": "", +"slice_12/start_frame": 0, +"slice_120/end_frame": 0, +"slice_120/loop_mode": 0, +"slice_120/name": "", +"slice_120/save_to_file/enabled": false, +"slice_120/save_to_file/keep_custom_tracks": false, +"slice_120/save_to_file/path": "", +"slice_120/start_frame": 0, +"slice_121/end_frame": 0, +"slice_121/loop_mode": 0, +"slice_121/name": "", +"slice_121/save_to_file/enabled": false, +"slice_121/save_to_file/keep_custom_tracks": false, +"slice_121/save_to_file/path": "", +"slice_121/start_frame": 0, +"slice_122/end_frame": 0, +"slice_122/loop_mode": 0, +"slice_122/name": "", +"slice_122/save_to_file/enabled": false, +"slice_122/save_to_file/keep_custom_tracks": false, +"slice_122/save_to_file/path": "", +"slice_122/start_frame": 0, +"slice_123/end_frame": 0, +"slice_123/loop_mode": 0, +"slice_123/name": "", +"slice_123/save_to_file/enabled": false, +"slice_123/save_to_file/keep_custom_tracks": false, +"slice_123/save_to_file/path": "", +"slice_123/start_frame": 0, +"slice_124/end_frame": 0, +"slice_124/loop_mode": 0, +"slice_124/name": "", +"slice_124/save_to_file/enabled": false, +"slice_124/save_to_file/keep_custom_tracks": false, +"slice_124/save_to_file/path": "", +"slice_124/start_frame": 0, +"slice_125/end_frame": 0, +"slice_125/loop_mode": 0, +"slice_125/name": "", +"slice_125/save_to_file/enabled": false, +"slice_125/save_to_file/keep_custom_tracks": false, +"slice_125/save_to_file/path": "", +"slice_125/start_frame": 0, +"slice_126/end_frame": 0, +"slice_126/loop_mode": 0, +"slice_126/name": "", +"slice_126/save_to_file/enabled": false, +"slice_126/save_to_file/keep_custom_tracks": false, +"slice_126/save_to_file/path": "", +"slice_126/start_frame": 0, +"slice_127/end_frame": 0, +"slice_127/loop_mode": 0, +"slice_127/name": "", +"slice_127/save_to_file/enabled": false, +"slice_127/save_to_file/keep_custom_tracks": false, +"slice_127/save_to_file/path": "", +"slice_127/start_frame": 0, +"slice_128/end_frame": 0, +"slice_128/loop_mode": 0, +"slice_128/name": "", +"slice_128/save_to_file/enabled": false, +"slice_128/save_to_file/keep_custom_tracks": false, +"slice_128/save_to_file/path": "", +"slice_128/start_frame": 0, +"slice_129/end_frame": 0, +"slice_129/loop_mode": 0, +"slice_129/name": "", +"slice_129/save_to_file/enabled": false, +"slice_129/save_to_file/keep_custom_tracks": false, +"slice_129/save_to_file/path": "", +"slice_129/start_frame": 0, +"slice_13/end_frame": 0, +"slice_13/loop_mode": 0, +"slice_13/name": "", +"slice_13/save_to_file/enabled": false, +"slice_13/save_to_file/keep_custom_tracks": false, +"slice_13/save_to_file/path": "", +"slice_13/start_frame": 0, +"slice_130/end_frame": 0, +"slice_130/loop_mode": 0, +"slice_130/name": "", +"slice_130/save_to_file/enabled": false, +"slice_130/save_to_file/keep_custom_tracks": false, +"slice_130/save_to_file/path": "", +"slice_130/start_frame": 0, +"slice_131/end_frame": 0, +"slice_131/loop_mode": 0, +"slice_131/name": "", +"slice_131/save_to_file/enabled": false, +"slice_131/save_to_file/keep_custom_tracks": false, +"slice_131/save_to_file/path": "", +"slice_131/start_frame": 0, +"slice_132/end_frame": 0, +"slice_132/loop_mode": 0, +"slice_132/name": "", +"slice_132/save_to_file/enabled": false, +"slice_132/save_to_file/keep_custom_tracks": false, +"slice_132/save_to_file/path": "", +"slice_132/start_frame": 0, +"slice_133/end_frame": 0, +"slice_133/loop_mode": 0, +"slice_133/name": "", +"slice_133/save_to_file/enabled": false, +"slice_133/save_to_file/keep_custom_tracks": false, +"slice_133/save_to_file/path": "", +"slice_133/start_frame": 0, +"slice_134/end_frame": 0, +"slice_134/loop_mode": 0, +"slice_134/name": "", +"slice_134/save_to_file/enabled": false, +"slice_134/save_to_file/keep_custom_tracks": false, +"slice_134/save_to_file/path": "", +"slice_134/start_frame": 0, +"slice_135/end_frame": 0, +"slice_135/loop_mode": 0, +"slice_135/name": "", +"slice_135/save_to_file/enabled": false, +"slice_135/save_to_file/keep_custom_tracks": false, +"slice_135/save_to_file/path": "", +"slice_135/start_frame": 0, +"slice_136/end_frame": 0, +"slice_136/loop_mode": 0, +"slice_136/name": "", +"slice_136/save_to_file/enabled": false, +"slice_136/save_to_file/keep_custom_tracks": false, +"slice_136/save_to_file/path": "", +"slice_136/start_frame": 0, +"slice_137/end_frame": 0, +"slice_137/loop_mode": 0, +"slice_137/name": "", +"slice_137/save_to_file/enabled": false, +"slice_137/save_to_file/keep_custom_tracks": false, +"slice_137/save_to_file/path": "", +"slice_137/start_frame": 0, +"slice_138/end_frame": 0, +"slice_138/loop_mode": 0, +"slice_138/name": "", +"slice_138/save_to_file/enabled": false, +"slice_138/save_to_file/keep_custom_tracks": false, +"slice_138/save_to_file/path": "", +"slice_138/start_frame": 0, +"slice_139/end_frame": 0, +"slice_139/loop_mode": 0, +"slice_139/name": "", +"slice_139/save_to_file/enabled": false, +"slice_139/save_to_file/keep_custom_tracks": false, +"slice_139/save_to_file/path": "", +"slice_139/start_frame": 0, +"slice_14/end_frame": 0, +"slice_14/loop_mode": 0, +"slice_14/name": "", +"slice_14/save_to_file/enabled": false, +"slice_14/save_to_file/keep_custom_tracks": false, +"slice_14/save_to_file/path": "", +"slice_14/start_frame": 0, +"slice_140/end_frame": 0, +"slice_140/loop_mode": 0, +"slice_140/name": "", +"slice_140/save_to_file/enabled": false, +"slice_140/save_to_file/keep_custom_tracks": false, +"slice_140/save_to_file/path": "", +"slice_140/start_frame": 0, +"slice_141/end_frame": 0, +"slice_141/loop_mode": 0, +"slice_141/name": "", +"slice_141/save_to_file/enabled": false, +"slice_141/save_to_file/keep_custom_tracks": false, +"slice_141/save_to_file/path": "", +"slice_141/start_frame": 0, +"slice_142/end_frame": 0, +"slice_142/loop_mode": 0, +"slice_142/name": "", +"slice_142/save_to_file/enabled": false, +"slice_142/save_to_file/keep_custom_tracks": false, +"slice_142/save_to_file/path": "", +"slice_142/start_frame": 0, +"slice_143/end_frame": 0, +"slice_143/loop_mode": 0, +"slice_143/name": "", +"slice_143/save_to_file/enabled": false, +"slice_143/save_to_file/keep_custom_tracks": false, +"slice_143/save_to_file/path": "", +"slice_143/start_frame": 0, +"slice_144/end_frame": 0, +"slice_144/loop_mode": 0, +"slice_144/name": "", +"slice_144/save_to_file/enabled": false, +"slice_144/save_to_file/keep_custom_tracks": false, +"slice_144/save_to_file/path": "", +"slice_144/start_frame": 0, +"slice_145/end_frame": 0, +"slice_145/loop_mode": 0, +"slice_145/name": "", +"slice_145/save_to_file/enabled": false, +"slice_145/save_to_file/keep_custom_tracks": false, +"slice_145/save_to_file/path": "", +"slice_145/start_frame": 0, +"slice_146/end_frame": 0, +"slice_146/loop_mode": 0, +"slice_146/name": "", +"slice_146/save_to_file/enabled": false, +"slice_146/save_to_file/keep_custom_tracks": false, +"slice_146/save_to_file/path": "", +"slice_146/start_frame": 0, +"slice_147/end_frame": 0, +"slice_147/loop_mode": 0, +"slice_147/name": "", +"slice_147/save_to_file/enabled": false, +"slice_147/save_to_file/keep_custom_tracks": false, +"slice_147/save_to_file/path": "", +"slice_147/start_frame": 0, +"slice_148/end_frame": 0, +"slice_148/loop_mode": 0, +"slice_148/name": "", +"slice_148/save_to_file/enabled": false, +"slice_148/save_to_file/keep_custom_tracks": false, +"slice_148/save_to_file/path": "", +"slice_148/start_frame": 0, +"slice_149/end_frame": 0, +"slice_149/loop_mode": 0, +"slice_149/name": "", +"slice_149/save_to_file/enabled": false, +"slice_149/save_to_file/keep_custom_tracks": false, +"slice_149/save_to_file/path": "", +"slice_149/start_frame": 0, +"slice_15/end_frame": 0, +"slice_15/loop_mode": 0, +"slice_15/name": "", +"slice_15/save_to_file/enabled": false, +"slice_15/save_to_file/keep_custom_tracks": false, +"slice_15/save_to_file/path": "", +"slice_15/start_frame": 0, +"slice_150/end_frame": 0, +"slice_150/loop_mode": 0, +"slice_150/name": "", +"slice_150/save_to_file/enabled": false, +"slice_150/save_to_file/keep_custom_tracks": false, +"slice_150/save_to_file/path": "", +"slice_150/start_frame": 0, +"slice_151/end_frame": 0, +"slice_151/loop_mode": 0, +"slice_151/name": "", +"slice_151/save_to_file/enabled": false, +"slice_151/save_to_file/keep_custom_tracks": false, +"slice_151/save_to_file/path": "", +"slice_151/start_frame": 0, +"slice_152/end_frame": 0, +"slice_152/loop_mode": 0, +"slice_152/name": "", +"slice_152/save_to_file/enabled": false, +"slice_152/save_to_file/keep_custom_tracks": false, +"slice_152/save_to_file/path": "", +"slice_152/start_frame": 0, +"slice_153/end_frame": 0, +"slice_153/loop_mode": 0, +"slice_153/name": "", +"slice_153/save_to_file/enabled": false, +"slice_153/save_to_file/keep_custom_tracks": false, +"slice_153/save_to_file/path": "", +"slice_153/start_frame": 0, +"slice_154/end_frame": 0, +"slice_154/loop_mode": 0, +"slice_154/name": "", +"slice_154/save_to_file/enabled": false, +"slice_154/save_to_file/keep_custom_tracks": false, +"slice_154/save_to_file/path": "", +"slice_154/start_frame": 0, +"slice_155/end_frame": 0, +"slice_155/loop_mode": 0, +"slice_155/name": "", +"slice_155/save_to_file/enabled": false, +"slice_155/save_to_file/keep_custom_tracks": false, +"slice_155/save_to_file/path": "", +"slice_155/start_frame": 0, +"slice_156/end_frame": 0, +"slice_156/loop_mode": 0, +"slice_156/name": "", +"slice_156/save_to_file/enabled": false, +"slice_156/save_to_file/keep_custom_tracks": false, +"slice_156/save_to_file/path": "", +"slice_156/start_frame": 0, +"slice_157/end_frame": 0, +"slice_157/loop_mode": 0, +"slice_157/name": "", +"slice_157/save_to_file/enabled": false, +"slice_157/save_to_file/keep_custom_tracks": false, +"slice_157/save_to_file/path": "", +"slice_157/start_frame": 0, +"slice_158/end_frame": 0, +"slice_158/loop_mode": 0, +"slice_158/name": "", +"slice_158/save_to_file/enabled": false, +"slice_158/save_to_file/keep_custom_tracks": false, +"slice_158/save_to_file/path": "", +"slice_158/start_frame": 0, +"slice_159/end_frame": 0, +"slice_159/loop_mode": 0, +"slice_159/name": "", +"slice_159/save_to_file/enabled": false, +"slice_159/save_to_file/keep_custom_tracks": false, +"slice_159/save_to_file/path": "", +"slice_159/start_frame": 0, +"slice_16/end_frame": 0, +"slice_16/loop_mode": 0, +"slice_16/name": "", +"slice_16/save_to_file/enabled": false, +"slice_16/save_to_file/keep_custom_tracks": false, +"slice_16/save_to_file/path": "", +"slice_16/start_frame": 0, +"slice_160/end_frame": 0, +"slice_160/loop_mode": 0, +"slice_160/name": "", +"slice_160/save_to_file/enabled": false, +"slice_160/save_to_file/keep_custom_tracks": false, +"slice_160/save_to_file/path": "", +"slice_160/start_frame": 0, +"slice_161/end_frame": 0, +"slice_161/loop_mode": 0, +"slice_161/name": "", +"slice_161/save_to_file/enabled": false, +"slice_161/save_to_file/keep_custom_tracks": false, +"slice_161/save_to_file/path": "", +"slice_161/start_frame": 0, +"slice_162/end_frame": 0, +"slice_162/loop_mode": 0, +"slice_162/name": "", +"slice_162/save_to_file/enabled": false, +"slice_162/save_to_file/keep_custom_tracks": false, +"slice_162/save_to_file/path": "", +"slice_162/start_frame": 0, +"slice_163/end_frame": 0, +"slice_163/loop_mode": 0, +"slice_163/name": "", +"slice_163/save_to_file/enabled": false, +"slice_163/save_to_file/keep_custom_tracks": false, +"slice_163/save_to_file/path": "", +"slice_163/start_frame": 0, +"slice_164/end_frame": 0, +"slice_164/loop_mode": 0, +"slice_164/name": "", +"slice_164/save_to_file/enabled": false, +"slice_164/save_to_file/keep_custom_tracks": false, +"slice_164/save_to_file/path": "", +"slice_164/start_frame": 0, +"slice_165/end_frame": 0, +"slice_165/loop_mode": 0, +"slice_165/name": "", +"slice_165/save_to_file/enabled": false, +"slice_165/save_to_file/keep_custom_tracks": false, +"slice_165/save_to_file/path": "", +"slice_165/start_frame": 0, +"slice_166/end_frame": 0, +"slice_166/loop_mode": 0, +"slice_166/name": "", +"slice_166/save_to_file/enabled": false, +"slice_166/save_to_file/keep_custom_tracks": false, +"slice_166/save_to_file/path": "", +"slice_166/start_frame": 0, +"slice_167/end_frame": 0, +"slice_167/loop_mode": 0, +"slice_167/name": "", +"slice_167/save_to_file/enabled": false, +"slice_167/save_to_file/keep_custom_tracks": false, +"slice_167/save_to_file/path": "", +"slice_167/start_frame": 0, +"slice_168/end_frame": 0, +"slice_168/loop_mode": 0, +"slice_168/name": "", +"slice_168/save_to_file/enabled": false, +"slice_168/save_to_file/keep_custom_tracks": false, +"slice_168/save_to_file/path": "", +"slice_168/start_frame": 0, +"slice_169/end_frame": 0, +"slice_169/loop_mode": 0, +"slice_169/name": "", +"slice_169/save_to_file/enabled": false, +"slice_169/save_to_file/keep_custom_tracks": false, +"slice_169/save_to_file/path": "", +"slice_169/start_frame": 0, +"slice_17/end_frame": 0, +"slice_17/loop_mode": 0, +"slice_17/name": "", +"slice_17/save_to_file/enabled": false, +"slice_17/save_to_file/keep_custom_tracks": false, +"slice_17/save_to_file/path": "", +"slice_17/start_frame": 0, +"slice_170/end_frame": 0, +"slice_170/loop_mode": 0, +"slice_170/name": "", +"slice_170/save_to_file/enabled": false, +"slice_170/save_to_file/keep_custom_tracks": false, +"slice_170/save_to_file/path": "", +"slice_170/start_frame": 0, +"slice_171/end_frame": 0, +"slice_171/loop_mode": 0, +"slice_171/name": "", +"slice_171/save_to_file/enabled": false, +"slice_171/save_to_file/keep_custom_tracks": false, +"slice_171/save_to_file/path": "", +"slice_171/start_frame": 0, +"slice_172/end_frame": 0, +"slice_172/loop_mode": 0, +"slice_172/name": "", +"slice_172/save_to_file/enabled": false, +"slice_172/save_to_file/keep_custom_tracks": false, +"slice_172/save_to_file/path": "", +"slice_172/start_frame": 0, +"slice_173/end_frame": 0, +"slice_173/loop_mode": 0, +"slice_173/name": "", +"slice_173/save_to_file/enabled": false, +"slice_173/save_to_file/keep_custom_tracks": false, +"slice_173/save_to_file/path": "", +"slice_173/start_frame": 0, +"slice_174/end_frame": 0, +"slice_174/loop_mode": 0, +"slice_174/name": "", +"slice_174/save_to_file/enabled": false, +"slice_174/save_to_file/keep_custom_tracks": false, +"slice_174/save_to_file/path": "", +"slice_174/start_frame": 0, +"slice_175/end_frame": 0, +"slice_175/loop_mode": 0, +"slice_175/name": "", +"slice_175/save_to_file/enabled": false, +"slice_175/save_to_file/keep_custom_tracks": false, +"slice_175/save_to_file/path": "", +"slice_175/start_frame": 0, +"slice_176/end_frame": 0, +"slice_176/loop_mode": 0, +"slice_176/name": "", +"slice_176/save_to_file/enabled": false, +"slice_176/save_to_file/keep_custom_tracks": false, +"slice_176/save_to_file/path": "", +"slice_176/start_frame": 0, +"slice_177/end_frame": 0, +"slice_177/loop_mode": 0, +"slice_177/name": "", +"slice_177/save_to_file/enabled": false, +"slice_177/save_to_file/keep_custom_tracks": false, +"slice_177/save_to_file/path": "", +"slice_177/start_frame": 0, +"slice_178/end_frame": 0, +"slice_178/loop_mode": 0, +"slice_178/name": "", +"slice_178/save_to_file/enabled": false, +"slice_178/save_to_file/keep_custom_tracks": false, +"slice_178/save_to_file/path": "", +"slice_178/start_frame": 0, +"slice_179/end_frame": 0, +"slice_179/loop_mode": 0, +"slice_179/name": "", +"slice_179/save_to_file/enabled": false, +"slice_179/save_to_file/keep_custom_tracks": false, +"slice_179/save_to_file/path": "", +"slice_179/start_frame": 0, +"slice_18/end_frame": 0, +"slice_18/loop_mode": 0, +"slice_18/name": "", +"slice_18/save_to_file/enabled": false, +"slice_18/save_to_file/keep_custom_tracks": false, +"slice_18/save_to_file/path": "", +"slice_18/start_frame": 0, +"slice_180/end_frame": 0, +"slice_180/loop_mode": 0, +"slice_180/name": "", +"slice_180/save_to_file/enabled": false, +"slice_180/save_to_file/keep_custom_tracks": false, +"slice_180/save_to_file/path": "", +"slice_180/start_frame": 0, +"slice_181/end_frame": 0, +"slice_181/loop_mode": 0, +"slice_181/name": "", +"slice_181/save_to_file/enabled": false, +"slice_181/save_to_file/keep_custom_tracks": false, +"slice_181/save_to_file/path": "", +"slice_181/start_frame": 0, +"slice_182/end_frame": 0, +"slice_182/loop_mode": 0, +"slice_182/name": "", +"slice_182/save_to_file/enabled": false, +"slice_182/save_to_file/keep_custom_tracks": false, +"slice_182/save_to_file/path": "", +"slice_182/start_frame": 0, +"slice_183/end_frame": 0, +"slice_183/loop_mode": 0, +"slice_183/name": "", +"slice_183/save_to_file/enabled": false, +"slice_183/save_to_file/keep_custom_tracks": false, +"slice_183/save_to_file/path": "", +"slice_183/start_frame": 0, +"slice_184/end_frame": 0, +"slice_184/loop_mode": 0, +"slice_184/name": "", +"slice_184/save_to_file/enabled": false, +"slice_184/save_to_file/keep_custom_tracks": false, +"slice_184/save_to_file/path": "", +"slice_184/start_frame": 0, +"slice_185/end_frame": 0, +"slice_185/loop_mode": 0, +"slice_185/name": "", +"slice_185/save_to_file/enabled": false, +"slice_185/save_to_file/keep_custom_tracks": false, +"slice_185/save_to_file/path": "", +"slice_185/start_frame": 0, +"slice_186/end_frame": 0, +"slice_186/loop_mode": 0, +"slice_186/name": "", +"slice_186/save_to_file/enabled": false, +"slice_186/save_to_file/keep_custom_tracks": false, +"slice_186/save_to_file/path": "", +"slice_186/start_frame": 0, +"slice_187/end_frame": 0, +"slice_187/loop_mode": 0, +"slice_187/name": "", +"slice_187/save_to_file/enabled": false, +"slice_187/save_to_file/keep_custom_tracks": false, +"slice_187/save_to_file/path": "", +"slice_187/start_frame": 0, +"slice_188/end_frame": 0, +"slice_188/loop_mode": 0, +"slice_188/name": "", +"slice_188/save_to_file/enabled": false, +"slice_188/save_to_file/keep_custom_tracks": false, +"slice_188/save_to_file/path": "", +"slice_188/start_frame": 0, +"slice_189/end_frame": 0, +"slice_189/loop_mode": 0, +"slice_189/name": "", +"slice_189/save_to_file/enabled": false, +"slice_189/save_to_file/keep_custom_tracks": false, +"slice_189/save_to_file/path": "", +"slice_189/start_frame": 0, +"slice_19/end_frame": 0, +"slice_19/loop_mode": 0, +"slice_19/name": "", +"slice_19/save_to_file/enabled": false, +"slice_19/save_to_file/keep_custom_tracks": false, +"slice_19/save_to_file/path": "", +"slice_19/start_frame": 0, +"slice_190/end_frame": 0, +"slice_190/loop_mode": 0, +"slice_190/name": "", +"slice_190/save_to_file/enabled": false, +"slice_190/save_to_file/keep_custom_tracks": false, +"slice_190/save_to_file/path": "", +"slice_190/start_frame": 0, +"slice_191/end_frame": 0, +"slice_191/loop_mode": 0, +"slice_191/name": "", +"slice_191/save_to_file/enabled": false, +"slice_191/save_to_file/keep_custom_tracks": false, +"slice_191/save_to_file/path": "", +"slice_191/start_frame": 0, +"slice_192/end_frame": 0, +"slice_192/loop_mode": 0, +"slice_192/name": "", +"slice_192/save_to_file/enabled": false, +"slice_192/save_to_file/keep_custom_tracks": false, +"slice_192/save_to_file/path": "", +"slice_192/start_frame": 0, +"slice_193/end_frame": 0, +"slice_193/loop_mode": 0, +"slice_193/name": "", +"slice_193/save_to_file/enabled": false, +"slice_193/save_to_file/keep_custom_tracks": false, +"slice_193/save_to_file/path": "", +"slice_193/start_frame": 0, +"slice_194/end_frame": 0, +"slice_194/loop_mode": 0, +"slice_194/name": "", +"slice_194/save_to_file/enabled": false, +"slice_194/save_to_file/keep_custom_tracks": false, +"slice_194/save_to_file/path": "", +"slice_194/start_frame": 0, +"slice_195/end_frame": 0, +"slice_195/loop_mode": 0, +"slice_195/name": "", +"slice_195/save_to_file/enabled": false, +"slice_195/save_to_file/keep_custom_tracks": false, +"slice_195/save_to_file/path": "", +"slice_195/start_frame": 0, +"slice_196/end_frame": 0, +"slice_196/loop_mode": 0, +"slice_196/name": "", +"slice_196/save_to_file/enabled": false, +"slice_196/save_to_file/keep_custom_tracks": false, +"slice_196/save_to_file/path": "", +"slice_196/start_frame": 0, +"slice_197/end_frame": 0, +"slice_197/loop_mode": 0, +"slice_197/name": "", +"slice_197/save_to_file/enabled": false, +"slice_197/save_to_file/keep_custom_tracks": false, +"slice_197/save_to_file/path": "", +"slice_197/start_frame": 0, +"slice_198/end_frame": 0, +"slice_198/loop_mode": 0, +"slice_198/name": "", +"slice_198/save_to_file/enabled": false, +"slice_198/save_to_file/keep_custom_tracks": false, +"slice_198/save_to_file/path": "", +"slice_198/start_frame": 0, +"slice_199/end_frame": 0, +"slice_199/loop_mode": 0, +"slice_199/name": "", +"slice_199/save_to_file/enabled": false, +"slice_199/save_to_file/keep_custom_tracks": false, +"slice_199/save_to_file/path": "", +"slice_199/start_frame": 0, +"slice_2/end_frame": 0, +"slice_2/loop_mode": 0, +"slice_2/name": "", +"slice_2/save_to_file/enabled": false, +"slice_2/save_to_file/keep_custom_tracks": false, +"slice_2/save_to_file/path": "", +"slice_2/start_frame": 0, +"slice_20/end_frame": 0, +"slice_20/loop_mode": 0, +"slice_20/name": "", +"slice_20/save_to_file/enabled": false, +"slice_20/save_to_file/keep_custom_tracks": false, +"slice_20/save_to_file/path": "", +"slice_20/start_frame": 0, +"slice_200/end_frame": 0, +"slice_200/loop_mode": 0, +"slice_200/name": "", +"slice_200/save_to_file/enabled": false, +"slice_200/save_to_file/keep_custom_tracks": false, +"slice_200/save_to_file/path": "", +"slice_200/start_frame": 0, +"slice_201/end_frame": 0, +"slice_201/loop_mode": 0, +"slice_201/name": "", +"slice_201/save_to_file/enabled": false, +"slice_201/save_to_file/keep_custom_tracks": false, +"slice_201/save_to_file/path": "", +"slice_201/start_frame": 0, +"slice_202/end_frame": 0, +"slice_202/loop_mode": 0, +"slice_202/name": "", +"slice_202/save_to_file/enabled": false, +"slice_202/save_to_file/keep_custom_tracks": false, +"slice_202/save_to_file/path": "", +"slice_202/start_frame": 0, +"slice_203/end_frame": 0, +"slice_203/loop_mode": 0, +"slice_203/name": "", +"slice_203/save_to_file/enabled": false, +"slice_203/save_to_file/keep_custom_tracks": false, +"slice_203/save_to_file/path": "", +"slice_203/start_frame": 0, +"slice_204/end_frame": 0, +"slice_204/loop_mode": 0, +"slice_204/name": "", +"slice_204/save_to_file/enabled": false, +"slice_204/save_to_file/keep_custom_tracks": false, +"slice_204/save_to_file/path": "", +"slice_204/start_frame": 0, +"slice_205/end_frame": 0, +"slice_205/loop_mode": 0, +"slice_205/name": "", +"slice_205/save_to_file/enabled": false, +"slice_205/save_to_file/keep_custom_tracks": false, +"slice_205/save_to_file/path": "", +"slice_205/start_frame": 0, +"slice_206/end_frame": 0, +"slice_206/loop_mode": 0, +"slice_206/name": "", +"slice_206/save_to_file/enabled": false, +"slice_206/save_to_file/keep_custom_tracks": false, +"slice_206/save_to_file/path": "", +"slice_206/start_frame": 0, +"slice_207/end_frame": 0, +"slice_207/loop_mode": 0, +"slice_207/name": "", +"slice_207/save_to_file/enabled": false, +"slice_207/save_to_file/keep_custom_tracks": false, +"slice_207/save_to_file/path": "", +"slice_207/start_frame": 0, +"slice_208/end_frame": 0, +"slice_208/loop_mode": 0, +"slice_208/name": "", +"slice_208/save_to_file/enabled": false, +"slice_208/save_to_file/keep_custom_tracks": false, +"slice_208/save_to_file/path": "", +"slice_208/start_frame": 0, +"slice_209/end_frame": 0, +"slice_209/loop_mode": 0, +"slice_209/name": "", +"slice_209/save_to_file/enabled": false, +"slice_209/save_to_file/keep_custom_tracks": false, +"slice_209/save_to_file/path": "", +"slice_209/start_frame": 0, +"slice_21/end_frame": 0, +"slice_21/loop_mode": 0, +"slice_21/name": "", +"slice_21/save_to_file/enabled": false, +"slice_21/save_to_file/keep_custom_tracks": false, +"slice_21/save_to_file/path": "", +"slice_21/start_frame": 0, +"slice_210/end_frame": 0, +"slice_210/loop_mode": 0, +"slice_210/name": "", +"slice_210/save_to_file/enabled": false, +"slice_210/save_to_file/keep_custom_tracks": false, +"slice_210/save_to_file/path": "", +"slice_210/start_frame": 0, +"slice_211/end_frame": 0, +"slice_211/loop_mode": 0, +"slice_211/name": "", +"slice_211/save_to_file/enabled": false, +"slice_211/save_to_file/keep_custom_tracks": false, +"slice_211/save_to_file/path": "", +"slice_211/start_frame": 0, +"slice_212/end_frame": 0, +"slice_212/loop_mode": 0, +"slice_212/name": "", +"slice_212/save_to_file/enabled": false, +"slice_212/save_to_file/keep_custom_tracks": false, +"slice_212/save_to_file/path": "", +"slice_212/start_frame": 0, +"slice_213/end_frame": 0, +"slice_213/loop_mode": 0, +"slice_213/name": "", +"slice_213/save_to_file/enabled": false, +"slice_213/save_to_file/keep_custom_tracks": false, +"slice_213/save_to_file/path": "", +"slice_213/start_frame": 0, +"slice_214/end_frame": 0, +"slice_214/loop_mode": 0, +"slice_214/name": "", +"slice_214/save_to_file/enabled": false, +"slice_214/save_to_file/keep_custom_tracks": false, +"slice_214/save_to_file/path": "", +"slice_214/start_frame": 0, +"slice_215/end_frame": 0, +"slice_215/loop_mode": 0, +"slice_215/name": "", +"slice_215/save_to_file/enabled": false, +"slice_215/save_to_file/keep_custom_tracks": false, +"slice_215/save_to_file/path": "", +"slice_215/start_frame": 0, +"slice_216/end_frame": 0, +"slice_216/loop_mode": 0, +"slice_216/name": "", +"slice_216/save_to_file/enabled": false, +"slice_216/save_to_file/keep_custom_tracks": false, +"slice_216/save_to_file/path": "", +"slice_216/start_frame": 0, +"slice_217/end_frame": 0, +"slice_217/loop_mode": 0, +"slice_217/name": "", +"slice_217/save_to_file/enabled": false, +"slice_217/save_to_file/keep_custom_tracks": false, +"slice_217/save_to_file/path": "", +"slice_217/start_frame": 0, +"slice_218/end_frame": 0, +"slice_218/loop_mode": 0, +"slice_218/name": "", +"slice_218/save_to_file/enabled": false, +"slice_218/save_to_file/keep_custom_tracks": false, +"slice_218/save_to_file/path": "", +"slice_218/start_frame": 0, +"slice_219/end_frame": 0, +"slice_219/loop_mode": 0, +"slice_219/name": "", +"slice_219/save_to_file/enabled": false, +"slice_219/save_to_file/keep_custom_tracks": false, +"slice_219/save_to_file/path": "", +"slice_219/start_frame": 0, +"slice_22/end_frame": 0, +"slice_22/loop_mode": 0, +"slice_22/name": "", +"slice_22/save_to_file/enabled": false, +"slice_22/save_to_file/keep_custom_tracks": false, +"slice_22/save_to_file/path": "", +"slice_22/start_frame": 0, +"slice_220/end_frame": 0, +"slice_220/loop_mode": 0, +"slice_220/name": "", +"slice_220/save_to_file/enabled": false, +"slice_220/save_to_file/keep_custom_tracks": false, +"slice_220/save_to_file/path": "", +"slice_220/start_frame": 0, +"slice_221/end_frame": 0, +"slice_221/loop_mode": 0, +"slice_221/name": "", +"slice_221/save_to_file/enabled": false, +"slice_221/save_to_file/keep_custom_tracks": false, +"slice_221/save_to_file/path": "", +"slice_221/start_frame": 0, +"slice_222/end_frame": 0, +"slice_222/loop_mode": 0, +"slice_222/name": "", +"slice_222/save_to_file/enabled": false, +"slice_222/save_to_file/keep_custom_tracks": false, +"slice_222/save_to_file/path": "", +"slice_222/start_frame": 0, +"slice_223/end_frame": 0, +"slice_223/loop_mode": 0, +"slice_223/name": "", +"slice_223/save_to_file/enabled": false, +"slice_223/save_to_file/keep_custom_tracks": false, +"slice_223/save_to_file/path": "", +"slice_223/start_frame": 0, +"slice_224/end_frame": 0, +"slice_224/loop_mode": 0, +"slice_224/name": "", +"slice_224/save_to_file/enabled": false, +"slice_224/save_to_file/keep_custom_tracks": false, +"slice_224/save_to_file/path": "", +"slice_224/start_frame": 0, +"slice_225/end_frame": 0, +"slice_225/loop_mode": 0, +"slice_225/name": "", +"slice_225/save_to_file/enabled": false, +"slice_225/save_to_file/keep_custom_tracks": false, +"slice_225/save_to_file/path": "", +"slice_225/start_frame": 0, +"slice_226/end_frame": 0, +"slice_226/loop_mode": 0, +"slice_226/name": "", +"slice_226/save_to_file/enabled": false, +"slice_226/save_to_file/keep_custom_tracks": false, +"slice_226/save_to_file/path": "", +"slice_226/start_frame": 0, +"slice_227/end_frame": 0, +"slice_227/loop_mode": 0, +"slice_227/name": "", +"slice_227/save_to_file/enabled": false, +"slice_227/save_to_file/keep_custom_tracks": false, +"slice_227/save_to_file/path": "", +"slice_227/start_frame": 0, +"slice_228/end_frame": 0, +"slice_228/loop_mode": 0, +"slice_228/name": "", +"slice_228/save_to_file/enabled": false, +"slice_228/save_to_file/keep_custom_tracks": false, +"slice_228/save_to_file/path": "", +"slice_228/start_frame": 0, +"slice_229/end_frame": 0, +"slice_229/loop_mode": 0, +"slice_229/name": "", +"slice_229/save_to_file/enabled": false, +"slice_229/save_to_file/keep_custom_tracks": false, +"slice_229/save_to_file/path": "", +"slice_229/start_frame": 0, +"slice_23/end_frame": 0, +"slice_23/loop_mode": 0, +"slice_23/name": "", +"slice_23/save_to_file/enabled": false, +"slice_23/save_to_file/keep_custom_tracks": false, +"slice_23/save_to_file/path": "", +"slice_23/start_frame": 0, +"slice_230/end_frame": 0, +"slice_230/loop_mode": 0, +"slice_230/name": "", +"slice_230/save_to_file/enabled": false, +"slice_230/save_to_file/keep_custom_tracks": false, +"slice_230/save_to_file/path": "", +"slice_230/start_frame": 0, +"slice_231/end_frame": 0, +"slice_231/loop_mode": 0, +"slice_231/name": "", +"slice_231/save_to_file/enabled": false, +"slice_231/save_to_file/keep_custom_tracks": false, +"slice_231/save_to_file/path": "", +"slice_231/start_frame": 0, +"slice_232/end_frame": 0, +"slice_232/loop_mode": 0, +"slice_232/name": "", +"slice_232/save_to_file/enabled": false, +"slice_232/save_to_file/keep_custom_tracks": false, +"slice_232/save_to_file/path": "", +"slice_232/start_frame": 0, +"slice_233/end_frame": 0, +"slice_233/loop_mode": 0, +"slice_233/name": "", +"slice_233/save_to_file/enabled": false, +"slice_233/save_to_file/keep_custom_tracks": false, +"slice_233/save_to_file/path": "", +"slice_233/start_frame": 0, +"slice_234/end_frame": 0, +"slice_234/loop_mode": 0, +"slice_234/name": "", +"slice_234/save_to_file/enabled": false, +"slice_234/save_to_file/keep_custom_tracks": false, +"slice_234/save_to_file/path": "", +"slice_234/start_frame": 0, +"slice_235/end_frame": 0, +"slice_235/loop_mode": 0, +"slice_235/name": "", +"slice_235/save_to_file/enabled": false, +"slice_235/save_to_file/keep_custom_tracks": false, +"slice_235/save_to_file/path": "", +"slice_235/start_frame": 0, +"slice_236/end_frame": 0, +"slice_236/loop_mode": 0, +"slice_236/name": "", +"slice_236/save_to_file/enabled": false, +"slice_236/save_to_file/keep_custom_tracks": false, +"slice_236/save_to_file/path": "", +"slice_236/start_frame": 0, +"slice_237/end_frame": 0, +"slice_237/loop_mode": 0, +"slice_237/name": "", +"slice_237/save_to_file/enabled": false, +"slice_237/save_to_file/keep_custom_tracks": false, +"slice_237/save_to_file/path": "", +"slice_237/start_frame": 0, +"slice_238/end_frame": 0, +"slice_238/loop_mode": 0, +"slice_238/name": "", +"slice_238/save_to_file/enabled": false, +"slice_238/save_to_file/keep_custom_tracks": false, +"slice_238/save_to_file/path": "", +"slice_238/start_frame": 0, +"slice_239/end_frame": 0, +"slice_239/loop_mode": 0, +"slice_239/name": "", +"slice_239/save_to_file/enabled": false, +"slice_239/save_to_file/keep_custom_tracks": false, +"slice_239/save_to_file/path": "", +"slice_239/start_frame": 0, +"slice_24/end_frame": 0, +"slice_24/loop_mode": 0, +"slice_24/name": "", +"slice_24/save_to_file/enabled": false, +"slice_24/save_to_file/keep_custom_tracks": false, +"slice_24/save_to_file/path": "", +"slice_24/start_frame": 0, +"slice_240/end_frame": 0, +"slice_240/loop_mode": 0, +"slice_240/name": "", +"slice_240/save_to_file/enabled": false, +"slice_240/save_to_file/keep_custom_tracks": false, +"slice_240/save_to_file/path": "", +"slice_240/start_frame": 0, +"slice_241/end_frame": 0, +"slice_241/loop_mode": 0, +"slice_241/name": "", +"slice_241/save_to_file/enabled": false, +"slice_241/save_to_file/keep_custom_tracks": false, +"slice_241/save_to_file/path": "", +"slice_241/start_frame": 0, +"slice_242/end_frame": 0, +"slice_242/loop_mode": 0, +"slice_242/name": "", +"slice_242/save_to_file/enabled": false, +"slice_242/save_to_file/keep_custom_tracks": false, +"slice_242/save_to_file/path": "", +"slice_242/start_frame": 0, +"slice_243/end_frame": 0, +"slice_243/loop_mode": 0, +"slice_243/name": "", +"slice_243/save_to_file/enabled": false, +"slice_243/save_to_file/keep_custom_tracks": false, +"slice_243/save_to_file/path": "", +"slice_243/start_frame": 0, +"slice_244/end_frame": 0, +"slice_244/loop_mode": 0, +"slice_244/name": "", +"slice_244/save_to_file/enabled": false, +"slice_244/save_to_file/keep_custom_tracks": false, +"slice_244/save_to_file/path": "", +"slice_244/start_frame": 0, +"slice_245/end_frame": 0, +"slice_245/loop_mode": 0, +"slice_245/name": "", +"slice_245/save_to_file/enabled": false, +"slice_245/save_to_file/keep_custom_tracks": false, +"slice_245/save_to_file/path": "", +"slice_245/start_frame": 0, +"slice_246/end_frame": 0, +"slice_246/loop_mode": 0, +"slice_246/name": "", +"slice_246/save_to_file/enabled": false, +"slice_246/save_to_file/keep_custom_tracks": false, +"slice_246/save_to_file/path": "", +"slice_246/start_frame": 0, +"slice_247/end_frame": 0, +"slice_247/loop_mode": 0, +"slice_247/name": "", +"slice_247/save_to_file/enabled": false, +"slice_247/save_to_file/keep_custom_tracks": false, +"slice_247/save_to_file/path": "", +"slice_247/start_frame": 0, +"slice_248/end_frame": 0, +"slice_248/loop_mode": 0, +"slice_248/name": "", +"slice_248/save_to_file/enabled": false, +"slice_248/save_to_file/keep_custom_tracks": false, +"slice_248/save_to_file/path": "", +"slice_248/start_frame": 0, +"slice_249/end_frame": 0, +"slice_249/loop_mode": 0, +"slice_249/name": "", +"slice_249/save_to_file/enabled": false, +"slice_249/save_to_file/keep_custom_tracks": false, +"slice_249/save_to_file/path": "", +"slice_249/start_frame": 0, +"slice_25/end_frame": 0, +"slice_25/loop_mode": 0, +"slice_25/name": "", +"slice_25/save_to_file/enabled": false, +"slice_25/save_to_file/keep_custom_tracks": false, +"slice_25/save_to_file/path": "", +"slice_25/start_frame": 0, +"slice_250/end_frame": 0, +"slice_250/loop_mode": 0, +"slice_250/name": "", +"slice_250/save_to_file/enabled": false, +"slice_250/save_to_file/keep_custom_tracks": false, +"slice_250/save_to_file/path": "", +"slice_250/start_frame": 0, +"slice_251/end_frame": 0, +"slice_251/loop_mode": 0, +"slice_251/name": "", +"slice_251/save_to_file/enabled": false, +"slice_251/save_to_file/keep_custom_tracks": false, +"slice_251/save_to_file/path": "", +"slice_251/start_frame": 0, +"slice_252/end_frame": 0, +"slice_252/loop_mode": 0, +"slice_252/name": "", +"slice_252/save_to_file/enabled": false, +"slice_252/save_to_file/keep_custom_tracks": false, +"slice_252/save_to_file/path": "", +"slice_252/start_frame": 0, +"slice_253/end_frame": 0, +"slice_253/loop_mode": 0, +"slice_253/name": "", +"slice_253/save_to_file/enabled": false, +"slice_253/save_to_file/keep_custom_tracks": false, +"slice_253/save_to_file/path": "", +"slice_253/start_frame": 0, +"slice_254/end_frame": 0, +"slice_254/loop_mode": 0, +"slice_254/name": "", +"slice_254/save_to_file/enabled": false, +"slice_254/save_to_file/keep_custom_tracks": false, +"slice_254/save_to_file/path": "", +"slice_254/start_frame": 0, +"slice_255/end_frame": 0, +"slice_255/loop_mode": 0, +"slice_255/name": "", +"slice_255/save_to_file/enabled": false, +"slice_255/save_to_file/keep_custom_tracks": false, +"slice_255/save_to_file/path": "", +"slice_255/start_frame": 0, +"slice_256/end_frame": 0, +"slice_256/loop_mode": 0, +"slice_256/name": "", +"slice_256/save_to_file/enabled": false, +"slice_256/save_to_file/keep_custom_tracks": false, +"slice_256/save_to_file/path": "", +"slice_256/start_frame": 0, +"slice_26/end_frame": 0, +"slice_26/loop_mode": 0, +"slice_26/name": "", +"slice_26/save_to_file/enabled": false, +"slice_26/save_to_file/keep_custom_tracks": false, +"slice_26/save_to_file/path": "", +"slice_26/start_frame": 0, +"slice_27/end_frame": 0, +"slice_27/loop_mode": 0, +"slice_27/name": "", +"slice_27/save_to_file/enabled": false, +"slice_27/save_to_file/keep_custom_tracks": false, +"slice_27/save_to_file/path": "", +"slice_27/start_frame": 0, +"slice_28/end_frame": 0, +"slice_28/loop_mode": 0, +"slice_28/name": "", +"slice_28/save_to_file/enabled": false, +"slice_28/save_to_file/keep_custom_tracks": false, +"slice_28/save_to_file/path": "", +"slice_28/start_frame": 0, +"slice_29/end_frame": 0, +"slice_29/loop_mode": 0, +"slice_29/name": "", +"slice_29/save_to_file/enabled": false, +"slice_29/save_to_file/keep_custom_tracks": false, +"slice_29/save_to_file/path": "", +"slice_29/start_frame": 0, +"slice_3/end_frame": 0, +"slice_3/loop_mode": 0, +"slice_3/name": "", +"slice_3/save_to_file/enabled": false, +"slice_3/save_to_file/keep_custom_tracks": false, +"slice_3/save_to_file/path": "", +"slice_3/start_frame": 0, +"slice_30/end_frame": 0, +"slice_30/loop_mode": 0, +"slice_30/name": "", +"slice_30/save_to_file/enabled": false, +"slice_30/save_to_file/keep_custom_tracks": false, +"slice_30/save_to_file/path": "", +"slice_30/start_frame": 0, +"slice_31/end_frame": 0, +"slice_31/loop_mode": 0, +"slice_31/name": "", +"slice_31/save_to_file/enabled": false, +"slice_31/save_to_file/keep_custom_tracks": false, +"slice_31/save_to_file/path": "", +"slice_31/start_frame": 0, +"slice_32/end_frame": 0, +"slice_32/loop_mode": 0, +"slice_32/name": "", +"slice_32/save_to_file/enabled": false, +"slice_32/save_to_file/keep_custom_tracks": false, +"slice_32/save_to_file/path": "", +"slice_32/start_frame": 0, +"slice_33/end_frame": 0, +"slice_33/loop_mode": 0, +"slice_33/name": "", +"slice_33/save_to_file/enabled": false, +"slice_33/save_to_file/keep_custom_tracks": false, +"slice_33/save_to_file/path": "", +"slice_33/start_frame": 0, +"slice_34/end_frame": 0, +"slice_34/loop_mode": 0, +"slice_34/name": "", +"slice_34/save_to_file/enabled": false, +"slice_34/save_to_file/keep_custom_tracks": false, +"slice_34/save_to_file/path": "", +"slice_34/start_frame": 0, +"slice_35/end_frame": 0, +"slice_35/loop_mode": 0, +"slice_35/name": "", +"slice_35/save_to_file/enabled": false, +"slice_35/save_to_file/keep_custom_tracks": false, +"slice_35/save_to_file/path": "", +"slice_35/start_frame": 0, +"slice_36/end_frame": 0, +"slice_36/loop_mode": 0, +"slice_36/name": "", +"slice_36/save_to_file/enabled": false, +"slice_36/save_to_file/keep_custom_tracks": false, +"slice_36/save_to_file/path": "", +"slice_36/start_frame": 0, +"slice_37/end_frame": 0, +"slice_37/loop_mode": 0, +"slice_37/name": "", +"slice_37/save_to_file/enabled": false, +"slice_37/save_to_file/keep_custom_tracks": false, +"slice_37/save_to_file/path": "", +"slice_37/start_frame": 0, +"slice_38/end_frame": 0, +"slice_38/loop_mode": 0, +"slice_38/name": "", +"slice_38/save_to_file/enabled": false, +"slice_38/save_to_file/keep_custom_tracks": false, +"slice_38/save_to_file/path": "", +"slice_38/start_frame": 0, +"slice_39/end_frame": 0, +"slice_39/loop_mode": 0, +"slice_39/name": "", +"slice_39/save_to_file/enabled": false, +"slice_39/save_to_file/keep_custom_tracks": false, +"slice_39/save_to_file/path": "", +"slice_39/start_frame": 0, +"slice_4/end_frame": 0, +"slice_4/loop_mode": 0, +"slice_4/name": "", +"slice_4/save_to_file/enabled": false, +"slice_4/save_to_file/keep_custom_tracks": false, +"slice_4/save_to_file/path": "", +"slice_4/start_frame": 0, +"slice_40/end_frame": 0, +"slice_40/loop_mode": 0, +"slice_40/name": "", +"slice_40/save_to_file/enabled": false, +"slice_40/save_to_file/keep_custom_tracks": false, +"slice_40/save_to_file/path": "", +"slice_40/start_frame": 0, +"slice_41/end_frame": 0, +"slice_41/loop_mode": 0, +"slice_41/name": "", +"slice_41/save_to_file/enabled": false, +"slice_41/save_to_file/keep_custom_tracks": false, +"slice_41/save_to_file/path": "", +"slice_41/start_frame": 0, +"slice_42/end_frame": 0, +"slice_42/loop_mode": 0, +"slice_42/name": "", +"slice_42/save_to_file/enabled": false, +"slice_42/save_to_file/keep_custom_tracks": false, +"slice_42/save_to_file/path": "", +"slice_42/start_frame": 0, +"slice_43/end_frame": 0, +"slice_43/loop_mode": 0, +"slice_43/name": "", +"slice_43/save_to_file/enabled": false, +"slice_43/save_to_file/keep_custom_tracks": false, +"slice_43/save_to_file/path": "", +"slice_43/start_frame": 0, +"slice_44/end_frame": 0, +"slice_44/loop_mode": 0, +"slice_44/name": "", +"slice_44/save_to_file/enabled": false, +"slice_44/save_to_file/keep_custom_tracks": false, +"slice_44/save_to_file/path": "", +"slice_44/start_frame": 0, +"slice_45/end_frame": 0, +"slice_45/loop_mode": 0, +"slice_45/name": "", +"slice_45/save_to_file/enabled": false, +"slice_45/save_to_file/keep_custom_tracks": false, +"slice_45/save_to_file/path": "", +"slice_45/start_frame": 0, +"slice_46/end_frame": 0, +"slice_46/loop_mode": 0, +"slice_46/name": "", +"slice_46/save_to_file/enabled": false, +"slice_46/save_to_file/keep_custom_tracks": false, +"slice_46/save_to_file/path": "", +"slice_46/start_frame": 0, +"slice_47/end_frame": 0, +"slice_47/loop_mode": 0, +"slice_47/name": "", +"slice_47/save_to_file/enabled": false, +"slice_47/save_to_file/keep_custom_tracks": false, +"slice_47/save_to_file/path": "", +"slice_47/start_frame": 0, +"slice_48/end_frame": 0, +"slice_48/loop_mode": 0, +"slice_48/name": "", +"slice_48/save_to_file/enabled": false, +"slice_48/save_to_file/keep_custom_tracks": false, +"slice_48/save_to_file/path": "", +"slice_48/start_frame": 0, +"slice_49/end_frame": 0, +"slice_49/loop_mode": 0, +"slice_49/name": "", +"slice_49/save_to_file/enabled": false, +"slice_49/save_to_file/keep_custom_tracks": false, +"slice_49/save_to_file/path": "", +"slice_49/start_frame": 0, +"slice_5/end_frame": 0, +"slice_5/loop_mode": 0, +"slice_5/name": "", +"slice_5/save_to_file/enabled": false, +"slice_5/save_to_file/keep_custom_tracks": false, +"slice_5/save_to_file/path": "", +"slice_5/start_frame": 0, +"slice_50/end_frame": 0, +"slice_50/loop_mode": 0, +"slice_50/name": "", +"slice_50/save_to_file/enabled": false, +"slice_50/save_to_file/keep_custom_tracks": false, +"slice_50/save_to_file/path": "", +"slice_50/start_frame": 0, +"slice_51/end_frame": 0, +"slice_51/loop_mode": 0, +"slice_51/name": "", +"slice_51/save_to_file/enabled": false, +"slice_51/save_to_file/keep_custom_tracks": false, +"slice_51/save_to_file/path": "", +"slice_51/start_frame": 0, +"slice_52/end_frame": 0, +"slice_52/loop_mode": 0, +"slice_52/name": "", +"slice_52/save_to_file/enabled": false, +"slice_52/save_to_file/keep_custom_tracks": false, +"slice_52/save_to_file/path": "", +"slice_52/start_frame": 0, +"slice_53/end_frame": 0, +"slice_53/loop_mode": 0, +"slice_53/name": "", +"slice_53/save_to_file/enabled": false, +"slice_53/save_to_file/keep_custom_tracks": false, +"slice_53/save_to_file/path": "", +"slice_53/start_frame": 0, +"slice_54/end_frame": 0, +"slice_54/loop_mode": 0, +"slice_54/name": "", +"slice_54/save_to_file/enabled": false, +"slice_54/save_to_file/keep_custom_tracks": false, +"slice_54/save_to_file/path": "", +"slice_54/start_frame": 0, +"slice_55/end_frame": 0, +"slice_55/loop_mode": 0, +"slice_55/name": "", +"slice_55/save_to_file/enabled": false, +"slice_55/save_to_file/keep_custom_tracks": false, +"slice_55/save_to_file/path": "", +"slice_55/start_frame": 0, +"slice_56/end_frame": 0, +"slice_56/loop_mode": 0, +"slice_56/name": "", +"slice_56/save_to_file/enabled": false, +"slice_56/save_to_file/keep_custom_tracks": false, +"slice_56/save_to_file/path": "", +"slice_56/start_frame": 0, +"slice_57/end_frame": 0, +"slice_57/loop_mode": 0, +"slice_57/name": "", +"slice_57/save_to_file/enabled": false, +"slice_57/save_to_file/keep_custom_tracks": false, +"slice_57/save_to_file/path": "", +"slice_57/start_frame": 0, +"slice_58/end_frame": 0, +"slice_58/loop_mode": 0, +"slice_58/name": "", +"slice_58/save_to_file/enabled": false, +"slice_58/save_to_file/keep_custom_tracks": false, +"slice_58/save_to_file/path": "", +"slice_58/start_frame": 0, +"slice_59/end_frame": 0, +"slice_59/loop_mode": 0, +"slice_59/name": "", +"slice_59/save_to_file/enabled": false, +"slice_59/save_to_file/keep_custom_tracks": false, +"slice_59/save_to_file/path": "", +"slice_59/start_frame": 0, +"slice_6/end_frame": 0, +"slice_6/loop_mode": 0, +"slice_6/name": "", +"slice_6/save_to_file/enabled": false, +"slice_6/save_to_file/keep_custom_tracks": false, +"slice_6/save_to_file/path": "", +"slice_6/start_frame": 0, +"slice_60/end_frame": 0, +"slice_60/loop_mode": 0, +"slice_60/name": "", +"slice_60/save_to_file/enabled": false, +"slice_60/save_to_file/keep_custom_tracks": false, +"slice_60/save_to_file/path": "", +"slice_60/start_frame": 0, +"slice_61/end_frame": 0, +"slice_61/loop_mode": 0, +"slice_61/name": "", +"slice_61/save_to_file/enabled": false, +"slice_61/save_to_file/keep_custom_tracks": false, +"slice_61/save_to_file/path": "", +"slice_61/start_frame": 0, +"slice_62/end_frame": 0, +"slice_62/loop_mode": 0, +"slice_62/name": "", +"slice_62/save_to_file/enabled": false, +"slice_62/save_to_file/keep_custom_tracks": false, +"slice_62/save_to_file/path": "", +"slice_62/start_frame": 0, +"slice_63/end_frame": 0, +"slice_63/loop_mode": 0, +"slice_63/name": "", +"slice_63/save_to_file/enabled": false, +"slice_63/save_to_file/keep_custom_tracks": false, +"slice_63/save_to_file/path": "", +"slice_63/start_frame": 0, +"slice_64/end_frame": 0, +"slice_64/loop_mode": 0, +"slice_64/name": "", +"slice_64/save_to_file/enabled": false, +"slice_64/save_to_file/keep_custom_tracks": false, +"slice_64/save_to_file/path": "", +"slice_64/start_frame": 0, +"slice_65/end_frame": 0, +"slice_65/loop_mode": 0, +"slice_65/name": "", +"slice_65/save_to_file/enabled": false, +"slice_65/save_to_file/keep_custom_tracks": false, +"slice_65/save_to_file/path": "", +"slice_65/start_frame": 0, +"slice_66/end_frame": 0, +"slice_66/loop_mode": 0, +"slice_66/name": "", +"slice_66/save_to_file/enabled": false, +"slice_66/save_to_file/keep_custom_tracks": false, +"slice_66/save_to_file/path": "", +"slice_66/start_frame": 0, +"slice_67/end_frame": 0, +"slice_67/loop_mode": 0, +"slice_67/name": "", +"slice_67/save_to_file/enabled": false, +"slice_67/save_to_file/keep_custom_tracks": false, +"slice_67/save_to_file/path": "", +"slice_67/start_frame": 0, +"slice_68/end_frame": 0, +"slice_68/loop_mode": 0, +"slice_68/name": "", +"slice_68/save_to_file/enabled": false, +"slice_68/save_to_file/keep_custom_tracks": false, +"slice_68/save_to_file/path": "", +"slice_68/start_frame": 0, +"slice_69/end_frame": 0, +"slice_69/loop_mode": 0, +"slice_69/name": "", +"slice_69/save_to_file/enabled": false, +"slice_69/save_to_file/keep_custom_tracks": false, +"slice_69/save_to_file/path": "", +"slice_69/start_frame": 0, +"slice_7/end_frame": 0, +"slice_7/loop_mode": 0, +"slice_7/name": "", +"slice_7/save_to_file/enabled": false, +"slice_7/save_to_file/keep_custom_tracks": false, +"slice_7/save_to_file/path": "", +"slice_7/start_frame": 0, +"slice_70/end_frame": 0, +"slice_70/loop_mode": 0, +"slice_70/name": "", +"slice_70/save_to_file/enabled": false, +"slice_70/save_to_file/keep_custom_tracks": false, +"slice_70/save_to_file/path": "", +"slice_70/start_frame": 0, +"slice_71/end_frame": 0, +"slice_71/loop_mode": 0, +"slice_71/name": "", +"slice_71/save_to_file/enabled": false, +"slice_71/save_to_file/keep_custom_tracks": false, +"slice_71/save_to_file/path": "", +"slice_71/start_frame": 0, +"slice_72/end_frame": 0, +"slice_72/loop_mode": 0, +"slice_72/name": "", +"slice_72/save_to_file/enabled": false, +"slice_72/save_to_file/keep_custom_tracks": false, +"slice_72/save_to_file/path": "", +"slice_72/start_frame": 0, +"slice_73/end_frame": 0, +"slice_73/loop_mode": 0, +"slice_73/name": "", +"slice_73/save_to_file/enabled": false, +"slice_73/save_to_file/keep_custom_tracks": false, +"slice_73/save_to_file/path": "", +"slice_73/start_frame": 0, +"slice_74/end_frame": 0, +"slice_74/loop_mode": 0, +"slice_74/name": "", +"slice_74/save_to_file/enabled": false, +"slice_74/save_to_file/keep_custom_tracks": false, +"slice_74/save_to_file/path": "", +"slice_74/start_frame": 0, +"slice_75/end_frame": 0, +"slice_75/loop_mode": 0, +"slice_75/name": "", +"slice_75/save_to_file/enabled": false, +"slice_75/save_to_file/keep_custom_tracks": false, +"slice_75/save_to_file/path": "", +"slice_75/start_frame": 0, +"slice_76/end_frame": 0, +"slice_76/loop_mode": 0, +"slice_76/name": "", +"slice_76/save_to_file/enabled": false, +"slice_76/save_to_file/keep_custom_tracks": false, +"slice_76/save_to_file/path": "", +"slice_76/start_frame": 0, +"slice_77/end_frame": 0, +"slice_77/loop_mode": 0, +"slice_77/name": "", +"slice_77/save_to_file/enabled": false, +"slice_77/save_to_file/keep_custom_tracks": false, +"slice_77/save_to_file/path": "", +"slice_77/start_frame": 0, +"slice_78/end_frame": 0, +"slice_78/loop_mode": 0, +"slice_78/name": "", +"slice_78/save_to_file/enabled": false, +"slice_78/save_to_file/keep_custom_tracks": false, +"slice_78/save_to_file/path": "", +"slice_78/start_frame": 0, +"slice_79/end_frame": 0, +"slice_79/loop_mode": 0, +"slice_79/name": "", +"slice_79/save_to_file/enabled": false, +"slice_79/save_to_file/keep_custom_tracks": false, +"slice_79/save_to_file/path": "", +"slice_79/start_frame": 0, +"slice_8/end_frame": 0, +"slice_8/loop_mode": 0, +"slice_8/name": "", +"slice_8/save_to_file/enabled": false, +"slice_8/save_to_file/keep_custom_tracks": false, +"slice_8/save_to_file/path": "", +"slice_8/start_frame": 0, +"slice_80/end_frame": 0, +"slice_80/loop_mode": 0, +"slice_80/name": "", +"slice_80/save_to_file/enabled": false, +"slice_80/save_to_file/keep_custom_tracks": false, +"slice_80/save_to_file/path": "", +"slice_80/start_frame": 0, +"slice_81/end_frame": 0, +"slice_81/loop_mode": 0, +"slice_81/name": "", +"slice_81/save_to_file/enabled": false, +"slice_81/save_to_file/keep_custom_tracks": false, +"slice_81/save_to_file/path": "", +"slice_81/start_frame": 0, +"slice_82/end_frame": 0, +"slice_82/loop_mode": 0, +"slice_82/name": "", +"slice_82/save_to_file/enabled": false, +"slice_82/save_to_file/keep_custom_tracks": false, +"slice_82/save_to_file/path": "", +"slice_82/start_frame": 0, +"slice_83/end_frame": 0, +"slice_83/loop_mode": 0, +"slice_83/name": "", +"slice_83/save_to_file/enabled": false, +"slice_83/save_to_file/keep_custom_tracks": false, +"slice_83/save_to_file/path": "", +"slice_83/start_frame": 0, +"slice_84/end_frame": 0, +"slice_84/loop_mode": 0, +"slice_84/name": "", +"slice_84/save_to_file/enabled": false, +"slice_84/save_to_file/keep_custom_tracks": false, +"slice_84/save_to_file/path": "", +"slice_84/start_frame": 0, +"slice_85/end_frame": 0, +"slice_85/loop_mode": 0, +"slice_85/name": "", +"slice_85/save_to_file/enabled": false, +"slice_85/save_to_file/keep_custom_tracks": false, +"slice_85/save_to_file/path": "", +"slice_85/start_frame": 0, +"slice_86/end_frame": 0, +"slice_86/loop_mode": 0, +"slice_86/name": "", +"slice_86/save_to_file/enabled": false, +"slice_86/save_to_file/keep_custom_tracks": false, +"slice_86/save_to_file/path": "", +"slice_86/start_frame": 0, +"slice_87/end_frame": 0, +"slice_87/loop_mode": 0, +"slice_87/name": "", +"slice_87/save_to_file/enabled": false, +"slice_87/save_to_file/keep_custom_tracks": false, +"slice_87/save_to_file/path": "", +"slice_87/start_frame": 0, +"slice_88/end_frame": 0, +"slice_88/loop_mode": 0, +"slice_88/name": "", +"slice_88/save_to_file/enabled": false, +"slice_88/save_to_file/keep_custom_tracks": false, +"slice_88/save_to_file/path": "", +"slice_88/start_frame": 0, +"slice_89/end_frame": 0, +"slice_89/loop_mode": 0, +"slice_89/name": "", +"slice_89/save_to_file/enabled": false, +"slice_89/save_to_file/keep_custom_tracks": false, +"slice_89/save_to_file/path": "", +"slice_89/start_frame": 0, +"slice_9/end_frame": 0, +"slice_9/loop_mode": 0, +"slice_9/name": "", +"slice_9/save_to_file/enabled": false, +"slice_9/save_to_file/keep_custom_tracks": false, +"slice_9/save_to_file/path": "", +"slice_9/start_frame": 0, +"slice_90/end_frame": 0, +"slice_90/loop_mode": 0, +"slice_90/name": "", +"slice_90/save_to_file/enabled": false, +"slice_90/save_to_file/keep_custom_tracks": false, +"slice_90/save_to_file/path": "", +"slice_90/start_frame": 0, +"slice_91/end_frame": 0, +"slice_91/loop_mode": 0, +"slice_91/name": "", +"slice_91/save_to_file/enabled": false, +"slice_91/save_to_file/keep_custom_tracks": false, +"slice_91/save_to_file/path": "", +"slice_91/start_frame": 0, +"slice_92/end_frame": 0, +"slice_92/loop_mode": 0, +"slice_92/name": "", +"slice_92/save_to_file/enabled": false, +"slice_92/save_to_file/keep_custom_tracks": false, +"slice_92/save_to_file/path": "", +"slice_92/start_frame": 0, +"slice_93/end_frame": 0, +"slice_93/loop_mode": 0, +"slice_93/name": "", +"slice_93/save_to_file/enabled": false, +"slice_93/save_to_file/keep_custom_tracks": false, +"slice_93/save_to_file/path": "", +"slice_93/start_frame": 0, +"slice_94/end_frame": 0, +"slice_94/loop_mode": 0, +"slice_94/name": "", +"slice_94/save_to_file/enabled": false, +"slice_94/save_to_file/keep_custom_tracks": false, +"slice_94/save_to_file/path": "", +"slice_94/start_frame": 0, +"slice_95/end_frame": 0, +"slice_95/loop_mode": 0, +"slice_95/name": "", +"slice_95/save_to_file/enabled": false, +"slice_95/save_to_file/keep_custom_tracks": false, +"slice_95/save_to_file/path": "", +"slice_95/start_frame": 0, +"slice_96/end_frame": 0, +"slice_96/loop_mode": 0, +"slice_96/name": "", +"slice_96/save_to_file/enabled": false, +"slice_96/save_to_file/keep_custom_tracks": false, +"slice_96/save_to_file/path": "", +"slice_96/start_frame": 0, +"slice_97/end_frame": 0, +"slice_97/loop_mode": 0, +"slice_97/name": "", +"slice_97/save_to_file/enabled": false, +"slice_97/save_to_file/keep_custom_tracks": false, +"slice_97/save_to_file/path": "", +"slice_97/start_frame": 0, +"slice_98/end_frame": 0, +"slice_98/loop_mode": 0, +"slice_98/name": "", +"slice_98/save_to_file/enabled": false, +"slice_98/save_to_file/keep_custom_tracks": false, +"slice_98/save_to_file/path": "", +"slice_98/start_frame": 0, +"slice_99/end_frame": 0, +"slice_99/loop_mode": 0, +"slice_99/name": "", +"slice_99/save_to_file/enabled": false, +"slice_99/save_to_file/keep_custom_tracks": false, +"slice_99/save_to_file/path": "", +"slice_99/start_frame": 0, +"slices/amount": null +} +}, +"materials": { +"Material.001": { +"use_external/enabled": true, +"use_external/path": "res://materials/MainTexture.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/models/Buc_general_texture-Recovered.png b/models/Buc_general_texture-Recovered.png new file mode 100644 index 0000000..ddadfa2 --- /dev/null +++ b/models/Buc_general_texture-Recovered.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2b571360a2744923ee3ff5eaa474ca6c610763d6efc209d454fd90b8fdec29c +size 1474 diff --git a/models/Buc_general_texture-Recovered.png.import b/models/Buc_general_texture-Recovered.png.import new file mode 100644 index 0000000..7ce3b15 --- /dev/null +++ b/models/Buc_general_texture-Recovered.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d0ge255joowck" +path.s3tc="res://.godot/imported/Buc_general_texture-Recovered.png-01d5165e276a539929237878e8134faa.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={} + +[deps] + +source_file="res://models/Buc_general_texture-Recovered.png" +dest_files=["res://.godot/imported/Buc_general_texture-Recovered.png-01d5165e276a539929237878e8134faa.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/models/Myd.glb b/models/Myd.glb new file mode 100644 index 0000000..e716aab --- /dev/null +++ b/models/Myd.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:715ed928fc344e0eaac8876792bc3683083ce3cadbf3d0f598d006b8ce219a84 +size 81788 diff --git a/models/Myd.glb.import b/models/Myd.glb.import new file mode 100644 index 0000000..2762d80 --- /dev/null +++ b/models/Myd.glb.import @@ -0,0 +1,3639 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://duxlytjrhvg3d" +path="res://.godot/imported/Myd.glb-8d9898c74d7f9d1c201b1afebea02d10.scn" + +[deps] + +source_file="res://models/Myd.glb" +dest_files=["res://.godot/imported/Myd.glb-8d9898c74d7f9d1c201b1afebea02d10.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=0.2 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"animations": { +"idle": { +"save_to_file/enabled": false, +"save_to_file/keep_custom_tracks": "", +"save_to_file/path": "", +"settings/loop_mode": 1, +"slice_1/end_frame": 0, +"slice_1/loop_mode": 0, +"slice_1/name": "", +"slice_1/save_to_file/enabled": false, +"slice_1/save_to_file/keep_custom_tracks": false, +"slice_1/save_to_file/path": "", +"slice_1/start_frame": 0, +"slice_10/end_frame": 0, +"slice_10/loop_mode": 0, +"slice_10/name": "", +"slice_10/save_to_file/enabled": false, +"slice_10/save_to_file/keep_custom_tracks": false, +"slice_10/save_to_file/path": "", +"slice_10/start_frame": 0, +"slice_100/end_frame": 0, +"slice_100/loop_mode": 0, +"slice_100/name": "", +"slice_100/save_to_file/enabled": false, +"slice_100/save_to_file/keep_custom_tracks": false, +"slice_100/save_to_file/path": "", +"slice_100/start_frame": 0, +"slice_101/end_frame": 0, +"slice_101/loop_mode": 0, +"slice_101/name": "", +"slice_101/save_to_file/enabled": false, +"slice_101/save_to_file/keep_custom_tracks": false, +"slice_101/save_to_file/path": "", +"slice_101/start_frame": 0, +"slice_102/end_frame": 0, +"slice_102/loop_mode": 0, +"slice_102/name": "", +"slice_102/save_to_file/enabled": false, +"slice_102/save_to_file/keep_custom_tracks": false, +"slice_102/save_to_file/path": "", +"slice_102/start_frame": 0, +"slice_103/end_frame": 0, +"slice_103/loop_mode": 0, +"slice_103/name": "", +"slice_103/save_to_file/enabled": false, +"slice_103/save_to_file/keep_custom_tracks": false, +"slice_103/save_to_file/path": "", +"slice_103/start_frame": 0, +"slice_104/end_frame": 0, +"slice_104/loop_mode": 0, +"slice_104/name": "", +"slice_104/save_to_file/enabled": false, +"slice_104/save_to_file/keep_custom_tracks": false, +"slice_104/save_to_file/path": "", +"slice_104/start_frame": 0, +"slice_105/end_frame": 0, +"slice_105/loop_mode": 0, +"slice_105/name": "", +"slice_105/save_to_file/enabled": false, +"slice_105/save_to_file/keep_custom_tracks": false, +"slice_105/save_to_file/path": "", +"slice_105/start_frame": 0, +"slice_106/end_frame": 0, +"slice_106/loop_mode": 0, +"slice_106/name": "", +"slice_106/save_to_file/enabled": false, +"slice_106/save_to_file/keep_custom_tracks": false, +"slice_106/save_to_file/path": "", +"slice_106/start_frame": 0, +"slice_107/end_frame": 0, +"slice_107/loop_mode": 0, +"slice_107/name": "", +"slice_107/save_to_file/enabled": false, +"slice_107/save_to_file/keep_custom_tracks": false, +"slice_107/save_to_file/path": "", +"slice_107/start_frame": 0, +"slice_108/end_frame": 0, +"slice_108/loop_mode": 0, +"slice_108/name": "", +"slice_108/save_to_file/enabled": false, +"slice_108/save_to_file/keep_custom_tracks": false, +"slice_108/save_to_file/path": "", +"slice_108/start_frame": 0, +"slice_109/end_frame": 0, +"slice_109/loop_mode": 0, +"slice_109/name": "", +"slice_109/save_to_file/enabled": false, +"slice_109/save_to_file/keep_custom_tracks": false, +"slice_109/save_to_file/path": "", +"slice_109/start_frame": 0, +"slice_11/end_frame": 0, +"slice_11/loop_mode": 0, +"slice_11/name": "", +"slice_11/save_to_file/enabled": false, +"slice_11/save_to_file/keep_custom_tracks": false, +"slice_11/save_to_file/path": "", +"slice_11/start_frame": 0, +"slice_110/end_frame": 0, +"slice_110/loop_mode": 0, +"slice_110/name": "", +"slice_110/save_to_file/enabled": false, +"slice_110/save_to_file/keep_custom_tracks": false, +"slice_110/save_to_file/path": "", +"slice_110/start_frame": 0, +"slice_111/end_frame": 0, +"slice_111/loop_mode": 0, +"slice_111/name": "", +"slice_111/save_to_file/enabled": false, +"slice_111/save_to_file/keep_custom_tracks": false, +"slice_111/save_to_file/path": "", +"slice_111/start_frame": 0, +"slice_112/end_frame": 0, +"slice_112/loop_mode": 0, +"slice_112/name": "", +"slice_112/save_to_file/enabled": false, +"slice_112/save_to_file/keep_custom_tracks": false, +"slice_112/save_to_file/path": "", +"slice_112/start_frame": 0, +"slice_113/end_frame": 0, +"slice_113/loop_mode": 0, +"slice_113/name": "", +"slice_113/save_to_file/enabled": false, +"slice_113/save_to_file/keep_custom_tracks": false, +"slice_113/save_to_file/path": "", +"slice_113/start_frame": 0, +"slice_114/end_frame": 0, +"slice_114/loop_mode": 0, +"slice_114/name": "", +"slice_114/save_to_file/enabled": false, +"slice_114/save_to_file/keep_custom_tracks": false, +"slice_114/save_to_file/path": "", +"slice_114/start_frame": 0, +"slice_115/end_frame": 0, +"slice_115/loop_mode": 0, +"slice_115/name": "", +"slice_115/save_to_file/enabled": false, +"slice_115/save_to_file/keep_custom_tracks": false, +"slice_115/save_to_file/path": "", +"slice_115/start_frame": 0, +"slice_116/end_frame": 0, +"slice_116/loop_mode": 0, +"slice_116/name": "", +"slice_116/save_to_file/enabled": false, +"slice_116/save_to_file/keep_custom_tracks": false, +"slice_116/save_to_file/path": "", +"slice_116/start_frame": 0, +"slice_117/end_frame": 0, +"slice_117/loop_mode": 0, +"slice_117/name": "", +"slice_117/save_to_file/enabled": false, +"slice_117/save_to_file/keep_custom_tracks": false, +"slice_117/save_to_file/path": "", +"slice_117/start_frame": 0, +"slice_118/end_frame": 0, +"slice_118/loop_mode": 0, +"slice_118/name": "", +"slice_118/save_to_file/enabled": false, +"slice_118/save_to_file/keep_custom_tracks": false, +"slice_118/save_to_file/path": "", +"slice_118/start_frame": 0, +"slice_119/end_frame": 0, +"slice_119/loop_mode": 0, +"slice_119/name": "", +"slice_119/save_to_file/enabled": false, +"slice_119/save_to_file/keep_custom_tracks": false, +"slice_119/save_to_file/path": "", +"slice_119/start_frame": 0, +"slice_12/end_frame": 0, +"slice_12/loop_mode": 0, +"slice_12/name": "", +"slice_12/save_to_file/enabled": false, +"slice_12/save_to_file/keep_custom_tracks": false, +"slice_12/save_to_file/path": "", +"slice_12/start_frame": 0, +"slice_120/end_frame": 0, +"slice_120/loop_mode": 0, +"slice_120/name": "", +"slice_120/save_to_file/enabled": false, +"slice_120/save_to_file/keep_custom_tracks": false, +"slice_120/save_to_file/path": "", +"slice_120/start_frame": 0, +"slice_121/end_frame": 0, +"slice_121/loop_mode": 0, +"slice_121/name": "", +"slice_121/save_to_file/enabled": false, +"slice_121/save_to_file/keep_custom_tracks": false, +"slice_121/save_to_file/path": "", +"slice_121/start_frame": 0, +"slice_122/end_frame": 0, +"slice_122/loop_mode": 0, +"slice_122/name": "", +"slice_122/save_to_file/enabled": false, +"slice_122/save_to_file/keep_custom_tracks": false, +"slice_122/save_to_file/path": "", +"slice_122/start_frame": 0, +"slice_123/end_frame": 0, +"slice_123/loop_mode": 0, +"slice_123/name": "", +"slice_123/save_to_file/enabled": false, +"slice_123/save_to_file/keep_custom_tracks": false, +"slice_123/save_to_file/path": "", +"slice_123/start_frame": 0, +"slice_124/end_frame": 0, +"slice_124/loop_mode": 0, +"slice_124/name": "", +"slice_124/save_to_file/enabled": false, +"slice_124/save_to_file/keep_custom_tracks": false, +"slice_124/save_to_file/path": "", +"slice_124/start_frame": 0, +"slice_125/end_frame": 0, +"slice_125/loop_mode": 0, +"slice_125/name": "", +"slice_125/save_to_file/enabled": false, +"slice_125/save_to_file/keep_custom_tracks": false, +"slice_125/save_to_file/path": "", +"slice_125/start_frame": 0, +"slice_126/end_frame": 0, +"slice_126/loop_mode": 0, +"slice_126/name": "", +"slice_126/save_to_file/enabled": false, +"slice_126/save_to_file/keep_custom_tracks": false, +"slice_126/save_to_file/path": "", +"slice_126/start_frame": 0, +"slice_127/end_frame": 0, +"slice_127/loop_mode": 0, +"slice_127/name": "", +"slice_127/save_to_file/enabled": false, +"slice_127/save_to_file/keep_custom_tracks": false, +"slice_127/save_to_file/path": "", +"slice_127/start_frame": 0, +"slice_128/end_frame": 0, +"slice_128/loop_mode": 0, +"slice_128/name": "", +"slice_128/save_to_file/enabled": false, +"slice_128/save_to_file/keep_custom_tracks": false, +"slice_128/save_to_file/path": "", +"slice_128/start_frame": 0, +"slice_129/end_frame": 0, +"slice_129/loop_mode": 0, +"slice_129/name": "", +"slice_129/save_to_file/enabled": false, +"slice_129/save_to_file/keep_custom_tracks": false, +"slice_129/save_to_file/path": "", +"slice_129/start_frame": 0, +"slice_13/end_frame": 0, +"slice_13/loop_mode": 0, +"slice_13/name": "", +"slice_13/save_to_file/enabled": false, +"slice_13/save_to_file/keep_custom_tracks": false, +"slice_13/save_to_file/path": "", +"slice_13/start_frame": 0, +"slice_130/end_frame": 0, +"slice_130/loop_mode": 0, +"slice_130/name": "", +"slice_130/save_to_file/enabled": false, +"slice_130/save_to_file/keep_custom_tracks": false, +"slice_130/save_to_file/path": "", +"slice_130/start_frame": 0, +"slice_131/end_frame": 0, +"slice_131/loop_mode": 0, +"slice_131/name": "", +"slice_131/save_to_file/enabled": false, +"slice_131/save_to_file/keep_custom_tracks": false, +"slice_131/save_to_file/path": "", +"slice_131/start_frame": 0, +"slice_132/end_frame": 0, +"slice_132/loop_mode": 0, +"slice_132/name": "", +"slice_132/save_to_file/enabled": false, +"slice_132/save_to_file/keep_custom_tracks": false, +"slice_132/save_to_file/path": "", +"slice_132/start_frame": 0, +"slice_133/end_frame": 0, +"slice_133/loop_mode": 0, +"slice_133/name": "", +"slice_133/save_to_file/enabled": false, +"slice_133/save_to_file/keep_custom_tracks": false, +"slice_133/save_to_file/path": "", +"slice_133/start_frame": 0, +"slice_134/end_frame": 0, +"slice_134/loop_mode": 0, +"slice_134/name": "", +"slice_134/save_to_file/enabled": false, +"slice_134/save_to_file/keep_custom_tracks": false, +"slice_134/save_to_file/path": "", +"slice_134/start_frame": 0, +"slice_135/end_frame": 0, +"slice_135/loop_mode": 0, +"slice_135/name": "", +"slice_135/save_to_file/enabled": false, +"slice_135/save_to_file/keep_custom_tracks": false, +"slice_135/save_to_file/path": "", +"slice_135/start_frame": 0, +"slice_136/end_frame": 0, +"slice_136/loop_mode": 0, +"slice_136/name": "", +"slice_136/save_to_file/enabled": false, +"slice_136/save_to_file/keep_custom_tracks": false, +"slice_136/save_to_file/path": "", +"slice_136/start_frame": 0, +"slice_137/end_frame": 0, +"slice_137/loop_mode": 0, +"slice_137/name": "", +"slice_137/save_to_file/enabled": false, +"slice_137/save_to_file/keep_custom_tracks": false, +"slice_137/save_to_file/path": "", +"slice_137/start_frame": 0, +"slice_138/end_frame": 0, +"slice_138/loop_mode": 0, +"slice_138/name": "", +"slice_138/save_to_file/enabled": false, +"slice_138/save_to_file/keep_custom_tracks": false, +"slice_138/save_to_file/path": "", +"slice_138/start_frame": 0, +"slice_139/end_frame": 0, +"slice_139/loop_mode": 0, +"slice_139/name": "", +"slice_139/save_to_file/enabled": false, +"slice_139/save_to_file/keep_custom_tracks": false, +"slice_139/save_to_file/path": "", +"slice_139/start_frame": 0, +"slice_14/end_frame": 0, +"slice_14/loop_mode": 0, +"slice_14/name": "", +"slice_14/save_to_file/enabled": false, +"slice_14/save_to_file/keep_custom_tracks": false, +"slice_14/save_to_file/path": "", +"slice_14/start_frame": 0, +"slice_140/end_frame": 0, +"slice_140/loop_mode": 0, +"slice_140/name": "", +"slice_140/save_to_file/enabled": false, +"slice_140/save_to_file/keep_custom_tracks": false, +"slice_140/save_to_file/path": "", +"slice_140/start_frame": 0, +"slice_141/end_frame": 0, +"slice_141/loop_mode": 0, +"slice_141/name": "", +"slice_141/save_to_file/enabled": false, +"slice_141/save_to_file/keep_custom_tracks": false, +"slice_141/save_to_file/path": "", +"slice_141/start_frame": 0, +"slice_142/end_frame": 0, +"slice_142/loop_mode": 0, +"slice_142/name": "", +"slice_142/save_to_file/enabled": false, +"slice_142/save_to_file/keep_custom_tracks": false, +"slice_142/save_to_file/path": "", +"slice_142/start_frame": 0, +"slice_143/end_frame": 0, +"slice_143/loop_mode": 0, +"slice_143/name": "", +"slice_143/save_to_file/enabled": false, +"slice_143/save_to_file/keep_custom_tracks": false, +"slice_143/save_to_file/path": "", +"slice_143/start_frame": 0, +"slice_144/end_frame": 0, +"slice_144/loop_mode": 0, +"slice_144/name": "", +"slice_144/save_to_file/enabled": false, +"slice_144/save_to_file/keep_custom_tracks": false, +"slice_144/save_to_file/path": "", +"slice_144/start_frame": 0, +"slice_145/end_frame": 0, +"slice_145/loop_mode": 0, +"slice_145/name": "", +"slice_145/save_to_file/enabled": false, +"slice_145/save_to_file/keep_custom_tracks": false, +"slice_145/save_to_file/path": "", +"slice_145/start_frame": 0, +"slice_146/end_frame": 0, +"slice_146/loop_mode": 0, +"slice_146/name": "", +"slice_146/save_to_file/enabled": false, +"slice_146/save_to_file/keep_custom_tracks": false, +"slice_146/save_to_file/path": "", +"slice_146/start_frame": 0, +"slice_147/end_frame": 0, +"slice_147/loop_mode": 0, +"slice_147/name": "", +"slice_147/save_to_file/enabled": false, +"slice_147/save_to_file/keep_custom_tracks": false, +"slice_147/save_to_file/path": "", +"slice_147/start_frame": 0, +"slice_148/end_frame": 0, +"slice_148/loop_mode": 0, +"slice_148/name": "", +"slice_148/save_to_file/enabled": false, +"slice_148/save_to_file/keep_custom_tracks": false, +"slice_148/save_to_file/path": "", +"slice_148/start_frame": 0, +"slice_149/end_frame": 0, +"slice_149/loop_mode": 0, +"slice_149/name": "", +"slice_149/save_to_file/enabled": false, +"slice_149/save_to_file/keep_custom_tracks": false, +"slice_149/save_to_file/path": "", +"slice_149/start_frame": 0, +"slice_15/end_frame": 0, +"slice_15/loop_mode": 0, +"slice_15/name": "", +"slice_15/save_to_file/enabled": false, +"slice_15/save_to_file/keep_custom_tracks": false, +"slice_15/save_to_file/path": "", +"slice_15/start_frame": 0, +"slice_150/end_frame": 0, +"slice_150/loop_mode": 0, +"slice_150/name": "", +"slice_150/save_to_file/enabled": false, +"slice_150/save_to_file/keep_custom_tracks": false, +"slice_150/save_to_file/path": "", +"slice_150/start_frame": 0, +"slice_151/end_frame": 0, +"slice_151/loop_mode": 0, +"slice_151/name": "", +"slice_151/save_to_file/enabled": false, +"slice_151/save_to_file/keep_custom_tracks": false, +"slice_151/save_to_file/path": "", +"slice_151/start_frame": 0, +"slice_152/end_frame": 0, +"slice_152/loop_mode": 0, +"slice_152/name": "", +"slice_152/save_to_file/enabled": false, +"slice_152/save_to_file/keep_custom_tracks": false, +"slice_152/save_to_file/path": "", +"slice_152/start_frame": 0, +"slice_153/end_frame": 0, +"slice_153/loop_mode": 0, +"slice_153/name": "", +"slice_153/save_to_file/enabled": false, +"slice_153/save_to_file/keep_custom_tracks": false, +"slice_153/save_to_file/path": "", +"slice_153/start_frame": 0, +"slice_154/end_frame": 0, +"slice_154/loop_mode": 0, +"slice_154/name": "", +"slice_154/save_to_file/enabled": false, +"slice_154/save_to_file/keep_custom_tracks": false, +"slice_154/save_to_file/path": "", +"slice_154/start_frame": 0, +"slice_155/end_frame": 0, +"slice_155/loop_mode": 0, +"slice_155/name": "", +"slice_155/save_to_file/enabled": false, +"slice_155/save_to_file/keep_custom_tracks": false, +"slice_155/save_to_file/path": "", +"slice_155/start_frame": 0, +"slice_156/end_frame": 0, +"slice_156/loop_mode": 0, +"slice_156/name": "", +"slice_156/save_to_file/enabled": false, +"slice_156/save_to_file/keep_custom_tracks": false, +"slice_156/save_to_file/path": "", +"slice_156/start_frame": 0, +"slice_157/end_frame": 0, +"slice_157/loop_mode": 0, +"slice_157/name": "", +"slice_157/save_to_file/enabled": false, +"slice_157/save_to_file/keep_custom_tracks": false, +"slice_157/save_to_file/path": "", +"slice_157/start_frame": 0, +"slice_158/end_frame": 0, +"slice_158/loop_mode": 0, +"slice_158/name": "", +"slice_158/save_to_file/enabled": false, +"slice_158/save_to_file/keep_custom_tracks": false, +"slice_158/save_to_file/path": "", +"slice_158/start_frame": 0, +"slice_159/end_frame": 0, +"slice_159/loop_mode": 0, +"slice_159/name": "", +"slice_159/save_to_file/enabled": false, +"slice_159/save_to_file/keep_custom_tracks": false, +"slice_159/save_to_file/path": "", +"slice_159/start_frame": 0, +"slice_16/end_frame": 0, +"slice_16/loop_mode": 0, +"slice_16/name": "", +"slice_16/save_to_file/enabled": false, +"slice_16/save_to_file/keep_custom_tracks": false, +"slice_16/save_to_file/path": "", +"slice_16/start_frame": 0, +"slice_160/end_frame": 0, +"slice_160/loop_mode": 0, +"slice_160/name": "", +"slice_160/save_to_file/enabled": false, +"slice_160/save_to_file/keep_custom_tracks": false, +"slice_160/save_to_file/path": "", +"slice_160/start_frame": 0, +"slice_161/end_frame": 0, +"slice_161/loop_mode": 0, +"slice_161/name": "", +"slice_161/save_to_file/enabled": false, +"slice_161/save_to_file/keep_custom_tracks": false, +"slice_161/save_to_file/path": "", +"slice_161/start_frame": 0, +"slice_162/end_frame": 0, +"slice_162/loop_mode": 0, +"slice_162/name": "", +"slice_162/save_to_file/enabled": false, +"slice_162/save_to_file/keep_custom_tracks": false, +"slice_162/save_to_file/path": "", +"slice_162/start_frame": 0, +"slice_163/end_frame": 0, +"slice_163/loop_mode": 0, +"slice_163/name": "", +"slice_163/save_to_file/enabled": false, +"slice_163/save_to_file/keep_custom_tracks": false, +"slice_163/save_to_file/path": "", +"slice_163/start_frame": 0, +"slice_164/end_frame": 0, +"slice_164/loop_mode": 0, +"slice_164/name": "", +"slice_164/save_to_file/enabled": false, +"slice_164/save_to_file/keep_custom_tracks": false, +"slice_164/save_to_file/path": "", +"slice_164/start_frame": 0, +"slice_165/end_frame": 0, +"slice_165/loop_mode": 0, +"slice_165/name": "", +"slice_165/save_to_file/enabled": false, +"slice_165/save_to_file/keep_custom_tracks": false, +"slice_165/save_to_file/path": "", +"slice_165/start_frame": 0, +"slice_166/end_frame": 0, +"slice_166/loop_mode": 0, +"slice_166/name": "", +"slice_166/save_to_file/enabled": false, +"slice_166/save_to_file/keep_custom_tracks": false, +"slice_166/save_to_file/path": "", +"slice_166/start_frame": 0, +"slice_167/end_frame": 0, +"slice_167/loop_mode": 0, +"slice_167/name": "", +"slice_167/save_to_file/enabled": false, +"slice_167/save_to_file/keep_custom_tracks": false, +"slice_167/save_to_file/path": "", +"slice_167/start_frame": 0, +"slice_168/end_frame": 0, +"slice_168/loop_mode": 0, +"slice_168/name": "", +"slice_168/save_to_file/enabled": false, +"slice_168/save_to_file/keep_custom_tracks": false, +"slice_168/save_to_file/path": "", +"slice_168/start_frame": 0, +"slice_169/end_frame": 0, +"slice_169/loop_mode": 0, +"slice_169/name": "", +"slice_169/save_to_file/enabled": false, +"slice_169/save_to_file/keep_custom_tracks": false, +"slice_169/save_to_file/path": "", +"slice_169/start_frame": 0, +"slice_17/end_frame": 0, +"slice_17/loop_mode": 0, +"slice_17/name": "", +"slice_17/save_to_file/enabled": false, +"slice_17/save_to_file/keep_custom_tracks": false, +"slice_17/save_to_file/path": "", +"slice_17/start_frame": 0, +"slice_170/end_frame": 0, +"slice_170/loop_mode": 0, +"slice_170/name": "", +"slice_170/save_to_file/enabled": false, +"slice_170/save_to_file/keep_custom_tracks": false, +"slice_170/save_to_file/path": "", +"slice_170/start_frame": 0, +"slice_171/end_frame": 0, +"slice_171/loop_mode": 0, +"slice_171/name": "", +"slice_171/save_to_file/enabled": false, +"slice_171/save_to_file/keep_custom_tracks": false, +"slice_171/save_to_file/path": "", +"slice_171/start_frame": 0, +"slice_172/end_frame": 0, +"slice_172/loop_mode": 0, +"slice_172/name": "", +"slice_172/save_to_file/enabled": false, +"slice_172/save_to_file/keep_custom_tracks": false, +"slice_172/save_to_file/path": "", +"slice_172/start_frame": 0, +"slice_173/end_frame": 0, +"slice_173/loop_mode": 0, +"slice_173/name": "", +"slice_173/save_to_file/enabled": false, +"slice_173/save_to_file/keep_custom_tracks": false, +"slice_173/save_to_file/path": "", +"slice_173/start_frame": 0, +"slice_174/end_frame": 0, +"slice_174/loop_mode": 0, +"slice_174/name": "", +"slice_174/save_to_file/enabled": false, +"slice_174/save_to_file/keep_custom_tracks": false, +"slice_174/save_to_file/path": "", +"slice_174/start_frame": 0, +"slice_175/end_frame": 0, +"slice_175/loop_mode": 0, +"slice_175/name": "", +"slice_175/save_to_file/enabled": false, +"slice_175/save_to_file/keep_custom_tracks": false, +"slice_175/save_to_file/path": "", +"slice_175/start_frame": 0, +"slice_176/end_frame": 0, +"slice_176/loop_mode": 0, +"slice_176/name": "", +"slice_176/save_to_file/enabled": false, +"slice_176/save_to_file/keep_custom_tracks": false, +"slice_176/save_to_file/path": "", +"slice_176/start_frame": 0, +"slice_177/end_frame": 0, +"slice_177/loop_mode": 0, +"slice_177/name": "", +"slice_177/save_to_file/enabled": false, +"slice_177/save_to_file/keep_custom_tracks": false, +"slice_177/save_to_file/path": "", +"slice_177/start_frame": 0, +"slice_178/end_frame": 0, +"slice_178/loop_mode": 0, +"slice_178/name": "", +"slice_178/save_to_file/enabled": false, +"slice_178/save_to_file/keep_custom_tracks": false, +"slice_178/save_to_file/path": "", +"slice_178/start_frame": 0, +"slice_179/end_frame": 0, +"slice_179/loop_mode": 0, +"slice_179/name": "", +"slice_179/save_to_file/enabled": false, +"slice_179/save_to_file/keep_custom_tracks": false, +"slice_179/save_to_file/path": "", +"slice_179/start_frame": 0, +"slice_18/end_frame": 0, +"slice_18/loop_mode": 0, +"slice_18/name": "", +"slice_18/save_to_file/enabled": false, +"slice_18/save_to_file/keep_custom_tracks": false, +"slice_18/save_to_file/path": "", +"slice_18/start_frame": 0, +"slice_180/end_frame": 0, +"slice_180/loop_mode": 0, +"slice_180/name": "", +"slice_180/save_to_file/enabled": false, +"slice_180/save_to_file/keep_custom_tracks": false, +"slice_180/save_to_file/path": "", +"slice_180/start_frame": 0, +"slice_181/end_frame": 0, +"slice_181/loop_mode": 0, +"slice_181/name": "", +"slice_181/save_to_file/enabled": false, +"slice_181/save_to_file/keep_custom_tracks": false, +"slice_181/save_to_file/path": "", +"slice_181/start_frame": 0, +"slice_182/end_frame": 0, +"slice_182/loop_mode": 0, +"slice_182/name": "", +"slice_182/save_to_file/enabled": false, +"slice_182/save_to_file/keep_custom_tracks": false, +"slice_182/save_to_file/path": "", +"slice_182/start_frame": 0, +"slice_183/end_frame": 0, +"slice_183/loop_mode": 0, +"slice_183/name": "", +"slice_183/save_to_file/enabled": false, +"slice_183/save_to_file/keep_custom_tracks": false, +"slice_183/save_to_file/path": "", +"slice_183/start_frame": 0, +"slice_184/end_frame": 0, +"slice_184/loop_mode": 0, +"slice_184/name": "", +"slice_184/save_to_file/enabled": false, +"slice_184/save_to_file/keep_custom_tracks": false, +"slice_184/save_to_file/path": "", +"slice_184/start_frame": 0, +"slice_185/end_frame": 0, +"slice_185/loop_mode": 0, +"slice_185/name": "", +"slice_185/save_to_file/enabled": false, +"slice_185/save_to_file/keep_custom_tracks": false, +"slice_185/save_to_file/path": "", +"slice_185/start_frame": 0, +"slice_186/end_frame": 0, +"slice_186/loop_mode": 0, +"slice_186/name": "", +"slice_186/save_to_file/enabled": false, +"slice_186/save_to_file/keep_custom_tracks": false, +"slice_186/save_to_file/path": "", +"slice_186/start_frame": 0, +"slice_187/end_frame": 0, +"slice_187/loop_mode": 0, +"slice_187/name": "", +"slice_187/save_to_file/enabled": false, +"slice_187/save_to_file/keep_custom_tracks": false, +"slice_187/save_to_file/path": "", +"slice_187/start_frame": 0, +"slice_188/end_frame": 0, +"slice_188/loop_mode": 0, +"slice_188/name": "", +"slice_188/save_to_file/enabled": false, +"slice_188/save_to_file/keep_custom_tracks": false, +"slice_188/save_to_file/path": "", +"slice_188/start_frame": 0, +"slice_189/end_frame": 0, +"slice_189/loop_mode": 0, +"slice_189/name": "", +"slice_189/save_to_file/enabled": false, +"slice_189/save_to_file/keep_custom_tracks": false, +"slice_189/save_to_file/path": "", +"slice_189/start_frame": 0, +"slice_19/end_frame": 0, +"slice_19/loop_mode": 0, +"slice_19/name": "", +"slice_19/save_to_file/enabled": false, +"slice_19/save_to_file/keep_custom_tracks": false, +"slice_19/save_to_file/path": "", +"slice_19/start_frame": 0, +"slice_190/end_frame": 0, +"slice_190/loop_mode": 0, +"slice_190/name": "", +"slice_190/save_to_file/enabled": false, +"slice_190/save_to_file/keep_custom_tracks": false, +"slice_190/save_to_file/path": "", +"slice_190/start_frame": 0, +"slice_191/end_frame": 0, +"slice_191/loop_mode": 0, +"slice_191/name": "", +"slice_191/save_to_file/enabled": false, +"slice_191/save_to_file/keep_custom_tracks": false, +"slice_191/save_to_file/path": "", +"slice_191/start_frame": 0, +"slice_192/end_frame": 0, +"slice_192/loop_mode": 0, +"slice_192/name": "", +"slice_192/save_to_file/enabled": false, +"slice_192/save_to_file/keep_custom_tracks": false, +"slice_192/save_to_file/path": "", +"slice_192/start_frame": 0, +"slice_193/end_frame": 0, +"slice_193/loop_mode": 0, +"slice_193/name": "", +"slice_193/save_to_file/enabled": false, +"slice_193/save_to_file/keep_custom_tracks": false, +"slice_193/save_to_file/path": "", +"slice_193/start_frame": 0, +"slice_194/end_frame": 0, +"slice_194/loop_mode": 0, +"slice_194/name": "", +"slice_194/save_to_file/enabled": false, +"slice_194/save_to_file/keep_custom_tracks": false, +"slice_194/save_to_file/path": "", +"slice_194/start_frame": 0, +"slice_195/end_frame": 0, +"slice_195/loop_mode": 0, +"slice_195/name": "", +"slice_195/save_to_file/enabled": false, +"slice_195/save_to_file/keep_custom_tracks": false, +"slice_195/save_to_file/path": "", +"slice_195/start_frame": 0, +"slice_196/end_frame": 0, +"slice_196/loop_mode": 0, +"slice_196/name": "", +"slice_196/save_to_file/enabled": false, +"slice_196/save_to_file/keep_custom_tracks": false, +"slice_196/save_to_file/path": "", +"slice_196/start_frame": 0, +"slice_197/end_frame": 0, +"slice_197/loop_mode": 0, +"slice_197/name": "", +"slice_197/save_to_file/enabled": false, +"slice_197/save_to_file/keep_custom_tracks": false, +"slice_197/save_to_file/path": "", +"slice_197/start_frame": 0, +"slice_198/end_frame": 0, +"slice_198/loop_mode": 0, +"slice_198/name": "", +"slice_198/save_to_file/enabled": false, +"slice_198/save_to_file/keep_custom_tracks": false, +"slice_198/save_to_file/path": "", +"slice_198/start_frame": 0, +"slice_199/end_frame": 0, +"slice_199/loop_mode": 0, +"slice_199/name": "", +"slice_199/save_to_file/enabled": false, +"slice_199/save_to_file/keep_custom_tracks": false, +"slice_199/save_to_file/path": "", +"slice_199/start_frame": 0, +"slice_2/end_frame": 0, +"slice_2/loop_mode": 0, +"slice_2/name": "", +"slice_2/save_to_file/enabled": false, +"slice_2/save_to_file/keep_custom_tracks": false, +"slice_2/save_to_file/path": "", +"slice_2/start_frame": 0, +"slice_20/end_frame": 0, +"slice_20/loop_mode": 0, +"slice_20/name": "", +"slice_20/save_to_file/enabled": false, +"slice_20/save_to_file/keep_custom_tracks": false, +"slice_20/save_to_file/path": "", +"slice_20/start_frame": 0, +"slice_200/end_frame": 0, +"slice_200/loop_mode": 0, +"slice_200/name": "", +"slice_200/save_to_file/enabled": false, +"slice_200/save_to_file/keep_custom_tracks": false, +"slice_200/save_to_file/path": "", +"slice_200/start_frame": 0, +"slice_201/end_frame": 0, +"slice_201/loop_mode": 0, +"slice_201/name": "", +"slice_201/save_to_file/enabled": false, +"slice_201/save_to_file/keep_custom_tracks": false, +"slice_201/save_to_file/path": "", +"slice_201/start_frame": 0, +"slice_202/end_frame": 0, +"slice_202/loop_mode": 0, +"slice_202/name": "", +"slice_202/save_to_file/enabled": false, +"slice_202/save_to_file/keep_custom_tracks": false, +"slice_202/save_to_file/path": "", +"slice_202/start_frame": 0, +"slice_203/end_frame": 0, +"slice_203/loop_mode": 0, +"slice_203/name": "", +"slice_203/save_to_file/enabled": false, +"slice_203/save_to_file/keep_custom_tracks": false, +"slice_203/save_to_file/path": "", +"slice_203/start_frame": 0, +"slice_204/end_frame": 0, +"slice_204/loop_mode": 0, +"slice_204/name": "", +"slice_204/save_to_file/enabled": false, +"slice_204/save_to_file/keep_custom_tracks": false, +"slice_204/save_to_file/path": "", +"slice_204/start_frame": 0, +"slice_205/end_frame": 0, +"slice_205/loop_mode": 0, +"slice_205/name": "", +"slice_205/save_to_file/enabled": false, +"slice_205/save_to_file/keep_custom_tracks": false, +"slice_205/save_to_file/path": "", +"slice_205/start_frame": 0, +"slice_206/end_frame": 0, +"slice_206/loop_mode": 0, +"slice_206/name": "", +"slice_206/save_to_file/enabled": false, +"slice_206/save_to_file/keep_custom_tracks": false, +"slice_206/save_to_file/path": "", +"slice_206/start_frame": 0, +"slice_207/end_frame": 0, +"slice_207/loop_mode": 0, +"slice_207/name": "", +"slice_207/save_to_file/enabled": false, +"slice_207/save_to_file/keep_custom_tracks": false, +"slice_207/save_to_file/path": "", +"slice_207/start_frame": 0, +"slice_208/end_frame": 0, +"slice_208/loop_mode": 0, +"slice_208/name": "", +"slice_208/save_to_file/enabled": false, +"slice_208/save_to_file/keep_custom_tracks": false, +"slice_208/save_to_file/path": "", +"slice_208/start_frame": 0, +"slice_209/end_frame": 0, +"slice_209/loop_mode": 0, +"slice_209/name": "", +"slice_209/save_to_file/enabled": false, +"slice_209/save_to_file/keep_custom_tracks": false, +"slice_209/save_to_file/path": "", +"slice_209/start_frame": 0, +"slice_21/end_frame": 0, +"slice_21/loop_mode": 0, +"slice_21/name": "", +"slice_21/save_to_file/enabled": false, +"slice_21/save_to_file/keep_custom_tracks": false, +"slice_21/save_to_file/path": "", +"slice_21/start_frame": 0, +"slice_210/end_frame": 0, +"slice_210/loop_mode": 0, +"slice_210/name": "", +"slice_210/save_to_file/enabled": false, +"slice_210/save_to_file/keep_custom_tracks": false, +"slice_210/save_to_file/path": "", +"slice_210/start_frame": 0, +"slice_211/end_frame": 0, +"slice_211/loop_mode": 0, +"slice_211/name": "", +"slice_211/save_to_file/enabled": false, +"slice_211/save_to_file/keep_custom_tracks": false, +"slice_211/save_to_file/path": "", +"slice_211/start_frame": 0, +"slice_212/end_frame": 0, +"slice_212/loop_mode": 0, +"slice_212/name": "", +"slice_212/save_to_file/enabled": false, +"slice_212/save_to_file/keep_custom_tracks": false, +"slice_212/save_to_file/path": "", +"slice_212/start_frame": 0, +"slice_213/end_frame": 0, +"slice_213/loop_mode": 0, +"slice_213/name": "", +"slice_213/save_to_file/enabled": false, +"slice_213/save_to_file/keep_custom_tracks": false, +"slice_213/save_to_file/path": "", +"slice_213/start_frame": 0, +"slice_214/end_frame": 0, +"slice_214/loop_mode": 0, +"slice_214/name": "", +"slice_214/save_to_file/enabled": false, +"slice_214/save_to_file/keep_custom_tracks": false, +"slice_214/save_to_file/path": "", +"slice_214/start_frame": 0, +"slice_215/end_frame": 0, +"slice_215/loop_mode": 0, +"slice_215/name": "", +"slice_215/save_to_file/enabled": false, +"slice_215/save_to_file/keep_custom_tracks": false, +"slice_215/save_to_file/path": "", +"slice_215/start_frame": 0, +"slice_216/end_frame": 0, +"slice_216/loop_mode": 0, +"slice_216/name": "", +"slice_216/save_to_file/enabled": false, +"slice_216/save_to_file/keep_custom_tracks": false, +"slice_216/save_to_file/path": "", +"slice_216/start_frame": 0, +"slice_217/end_frame": 0, +"slice_217/loop_mode": 0, +"slice_217/name": "", +"slice_217/save_to_file/enabled": false, +"slice_217/save_to_file/keep_custom_tracks": false, +"slice_217/save_to_file/path": "", +"slice_217/start_frame": 0, +"slice_218/end_frame": 0, +"slice_218/loop_mode": 0, +"slice_218/name": "", +"slice_218/save_to_file/enabled": false, +"slice_218/save_to_file/keep_custom_tracks": false, +"slice_218/save_to_file/path": "", +"slice_218/start_frame": 0, +"slice_219/end_frame": 0, +"slice_219/loop_mode": 0, +"slice_219/name": "", +"slice_219/save_to_file/enabled": false, +"slice_219/save_to_file/keep_custom_tracks": false, +"slice_219/save_to_file/path": "", +"slice_219/start_frame": 0, +"slice_22/end_frame": 0, +"slice_22/loop_mode": 0, +"slice_22/name": "", +"slice_22/save_to_file/enabled": false, +"slice_22/save_to_file/keep_custom_tracks": false, +"slice_22/save_to_file/path": "", +"slice_22/start_frame": 0, +"slice_220/end_frame": 0, +"slice_220/loop_mode": 0, +"slice_220/name": "", +"slice_220/save_to_file/enabled": false, +"slice_220/save_to_file/keep_custom_tracks": false, +"slice_220/save_to_file/path": "", +"slice_220/start_frame": 0, +"slice_221/end_frame": 0, +"slice_221/loop_mode": 0, +"slice_221/name": "", +"slice_221/save_to_file/enabled": false, +"slice_221/save_to_file/keep_custom_tracks": false, +"slice_221/save_to_file/path": "", +"slice_221/start_frame": 0, +"slice_222/end_frame": 0, +"slice_222/loop_mode": 0, +"slice_222/name": "", +"slice_222/save_to_file/enabled": false, +"slice_222/save_to_file/keep_custom_tracks": false, +"slice_222/save_to_file/path": "", +"slice_222/start_frame": 0, +"slice_223/end_frame": 0, +"slice_223/loop_mode": 0, +"slice_223/name": "", +"slice_223/save_to_file/enabled": false, +"slice_223/save_to_file/keep_custom_tracks": false, +"slice_223/save_to_file/path": "", +"slice_223/start_frame": 0, +"slice_224/end_frame": 0, +"slice_224/loop_mode": 0, +"slice_224/name": "", +"slice_224/save_to_file/enabled": false, +"slice_224/save_to_file/keep_custom_tracks": false, +"slice_224/save_to_file/path": "", +"slice_224/start_frame": 0, +"slice_225/end_frame": 0, +"slice_225/loop_mode": 0, +"slice_225/name": "", +"slice_225/save_to_file/enabled": false, +"slice_225/save_to_file/keep_custom_tracks": false, +"slice_225/save_to_file/path": "", +"slice_225/start_frame": 0, +"slice_226/end_frame": 0, +"slice_226/loop_mode": 0, +"slice_226/name": "", +"slice_226/save_to_file/enabled": false, +"slice_226/save_to_file/keep_custom_tracks": false, +"slice_226/save_to_file/path": "", +"slice_226/start_frame": 0, +"slice_227/end_frame": 0, +"slice_227/loop_mode": 0, +"slice_227/name": "", +"slice_227/save_to_file/enabled": false, +"slice_227/save_to_file/keep_custom_tracks": false, +"slice_227/save_to_file/path": "", +"slice_227/start_frame": 0, +"slice_228/end_frame": 0, +"slice_228/loop_mode": 0, +"slice_228/name": "", +"slice_228/save_to_file/enabled": false, +"slice_228/save_to_file/keep_custom_tracks": false, +"slice_228/save_to_file/path": "", +"slice_228/start_frame": 0, +"slice_229/end_frame": 0, +"slice_229/loop_mode": 0, +"slice_229/name": "", +"slice_229/save_to_file/enabled": false, +"slice_229/save_to_file/keep_custom_tracks": false, +"slice_229/save_to_file/path": "", +"slice_229/start_frame": 0, +"slice_23/end_frame": 0, +"slice_23/loop_mode": 0, +"slice_23/name": "", +"slice_23/save_to_file/enabled": false, +"slice_23/save_to_file/keep_custom_tracks": false, +"slice_23/save_to_file/path": "", +"slice_23/start_frame": 0, +"slice_230/end_frame": 0, +"slice_230/loop_mode": 0, +"slice_230/name": "", +"slice_230/save_to_file/enabled": false, +"slice_230/save_to_file/keep_custom_tracks": false, +"slice_230/save_to_file/path": "", +"slice_230/start_frame": 0, +"slice_231/end_frame": 0, +"slice_231/loop_mode": 0, +"slice_231/name": "", +"slice_231/save_to_file/enabled": false, +"slice_231/save_to_file/keep_custom_tracks": false, +"slice_231/save_to_file/path": "", +"slice_231/start_frame": 0, +"slice_232/end_frame": 0, +"slice_232/loop_mode": 0, +"slice_232/name": "", +"slice_232/save_to_file/enabled": false, +"slice_232/save_to_file/keep_custom_tracks": false, +"slice_232/save_to_file/path": "", +"slice_232/start_frame": 0, +"slice_233/end_frame": 0, +"slice_233/loop_mode": 0, +"slice_233/name": "", +"slice_233/save_to_file/enabled": false, +"slice_233/save_to_file/keep_custom_tracks": false, +"slice_233/save_to_file/path": "", +"slice_233/start_frame": 0, +"slice_234/end_frame": 0, +"slice_234/loop_mode": 0, +"slice_234/name": "", +"slice_234/save_to_file/enabled": false, +"slice_234/save_to_file/keep_custom_tracks": false, +"slice_234/save_to_file/path": "", +"slice_234/start_frame": 0, +"slice_235/end_frame": 0, +"slice_235/loop_mode": 0, +"slice_235/name": "", +"slice_235/save_to_file/enabled": false, +"slice_235/save_to_file/keep_custom_tracks": false, +"slice_235/save_to_file/path": "", +"slice_235/start_frame": 0, +"slice_236/end_frame": 0, +"slice_236/loop_mode": 0, +"slice_236/name": "", +"slice_236/save_to_file/enabled": false, +"slice_236/save_to_file/keep_custom_tracks": false, +"slice_236/save_to_file/path": "", +"slice_236/start_frame": 0, +"slice_237/end_frame": 0, +"slice_237/loop_mode": 0, +"slice_237/name": "", +"slice_237/save_to_file/enabled": false, +"slice_237/save_to_file/keep_custom_tracks": false, +"slice_237/save_to_file/path": "", +"slice_237/start_frame": 0, +"slice_238/end_frame": 0, +"slice_238/loop_mode": 0, +"slice_238/name": "", +"slice_238/save_to_file/enabled": false, +"slice_238/save_to_file/keep_custom_tracks": false, +"slice_238/save_to_file/path": "", +"slice_238/start_frame": 0, +"slice_239/end_frame": 0, +"slice_239/loop_mode": 0, +"slice_239/name": "", +"slice_239/save_to_file/enabled": false, +"slice_239/save_to_file/keep_custom_tracks": false, +"slice_239/save_to_file/path": "", +"slice_239/start_frame": 0, +"slice_24/end_frame": 0, +"slice_24/loop_mode": 0, +"slice_24/name": "", +"slice_24/save_to_file/enabled": false, +"slice_24/save_to_file/keep_custom_tracks": false, +"slice_24/save_to_file/path": "", +"slice_24/start_frame": 0, +"slice_240/end_frame": 0, +"slice_240/loop_mode": 0, +"slice_240/name": "", +"slice_240/save_to_file/enabled": false, +"slice_240/save_to_file/keep_custom_tracks": false, +"slice_240/save_to_file/path": "", +"slice_240/start_frame": 0, +"slice_241/end_frame": 0, +"slice_241/loop_mode": 0, +"slice_241/name": "", +"slice_241/save_to_file/enabled": false, +"slice_241/save_to_file/keep_custom_tracks": false, +"slice_241/save_to_file/path": "", +"slice_241/start_frame": 0, +"slice_242/end_frame": 0, +"slice_242/loop_mode": 0, +"slice_242/name": "", +"slice_242/save_to_file/enabled": false, +"slice_242/save_to_file/keep_custom_tracks": false, +"slice_242/save_to_file/path": "", +"slice_242/start_frame": 0, +"slice_243/end_frame": 0, +"slice_243/loop_mode": 0, +"slice_243/name": "", +"slice_243/save_to_file/enabled": false, +"slice_243/save_to_file/keep_custom_tracks": false, +"slice_243/save_to_file/path": "", +"slice_243/start_frame": 0, +"slice_244/end_frame": 0, +"slice_244/loop_mode": 0, +"slice_244/name": "", +"slice_244/save_to_file/enabled": false, +"slice_244/save_to_file/keep_custom_tracks": false, +"slice_244/save_to_file/path": "", +"slice_244/start_frame": 0, +"slice_245/end_frame": 0, +"slice_245/loop_mode": 0, +"slice_245/name": "", +"slice_245/save_to_file/enabled": false, +"slice_245/save_to_file/keep_custom_tracks": false, +"slice_245/save_to_file/path": "", +"slice_245/start_frame": 0, +"slice_246/end_frame": 0, +"slice_246/loop_mode": 0, +"slice_246/name": "", +"slice_246/save_to_file/enabled": false, +"slice_246/save_to_file/keep_custom_tracks": false, +"slice_246/save_to_file/path": "", +"slice_246/start_frame": 0, +"slice_247/end_frame": 0, +"slice_247/loop_mode": 0, +"slice_247/name": "", +"slice_247/save_to_file/enabled": false, +"slice_247/save_to_file/keep_custom_tracks": false, +"slice_247/save_to_file/path": "", +"slice_247/start_frame": 0, +"slice_248/end_frame": 0, +"slice_248/loop_mode": 0, +"slice_248/name": "", +"slice_248/save_to_file/enabled": false, +"slice_248/save_to_file/keep_custom_tracks": false, +"slice_248/save_to_file/path": "", +"slice_248/start_frame": 0, +"slice_249/end_frame": 0, +"slice_249/loop_mode": 0, +"slice_249/name": "", +"slice_249/save_to_file/enabled": false, +"slice_249/save_to_file/keep_custom_tracks": false, +"slice_249/save_to_file/path": "", +"slice_249/start_frame": 0, +"slice_25/end_frame": 0, +"slice_25/loop_mode": 0, +"slice_25/name": "", +"slice_25/save_to_file/enabled": false, +"slice_25/save_to_file/keep_custom_tracks": false, +"slice_25/save_to_file/path": "", +"slice_25/start_frame": 0, +"slice_250/end_frame": 0, +"slice_250/loop_mode": 0, +"slice_250/name": "", +"slice_250/save_to_file/enabled": false, +"slice_250/save_to_file/keep_custom_tracks": false, +"slice_250/save_to_file/path": "", +"slice_250/start_frame": 0, +"slice_251/end_frame": 0, +"slice_251/loop_mode": 0, +"slice_251/name": "", +"slice_251/save_to_file/enabled": false, +"slice_251/save_to_file/keep_custom_tracks": false, +"slice_251/save_to_file/path": "", +"slice_251/start_frame": 0, +"slice_252/end_frame": 0, +"slice_252/loop_mode": 0, +"slice_252/name": "", +"slice_252/save_to_file/enabled": false, +"slice_252/save_to_file/keep_custom_tracks": false, +"slice_252/save_to_file/path": "", +"slice_252/start_frame": 0, +"slice_253/end_frame": 0, +"slice_253/loop_mode": 0, +"slice_253/name": "", +"slice_253/save_to_file/enabled": false, +"slice_253/save_to_file/keep_custom_tracks": false, +"slice_253/save_to_file/path": "", +"slice_253/start_frame": 0, +"slice_254/end_frame": 0, +"slice_254/loop_mode": 0, +"slice_254/name": "", +"slice_254/save_to_file/enabled": false, +"slice_254/save_to_file/keep_custom_tracks": false, +"slice_254/save_to_file/path": "", +"slice_254/start_frame": 0, +"slice_255/end_frame": 0, +"slice_255/loop_mode": 0, +"slice_255/name": "", +"slice_255/save_to_file/enabled": false, +"slice_255/save_to_file/keep_custom_tracks": false, +"slice_255/save_to_file/path": "", +"slice_255/start_frame": 0, +"slice_256/end_frame": 0, +"slice_256/loop_mode": 0, +"slice_256/name": "", +"slice_256/save_to_file/enabled": false, +"slice_256/save_to_file/keep_custom_tracks": false, +"slice_256/save_to_file/path": "", +"slice_256/start_frame": 0, +"slice_26/end_frame": 0, +"slice_26/loop_mode": 0, +"slice_26/name": "", +"slice_26/save_to_file/enabled": false, +"slice_26/save_to_file/keep_custom_tracks": false, +"slice_26/save_to_file/path": "", +"slice_26/start_frame": 0, +"slice_27/end_frame": 0, +"slice_27/loop_mode": 0, +"slice_27/name": "", +"slice_27/save_to_file/enabled": false, +"slice_27/save_to_file/keep_custom_tracks": false, +"slice_27/save_to_file/path": "", +"slice_27/start_frame": 0, +"slice_28/end_frame": 0, +"slice_28/loop_mode": 0, +"slice_28/name": "", +"slice_28/save_to_file/enabled": false, +"slice_28/save_to_file/keep_custom_tracks": false, +"slice_28/save_to_file/path": "", +"slice_28/start_frame": 0, +"slice_29/end_frame": 0, +"slice_29/loop_mode": 0, +"slice_29/name": "", +"slice_29/save_to_file/enabled": false, +"slice_29/save_to_file/keep_custom_tracks": false, +"slice_29/save_to_file/path": "", +"slice_29/start_frame": 0, +"slice_3/end_frame": 0, +"slice_3/loop_mode": 0, +"slice_3/name": "", +"slice_3/save_to_file/enabled": false, +"slice_3/save_to_file/keep_custom_tracks": false, +"slice_3/save_to_file/path": "", +"slice_3/start_frame": 0, +"slice_30/end_frame": 0, +"slice_30/loop_mode": 0, +"slice_30/name": "", +"slice_30/save_to_file/enabled": false, +"slice_30/save_to_file/keep_custom_tracks": false, +"slice_30/save_to_file/path": "", +"slice_30/start_frame": 0, +"slice_31/end_frame": 0, +"slice_31/loop_mode": 0, +"slice_31/name": "", +"slice_31/save_to_file/enabled": false, +"slice_31/save_to_file/keep_custom_tracks": false, +"slice_31/save_to_file/path": "", +"slice_31/start_frame": 0, +"slice_32/end_frame": 0, +"slice_32/loop_mode": 0, +"slice_32/name": "", +"slice_32/save_to_file/enabled": false, +"slice_32/save_to_file/keep_custom_tracks": false, +"slice_32/save_to_file/path": "", +"slice_32/start_frame": 0, +"slice_33/end_frame": 0, +"slice_33/loop_mode": 0, +"slice_33/name": "", +"slice_33/save_to_file/enabled": false, +"slice_33/save_to_file/keep_custom_tracks": false, +"slice_33/save_to_file/path": "", +"slice_33/start_frame": 0, +"slice_34/end_frame": 0, +"slice_34/loop_mode": 0, +"slice_34/name": "", +"slice_34/save_to_file/enabled": false, +"slice_34/save_to_file/keep_custom_tracks": false, +"slice_34/save_to_file/path": "", +"slice_34/start_frame": 0, +"slice_35/end_frame": 0, +"slice_35/loop_mode": 0, +"slice_35/name": "", +"slice_35/save_to_file/enabled": false, +"slice_35/save_to_file/keep_custom_tracks": false, +"slice_35/save_to_file/path": "", +"slice_35/start_frame": 0, +"slice_36/end_frame": 0, +"slice_36/loop_mode": 0, +"slice_36/name": "", +"slice_36/save_to_file/enabled": false, +"slice_36/save_to_file/keep_custom_tracks": false, +"slice_36/save_to_file/path": "", +"slice_36/start_frame": 0, +"slice_37/end_frame": 0, +"slice_37/loop_mode": 0, +"slice_37/name": "", +"slice_37/save_to_file/enabled": false, +"slice_37/save_to_file/keep_custom_tracks": false, +"slice_37/save_to_file/path": "", +"slice_37/start_frame": 0, +"slice_38/end_frame": 0, +"slice_38/loop_mode": 0, +"slice_38/name": "", +"slice_38/save_to_file/enabled": false, +"slice_38/save_to_file/keep_custom_tracks": false, +"slice_38/save_to_file/path": "", +"slice_38/start_frame": 0, +"slice_39/end_frame": 0, +"slice_39/loop_mode": 0, +"slice_39/name": "", +"slice_39/save_to_file/enabled": false, +"slice_39/save_to_file/keep_custom_tracks": false, +"slice_39/save_to_file/path": "", +"slice_39/start_frame": 0, +"slice_4/end_frame": 0, +"slice_4/loop_mode": 0, +"slice_4/name": "", +"slice_4/save_to_file/enabled": false, +"slice_4/save_to_file/keep_custom_tracks": false, +"slice_4/save_to_file/path": "", +"slice_4/start_frame": 0, +"slice_40/end_frame": 0, +"slice_40/loop_mode": 0, +"slice_40/name": "", +"slice_40/save_to_file/enabled": false, +"slice_40/save_to_file/keep_custom_tracks": false, +"slice_40/save_to_file/path": "", +"slice_40/start_frame": 0, +"slice_41/end_frame": 0, +"slice_41/loop_mode": 0, +"slice_41/name": "", +"slice_41/save_to_file/enabled": false, +"slice_41/save_to_file/keep_custom_tracks": false, +"slice_41/save_to_file/path": "", +"slice_41/start_frame": 0, +"slice_42/end_frame": 0, +"slice_42/loop_mode": 0, +"slice_42/name": "", +"slice_42/save_to_file/enabled": false, +"slice_42/save_to_file/keep_custom_tracks": false, +"slice_42/save_to_file/path": "", +"slice_42/start_frame": 0, +"slice_43/end_frame": 0, +"slice_43/loop_mode": 0, +"slice_43/name": "", +"slice_43/save_to_file/enabled": false, +"slice_43/save_to_file/keep_custom_tracks": false, +"slice_43/save_to_file/path": "", +"slice_43/start_frame": 0, +"slice_44/end_frame": 0, +"slice_44/loop_mode": 0, +"slice_44/name": "", +"slice_44/save_to_file/enabled": false, +"slice_44/save_to_file/keep_custom_tracks": false, +"slice_44/save_to_file/path": "", +"slice_44/start_frame": 0, +"slice_45/end_frame": 0, +"slice_45/loop_mode": 0, +"slice_45/name": "", +"slice_45/save_to_file/enabled": false, +"slice_45/save_to_file/keep_custom_tracks": false, +"slice_45/save_to_file/path": "", +"slice_45/start_frame": 0, +"slice_46/end_frame": 0, +"slice_46/loop_mode": 0, +"slice_46/name": "", +"slice_46/save_to_file/enabled": false, +"slice_46/save_to_file/keep_custom_tracks": false, +"slice_46/save_to_file/path": "", +"slice_46/start_frame": 0, +"slice_47/end_frame": 0, +"slice_47/loop_mode": 0, +"slice_47/name": "", +"slice_47/save_to_file/enabled": false, +"slice_47/save_to_file/keep_custom_tracks": false, +"slice_47/save_to_file/path": "", +"slice_47/start_frame": 0, +"slice_48/end_frame": 0, +"slice_48/loop_mode": 0, +"slice_48/name": "", +"slice_48/save_to_file/enabled": false, +"slice_48/save_to_file/keep_custom_tracks": false, +"slice_48/save_to_file/path": "", +"slice_48/start_frame": 0, +"slice_49/end_frame": 0, +"slice_49/loop_mode": 0, +"slice_49/name": "", +"slice_49/save_to_file/enabled": false, +"slice_49/save_to_file/keep_custom_tracks": false, +"slice_49/save_to_file/path": "", +"slice_49/start_frame": 0, +"slice_5/end_frame": 0, +"slice_5/loop_mode": 0, +"slice_5/name": "", +"slice_5/save_to_file/enabled": false, +"slice_5/save_to_file/keep_custom_tracks": false, +"slice_5/save_to_file/path": "", +"slice_5/start_frame": 0, +"slice_50/end_frame": 0, +"slice_50/loop_mode": 0, +"slice_50/name": "", +"slice_50/save_to_file/enabled": false, +"slice_50/save_to_file/keep_custom_tracks": false, +"slice_50/save_to_file/path": "", +"slice_50/start_frame": 0, +"slice_51/end_frame": 0, +"slice_51/loop_mode": 0, +"slice_51/name": "", +"slice_51/save_to_file/enabled": false, +"slice_51/save_to_file/keep_custom_tracks": false, +"slice_51/save_to_file/path": "", +"slice_51/start_frame": 0, +"slice_52/end_frame": 0, +"slice_52/loop_mode": 0, +"slice_52/name": "", +"slice_52/save_to_file/enabled": false, +"slice_52/save_to_file/keep_custom_tracks": false, +"slice_52/save_to_file/path": "", +"slice_52/start_frame": 0, +"slice_53/end_frame": 0, +"slice_53/loop_mode": 0, +"slice_53/name": "", +"slice_53/save_to_file/enabled": false, +"slice_53/save_to_file/keep_custom_tracks": false, +"slice_53/save_to_file/path": "", +"slice_53/start_frame": 0, +"slice_54/end_frame": 0, +"slice_54/loop_mode": 0, +"slice_54/name": "", +"slice_54/save_to_file/enabled": false, +"slice_54/save_to_file/keep_custom_tracks": false, +"slice_54/save_to_file/path": "", +"slice_54/start_frame": 0, +"slice_55/end_frame": 0, +"slice_55/loop_mode": 0, +"slice_55/name": "", +"slice_55/save_to_file/enabled": false, +"slice_55/save_to_file/keep_custom_tracks": false, +"slice_55/save_to_file/path": "", +"slice_55/start_frame": 0, +"slice_56/end_frame": 0, +"slice_56/loop_mode": 0, +"slice_56/name": "", +"slice_56/save_to_file/enabled": false, +"slice_56/save_to_file/keep_custom_tracks": false, +"slice_56/save_to_file/path": "", +"slice_56/start_frame": 0, +"slice_57/end_frame": 0, +"slice_57/loop_mode": 0, +"slice_57/name": "", +"slice_57/save_to_file/enabled": false, +"slice_57/save_to_file/keep_custom_tracks": false, +"slice_57/save_to_file/path": "", +"slice_57/start_frame": 0, +"slice_58/end_frame": 0, +"slice_58/loop_mode": 0, +"slice_58/name": "", +"slice_58/save_to_file/enabled": false, +"slice_58/save_to_file/keep_custom_tracks": false, +"slice_58/save_to_file/path": "", +"slice_58/start_frame": 0, +"slice_59/end_frame": 0, +"slice_59/loop_mode": 0, +"slice_59/name": "", +"slice_59/save_to_file/enabled": false, +"slice_59/save_to_file/keep_custom_tracks": false, +"slice_59/save_to_file/path": "", +"slice_59/start_frame": 0, +"slice_6/end_frame": 0, +"slice_6/loop_mode": 0, +"slice_6/name": "", +"slice_6/save_to_file/enabled": false, +"slice_6/save_to_file/keep_custom_tracks": false, +"slice_6/save_to_file/path": "", +"slice_6/start_frame": 0, +"slice_60/end_frame": 0, +"slice_60/loop_mode": 0, +"slice_60/name": "", +"slice_60/save_to_file/enabled": false, +"slice_60/save_to_file/keep_custom_tracks": false, +"slice_60/save_to_file/path": "", +"slice_60/start_frame": 0, +"slice_61/end_frame": 0, +"slice_61/loop_mode": 0, +"slice_61/name": "", +"slice_61/save_to_file/enabled": false, +"slice_61/save_to_file/keep_custom_tracks": false, +"slice_61/save_to_file/path": "", +"slice_61/start_frame": 0, +"slice_62/end_frame": 0, +"slice_62/loop_mode": 0, +"slice_62/name": "", +"slice_62/save_to_file/enabled": false, +"slice_62/save_to_file/keep_custom_tracks": false, +"slice_62/save_to_file/path": "", +"slice_62/start_frame": 0, +"slice_63/end_frame": 0, +"slice_63/loop_mode": 0, +"slice_63/name": "", +"slice_63/save_to_file/enabled": false, +"slice_63/save_to_file/keep_custom_tracks": false, +"slice_63/save_to_file/path": "", +"slice_63/start_frame": 0, +"slice_64/end_frame": 0, +"slice_64/loop_mode": 0, +"slice_64/name": "", +"slice_64/save_to_file/enabled": false, +"slice_64/save_to_file/keep_custom_tracks": false, +"slice_64/save_to_file/path": "", +"slice_64/start_frame": 0, +"slice_65/end_frame": 0, +"slice_65/loop_mode": 0, +"slice_65/name": "", +"slice_65/save_to_file/enabled": false, +"slice_65/save_to_file/keep_custom_tracks": false, +"slice_65/save_to_file/path": "", +"slice_65/start_frame": 0, +"slice_66/end_frame": 0, +"slice_66/loop_mode": 0, +"slice_66/name": "", +"slice_66/save_to_file/enabled": false, +"slice_66/save_to_file/keep_custom_tracks": false, +"slice_66/save_to_file/path": "", +"slice_66/start_frame": 0, +"slice_67/end_frame": 0, +"slice_67/loop_mode": 0, +"slice_67/name": "", +"slice_67/save_to_file/enabled": false, +"slice_67/save_to_file/keep_custom_tracks": false, +"slice_67/save_to_file/path": "", +"slice_67/start_frame": 0, +"slice_68/end_frame": 0, +"slice_68/loop_mode": 0, +"slice_68/name": "", +"slice_68/save_to_file/enabled": false, +"slice_68/save_to_file/keep_custom_tracks": false, +"slice_68/save_to_file/path": "", +"slice_68/start_frame": 0, +"slice_69/end_frame": 0, +"slice_69/loop_mode": 0, +"slice_69/name": "", +"slice_69/save_to_file/enabled": false, +"slice_69/save_to_file/keep_custom_tracks": false, +"slice_69/save_to_file/path": "", +"slice_69/start_frame": 0, +"slice_7/end_frame": 0, +"slice_7/loop_mode": 0, +"slice_7/name": "", +"slice_7/save_to_file/enabled": false, +"slice_7/save_to_file/keep_custom_tracks": false, +"slice_7/save_to_file/path": "", +"slice_7/start_frame": 0, +"slice_70/end_frame": 0, +"slice_70/loop_mode": 0, +"slice_70/name": "", +"slice_70/save_to_file/enabled": false, +"slice_70/save_to_file/keep_custom_tracks": false, +"slice_70/save_to_file/path": "", +"slice_70/start_frame": 0, +"slice_71/end_frame": 0, +"slice_71/loop_mode": 0, +"slice_71/name": "", +"slice_71/save_to_file/enabled": false, +"slice_71/save_to_file/keep_custom_tracks": false, +"slice_71/save_to_file/path": "", +"slice_71/start_frame": 0, +"slice_72/end_frame": 0, +"slice_72/loop_mode": 0, +"slice_72/name": "", +"slice_72/save_to_file/enabled": false, +"slice_72/save_to_file/keep_custom_tracks": false, +"slice_72/save_to_file/path": "", +"slice_72/start_frame": 0, +"slice_73/end_frame": 0, +"slice_73/loop_mode": 0, +"slice_73/name": "", +"slice_73/save_to_file/enabled": false, +"slice_73/save_to_file/keep_custom_tracks": false, +"slice_73/save_to_file/path": "", +"slice_73/start_frame": 0, +"slice_74/end_frame": 0, +"slice_74/loop_mode": 0, +"slice_74/name": "", +"slice_74/save_to_file/enabled": false, +"slice_74/save_to_file/keep_custom_tracks": false, +"slice_74/save_to_file/path": "", +"slice_74/start_frame": 0, +"slice_75/end_frame": 0, +"slice_75/loop_mode": 0, +"slice_75/name": "", +"slice_75/save_to_file/enabled": false, +"slice_75/save_to_file/keep_custom_tracks": false, +"slice_75/save_to_file/path": "", +"slice_75/start_frame": 0, +"slice_76/end_frame": 0, +"slice_76/loop_mode": 0, +"slice_76/name": "", +"slice_76/save_to_file/enabled": false, +"slice_76/save_to_file/keep_custom_tracks": false, +"slice_76/save_to_file/path": "", +"slice_76/start_frame": 0, +"slice_77/end_frame": 0, +"slice_77/loop_mode": 0, +"slice_77/name": "", +"slice_77/save_to_file/enabled": false, +"slice_77/save_to_file/keep_custom_tracks": false, +"slice_77/save_to_file/path": "", +"slice_77/start_frame": 0, +"slice_78/end_frame": 0, +"slice_78/loop_mode": 0, +"slice_78/name": "", +"slice_78/save_to_file/enabled": false, +"slice_78/save_to_file/keep_custom_tracks": false, +"slice_78/save_to_file/path": "", +"slice_78/start_frame": 0, +"slice_79/end_frame": 0, +"slice_79/loop_mode": 0, +"slice_79/name": "", +"slice_79/save_to_file/enabled": false, +"slice_79/save_to_file/keep_custom_tracks": false, +"slice_79/save_to_file/path": "", +"slice_79/start_frame": 0, +"slice_8/end_frame": 0, +"slice_8/loop_mode": 0, +"slice_8/name": "", +"slice_8/save_to_file/enabled": false, +"slice_8/save_to_file/keep_custom_tracks": false, +"slice_8/save_to_file/path": "", +"slice_8/start_frame": 0, +"slice_80/end_frame": 0, +"slice_80/loop_mode": 0, +"slice_80/name": "", +"slice_80/save_to_file/enabled": false, +"slice_80/save_to_file/keep_custom_tracks": false, +"slice_80/save_to_file/path": "", +"slice_80/start_frame": 0, +"slice_81/end_frame": 0, +"slice_81/loop_mode": 0, +"slice_81/name": "", +"slice_81/save_to_file/enabled": false, +"slice_81/save_to_file/keep_custom_tracks": false, +"slice_81/save_to_file/path": "", +"slice_81/start_frame": 0, +"slice_82/end_frame": 0, +"slice_82/loop_mode": 0, +"slice_82/name": "", +"slice_82/save_to_file/enabled": false, +"slice_82/save_to_file/keep_custom_tracks": false, +"slice_82/save_to_file/path": "", +"slice_82/start_frame": 0, +"slice_83/end_frame": 0, +"slice_83/loop_mode": 0, +"slice_83/name": "", +"slice_83/save_to_file/enabled": false, +"slice_83/save_to_file/keep_custom_tracks": false, +"slice_83/save_to_file/path": "", +"slice_83/start_frame": 0, +"slice_84/end_frame": 0, +"slice_84/loop_mode": 0, +"slice_84/name": "", +"slice_84/save_to_file/enabled": false, +"slice_84/save_to_file/keep_custom_tracks": false, +"slice_84/save_to_file/path": "", +"slice_84/start_frame": 0, +"slice_85/end_frame": 0, +"slice_85/loop_mode": 0, +"slice_85/name": "", +"slice_85/save_to_file/enabled": false, +"slice_85/save_to_file/keep_custom_tracks": false, +"slice_85/save_to_file/path": "", +"slice_85/start_frame": 0, +"slice_86/end_frame": 0, +"slice_86/loop_mode": 0, +"slice_86/name": "", +"slice_86/save_to_file/enabled": false, +"slice_86/save_to_file/keep_custom_tracks": false, +"slice_86/save_to_file/path": "", +"slice_86/start_frame": 0, +"slice_87/end_frame": 0, +"slice_87/loop_mode": 0, +"slice_87/name": "", +"slice_87/save_to_file/enabled": false, +"slice_87/save_to_file/keep_custom_tracks": false, +"slice_87/save_to_file/path": "", +"slice_87/start_frame": 0, +"slice_88/end_frame": 0, +"slice_88/loop_mode": 0, +"slice_88/name": "", +"slice_88/save_to_file/enabled": false, +"slice_88/save_to_file/keep_custom_tracks": false, +"slice_88/save_to_file/path": "", +"slice_88/start_frame": 0, +"slice_89/end_frame": 0, +"slice_89/loop_mode": 0, +"slice_89/name": "", +"slice_89/save_to_file/enabled": false, +"slice_89/save_to_file/keep_custom_tracks": false, +"slice_89/save_to_file/path": "", +"slice_89/start_frame": 0, +"slice_9/end_frame": 0, +"slice_9/loop_mode": 0, +"slice_9/name": "", +"slice_9/save_to_file/enabled": false, +"slice_9/save_to_file/keep_custom_tracks": false, +"slice_9/save_to_file/path": "", +"slice_9/start_frame": 0, +"slice_90/end_frame": 0, +"slice_90/loop_mode": 0, +"slice_90/name": "", +"slice_90/save_to_file/enabled": false, +"slice_90/save_to_file/keep_custom_tracks": false, +"slice_90/save_to_file/path": "", +"slice_90/start_frame": 0, +"slice_91/end_frame": 0, +"slice_91/loop_mode": 0, +"slice_91/name": "", +"slice_91/save_to_file/enabled": false, +"slice_91/save_to_file/keep_custom_tracks": false, +"slice_91/save_to_file/path": "", +"slice_91/start_frame": 0, +"slice_92/end_frame": 0, +"slice_92/loop_mode": 0, +"slice_92/name": "", +"slice_92/save_to_file/enabled": false, +"slice_92/save_to_file/keep_custom_tracks": false, +"slice_92/save_to_file/path": "", +"slice_92/start_frame": 0, +"slice_93/end_frame": 0, +"slice_93/loop_mode": 0, +"slice_93/name": "", +"slice_93/save_to_file/enabled": false, +"slice_93/save_to_file/keep_custom_tracks": false, +"slice_93/save_to_file/path": "", +"slice_93/start_frame": 0, +"slice_94/end_frame": 0, +"slice_94/loop_mode": 0, +"slice_94/name": "", +"slice_94/save_to_file/enabled": false, +"slice_94/save_to_file/keep_custom_tracks": false, +"slice_94/save_to_file/path": "", +"slice_94/start_frame": 0, +"slice_95/end_frame": 0, +"slice_95/loop_mode": 0, +"slice_95/name": "", +"slice_95/save_to_file/enabled": false, +"slice_95/save_to_file/keep_custom_tracks": false, +"slice_95/save_to_file/path": "", +"slice_95/start_frame": 0, +"slice_96/end_frame": 0, +"slice_96/loop_mode": 0, +"slice_96/name": "", +"slice_96/save_to_file/enabled": false, +"slice_96/save_to_file/keep_custom_tracks": false, +"slice_96/save_to_file/path": "", +"slice_96/start_frame": 0, +"slice_97/end_frame": 0, +"slice_97/loop_mode": 0, +"slice_97/name": "", +"slice_97/save_to_file/enabled": false, +"slice_97/save_to_file/keep_custom_tracks": false, +"slice_97/save_to_file/path": "", +"slice_97/start_frame": 0, +"slice_98/end_frame": 0, +"slice_98/loop_mode": 0, +"slice_98/name": "", +"slice_98/save_to_file/enabled": false, +"slice_98/save_to_file/keep_custom_tracks": false, +"slice_98/save_to_file/path": "", +"slice_98/start_frame": 0, +"slice_99/end_frame": 0, +"slice_99/loop_mode": 0, +"slice_99/name": "", +"slice_99/save_to_file/enabled": false, +"slice_99/save_to_file/keep_custom_tracks": false, +"slice_99/save_to_file/path": "", +"slice_99/start_frame": 0, +"slices/amount": null +}, +"walk": { +"save_to_file/enabled": false, +"save_to_file/keep_custom_tracks": "", +"save_to_file/path": "", +"settings/loop_mode": 1, +"slice_1/end_frame": 0, +"slice_1/loop_mode": 0, +"slice_1/name": "", +"slice_1/save_to_file/enabled": false, +"slice_1/save_to_file/keep_custom_tracks": false, +"slice_1/save_to_file/path": "", +"slice_1/start_frame": 0, +"slice_10/end_frame": 0, +"slice_10/loop_mode": 0, +"slice_10/name": "", +"slice_10/save_to_file/enabled": false, +"slice_10/save_to_file/keep_custom_tracks": false, +"slice_10/save_to_file/path": "", +"slice_10/start_frame": 0, +"slice_100/end_frame": 0, +"slice_100/loop_mode": 0, +"slice_100/name": "", +"slice_100/save_to_file/enabled": false, +"slice_100/save_to_file/keep_custom_tracks": false, +"slice_100/save_to_file/path": "", +"slice_100/start_frame": 0, +"slice_101/end_frame": 0, +"slice_101/loop_mode": 0, +"slice_101/name": "", +"slice_101/save_to_file/enabled": false, +"slice_101/save_to_file/keep_custom_tracks": false, +"slice_101/save_to_file/path": "", +"slice_101/start_frame": 0, +"slice_102/end_frame": 0, +"slice_102/loop_mode": 0, +"slice_102/name": "", +"slice_102/save_to_file/enabled": false, +"slice_102/save_to_file/keep_custom_tracks": false, +"slice_102/save_to_file/path": "", +"slice_102/start_frame": 0, +"slice_103/end_frame": 0, +"slice_103/loop_mode": 0, +"slice_103/name": "", +"slice_103/save_to_file/enabled": false, +"slice_103/save_to_file/keep_custom_tracks": false, +"slice_103/save_to_file/path": "", +"slice_103/start_frame": 0, +"slice_104/end_frame": 0, +"slice_104/loop_mode": 0, +"slice_104/name": "", +"slice_104/save_to_file/enabled": false, +"slice_104/save_to_file/keep_custom_tracks": false, +"slice_104/save_to_file/path": "", +"slice_104/start_frame": 0, +"slice_105/end_frame": 0, +"slice_105/loop_mode": 0, +"slice_105/name": "", +"slice_105/save_to_file/enabled": false, +"slice_105/save_to_file/keep_custom_tracks": false, +"slice_105/save_to_file/path": "", +"slice_105/start_frame": 0, +"slice_106/end_frame": 0, +"slice_106/loop_mode": 0, +"slice_106/name": "", +"slice_106/save_to_file/enabled": false, +"slice_106/save_to_file/keep_custom_tracks": false, +"slice_106/save_to_file/path": "", +"slice_106/start_frame": 0, +"slice_107/end_frame": 0, +"slice_107/loop_mode": 0, +"slice_107/name": "", +"slice_107/save_to_file/enabled": false, +"slice_107/save_to_file/keep_custom_tracks": false, +"slice_107/save_to_file/path": "", +"slice_107/start_frame": 0, +"slice_108/end_frame": 0, +"slice_108/loop_mode": 0, +"slice_108/name": "", +"slice_108/save_to_file/enabled": false, +"slice_108/save_to_file/keep_custom_tracks": false, +"slice_108/save_to_file/path": "", +"slice_108/start_frame": 0, +"slice_109/end_frame": 0, +"slice_109/loop_mode": 0, +"slice_109/name": "", +"slice_109/save_to_file/enabled": false, +"slice_109/save_to_file/keep_custom_tracks": false, +"slice_109/save_to_file/path": "", +"slice_109/start_frame": 0, +"slice_11/end_frame": 0, +"slice_11/loop_mode": 0, +"slice_11/name": "", +"slice_11/save_to_file/enabled": false, +"slice_11/save_to_file/keep_custom_tracks": false, +"slice_11/save_to_file/path": "", +"slice_11/start_frame": 0, +"slice_110/end_frame": 0, +"slice_110/loop_mode": 0, +"slice_110/name": "", +"slice_110/save_to_file/enabled": false, +"slice_110/save_to_file/keep_custom_tracks": false, +"slice_110/save_to_file/path": "", +"slice_110/start_frame": 0, +"slice_111/end_frame": 0, +"slice_111/loop_mode": 0, +"slice_111/name": "", +"slice_111/save_to_file/enabled": false, +"slice_111/save_to_file/keep_custom_tracks": false, +"slice_111/save_to_file/path": "", +"slice_111/start_frame": 0, +"slice_112/end_frame": 0, +"slice_112/loop_mode": 0, +"slice_112/name": "", +"slice_112/save_to_file/enabled": false, +"slice_112/save_to_file/keep_custom_tracks": false, +"slice_112/save_to_file/path": "", +"slice_112/start_frame": 0, +"slice_113/end_frame": 0, +"slice_113/loop_mode": 0, +"slice_113/name": "", +"slice_113/save_to_file/enabled": false, +"slice_113/save_to_file/keep_custom_tracks": false, +"slice_113/save_to_file/path": "", +"slice_113/start_frame": 0, +"slice_114/end_frame": 0, +"slice_114/loop_mode": 0, +"slice_114/name": "", +"slice_114/save_to_file/enabled": false, +"slice_114/save_to_file/keep_custom_tracks": false, +"slice_114/save_to_file/path": "", +"slice_114/start_frame": 0, +"slice_115/end_frame": 0, +"slice_115/loop_mode": 0, +"slice_115/name": "", +"slice_115/save_to_file/enabled": false, +"slice_115/save_to_file/keep_custom_tracks": false, +"slice_115/save_to_file/path": "", +"slice_115/start_frame": 0, +"slice_116/end_frame": 0, +"slice_116/loop_mode": 0, +"slice_116/name": "", +"slice_116/save_to_file/enabled": false, +"slice_116/save_to_file/keep_custom_tracks": false, +"slice_116/save_to_file/path": "", +"slice_116/start_frame": 0, +"slice_117/end_frame": 0, +"slice_117/loop_mode": 0, +"slice_117/name": "", +"slice_117/save_to_file/enabled": false, +"slice_117/save_to_file/keep_custom_tracks": false, +"slice_117/save_to_file/path": "", +"slice_117/start_frame": 0, +"slice_118/end_frame": 0, +"slice_118/loop_mode": 0, +"slice_118/name": "", +"slice_118/save_to_file/enabled": false, +"slice_118/save_to_file/keep_custom_tracks": false, +"slice_118/save_to_file/path": "", +"slice_118/start_frame": 0, +"slice_119/end_frame": 0, +"slice_119/loop_mode": 0, +"slice_119/name": "", +"slice_119/save_to_file/enabled": false, +"slice_119/save_to_file/keep_custom_tracks": false, +"slice_119/save_to_file/path": "", +"slice_119/start_frame": 0, +"slice_12/end_frame": 0, +"slice_12/loop_mode": 0, +"slice_12/name": "", +"slice_12/save_to_file/enabled": false, +"slice_12/save_to_file/keep_custom_tracks": false, +"slice_12/save_to_file/path": "", +"slice_12/start_frame": 0, +"slice_120/end_frame": 0, +"slice_120/loop_mode": 0, +"slice_120/name": "", +"slice_120/save_to_file/enabled": false, +"slice_120/save_to_file/keep_custom_tracks": false, +"slice_120/save_to_file/path": "", +"slice_120/start_frame": 0, +"slice_121/end_frame": 0, +"slice_121/loop_mode": 0, +"slice_121/name": "", +"slice_121/save_to_file/enabled": false, +"slice_121/save_to_file/keep_custom_tracks": false, +"slice_121/save_to_file/path": "", +"slice_121/start_frame": 0, +"slice_122/end_frame": 0, +"slice_122/loop_mode": 0, +"slice_122/name": "", +"slice_122/save_to_file/enabled": false, +"slice_122/save_to_file/keep_custom_tracks": false, +"slice_122/save_to_file/path": "", +"slice_122/start_frame": 0, +"slice_123/end_frame": 0, +"slice_123/loop_mode": 0, +"slice_123/name": "", +"slice_123/save_to_file/enabled": false, +"slice_123/save_to_file/keep_custom_tracks": false, +"slice_123/save_to_file/path": "", +"slice_123/start_frame": 0, +"slice_124/end_frame": 0, +"slice_124/loop_mode": 0, +"slice_124/name": "", +"slice_124/save_to_file/enabled": false, +"slice_124/save_to_file/keep_custom_tracks": false, +"slice_124/save_to_file/path": "", +"slice_124/start_frame": 0, +"slice_125/end_frame": 0, +"slice_125/loop_mode": 0, +"slice_125/name": "", +"slice_125/save_to_file/enabled": false, +"slice_125/save_to_file/keep_custom_tracks": false, +"slice_125/save_to_file/path": "", +"slice_125/start_frame": 0, +"slice_126/end_frame": 0, +"slice_126/loop_mode": 0, +"slice_126/name": "", +"slice_126/save_to_file/enabled": false, +"slice_126/save_to_file/keep_custom_tracks": false, +"slice_126/save_to_file/path": "", +"slice_126/start_frame": 0, +"slice_127/end_frame": 0, +"slice_127/loop_mode": 0, +"slice_127/name": "", +"slice_127/save_to_file/enabled": false, +"slice_127/save_to_file/keep_custom_tracks": false, +"slice_127/save_to_file/path": "", +"slice_127/start_frame": 0, +"slice_128/end_frame": 0, +"slice_128/loop_mode": 0, +"slice_128/name": "", +"slice_128/save_to_file/enabled": false, +"slice_128/save_to_file/keep_custom_tracks": false, +"slice_128/save_to_file/path": "", +"slice_128/start_frame": 0, +"slice_129/end_frame": 0, +"slice_129/loop_mode": 0, +"slice_129/name": "", +"slice_129/save_to_file/enabled": false, +"slice_129/save_to_file/keep_custom_tracks": false, +"slice_129/save_to_file/path": "", +"slice_129/start_frame": 0, +"slice_13/end_frame": 0, +"slice_13/loop_mode": 0, +"slice_13/name": "", +"slice_13/save_to_file/enabled": false, +"slice_13/save_to_file/keep_custom_tracks": false, +"slice_13/save_to_file/path": "", +"slice_13/start_frame": 0, +"slice_130/end_frame": 0, +"slice_130/loop_mode": 0, +"slice_130/name": "", +"slice_130/save_to_file/enabled": false, +"slice_130/save_to_file/keep_custom_tracks": false, +"slice_130/save_to_file/path": "", +"slice_130/start_frame": 0, +"slice_131/end_frame": 0, +"slice_131/loop_mode": 0, +"slice_131/name": "", +"slice_131/save_to_file/enabled": false, +"slice_131/save_to_file/keep_custom_tracks": false, +"slice_131/save_to_file/path": "", +"slice_131/start_frame": 0, +"slice_132/end_frame": 0, +"slice_132/loop_mode": 0, +"slice_132/name": "", +"slice_132/save_to_file/enabled": false, +"slice_132/save_to_file/keep_custom_tracks": false, +"slice_132/save_to_file/path": "", +"slice_132/start_frame": 0, +"slice_133/end_frame": 0, +"slice_133/loop_mode": 0, +"slice_133/name": "", +"slice_133/save_to_file/enabled": false, +"slice_133/save_to_file/keep_custom_tracks": false, +"slice_133/save_to_file/path": "", +"slice_133/start_frame": 0, +"slice_134/end_frame": 0, +"slice_134/loop_mode": 0, +"slice_134/name": "", +"slice_134/save_to_file/enabled": false, +"slice_134/save_to_file/keep_custom_tracks": false, +"slice_134/save_to_file/path": "", +"slice_134/start_frame": 0, +"slice_135/end_frame": 0, +"slice_135/loop_mode": 0, +"slice_135/name": "", +"slice_135/save_to_file/enabled": false, +"slice_135/save_to_file/keep_custom_tracks": false, +"slice_135/save_to_file/path": "", +"slice_135/start_frame": 0, +"slice_136/end_frame": 0, +"slice_136/loop_mode": 0, +"slice_136/name": "", +"slice_136/save_to_file/enabled": false, +"slice_136/save_to_file/keep_custom_tracks": false, +"slice_136/save_to_file/path": "", +"slice_136/start_frame": 0, +"slice_137/end_frame": 0, +"slice_137/loop_mode": 0, +"slice_137/name": "", +"slice_137/save_to_file/enabled": false, +"slice_137/save_to_file/keep_custom_tracks": false, +"slice_137/save_to_file/path": "", +"slice_137/start_frame": 0, +"slice_138/end_frame": 0, +"slice_138/loop_mode": 0, +"slice_138/name": "", +"slice_138/save_to_file/enabled": false, +"slice_138/save_to_file/keep_custom_tracks": false, +"slice_138/save_to_file/path": "", +"slice_138/start_frame": 0, +"slice_139/end_frame": 0, +"slice_139/loop_mode": 0, +"slice_139/name": "", +"slice_139/save_to_file/enabled": false, +"slice_139/save_to_file/keep_custom_tracks": false, +"slice_139/save_to_file/path": "", +"slice_139/start_frame": 0, +"slice_14/end_frame": 0, +"slice_14/loop_mode": 0, +"slice_14/name": "", +"slice_14/save_to_file/enabled": false, +"slice_14/save_to_file/keep_custom_tracks": false, +"slice_14/save_to_file/path": "", +"slice_14/start_frame": 0, +"slice_140/end_frame": 0, +"slice_140/loop_mode": 0, +"slice_140/name": "", +"slice_140/save_to_file/enabled": false, +"slice_140/save_to_file/keep_custom_tracks": false, +"slice_140/save_to_file/path": "", +"slice_140/start_frame": 0, +"slice_141/end_frame": 0, +"slice_141/loop_mode": 0, +"slice_141/name": "", +"slice_141/save_to_file/enabled": false, +"slice_141/save_to_file/keep_custom_tracks": false, +"slice_141/save_to_file/path": "", +"slice_141/start_frame": 0, +"slice_142/end_frame": 0, +"slice_142/loop_mode": 0, +"slice_142/name": "", +"slice_142/save_to_file/enabled": false, +"slice_142/save_to_file/keep_custom_tracks": false, +"slice_142/save_to_file/path": "", +"slice_142/start_frame": 0, +"slice_143/end_frame": 0, +"slice_143/loop_mode": 0, +"slice_143/name": "", +"slice_143/save_to_file/enabled": false, +"slice_143/save_to_file/keep_custom_tracks": false, +"slice_143/save_to_file/path": "", +"slice_143/start_frame": 0, +"slice_144/end_frame": 0, +"slice_144/loop_mode": 0, +"slice_144/name": "", +"slice_144/save_to_file/enabled": false, +"slice_144/save_to_file/keep_custom_tracks": false, +"slice_144/save_to_file/path": "", +"slice_144/start_frame": 0, +"slice_145/end_frame": 0, +"slice_145/loop_mode": 0, +"slice_145/name": "", +"slice_145/save_to_file/enabled": false, +"slice_145/save_to_file/keep_custom_tracks": false, +"slice_145/save_to_file/path": "", +"slice_145/start_frame": 0, +"slice_146/end_frame": 0, +"slice_146/loop_mode": 0, +"slice_146/name": "", +"slice_146/save_to_file/enabled": false, +"slice_146/save_to_file/keep_custom_tracks": false, +"slice_146/save_to_file/path": "", +"slice_146/start_frame": 0, +"slice_147/end_frame": 0, +"slice_147/loop_mode": 0, +"slice_147/name": "", +"slice_147/save_to_file/enabled": false, +"slice_147/save_to_file/keep_custom_tracks": false, +"slice_147/save_to_file/path": "", +"slice_147/start_frame": 0, +"slice_148/end_frame": 0, +"slice_148/loop_mode": 0, +"slice_148/name": "", +"slice_148/save_to_file/enabled": false, +"slice_148/save_to_file/keep_custom_tracks": false, +"slice_148/save_to_file/path": "", +"slice_148/start_frame": 0, +"slice_149/end_frame": 0, +"slice_149/loop_mode": 0, +"slice_149/name": "", +"slice_149/save_to_file/enabled": false, +"slice_149/save_to_file/keep_custom_tracks": false, +"slice_149/save_to_file/path": "", +"slice_149/start_frame": 0, +"slice_15/end_frame": 0, +"slice_15/loop_mode": 0, +"slice_15/name": "", +"slice_15/save_to_file/enabled": false, +"slice_15/save_to_file/keep_custom_tracks": false, +"slice_15/save_to_file/path": "", +"slice_15/start_frame": 0, +"slice_150/end_frame": 0, +"slice_150/loop_mode": 0, +"slice_150/name": "", +"slice_150/save_to_file/enabled": false, +"slice_150/save_to_file/keep_custom_tracks": false, +"slice_150/save_to_file/path": "", +"slice_150/start_frame": 0, +"slice_151/end_frame": 0, +"slice_151/loop_mode": 0, +"slice_151/name": "", +"slice_151/save_to_file/enabled": false, +"slice_151/save_to_file/keep_custom_tracks": false, +"slice_151/save_to_file/path": "", +"slice_151/start_frame": 0, +"slice_152/end_frame": 0, +"slice_152/loop_mode": 0, +"slice_152/name": "", +"slice_152/save_to_file/enabled": false, +"slice_152/save_to_file/keep_custom_tracks": false, +"slice_152/save_to_file/path": "", +"slice_152/start_frame": 0, +"slice_153/end_frame": 0, +"slice_153/loop_mode": 0, +"slice_153/name": "", +"slice_153/save_to_file/enabled": false, +"slice_153/save_to_file/keep_custom_tracks": false, +"slice_153/save_to_file/path": "", +"slice_153/start_frame": 0, +"slice_154/end_frame": 0, +"slice_154/loop_mode": 0, +"slice_154/name": "", +"slice_154/save_to_file/enabled": false, +"slice_154/save_to_file/keep_custom_tracks": false, +"slice_154/save_to_file/path": "", +"slice_154/start_frame": 0, +"slice_155/end_frame": 0, +"slice_155/loop_mode": 0, +"slice_155/name": "", +"slice_155/save_to_file/enabled": false, +"slice_155/save_to_file/keep_custom_tracks": false, +"slice_155/save_to_file/path": "", +"slice_155/start_frame": 0, +"slice_156/end_frame": 0, +"slice_156/loop_mode": 0, +"slice_156/name": "", +"slice_156/save_to_file/enabled": false, +"slice_156/save_to_file/keep_custom_tracks": false, +"slice_156/save_to_file/path": "", +"slice_156/start_frame": 0, +"slice_157/end_frame": 0, +"slice_157/loop_mode": 0, +"slice_157/name": "", +"slice_157/save_to_file/enabled": false, +"slice_157/save_to_file/keep_custom_tracks": false, +"slice_157/save_to_file/path": "", +"slice_157/start_frame": 0, +"slice_158/end_frame": 0, +"slice_158/loop_mode": 0, +"slice_158/name": "", +"slice_158/save_to_file/enabled": false, +"slice_158/save_to_file/keep_custom_tracks": false, +"slice_158/save_to_file/path": "", +"slice_158/start_frame": 0, +"slice_159/end_frame": 0, +"slice_159/loop_mode": 0, +"slice_159/name": "", +"slice_159/save_to_file/enabled": false, +"slice_159/save_to_file/keep_custom_tracks": false, +"slice_159/save_to_file/path": "", +"slice_159/start_frame": 0, +"slice_16/end_frame": 0, +"slice_16/loop_mode": 0, +"slice_16/name": "", +"slice_16/save_to_file/enabled": false, +"slice_16/save_to_file/keep_custom_tracks": false, +"slice_16/save_to_file/path": "", +"slice_16/start_frame": 0, +"slice_160/end_frame": 0, +"slice_160/loop_mode": 0, +"slice_160/name": "", +"slice_160/save_to_file/enabled": false, +"slice_160/save_to_file/keep_custom_tracks": false, +"slice_160/save_to_file/path": "", +"slice_160/start_frame": 0, +"slice_161/end_frame": 0, +"slice_161/loop_mode": 0, +"slice_161/name": "", +"slice_161/save_to_file/enabled": false, +"slice_161/save_to_file/keep_custom_tracks": false, +"slice_161/save_to_file/path": "", +"slice_161/start_frame": 0, +"slice_162/end_frame": 0, +"slice_162/loop_mode": 0, +"slice_162/name": "", +"slice_162/save_to_file/enabled": false, +"slice_162/save_to_file/keep_custom_tracks": false, +"slice_162/save_to_file/path": "", +"slice_162/start_frame": 0, +"slice_163/end_frame": 0, +"slice_163/loop_mode": 0, +"slice_163/name": "", +"slice_163/save_to_file/enabled": false, +"slice_163/save_to_file/keep_custom_tracks": false, +"slice_163/save_to_file/path": "", +"slice_163/start_frame": 0, +"slice_164/end_frame": 0, +"slice_164/loop_mode": 0, +"slice_164/name": "", +"slice_164/save_to_file/enabled": false, +"slice_164/save_to_file/keep_custom_tracks": false, +"slice_164/save_to_file/path": "", +"slice_164/start_frame": 0, +"slice_165/end_frame": 0, +"slice_165/loop_mode": 0, +"slice_165/name": "", +"slice_165/save_to_file/enabled": false, +"slice_165/save_to_file/keep_custom_tracks": false, +"slice_165/save_to_file/path": "", +"slice_165/start_frame": 0, +"slice_166/end_frame": 0, +"slice_166/loop_mode": 0, +"slice_166/name": "", +"slice_166/save_to_file/enabled": false, +"slice_166/save_to_file/keep_custom_tracks": false, +"slice_166/save_to_file/path": "", +"slice_166/start_frame": 0, +"slice_167/end_frame": 0, +"slice_167/loop_mode": 0, +"slice_167/name": "", +"slice_167/save_to_file/enabled": false, +"slice_167/save_to_file/keep_custom_tracks": false, +"slice_167/save_to_file/path": "", +"slice_167/start_frame": 0, +"slice_168/end_frame": 0, +"slice_168/loop_mode": 0, +"slice_168/name": "", +"slice_168/save_to_file/enabled": false, +"slice_168/save_to_file/keep_custom_tracks": false, +"slice_168/save_to_file/path": "", +"slice_168/start_frame": 0, +"slice_169/end_frame": 0, +"slice_169/loop_mode": 0, +"slice_169/name": "", +"slice_169/save_to_file/enabled": false, +"slice_169/save_to_file/keep_custom_tracks": false, +"slice_169/save_to_file/path": "", +"slice_169/start_frame": 0, +"slice_17/end_frame": 0, +"slice_17/loop_mode": 0, +"slice_17/name": "", +"slice_17/save_to_file/enabled": false, +"slice_17/save_to_file/keep_custom_tracks": false, +"slice_17/save_to_file/path": "", +"slice_17/start_frame": 0, +"slice_170/end_frame": 0, +"slice_170/loop_mode": 0, +"slice_170/name": "", +"slice_170/save_to_file/enabled": false, +"slice_170/save_to_file/keep_custom_tracks": false, +"slice_170/save_to_file/path": "", +"slice_170/start_frame": 0, +"slice_171/end_frame": 0, +"slice_171/loop_mode": 0, +"slice_171/name": "", +"slice_171/save_to_file/enabled": false, +"slice_171/save_to_file/keep_custom_tracks": false, +"slice_171/save_to_file/path": "", +"slice_171/start_frame": 0, +"slice_172/end_frame": 0, +"slice_172/loop_mode": 0, +"slice_172/name": "", +"slice_172/save_to_file/enabled": false, +"slice_172/save_to_file/keep_custom_tracks": false, +"slice_172/save_to_file/path": "", +"slice_172/start_frame": 0, +"slice_173/end_frame": 0, +"slice_173/loop_mode": 0, +"slice_173/name": "", +"slice_173/save_to_file/enabled": false, +"slice_173/save_to_file/keep_custom_tracks": false, +"slice_173/save_to_file/path": "", +"slice_173/start_frame": 0, +"slice_174/end_frame": 0, +"slice_174/loop_mode": 0, +"slice_174/name": "", +"slice_174/save_to_file/enabled": false, +"slice_174/save_to_file/keep_custom_tracks": false, +"slice_174/save_to_file/path": "", +"slice_174/start_frame": 0, +"slice_175/end_frame": 0, +"slice_175/loop_mode": 0, +"slice_175/name": "", +"slice_175/save_to_file/enabled": false, +"slice_175/save_to_file/keep_custom_tracks": false, +"slice_175/save_to_file/path": "", +"slice_175/start_frame": 0, +"slice_176/end_frame": 0, +"slice_176/loop_mode": 0, +"slice_176/name": "", +"slice_176/save_to_file/enabled": false, +"slice_176/save_to_file/keep_custom_tracks": false, +"slice_176/save_to_file/path": "", +"slice_176/start_frame": 0, +"slice_177/end_frame": 0, +"slice_177/loop_mode": 0, +"slice_177/name": "", +"slice_177/save_to_file/enabled": false, +"slice_177/save_to_file/keep_custom_tracks": false, +"slice_177/save_to_file/path": "", +"slice_177/start_frame": 0, +"slice_178/end_frame": 0, +"slice_178/loop_mode": 0, +"slice_178/name": "", +"slice_178/save_to_file/enabled": false, +"slice_178/save_to_file/keep_custom_tracks": false, +"slice_178/save_to_file/path": "", +"slice_178/start_frame": 0, +"slice_179/end_frame": 0, +"slice_179/loop_mode": 0, +"slice_179/name": "", +"slice_179/save_to_file/enabled": false, +"slice_179/save_to_file/keep_custom_tracks": false, +"slice_179/save_to_file/path": "", +"slice_179/start_frame": 0, +"slice_18/end_frame": 0, +"slice_18/loop_mode": 0, +"slice_18/name": "", +"slice_18/save_to_file/enabled": false, +"slice_18/save_to_file/keep_custom_tracks": false, +"slice_18/save_to_file/path": "", +"slice_18/start_frame": 0, +"slice_180/end_frame": 0, +"slice_180/loop_mode": 0, +"slice_180/name": "", +"slice_180/save_to_file/enabled": false, +"slice_180/save_to_file/keep_custom_tracks": false, +"slice_180/save_to_file/path": "", +"slice_180/start_frame": 0, +"slice_181/end_frame": 0, +"slice_181/loop_mode": 0, +"slice_181/name": "", +"slice_181/save_to_file/enabled": false, +"slice_181/save_to_file/keep_custom_tracks": false, +"slice_181/save_to_file/path": "", +"slice_181/start_frame": 0, +"slice_182/end_frame": 0, +"slice_182/loop_mode": 0, +"slice_182/name": "", +"slice_182/save_to_file/enabled": false, +"slice_182/save_to_file/keep_custom_tracks": false, +"slice_182/save_to_file/path": "", +"slice_182/start_frame": 0, +"slice_183/end_frame": 0, +"slice_183/loop_mode": 0, +"slice_183/name": "", +"slice_183/save_to_file/enabled": false, +"slice_183/save_to_file/keep_custom_tracks": false, +"slice_183/save_to_file/path": "", +"slice_183/start_frame": 0, +"slice_184/end_frame": 0, +"slice_184/loop_mode": 0, +"slice_184/name": "", +"slice_184/save_to_file/enabled": false, +"slice_184/save_to_file/keep_custom_tracks": false, +"slice_184/save_to_file/path": "", +"slice_184/start_frame": 0, +"slice_185/end_frame": 0, +"slice_185/loop_mode": 0, +"slice_185/name": "", +"slice_185/save_to_file/enabled": false, +"slice_185/save_to_file/keep_custom_tracks": false, +"slice_185/save_to_file/path": "", +"slice_185/start_frame": 0, +"slice_186/end_frame": 0, +"slice_186/loop_mode": 0, +"slice_186/name": "", +"slice_186/save_to_file/enabled": false, +"slice_186/save_to_file/keep_custom_tracks": false, +"slice_186/save_to_file/path": "", +"slice_186/start_frame": 0, +"slice_187/end_frame": 0, +"slice_187/loop_mode": 0, +"slice_187/name": "", +"slice_187/save_to_file/enabled": false, +"slice_187/save_to_file/keep_custom_tracks": false, +"slice_187/save_to_file/path": "", +"slice_187/start_frame": 0, +"slice_188/end_frame": 0, +"slice_188/loop_mode": 0, +"slice_188/name": "", +"slice_188/save_to_file/enabled": false, +"slice_188/save_to_file/keep_custom_tracks": false, +"slice_188/save_to_file/path": "", +"slice_188/start_frame": 0, +"slice_189/end_frame": 0, +"slice_189/loop_mode": 0, +"slice_189/name": "", +"slice_189/save_to_file/enabled": false, +"slice_189/save_to_file/keep_custom_tracks": false, +"slice_189/save_to_file/path": "", +"slice_189/start_frame": 0, +"slice_19/end_frame": 0, +"slice_19/loop_mode": 0, +"slice_19/name": "", +"slice_19/save_to_file/enabled": false, +"slice_19/save_to_file/keep_custom_tracks": false, +"slice_19/save_to_file/path": "", +"slice_19/start_frame": 0, +"slice_190/end_frame": 0, +"slice_190/loop_mode": 0, +"slice_190/name": "", +"slice_190/save_to_file/enabled": false, +"slice_190/save_to_file/keep_custom_tracks": false, +"slice_190/save_to_file/path": "", +"slice_190/start_frame": 0, +"slice_191/end_frame": 0, +"slice_191/loop_mode": 0, +"slice_191/name": "", +"slice_191/save_to_file/enabled": false, +"slice_191/save_to_file/keep_custom_tracks": false, +"slice_191/save_to_file/path": "", +"slice_191/start_frame": 0, +"slice_192/end_frame": 0, +"slice_192/loop_mode": 0, +"slice_192/name": "", +"slice_192/save_to_file/enabled": false, +"slice_192/save_to_file/keep_custom_tracks": false, +"slice_192/save_to_file/path": "", +"slice_192/start_frame": 0, +"slice_193/end_frame": 0, +"slice_193/loop_mode": 0, +"slice_193/name": "", +"slice_193/save_to_file/enabled": false, +"slice_193/save_to_file/keep_custom_tracks": false, +"slice_193/save_to_file/path": "", +"slice_193/start_frame": 0, +"slice_194/end_frame": 0, +"slice_194/loop_mode": 0, +"slice_194/name": "", +"slice_194/save_to_file/enabled": false, +"slice_194/save_to_file/keep_custom_tracks": false, +"slice_194/save_to_file/path": "", +"slice_194/start_frame": 0, +"slice_195/end_frame": 0, +"slice_195/loop_mode": 0, +"slice_195/name": "", +"slice_195/save_to_file/enabled": false, +"slice_195/save_to_file/keep_custom_tracks": false, +"slice_195/save_to_file/path": "", +"slice_195/start_frame": 0, +"slice_196/end_frame": 0, +"slice_196/loop_mode": 0, +"slice_196/name": "", +"slice_196/save_to_file/enabled": false, +"slice_196/save_to_file/keep_custom_tracks": false, +"slice_196/save_to_file/path": "", +"slice_196/start_frame": 0, +"slice_197/end_frame": 0, +"slice_197/loop_mode": 0, +"slice_197/name": "", +"slice_197/save_to_file/enabled": false, +"slice_197/save_to_file/keep_custom_tracks": false, +"slice_197/save_to_file/path": "", +"slice_197/start_frame": 0, +"slice_198/end_frame": 0, +"slice_198/loop_mode": 0, +"slice_198/name": "", +"slice_198/save_to_file/enabled": false, +"slice_198/save_to_file/keep_custom_tracks": false, +"slice_198/save_to_file/path": "", +"slice_198/start_frame": 0, +"slice_199/end_frame": 0, +"slice_199/loop_mode": 0, +"slice_199/name": "", +"slice_199/save_to_file/enabled": false, +"slice_199/save_to_file/keep_custom_tracks": false, +"slice_199/save_to_file/path": "", +"slice_199/start_frame": 0, +"slice_2/end_frame": 0, +"slice_2/loop_mode": 0, +"slice_2/name": "", +"slice_2/save_to_file/enabled": false, +"slice_2/save_to_file/keep_custom_tracks": false, +"slice_2/save_to_file/path": "", +"slice_2/start_frame": 0, +"slice_20/end_frame": 0, +"slice_20/loop_mode": 0, +"slice_20/name": "", +"slice_20/save_to_file/enabled": false, +"slice_20/save_to_file/keep_custom_tracks": false, +"slice_20/save_to_file/path": "", +"slice_20/start_frame": 0, +"slice_200/end_frame": 0, +"slice_200/loop_mode": 0, +"slice_200/name": "", +"slice_200/save_to_file/enabled": false, +"slice_200/save_to_file/keep_custom_tracks": false, +"slice_200/save_to_file/path": "", +"slice_200/start_frame": 0, +"slice_201/end_frame": 0, +"slice_201/loop_mode": 0, +"slice_201/name": "", +"slice_201/save_to_file/enabled": false, +"slice_201/save_to_file/keep_custom_tracks": false, +"slice_201/save_to_file/path": "", +"slice_201/start_frame": 0, +"slice_202/end_frame": 0, +"slice_202/loop_mode": 0, +"slice_202/name": "", +"slice_202/save_to_file/enabled": false, +"slice_202/save_to_file/keep_custom_tracks": false, +"slice_202/save_to_file/path": "", +"slice_202/start_frame": 0, +"slice_203/end_frame": 0, +"slice_203/loop_mode": 0, +"slice_203/name": "", +"slice_203/save_to_file/enabled": false, +"slice_203/save_to_file/keep_custom_tracks": false, +"slice_203/save_to_file/path": "", +"slice_203/start_frame": 0, +"slice_204/end_frame": 0, +"slice_204/loop_mode": 0, +"slice_204/name": "", +"slice_204/save_to_file/enabled": false, +"slice_204/save_to_file/keep_custom_tracks": false, +"slice_204/save_to_file/path": "", +"slice_204/start_frame": 0, +"slice_205/end_frame": 0, +"slice_205/loop_mode": 0, +"slice_205/name": "", +"slice_205/save_to_file/enabled": false, +"slice_205/save_to_file/keep_custom_tracks": false, +"slice_205/save_to_file/path": "", +"slice_205/start_frame": 0, +"slice_206/end_frame": 0, +"slice_206/loop_mode": 0, +"slice_206/name": "", +"slice_206/save_to_file/enabled": false, +"slice_206/save_to_file/keep_custom_tracks": false, +"slice_206/save_to_file/path": "", +"slice_206/start_frame": 0, +"slice_207/end_frame": 0, +"slice_207/loop_mode": 0, +"slice_207/name": "", +"slice_207/save_to_file/enabled": false, +"slice_207/save_to_file/keep_custom_tracks": false, +"slice_207/save_to_file/path": "", +"slice_207/start_frame": 0, +"slice_208/end_frame": 0, +"slice_208/loop_mode": 0, +"slice_208/name": "", +"slice_208/save_to_file/enabled": false, +"slice_208/save_to_file/keep_custom_tracks": false, +"slice_208/save_to_file/path": "", +"slice_208/start_frame": 0, +"slice_209/end_frame": 0, +"slice_209/loop_mode": 0, +"slice_209/name": "", +"slice_209/save_to_file/enabled": false, +"slice_209/save_to_file/keep_custom_tracks": false, +"slice_209/save_to_file/path": "", +"slice_209/start_frame": 0, +"slice_21/end_frame": 0, +"slice_21/loop_mode": 0, +"slice_21/name": "", +"slice_21/save_to_file/enabled": false, +"slice_21/save_to_file/keep_custom_tracks": false, +"slice_21/save_to_file/path": "", +"slice_21/start_frame": 0, +"slice_210/end_frame": 0, +"slice_210/loop_mode": 0, +"slice_210/name": "", +"slice_210/save_to_file/enabled": false, +"slice_210/save_to_file/keep_custom_tracks": false, +"slice_210/save_to_file/path": "", +"slice_210/start_frame": 0, +"slice_211/end_frame": 0, +"slice_211/loop_mode": 0, +"slice_211/name": "", +"slice_211/save_to_file/enabled": false, +"slice_211/save_to_file/keep_custom_tracks": false, +"slice_211/save_to_file/path": "", +"slice_211/start_frame": 0, +"slice_212/end_frame": 0, +"slice_212/loop_mode": 0, +"slice_212/name": "", +"slice_212/save_to_file/enabled": false, +"slice_212/save_to_file/keep_custom_tracks": false, +"slice_212/save_to_file/path": "", +"slice_212/start_frame": 0, +"slice_213/end_frame": 0, +"slice_213/loop_mode": 0, +"slice_213/name": "", +"slice_213/save_to_file/enabled": false, +"slice_213/save_to_file/keep_custom_tracks": false, +"slice_213/save_to_file/path": "", +"slice_213/start_frame": 0, +"slice_214/end_frame": 0, +"slice_214/loop_mode": 0, +"slice_214/name": "", +"slice_214/save_to_file/enabled": false, +"slice_214/save_to_file/keep_custom_tracks": false, +"slice_214/save_to_file/path": "", +"slice_214/start_frame": 0, +"slice_215/end_frame": 0, +"slice_215/loop_mode": 0, +"slice_215/name": "", +"slice_215/save_to_file/enabled": false, +"slice_215/save_to_file/keep_custom_tracks": false, +"slice_215/save_to_file/path": "", +"slice_215/start_frame": 0, +"slice_216/end_frame": 0, +"slice_216/loop_mode": 0, +"slice_216/name": "", +"slice_216/save_to_file/enabled": false, +"slice_216/save_to_file/keep_custom_tracks": false, +"slice_216/save_to_file/path": "", +"slice_216/start_frame": 0, +"slice_217/end_frame": 0, +"slice_217/loop_mode": 0, +"slice_217/name": "", +"slice_217/save_to_file/enabled": false, +"slice_217/save_to_file/keep_custom_tracks": false, +"slice_217/save_to_file/path": "", +"slice_217/start_frame": 0, +"slice_218/end_frame": 0, +"slice_218/loop_mode": 0, +"slice_218/name": "", +"slice_218/save_to_file/enabled": false, +"slice_218/save_to_file/keep_custom_tracks": false, +"slice_218/save_to_file/path": "", +"slice_218/start_frame": 0, +"slice_219/end_frame": 0, +"slice_219/loop_mode": 0, +"slice_219/name": "", +"slice_219/save_to_file/enabled": false, +"slice_219/save_to_file/keep_custom_tracks": false, +"slice_219/save_to_file/path": "", +"slice_219/start_frame": 0, +"slice_22/end_frame": 0, +"slice_22/loop_mode": 0, +"slice_22/name": "", +"slice_22/save_to_file/enabled": false, +"slice_22/save_to_file/keep_custom_tracks": false, +"slice_22/save_to_file/path": "", +"slice_22/start_frame": 0, +"slice_220/end_frame": 0, +"slice_220/loop_mode": 0, +"slice_220/name": "", +"slice_220/save_to_file/enabled": false, +"slice_220/save_to_file/keep_custom_tracks": false, +"slice_220/save_to_file/path": "", +"slice_220/start_frame": 0, +"slice_221/end_frame": 0, +"slice_221/loop_mode": 0, +"slice_221/name": "", +"slice_221/save_to_file/enabled": false, +"slice_221/save_to_file/keep_custom_tracks": false, +"slice_221/save_to_file/path": "", +"slice_221/start_frame": 0, +"slice_222/end_frame": 0, +"slice_222/loop_mode": 0, +"slice_222/name": "", +"slice_222/save_to_file/enabled": false, +"slice_222/save_to_file/keep_custom_tracks": false, +"slice_222/save_to_file/path": "", +"slice_222/start_frame": 0, +"slice_223/end_frame": 0, +"slice_223/loop_mode": 0, +"slice_223/name": "", +"slice_223/save_to_file/enabled": false, +"slice_223/save_to_file/keep_custom_tracks": false, +"slice_223/save_to_file/path": "", +"slice_223/start_frame": 0, +"slice_224/end_frame": 0, +"slice_224/loop_mode": 0, +"slice_224/name": "", +"slice_224/save_to_file/enabled": false, +"slice_224/save_to_file/keep_custom_tracks": false, +"slice_224/save_to_file/path": "", +"slice_224/start_frame": 0, +"slice_225/end_frame": 0, +"slice_225/loop_mode": 0, +"slice_225/name": "", +"slice_225/save_to_file/enabled": false, +"slice_225/save_to_file/keep_custom_tracks": false, +"slice_225/save_to_file/path": "", +"slice_225/start_frame": 0, +"slice_226/end_frame": 0, +"slice_226/loop_mode": 0, +"slice_226/name": "", +"slice_226/save_to_file/enabled": false, +"slice_226/save_to_file/keep_custom_tracks": false, +"slice_226/save_to_file/path": "", +"slice_226/start_frame": 0, +"slice_227/end_frame": 0, +"slice_227/loop_mode": 0, +"slice_227/name": "", +"slice_227/save_to_file/enabled": false, +"slice_227/save_to_file/keep_custom_tracks": false, +"slice_227/save_to_file/path": "", +"slice_227/start_frame": 0, +"slice_228/end_frame": 0, +"slice_228/loop_mode": 0, +"slice_228/name": "", +"slice_228/save_to_file/enabled": false, +"slice_228/save_to_file/keep_custom_tracks": false, +"slice_228/save_to_file/path": "", +"slice_228/start_frame": 0, +"slice_229/end_frame": 0, +"slice_229/loop_mode": 0, +"slice_229/name": "", +"slice_229/save_to_file/enabled": false, +"slice_229/save_to_file/keep_custom_tracks": false, +"slice_229/save_to_file/path": "", +"slice_229/start_frame": 0, +"slice_23/end_frame": 0, +"slice_23/loop_mode": 0, +"slice_23/name": "", +"slice_23/save_to_file/enabled": false, +"slice_23/save_to_file/keep_custom_tracks": false, +"slice_23/save_to_file/path": "", +"slice_23/start_frame": 0, +"slice_230/end_frame": 0, +"slice_230/loop_mode": 0, +"slice_230/name": "", +"slice_230/save_to_file/enabled": false, +"slice_230/save_to_file/keep_custom_tracks": false, +"slice_230/save_to_file/path": "", +"slice_230/start_frame": 0, +"slice_231/end_frame": 0, +"slice_231/loop_mode": 0, +"slice_231/name": "", +"slice_231/save_to_file/enabled": false, +"slice_231/save_to_file/keep_custom_tracks": false, +"slice_231/save_to_file/path": "", +"slice_231/start_frame": 0, +"slice_232/end_frame": 0, +"slice_232/loop_mode": 0, +"slice_232/name": "", +"slice_232/save_to_file/enabled": false, +"slice_232/save_to_file/keep_custom_tracks": false, +"slice_232/save_to_file/path": "", +"slice_232/start_frame": 0, +"slice_233/end_frame": 0, +"slice_233/loop_mode": 0, +"slice_233/name": "", +"slice_233/save_to_file/enabled": false, +"slice_233/save_to_file/keep_custom_tracks": false, +"slice_233/save_to_file/path": "", +"slice_233/start_frame": 0, +"slice_234/end_frame": 0, +"slice_234/loop_mode": 0, +"slice_234/name": "", +"slice_234/save_to_file/enabled": false, +"slice_234/save_to_file/keep_custom_tracks": false, +"slice_234/save_to_file/path": "", +"slice_234/start_frame": 0, +"slice_235/end_frame": 0, +"slice_235/loop_mode": 0, +"slice_235/name": "", +"slice_235/save_to_file/enabled": false, +"slice_235/save_to_file/keep_custom_tracks": false, +"slice_235/save_to_file/path": "", +"slice_235/start_frame": 0, +"slice_236/end_frame": 0, +"slice_236/loop_mode": 0, +"slice_236/name": "", +"slice_236/save_to_file/enabled": false, +"slice_236/save_to_file/keep_custom_tracks": false, +"slice_236/save_to_file/path": "", +"slice_236/start_frame": 0, +"slice_237/end_frame": 0, +"slice_237/loop_mode": 0, +"slice_237/name": "", +"slice_237/save_to_file/enabled": false, +"slice_237/save_to_file/keep_custom_tracks": false, +"slice_237/save_to_file/path": "", +"slice_237/start_frame": 0, +"slice_238/end_frame": 0, +"slice_238/loop_mode": 0, +"slice_238/name": "", +"slice_238/save_to_file/enabled": false, +"slice_238/save_to_file/keep_custom_tracks": false, +"slice_238/save_to_file/path": "", +"slice_238/start_frame": 0, +"slice_239/end_frame": 0, +"slice_239/loop_mode": 0, +"slice_239/name": "", +"slice_239/save_to_file/enabled": false, +"slice_239/save_to_file/keep_custom_tracks": false, +"slice_239/save_to_file/path": "", +"slice_239/start_frame": 0, +"slice_24/end_frame": 0, +"slice_24/loop_mode": 0, +"slice_24/name": "", +"slice_24/save_to_file/enabled": false, +"slice_24/save_to_file/keep_custom_tracks": false, +"slice_24/save_to_file/path": "", +"slice_24/start_frame": 0, +"slice_240/end_frame": 0, +"slice_240/loop_mode": 0, +"slice_240/name": "", +"slice_240/save_to_file/enabled": false, +"slice_240/save_to_file/keep_custom_tracks": false, +"slice_240/save_to_file/path": "", +"slice_240/start_frame": 0, +"slice_241/end_frame": 0, +"slice_241/loop_mode": 0, +"slice_241/name": "", +"slice_241/save_to_file/enabled": false, +"slice_241/save_to_file/keep_custom_tracks": false, +"slice_241/save_to_file/path": "", +"slice_241/start_frame": 0, +"slice_242/end_frame": 0, +"slice_242/loop_mode": 0, +"slice_242/name": "", +"slice_242/save_to_file/enabled": false, +"slice_242/save_to_file/keep_custom_tracks": false, +"slice_242/save_to_file/path": "", +"slice_242/start_frame": 0, +"slice_243/end_frame": 0, +"slice_243/loop_mode": 0, +"slice_243/name": "", +"slice_243/save_to_file/enabled": false, +"slice_243/save_to_file/keep_custom_tracks": false, +"slice_243/save_to_file/path": "", +"slice_243/start_frame": 0, +"slice_244/end_frame": 0, +"slice_244/loop_mode": 0, +"slice_244/name": "", +"slice_244/save_to_file/enabled": false, +"slice_244/save_to_file/keep_custom_tracks": false, +"slice_244/save_to_file/path": "", +"slice_244/start_frame": 0, +"slice_245/end_frame": 0, +"slice_245/loop_mode": 0, +"slice_245/name": "", +"slice_245/save_to_file/enabled": false, +"slice_245/save_to_file/keep_custom_tracks": false, +"slice_245/save_to_file/path": "", +"slice_245/start_frame": 0, +"slice_246/end_frame": 0, +"slice_246/loop_mode": 0, +"slice_246/name": "", +"slice_246/save_to_file/enabled": false, +"slice_246/save_to_file/keep_custom_tracks": false, +"slice_246/save_to_file/path": "", +"slice_246/start_frame": 0, +"slice_247/end_frame": 0, +"slice_247/loop_mode": 0, +"slice_247/name": "", +"slice_247/save_to_file/enabled": false, +"slice_247/save_to_file/keep_custom_tracks": false, +"slice_247/save_to_file/path": "", +"slice_247/start_frame": 0, +"slice_248/end_frame": 0, +"slice_248/loop_mode": 0, +"slice_248/name": "", +"slice_248/save_to_file/enabled": false, +"slice_248/save_to_file/keep_custom_tracks": false, +"slice_248/save_to_file/path": "", +"slice_248/start_frame": 0, +"slice_249/end_frame": 0, +"slice_249/loop_mode": 0, +"slice_249/name": "", +"slice_249/save_to_file/enabled": false, +"slice_249/save_to_file/keep_custom_tracks": false, +"slice_249/save_to_file/path": "", +"slice_249/start_frame": 0, +"slice_25/end_frame": 0, +"slice_25/loop_mode": 0, +"slice_25/name": "", +"slice_25/save_to_file/enabled": false, +"slice_25/save_to_file/keep_custom_tracks": false, +"slice_25/save_to_file/path": "", +"slice_25/start_frame": 0, +"slice_250/end_frame": 0, +"slice_250/loop_mode": 0, +"slice_250/name": "", +"slice_250/save_to_file/enabled": false, +"slice_250/save_to_file/keep_custom_tracks": false, +"slice_250/save_to_file/path": "", +"slice_250/start_frame": 0, +"slice_251/end_frame": 0, +"slice_251/loop_mode": 0, +"slice_251/name": "", +"slice_251/save_to_file/enabled": false, +"slice_251/save_to_file/keep_custom_tracks": false, +"slice_251/save_to_file/path": "", +"slice_251/start_frame": 0, +"slice_252/end_frame": 0, +"slice_252/loop_mode": 0, +"slice_252/name": "", +"slice_252/save_to_file/enabled": false, +"slice_252/save_to_file/keep_custom_tracks": false, +"slice_252/save_to_file/path": "", +"slice_252/start_frame": 0, +"slice_253/end_frame": 0, +"slice_253/loop_mode": 0, +"slice_253/name": "", +"slice_253/save_to_file/enabled": false, +"slice_253/save_to_file/keep_custom_tracks": false, +"slice_253/save_to_file/path": "", +"slice_253/start_frame": 0, +"slice_254/end_frame": 0, +"slice_254/loop_mode": 0, +"slice_254/name": "", +"slice_254/save_to_file/enabled": false, +"slice_254/save_to_file/keep_custom_tracks": false, +"slice_254/save_to_file/path": "", +"slice_254/start_frame": 0, +"slice_255/end_frame": 0, +"slice_255/loop_mode": 0, +"slice_255/name": "", +"slice_255/save_to_file/enabled": false, +"slice_255/save_to_file/keep_custom_tracks": false, +"slice_255/save_to_file/path": "", +"slice_255/start_frame": 0, +"slice_256/end_frame": 0, +"slice_256/loop_mode": 0, +"slice_256/name": "", +"slice_256/save_to_file/enabled": false, +"slice_256/save_to_file/keep_custom_tracks": false, +"slice_256/save_to_file/path": "", +"slice_256/start_frame": 0, +"slice_26/end_frame": 0, +"slice_26/loop_mode": 0, +"slice_26/name": "", +"slice_26/save_to_file/enabled": false, +"slice_26/save_to_file/keep_custom_tracks": false, +"slice_26/save_to_file/path": "", +"slice_26/start_frame": 0, +"slice_27/end_frame": 0, +"slice_27/loop_mode": 0, +"slice_27/name": "", +"slice_27/save_to_file/enabled": false, +"slice_27/save_to_file/keep_custom_tracks": false, +"slice_27/save_to_file/path": "", +"slice_27/start_frame": 0, +"slice_28/end_frame": 0, +"slice_28/loop_mode": 0, +"slice_28/name": "", +"slice_28/save_to_file/enabled": false, +"slice_28/save_to_file/keep_custom_tracks": false, +"slice_28/save_to_file/path": "", +"slice_28/start_frame": 0, +"slice_29/end_frame": 0, +"slice_29/loop_mode": 0, +"slice_29/name": "", +"slice_29/save_to_file/enabled": false, +"slice_29/save_to_file/keep_custom_tracks": false, +"slice_29/save_to_file/path": "", +"slice_29/start_frame": 0, +"slice_3/end_frame": 0, +"slice_3/loop_mode": 0, +"slice_3/name": "", +"slice_3/save_to_file/enabled": false, +"slice_3/save_to_file/keep_custom_tracks": false, +"slice_3/save_to_file/path": "", +"slice_3/start_frame": 0, +"slice_30/end_frame": 0, +"slice_30/loop_mode": 0, +"slice_30/name": "", +"slice_30/save_to_file/enabled": false, +"slice_30/save_to_file/keep_custom_tracks": false, +"slice_30/save_to_file/path": "", +"slice_30/start_frame": 0, +"slice_31/end_frame": 0, +"slice_31/loop_mode": 0, +"slice_31/name": "", +"slice_31/save_to_file/enabled": false, +"slice_31/save_to_file/keep_custom_tracks": false, +"slice_31/save_to_file/path": "", +"slice_31/start_frame": 0, +"slice_32/end_frame": 0, +"slice_32/loop_mode": 0, +"slice_32/name": "", +"slice_32/save_to_file/enabled": false, +"slice_32/save_to_file/keep_custom_tracks": false, +"slice_32/save_to_file/path": "", +"slice_32/start_frame": 0, +"slice_33/end_frame": 0, +"slice_33/loop_mode": 0, +"slice_33/name": "", +"slice_33/save_to_file/enabled": false, +"slice_33/save_to_file/keep_custom_tracks": false, +"slice_33/save_to_file/path": "", +"slice_33/start_frame": 0, +"slice_34/end_frame": 0, +"slice_34/loop_mode": 0, +"slice_34/name": "", +"slice_34/save_to_file/enabled": false, +"slice_34/save_to_file/keep_custom_tracks": false, +"slice_34/save_to_file/path": "", +"slice_34/start_frame": 0, +"slice_35/end_frame": 0, +"slice_35/loop_mode": 0, +"slice_35/name": "", +"slice_35/save_to_file/enabled": false, +"slice_35/save_to_file/keep_custom_tracks": false, +"slice_35/save_to_file/path": "", +"slice_35/start_frame": 0, +"slice_36/end_frame": 0, +"slice_36/loop_mode": 0, +"slice_36/name": "", +"slice_36/save_to_file/enabled": false, +"slice_36/save_to_file/keep_custom_tracks": false, +"slice_36/save_to_file/path": "", +"slice_36/start_frame": 0, +"slice_37/end_frame": 0, +"slice_37/loop_mode": 0, +"slice_37/name": "", +"slice_37/save_to_file/enabled": false, +"slice_37/save_to_file/keep_custom_tracks": false, +"slice_37/save_to_file/path": "", +"slice_37/start_frame": 0, +"slice_38/end_frame": 0, +"slice_38/loop_mode": 0, +"slice_38/name": "", +"slice_38/save_to_file/enabled": false, +"slice_38/save_to_file/keep_custom_tracks": false, +"slice_38/save_to_file/path": "", +"slice_38/start_frame": 0, +"slice_39/end_frame": 0, +"slice_39/loop_mode": 0, +"slice_39/name": "", +"slice_39/save_to_file/enabled": false, +"slice_39/save_to_file/keep_custom_tracks": false, +"slice_39/save_to_file/path": "", +"slice_39/start_frame": 0, +"slice_4/end_frame": 0, +"slice_4/loop_mode": 0, +"slice_4/name": "", +"slice_4/save_to_file/enabled": false, +"slice_4/save_to_file/keep_custom_tracks": false, +"slice_4/save_to_file/path": "", +"slice_4/start_frame": 0, +"slice_40/end_frame": 0, +"slice_40/loop_mode": 0, +"slice_40/name": "", +"slice_40/save_to_file/enabled": false, +"slice_40/save_to_file/keep_custom_tracks": false, +"slice_40/save_to_file/path": "", +"slice_40/start_frame": 0, +"slice_41/end_frame": 0, +"slice_41/loop_mode": 0, +"slice_41/name": "", +"slice_41/save_to_file/enabled": false, +"slice_41/save_to_file/keep_custom_tracks": false, +"slice_41/save_to_file/path": "", +"slice_41/start_frame": 0, +"slice_42/end_frame": 0, +"slice_42/loop_mode": 0, +"slice_42/name": "", +"slice_42/save_to_file/enabled": false, +"slice_42/save_to_file/keep_custom_tracks": false, +"slice_42/save_to_file/path": "", +"slice_42/start_frame": 0, +"slice_43/end_frame": 0, +"slice_43/loop_mode": 0, +"slice_43/name": "", +"slice_43/save_to_file/enabled": false, +"slice_43/save_to_file/keep_custom_tracks": false, +"slice_43/save_to_file/path": "", +"slice_43/start_frame": 0, +"slice_44/end_frame": 0, +"slice_44/loop_mode": 0, +"slice_44/name": "", +"slice_44/save_to_file/enabled": false, +"slice_44/save_to_file/keep_custom_tracks": false, +"slice_44/save_to_file/path": "", +"slice_44/start_frame": 0, +"slice_45/end_frame": 0, +"slice_45/loop_mode": 0, +"slice_45/name": "", +"slice_45/save_to_file/enabled": false, +"slice_45/save_to_file/keep_custom_tracks": false, +"slice_45/save_to_file/path": "", +"slice_45/start_frame": 0, +"slice_46/end_frame": 0, +"slice_46/loop_mode": 0, +"slice_46/name": "", +"slice_46/save_to_file/enabled": false, +"slice_46/save_to_file/keep_custom_tracks": false, +"slice_46/save_to_file/path": "", +"slice_46/start_frame": 0, +"slice_47/end_frame": 0, +"slice_47/loop_mode": 0, +"slice_47/name": "", +"slice_47/save_to_file/enabled": false, +"slice_47/save_to_file/keep_custom_tracks": false, +"slice_47/save_to_file/path": "", +"slice_47/start_frame": 0, +"slice_48/end_frame": 0, +"slice_48/loop_mode": 0, +"slice_48/name": "", +"slice_48/save_to_file/enabled": false, +"slice_48/save_to_file/keep_custom_tracks": false, +"slice_48/save_to_file/path": "", +"slice_48/start_frame": 0, +"slice_49/end_frame": 0, +"slice_49/loop_mode": 0, +"slice_49/name": "", +"slice_49/save_to_file/enabled": false, +"slice_49/save_to_file/keep_custom_tracks": false, +"slice_49/save_to_file/path": "", +"slice_49/start_frame": 0, +"slice_5/end_frame": 0, +"slice_5/loop_mode": 0, +"slice_5/name": "", +"slice_5/save_to_file/enabled": false, +"slice_5/save_to_file/keep_custom_tracks": false, +"slice_5/save_to_file/path": "", +"slice_5/start_frame": 0, +"slice_50/end_frame": 0, +"slice_50/loop_mode": 0, +"slice_50/name": "", +"slice_50/save_to_file/enabled": false, +"slice_50/save_to_file/keep_custom_tracks": false, +"slice_50/save_to_file/path": "", +"slice_50/start_frame": 0, +"slice_51/end_frame": 0, +"slice_51/loop_mode": 0, +"slice_51/name": "", +"slice_51/save_to_file/enabled": false, +"slice_51/save_to_file/keep_custom_tracks": false, +"slice_51/save_to_file/path": "", +"slice_51/start_frame": 0, +"slice_52/end_frame": 0, +"slice_52/loop_mode": 0, +"slice_52/name": "", +"slice_52/save_to_file/enabled": false, +"slice_52/save_to_file/keep_custom_tracks": false, +"slice_52/save_to_file/path": "", +"slice_52/start_frame": 0, +"slice_53/end_frame": 0, +"slice_53/loop_mode": 0, +"slice_53/name": "", +"slice_53/save_to_file/enabled": false, +"slice_53/save_to_file/keep_custom_tracks": false, +"slice_53/save_to_file/path": "", +"slice_53/start_frame": 0, +"slice_54/end_frame": 0, +"slice_54/loop_mode": 0, +"slice_54/name": "", +"slice_54/save_to_file/enabled": false, +"slice_54/save_to_file/keep_custom_tracks": false, +"slice_54/save_to_file/path": "", +"slice_54/start_frame": 0, +"slice_55/end_frame": 0, +"slice_55/loop_mode": 0, +"slice_55/name": "", +"slice_55/save_to_file/enabled": false, +"slice_55/save_to_file/keep_custom_tracks": false, +"slice_55/save_to_file/path": "", +"slice_55/start_frame": 0, +"slice_56/end_frame": 0, +"slice_56/loop_mode": 0, +"slice_56/name": "", +"slice_56/save_to_file/enabled": false, +"slice_56/save_to_file/keep_custom_tracks": false, +"slice_56/save_to_file/path": "", +"slice_56/start_frame": 0, +"slice_57/end_frame": 0, +"slice_57/loop_mode": 0, +"slice_57/name": "", +"slice_57/save_to_file/enabled": false, +"slice_57/save_to_file/keep_custom_tracks": false, +"slice_57/save_to_file/path": "", +"slice_57/start_frame": 0, +"slice_58/end_frame": 0, +"slice_58/loop_mode": 0, +"slice_58/name": "", +"slice_58/save_to_file/enabled": false, +"slice_58/save_to_file/keep_custom_tracks": false, +"slice_58/save_to_file/path": "", +"slice_58/start_frame": 0, +"slice_59/end_frame": 0, +"slice_59/loop_mode": 0, +"slice_59/name": "", +"slice_59/save_to_file/enabled": false, +"slice_59/save_to_file/keep_custom_tracks": false, +"slice_59/save_to_file/path": "", +"slice_59/start_frame": 0, +"slice_6/end_frame": 0, +"slice_6/loop_mode": 0, +"slice_6/name": "", +"slice_6/save_to_file/enabled": false, +"slice_6/save_to_file/keep_custom_tracks": false, +"slice_6/save_to_file/path": "", +"slice_6/start_frame": 0, +"slice_60/end_frame": 0, +"slice_60/loop_mode": 0, +"slice_60/name": "", +"slice_60/save_to_file/enabled": false, +"slice_60/save_to_file/keep_custom_tracks": false, +"slice_60/save_to_file/path": "", +"slice_60/start_frame": 0, +"slice_61/end_frame": 0, +"slice_61/loop_mode": 0, +"slice_61/name": "", +"slice_61/save_to_file/enabled": false, +"slice_61/save_to_file/keep_custom_tracks": false, +"slice_61/save_to_file/path": "", +"slice_61/start_frame": 0, +"slice_62/end_frame": 0, +"slice_62/loop_mode": 0, +"slice_62/name": "", +"slice_62/save_to_file/enabled": false, +"slice_62/save_to_file/keep_custom_tracks": false, +"slice_62/save_to_file/path": "", +"slice_62/start_frame": 0, +"slice_63/end_frame": 0, +"slice_63/loop_mode": 0, +"slice_63/name": "", +"slice_63/save_to_file/enabled": false, +"slice_63/save_to_file/keep_custom_tracks": false, +"slice_63/save_to_file/path": "", +"slice_63/start_frame": 0, +"slice_64/end_frame": 0, +"slice_64/loop_mode": 0, +"slice_64/name": "", +"slice_64/save_to_file/enabled": false, +"slice_64/save_to_file/keep_custom_tracks": false, +"slice_64/save_to_file/path": "", +"slice_64/start_frame": 0, +"slice_65/end_frame": 0, +"slice_65/loop_mode": 0, +"slice_65/name": "", +"slice_65/save_to_file/enabled": false, +"slice_65/save_to_file/keep_custom_tracks": false, +"slice_65/save_to_file/path": "", +"slice_65/start_frame": 0, +"slice_66/end_frame": 0, +"slice_66/loop_mode": 0, +"slice_66/name": "", +"slice_66/save_to_file/enabled": false, +"slice_66/save_to_file/keep_custom_tracks": false, +"slice_66/save_to_file/path": "", +"slice_66/start_frame": 0, +"slice_67/end_frame": 0, +"slice_67/loop_mode": 0, +"slice_67/name": "", +"slice_67/save_to_file/enabled": false, +"slice_67/save_to_file/keep_custom_tracks": false, +"slice_67/save_to_file/path": "", +"slice_67/start_frame": 0, +"slice_68/end_frame": 0, +"slice_68/loop_mode": 0, +"slice_68/name": "", +"slice_68/save_to_file/enabled": false, +"slice_68/save_to_file/keep_custom_tracks": false, +"slice_68/save_to_file/path": "", +"slice_68/start_frame": 0, +"slice_69/end_frame": 0, +"slice_69/loop_mode": 0, +"slice_69/name": "", +"slice_69/save_to_file/enabled": false, +"slice_69/save_to_file/keep_custom_tracks": false, +"slice_69/save_to_file/path": "", +"slice_69/start_frame": 0, +"slice_7/end_frame": 0, +"slice_7/loop_mode": 0, +"slice_7/name": "", +"slice_7/save_to_file/enabled": false, +"slice_7/save_to_file/keep_custom_tracks": false, +"slice_7/save_to_file/path": "", +"slice_7/start_frame": 0, +"slice_70/end_frame": 0, +"slice_70/loop_mode": 0, +"slice_70/name": "", +"slice_70/save_to_file/enabled": false, +"slice_70/save_to_file/keep_custom_tracks": false, +"slice_70/save_to_file/path": "", +"slice_70/start_frame": 0, +"slice_71/end_frame": 0, +"slice_71/loop_mode": 0, +"slice_71/name": "", +"slice_71/save_to_file/enabled": false, +"slice_71/save_to_file/keep_custom_tracks": false, +"slice_71/save_to_file/path": "", +"slice_71/start_frame": 0, +"slice_72/end_frame": 0, +"slice_72/loop_mode": 0, +"slice_72/name": "", +"slice_72/save_to_file/enabled": false, +"slice_72/save_to_file/keep_custom_tracks": false, +"slice_72/save_to_file/path": "", +"slice_72/start_frame": 0, +"slice_73/end_frame": 0, +"slice_73/loop_mode": 0, +"slice_73/name": "", +"slice_73/save_to_file/enabled": false, +"slice_73/save_to_file/keep_custom_tracks": false, +"slice_73/save_to_file/path": "", +"slice_73/start_frame": 0, +"slice_74/end_frame": 0, +"slice_74/loop_mode": 0, +"slice_74/name": "", +"slice_74/save_to_file/enabled": false, +"slice_74/save_to_file/keep_custom_tracks": false, +"slice_74/save_to_file/path": "", +"slice_74/start_frame": 0, +"slice_75/end_frame": 0, +"slice_75/loop_mode": 0, +"slice_75/name": "", +"slice_75/save_to_file/enabled": false, +"slice_75/save_to_file/keep_custom_tracks": false, +"slice_75/save_to_file/path": "", +"slice_75/start_frame": 0, +"slice_76/end_frame": 0, +"slice_76/loop_mode": 0, +"slice_76/name": "", +"slice_76/save_to_file/enabled": false, +"slice_76/save_to_file/keep_custom_tracks": false, +"slice_76/save_to_file/path": "", +"slice_76/start_frame": 0, +"slice_77/end_frame": 0, +"slice_77/loop_mode": 0, +"slice_77/name": "", +"slice_77/save_to_file/enabled": false, +"slice_77/save_to_file/keep_custom_tracks": false, +"slice_77/save_to_file/path": "", +"slice_77/start_frame": 0, +"slice_78/end_frame": 0, +"slice_78/loop_mode": 0, +"slice_78/name": "", +"slice_78/save_to_file/enabled": false, +"slice_78/save_to_file/keep_custom_tracks": false, +"slice_78/save_to_file/path": "", +"slice_78/start_frame": 0, +"slice_79/end_frame": 0, +"slice_79/loop_mode": 0, +"slice_79/name": "", +"slice_79/save_to_file/enabled": false, +"slice_79/save_to_file/keep_custom_tracks": false, +"slice_79/save_to_file/path": "", +"slice_79/start_frame": 0, +"slice_8/end_frame": 0, +"slice_8/loop_mode": 0, +"slice_8/name": "", +"slice_8/save_to_file/enabled": false, +"slice_8/save_to_file/keep_custom_tracks": false, +"slice_8/save_to_file/path": "", +"slice_8/start_frame": 0, +"slice_80/end_frame": 0, +"slice_80/loop_mode": 0, +"slice_80/name": "", +"slice_80/save_to_file/enabled": false, +"slice_80/save_to_file/keep_custom_tracks": false, +"slice_80/save_to_file/path": "", +"slice_80/start_frame": 0, +"slice_81/end_frame": 0, +"slice_81/loop_mode": 0, +"slice_81/name": "", +"slice_81/save_to_file/enabled": false, +"slice_81/save_to_file/keep_custom_tracks": false, +"slice_81/save_to_file/path": "", +"slice_81/start_frame": 0, +"slice_82/end_frame": 0, +"slice_82/loop_mode": 0, +"slice_82/name": "", +"slice_82/save_to_file/enabled": false, +"slice_82/save_to_file/keep_custom_tracks": false, +"slice_82/save_to_file/path": "", +"slice_82/start_frame": 0, +"slice_83/end_frame": 0, +"slice_83/loop_mode": 0, +"slice_83/name": "", +"slice_83/save_to_file/enabled": false, +"slice_83/save_to_file/keep_custom_tracks": false, +"slice_83/save_to_file/path": "", +"slice_83/start_frame": 0, +"slice_84/end_frame": 0, +"slice_84/loop_mode": 0, +"slice_84/name": "", +"slice_84/save_to_file/enabled": false, +"slice_84/save_to_file/keep_custom_tracks": false, +"slice_84/save_to_file/path": "", +"slice_84/start_frame": 0, +"slice_85/end_frame": 0, +"slice_85/loop_mode": 0, +"slice_85/name": "", +"slice_85/save_to_file/enabled": false, +"slice_85/save_to_file/keep_custom_tracks": false, +"slice_85/save_to_file/path": "", +"slice_85/start_frame": 0, +"slice_86/end_frame": 0, +"slice_86/loop_mode": 0, +"slice_86/name": "", +"slice_86/save_to_file/enabled": false, +"slice_86/save_to_file/keep_custom_tracks": false, +"slice_86/save_to_file/path": "", +"slice_86/start_frame": 0, +"slice_87/end_frame": 0, +"slice_87/loop_mode": 0, +"slice_87/name": "", +"slice_87/save_to_file/enabled": false, +"slice_87/save_to_file/keep_custom_tracks": false, +"slice_87/save_to_file/path": "", +"slice_87/start_frame": 0, +"slice_88/end_frame": 0, +"slice_88/loop_mode": 0, +"slice_88/name": "", +"slice_88/save_to_file/enabled": false, +"slice_88/save_to_file/keep_custom_tracks": false, +"slice_88/save_to_file/path": "", +"slice_88/start_frame": 0, +"slice_89/end_frame": 0, +"slice_89/loop_mode": 0, +"slice_89/name": "", +"slice_89/save_to_file/enabled": false, +"slice_89/save_to_file/keep_custom_tracks": false, +"slice_89/save_to_file/path": "", +"slice_89/start_frame": 0, +"slice_9/end_frame": 0, +"slice_9/loop_mode": 0, +"slice_9/name": "", +"slice_9/save_to_file/enabled": false, +"slice_9/save_to_file/keep_custom_tracks": false, +"slice_9/save_to_file/path": "", +"slice_9/start_frame": 0, +"slice_90/end_frame": 0, +"slice_90/loop_mode": 0, +"slice_90/name": "", +"slice_90/save_to_file/enabled": false, +"slice_90/save_to_file/keep_custom_tracks": false, +"slice_90/save_to_file/path": "", +"slice_90/start_frame": 0, +"slice_91/end_frame": 0, +"slice_91/loop_mode": 0, +"slice_91/name": "", +"slice_91/save_to_file/enabled": false, +"slice_91/save_to_file/keep_custom_tracks": false, +"slice_91/save_to_file/path": "", +"slice_91/start_frame": 0, +"slice_92/end_frame": 0, +"slice_92/loop_mode": 0, +"slice_92/name": "", +"slice_92/save_to_file/enabled": false, +"slice_92/save_to_file/keep_custom_tracks": false, +"slice_92/save_to_file/path": "", +"slice_92/start_frame": 0, +"slice_93/end_frame": 0, +"slice_93/loop_mode": 0, +"slice_93/name": "", +"slice_93/save_to_file/enabled": false, +"slice_93/save_to_file/keep_custom_tracks": false, +"slice_93/save_to_file/path": "", +"slice_93/start_frame": 0, +"slice_94/end_frame": 0, +"slice_94/loop_mode": 0, +"slice_94/name": "", +"slice_94/save_to_file/enabled": false, +"slice_94/save_to_file/keep_custom_tracks": false, +"slice_94/save_to_file/path": "", +"slice_94/start_frame": 0, +"slice_95/end_frame": 0, +"slice_95/loop_mode": 0, +"slice_95/name": "", +"slice_95/save_to_file/enabled": false, +"slice_95/save_to_file/keep_custom_tracks": false, +"slice_95/save_to_file/path": "", +"slice_95/start_frame": 0, +"slice_96/end_frame": 0, +"slice_96/loop_mode": 0, +"slice_96/name": "", +"slice_96/save_to_file/enabled": false, +"slice_96/save_to_file/keep_custom_tracks": false, +"slice_96/save_to_file/path": "", +"slice_96/start_frame": 0, +"slice_97/end_frame": 0, +"slice_97/loop_mode": 0, +"slice_97/name": "", +"slice_97/save_to_file/enabled": false, +"slice_97/save_to_file/keep_custom_tracks": false, +"slice_97/save_to_file/path": "", +"slice_97/start_frame": 0, +"slice_98/end_frame": 0, +"slice_98/loop_mode": 0, +"slice_98/name": "", +"slice_98/save_to_file/enabled": false, +"slice_98/save_to_file/keep_custom_tracks": false, +"slice_98/save_to_file/path": "", +"slice_98/start_frame": 0, +"slice_99/end_frame": 0, +"slice_99/loop_mode": 0, +"slice_99/name": "", +"slice_99/save_to_file/enabled": false, +"slice_99/save_to_file/keep_custom_tracks": false, +"slice_99/save_to_file/path": "", +"slice_99/start_frame": 0, +"slices/amount": null +} +}, +"materials": { +"Material.002": { +"use_external/enabled": true, +"use_external/path": "res://materials/MainTexture.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/models/Myd_general_texture-Recovered.png b/models/Myd_general_texture-Recovered.png new file mode 100644 index 0000000..ddadfa2 --- /dev/null +++ b/models/Myd_general_texture-Recovered.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2b571360a2744923ee3ff5eaa474ca6c610763d6efc209d454fd90b8fdec29c +size 1474 diff --git a/models/Myd_general_texture-Recovered.png.import b/models/Myd_general_texture-Recovered.png.import new file mode 100644 index 0000000..40defa5 --- /dev/null +++ b/models/Myd_general_texture-Recovered.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://tlpkbk78kpx0" +path.s3tc="res://.godot/imported/Myd_general_texture-Recovered.png-ef720d9924f6baa39ab8181bf3abad54.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={} + +[deps] + +source_file="res://models/Myd_general_texture-Recovered.png" +dest_files=["res://.godot/imported/Myd_general_texture-Recovered.png-ef720d9924f6baa39ab8181bf3abad54.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/models/arbusto.glb b/models/arbusto.glb new file mode 100644 index 0000000..0fac618 --- /dev/null +++ b/models/arbusto.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:014ddaa14fedee57bb867c1349094941b25f85739eff6872b3a2b4fa3b00f504 +size 12804 diff --git a/models/arbusto.glb.import b/models/arbusto.glb.import new file mode 100644 index 0000000..f34eacb --- /dev/null +++ b/models/arbusto.glb.import @@ -0,0 +1,39 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://blgj5rrqy2wxk" +path="res://.godot/imported/arbusto.glb-b9d8e08c7d56e66cf4ac6d8dbf078005.scn" + +[deps] + +source_file="res://models/arbusto.glb" +dest_files=["res://.godot/imported/arbusto.glb-b9d8e08c7d56e66cf4ac6d8dbf078005.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Material.003": { +"use_external/enabled": true, +"use_external/path": "res://materials/plants_opacity.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/models/arbusto_vegetation_terrains.png b/models/arbusto_vegetation_terrains.png new file mode 100644 index 0000000..187dff1 --- /dev/null +++ b/models/arbusto_vegetation_terrains.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:800029739505df93467b3463612aad78d90f19fe15b18b46d672f66ea83585b0 +size 4870 diff --git a/models/arbusto_vegetation_terrains.png.import b/models/arbusto_vegetation_terrains.png.import new file mode 100644 index 0000000..47be687 --- /dev/null +++ b/models/arbusto_vegetation_terrains.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cpthta46g1cd6" +path="res://.godot/imported/arbusto_vegetation_terrains.png-19234bd099645856e21f5f63401b774f.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={} + +[deps] + +source_file="res://models/arbusto_vegetation_terrains.png" +dest_files=["res://.godot/imported/arbusto_vegetation_terrains.png-19234bd099645856e21f5f63401b774f.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=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=1 diff --git a/models/banco.glb b/models/banco.glb new file mode 100644 index 0000000..8ef4faa --- /dev/null +++ b/models/banco.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b518f9efc70fc4b3f016614c4238def5a49d9a19818d316fede3af4af5e10214 +size 14132 diff --git a/models/banco.glb.import b/models/banco.glb.import new file mode 100644 index 0000000..78f3b92 --- /dev/null +++ b/models/banco.glb.import @@ -0,0 +1,39 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://4bgld0xe5jxd" +path="res://.godot/imported/banco.glb-e1b902f6e9dbf8b0380266980e7993c0.scn" + +[deps] + +source_file="res://models/banco.glb" +dest_files=["res://.godot/imported/banco.glb-e1b902f6e9dbf8b0380266980e7993c0.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Material": { +"use_external/enabled": true, +"use_external/path": "res://materials/opaque_terrains.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/models/banco_vegetation_terrains.png b/models/banco_vegetation_terrains.png new file mode 100644 index 0000000..770cac0 --- /dev/null +++ b/models/banco_vegetation_terrains.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5cf2c3da4317195710af91e7c6eb69725e88751920b5443d0cf1a517f55505e2 +size 5491 diff --git a/models/banco_vegetation_terrains.png.import b/models/banco_vegetation_terrains.png.import new file mode 100644 index 0000000..a864236 --- /dev/null +++ b/models/banco_vegetation_terrains.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://8elcxu7tnv0y" +path.s3tc="res://.godot/imported/banco_vegetation_terrains.png-b9b169479a333397c707d24fb21929dd.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={} + +[deps] + +source_file="res://models/banco_vegetation_terrains.png" +dest_files=["res://.godot/imported/banco_vegetation_terrains.png-b9b169479a333397c707d24fb21929dd.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/models/barco.glb b/models/barco.glb new file mode 100644 index 0000000..d216eba --- /dev/null +++ b/models/barco.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4655184d66bf1ec39258c91a7210e8d9892f115957a0fb06d3c5286323f588d8 +size 79832 diff --git a/models/barco.glb.import b/models/barco.glb.import new file mode 100644 index 0000000..f5dda29 --- /dev/null +++ b/models/barco.glb.import @@ -0,0 +1,39 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://du8cdi3hog355" +path="res://.godot/imported/barco.glb-01ed72d3af45628c573857ea40adc7fc.scn" + +[deps] + +source_file="res://models/barco.glb" +dest_files=["res://.godot/imported/barco.glb-01ed72d3af45628c573857ea40adc7fc.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Material.001": { +"use_external/enabled": true, +"use_external/path": "res://materials/opaque_terrains.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/models/barco_vegetation_terrains.png b/models/barco_vegetation_terrains.png new file mode 100644 index 0000000..e2a6c00 --- /dev/null +++ b/models/barco_vegetation_terrains.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d916979fd12621a154208fa370488dec8a6b359cd62520e43763c4d932069bed +size 1155 diff --git a/models/barco_vegetation_terrains.png.import b/models/barco_vegetation_terrains.png.import new file mode 100644 index 0000000..7d0ac9e --- /dev/null +++ b/models/barco_vegetation_terrains.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ciwf1ibxbudj2" +path="res://.godot/imported/barco_vegetation_terrains.png-8a92f09ef978e614ecd96863b5d1c5ce.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={} + +[deps] + +source_file="res://models/barco_vegetation_terrains.png" +dest_files=["res://.godot/imported/barco_vegetation_terrains.png-8a92f09ef978e614ecd96863b5d1c5ce.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=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=1 diff --git a/models/caja.glb b/models/caja.glb new file mode 100644 index 0000000..fe7d88e --- /dev/null +++ b/models/caja.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7566427ca5d76dc5236418ba9b7491987cb93a1c8cca4f88aef85d24d01c3d6c +size 19332 diff --git a/models/caja.glb.import b/models/caja.glb.import new file mode 100644 index 0000000..01f3c20 --- /dev/null +++ b/models/caja.glb.import @@ -0,0 +1,39 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bw5uidace7wvs" +path="res://.godot/imported/caja.glb-1bd3475d9700b632b4341806dfa8fa87.scn" + +[deps] + +source_file="res://models/caja.glb" +dest_files=["res://.godot/imported/caja.glb-1bd3475d9700b632b4341806dfa8fa87.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Material.002": { +"use_external/enabled": true, +"use_external/path": "res://materials/opaque_terrains.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/models/caja_vegetation_terrains.png b/models/caja_vegetation_terrains.png new file mode 100644 index 0000000..770cac0 --- /dev/null +++ b/models/caja_vegetation_terrains.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5cf2c3da4317195710af91e7c6eb69725e88751920b5443d0cf1a517f55505e2 +size 5491 diff --git a/models/caja_vegetation_terrains.png.import b/models/caja_vegetation_terrains.png.import new file mode 100644 index 0000000..637a4d4 --- /dev/null +++ b/models/caja_vegetation_terrains.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://0hdb585bbp32" +path.s3tc="res://.godot/imported/caja_vegetation_terrains.png-4acfc97073e51914efbd6d9e33bff9cd.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={} + +[deps] + +source_file="res://models/caja_vegetation_terrains.png" +dest_files=["res://.godot/imported/caja_vegetation_terrains.png-4acfc97073e51914efbd6d9e33bff9cd.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/models/cama.glb b/models/cama.glb new file mode 100644 index 0000000..8549108 --- /dev/null +++ b/models/cama.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e992b1e27565c9e14ed7e0c62d250bcea87d31031ede441eac520334a810d099 +size 14672 diff --git a/models/cama.glb.import b/models/cama.glb.import new file mode 100644 index 0000000..aa2b1da --- /dev/null +++ b/models/cama.glb.import @@ -0,0 +1,39 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bgqwqeo815bmn" +path="res://.godot/imported/cama.glb-8497e3701719dc98039bac2a4388901f.scn" + +[deps] + +source_file="res://models/cama.glb" +dest_files=["res://.godot/imported/cama.glb-8497e3701719dc98039bac2a4388901f.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Material": { +"use_external/enabled": true, +"use_external/path": "res://materials/opaque_terrains.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/models/cama_vegetation_terrains.png b/models/cama_vegetation_terrains.png new file mode 100644 index 0000000..770cac0 --- /dev/null +++ b/models/cama_vegetation_terrains.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5cf2c3da4317195710af91e7c6eb69725e88751920b5443d0cf1a517f55505e2 +size 5491 diff --git a/models/cama_vegetation_terrains.png.import b/models/cama_vegetation_terrains.png.import new file mode 100644 index 0000000..7cacaa4 --- /dev/null +++ b/models/cama_vegetation_terrains.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c6s6k8tb4hjiy" +path.s3tc="res://.godot/imported/cama_vegetation_terrains.png-c15a972681eff4174c964a1407e53270.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={} + +[deps] + +source_file="res://models/cama_vegetation_terrains.png" +dest_files=["res://.godot/imported/cama_vegetation_terrains.png-c15a972681eff4174c964a1407e53270.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/models/captain_D._Ed.glb b/models/captain_D._Ed.glb new file mode 100644 index 0000000..b298f49 --- /dev/null +++ b/models/captain_D._Ed.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1f477bd5e808b51eaf2ac0eb0df052cfda00c41e64a1ca2c61a38251e6fbd0c7 +size 175968 diff --git a/models/captain_D._Ed.glb.import b/models/captain_D._Ed.glb.import new file mode 100644 index 0000000..7957401 --- /dev/null +++ b/models/captain_D._Ed.glb.import @@ -0,0 +1,3643 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://df3qcpluh0yxr" +path="res://.godot/imported/captain_D._Ed.glb-acf01ef9952c1ca247f3f7c2b9ac88dc.scn" + +[deps] + +source_file="res://models/captain_D._Ed.glb" +dest_files=["res://.godot/imported/captain_D._Ed.glb-acf01ef9952c1ca247f3f7c2b9ac88dc.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=0.2 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"animations": { +"death": { +"save_to_file/enabled": false, +"save_to_file/keep_custom_tracks": "", +"save_to_file/path": "", +"settings/loop_mode": 1, +"slice_1/end_frame": 0, +"slice_1/loop_mode": 0, +"slice_1/name": "", +"slice_1/save_to_file/enabled": false, +"slice_1/save_to_file/keep_custom_tracks": false, +"slice_1/save_to_file/path": "", +"slice_1/start_frame": 0, +"slice_10/end_frame": 0, +"slice_10/loop_mode": 0, +"slice_10/name": "", +"slice_10/save_to_file/enabled": false, +"slice_10/save_to_file/keep_custom_tracks": false, +"slice_10/save_to_file/path": "", +"slice_10/start_frame": 0, +"slice_100/end_frame": 0, +"slice_100/loop_mode": 0, +"slice_100/name": "", +"slice_100/save_to_file/enabled": false, +"slice_100/save_to_file/keep_custom_tracks": false, +"slice_100/save_to_file/path": "", +"slice_100/start_frame": 0, +"slice_101/end_frame": 0, +"slice_101/loop_mode": 0, +"slice_101/name": "", +"slice_101/save_to_file/enabled": false, +"slice_101/save_to_file/keep_custom_tracks": false, +"slice_101/save_to_file/path": "", +"slice_101/start_frame": 0, +"slice_102/end_frame": 0, +"slice_102/loop_mode": 0, +"slice_102/name": "", +"slice_102/save_to_file/enabled": false, +"slice_102/save_to_file/keep_custom_tracks": false, +"slice_102/save_to_file/path": "", +"slice_102/start_frame": 0, +"slice_103/end_frame": 0, +"slice_103/loop_mode": 0, +"slice_103/name": "", +"slice_103/save_to_file/enabled": false, +"slice_103/save_to_file/keep_custom_tracks": false, +"slice_103/save_to_file/path": "", +"slice_103/start_frame": 0, +"slice_104/end_frame": 0, +"slice_104/loop_mode": 0, +"slice_104/name": "", +"slice_104/save_to_file/enabled": false, +"slice_104/save_to_file/keep_custom_tracks": false, +"slice_104/save_to_file/path": "", +"slice_104/start_frame": 0, +"slice_105/end_frame": 0, +"slice_105/loop_mode": 0, +"slice_105/name": "", +"slice_105/save_to_file/enabled": false, +"slice_105/save_to_file/keep_custom_tracks": false, +"slice_105/save_to_file/path": "", +"slice_105/start_frame": 0, +"slice_106/end_frame": 0, +"slice_106/loop_mode": 0, +"slice_106/name": "", +"slice_106/save_to_file/enabled": false, +"slice_106/save_to_file/keep_custom_tracks": false, +"slice_106/save_to_file/path": "", +"slice_106/start_frame": 0, +"slice_107/end_frame": 0, +"slice_107/loop_mode": 0, +"slice_107/name": "", +"slice_107/save_to_file/enabled": false, +"slice_107/save_to_file/keep_custom_tracks": false, +"slice_107/save_to_file/path": "", +"slice_107/start_frame": 0, +"slice_108/end_frame": 0, +"slice_108/loop_mode": 0, +"slice_108/name": "", +"slice_108/save_to_file/enabled": false, +"slice_108/save_to_file/keep_custom_tracks": false, +"slice_108/save_to_file/path": "", +"slice_108/start_frame": 0, +"slice_109/end_frame": 0, +"slice_109/loop_mode": 0, +"slice_109/name": "", +"slice_109/save_to_file/enabled": false, +"slice_109/save_to_file/keep_custom_tracks": false, +"slice_109/save_to_file/path": "", +"slice_109/start_frame": 0, +"slice_11/end_frame": 0, +"slice_11/loop_mode": 0, +"slice_11/name": "", +"slice_11/save_to_file/enabled": false, +"slice_11/save_to_file/keep_custom_tracks": false, +"slice_11/save_to_file/path": "", +"slice_11/start_frame": 0, +"slice_110/end_frame": 0, +"slice_110/loop_mode": 0, +"slice_110/name": "", +"slice_110/save_to_file/enabled": false, +"slice_110/save_to_file/keep_custom_tracks": false, +"slice_110/save_to_file/path": "", +"slice_110/start_frame": 0, +"slice_111/end_frame": 0, +"slice_111/loop_mode": 0, +"slice_111/name": "", +"slice_111/save_to_file/enabled": false, +"slice_111/save_to_file/keep_custom_tracks": false, +"slice_111/save_to_file/path": "", +"slice_111/start_frame": 0, +"slice_112/end_frame": 0, +"slice_112/loop_mode": 0, +"slice_112/name": "", +"slice_112/save_to_file/enabled": false, +"slice_112/save_to_file/keep_custom_tracks": false, +"slice_112/save_to_file/path": "", +"slice_112/start_frame": 0, +"slice_113/end_frame": 0, +"slice_113/loop_mode": 0, +"slice_113/name": "", +"slice_113/save_to_file/enabled": false, +"slice_113/save_to_file/keep_custom_tracks": false, +"slice_113/save_to_file/path": "", +"slice_113/start_frame": 0, +"slice_114/end_frame": 0, +"slice_114/loop_mode": 0, +"slice_114/name": "", +"slice_114/save_to_file/enabled": false, +"slice_114/save_to_file/keep_custom_tracks": false, +"slice_114/save_to_file/path": "", +"slice_114/start_frame": 0, +"slice_115/end_frame": 0, +"slice_115/loop_mode": 0, +"slice_115/name": "", +"slice_115/save_to_file/enabled": false, +"slice_115/save_to_file/keep_custom_tracks": false, +"slice_115/save_to_file/path": "", +"slice_115/start_frame": 0, +"slice_116/end_frame": 0, +"slice_116/loop_mode": 0, +"slice_116/name": "", +"slice_116/save_to_file/enabled": false, +"slice_116/save_to_file/keep_custom_tracks": false, +"slice_116/save_to_file/path": "", +"slice_116/start_frame": 0, +"slice_117/end_frame": 0, +"slice_117/loop_mode": 0, +"slice_117/name": "", +"slice_117/save_to_file/enabled": false, +"slice_117/save_to_file/keep_custom_tracks": false, +"slice_117/save_to_file/path": "", +"slice_117/start_frame": 0, +"slice_118/end_frame": 0, +"slice_118/loop_mode": 0, +"slice_118/name": "", +"slice_118/save_to_file/enabled": false, +"slice_118/save_to_file/keep_custom_tracks": false, +"slice_118/save_to_file/path": "", +"slice_118/start_frame": 0, +"slice_119/end_frame": 0, +"slice_119/loop_mode": 0, +"slice_119/name": "", +"slice_119/save_to_file/enabled": false, +"slice_119/save_to_file/keep_custom_tracks": false, +"slice_119/save_to_file/path": "", +"slice_119/start_frame": 0, +"slice_12/end_frame": 0, +"slice_12/loop_mode": 0, +"slice_12/name": "", +"slice_12/save_to_file/enabled": false, +"slice_12/save_to_file/keep_custom_tracks": false, +"slice_12/save_to_file/path": "", +"slice_12/start_frame": 0, +"slice_120/end_frame": 0, +"slice_120/loop_mode": 0, +"slice_120/name": "", +"slice_120/save_to_file/enabled": false, +"slice_120/save_to_file/keep_custom_tracks": false, +"slice_120/save_to_file/path": "", +"slice_120/start_frame": 0, +"slice_121/end_frame": 0, +"slice_121/loop_mode": 0, +"slice_121/name": "", +"slice_121/save_to_file/enabled": false, +"slice_121/save_to_file/keep_custom_tracks": false, +"slice_121/save_to_file/path": "", +"slice_121/start_frame": 0, +"slice_122/end_frame": 0, +"slice_122/loop_mode": 0, +"slice_122/name": "", +"slice_122/save_to_file/enabled": false, +"slice_122/save_to_file/keep_custom_tracks": false, +"slice_122/save_to_file/path": "", +"slice_122/start_frame": 0, +"slice_123/end_frame": 0, +"slice_123/loop_mode": 0, +"slice_123/name": "", +"slice_123/save_to_file/enabled": false, +"slice_123/save_to_file/keep_custom_tracks": false, +"slice_123/save_to_file/path": "", +"slice_123/start_frame": 0, +"slice_124/end_frame": 0, +"slice_124/loop_mode": 0, +"slice_124/name": "", +"slice_124/save_to_file/enabled": false, +"slice_124/save_to_file/keep_custom_tracks": false, +"slice_124/save_to_file/path": "", +"slice_124/start_frame": 0, +"slice_125/end_frame": 0, +"slice_125/loop_mode": 0, +"slice_125/name": "", +"slice_125/save_to_file/enabled": false, +"slice_125/save_to_file/keep_custom_tracks": false, +"slice_125/save_to_file/path": "", +"slice_125/start_frame": 0, +"slice_126/end_frame": 0, +"slice_126/loop_mode": 0, +"slice_126/name": "", +"slice_126/save_to_file/enabled": false, +"slice_126/save_to_file/keep_custom_tracks": false, +"slice_126/save_to_file/path": "", +"slice_126/start_frame": 0, +"slice_127/end_frame": 0, +"slice_127/loop_mode": 0, +"slice_127/name": "", +"slice_127/save_to_file/enabled": false, +"slice_127/save_to_file/keep_custom_tracks": false, +"slice_127/save_to_file/path": "", +"slice_127/start_frame": 0, +"slice_128/end_frame": 0, +"slice_128/loop_mode": 0, +"slice_128/name": "", +"slice_128/save_to_file/enabled": false, +"slice_128/save_to_file/keep_custom_tracks": false, +"slice_128/save_to_file/path": "", +"slice_128/start_frame": 0, +"slice_129/end_frame": 0, +"slice_129/loop_mode": 0, +"slice_129/name": "", +"slice_129/save_to_file/enabled": false, +"slice_129/save_to_file/keep_custom_tracks": false, +"slice_129/save_to_file/path": "", +"slice_129/start_frame": 0, +"slice_13/end_frame": 0, +"slice_13/loop_mode": 0, +"slice_13/name": "", +"slice_13/save_to_file/enabled": false, +"slice_13/save_to_file/keep_custom_tracks": false, +"slice_13/save_to_file/path": "", +"slice_13/start_frame": 0, +"slice_130/end_frame": 0, +"slice_130/loop_mode": 0, +"slice_130/name": "", +"slice_130/save_to_file/enabled": false, +"slice_130/save_to_file/keep_custom_tracks": false, +"slice_130/save_to_file/path": "", +"slice_130/start_frame": 0, +"slice_131/end_frame": 0, +"slice_131/loop_mode": 0, +"slice_131/name": "", +"slice_131/save_to_file/enabled": false, +"slice_131/save_to_file/keep_custom_tracks": false, +"slice_131/save_to_file/path": "", +"slice_131/start_frame": 0, +"slice_132/end_frame": 0, +"slice_132/loop_mode": 0, +"slice_132/name": "", +"slice_132/save_to_file/enabled": false, +"slice_132/save_to_file/keep_custom_tracks": false, +"slice_132/save_to_file/path": "", +"slice_132/start_frame": 0, +"slice_133/end_frame": 0, +"slice_133/loop_mode": 0, +"slice_133/name": "", +"slice_133/save_to_file/enabled": false, +"slice_133/save_to_file/keep_custom_tracks": false, +"slice_133/save_to_file/path": "", +"slice_133/start_frame": 0, +"slice_134/end_frame": 0, +"slice_134/loop_mode": 0, +"slice_134/name": "", +"slice_134/save_to_file/enabled": false, +"slice_134/save_to_file/keep_custom_tracks": false, +"slice_134/save_to_file/path": "", +"slice_134/start_frame": 0, +"slice_135/end_frame": 0, +"slice_135/loop_mode": 0, +"slice_135/name": "", +"slice_135/save_to_file/enabled": false, +"slice_135/save_to_file/keep_custom_tracks": false, +"slice_135/save_to_file/path": "", +"slice_135/start_frame": 0, +"slice_136/end_frame": 0, +"slice_136/loop_mode": 0, +"slice_136/name": "", +"slice_136/save_to_file/enabled": false, +"slice_136/save_to_file/keep_custom_tracks": false, +"slice_136/save_to_file/path": "", +"slice_136/start_frame": 0, +"slice_137/end_frame": 0, +"slice_137/loop_mode": 0, +"slice_137/name": "", +"slice_137/save_to_file/enabled": false, +"slice_137/save_to_file/keep_custom_tracks": false, +"slice_137/save_to_file/path": "", +"slice_137/start_frame": 0, +"slice_138/end_frame": 0, +"slice_138/loop_mode": 0, +"slice_138/name": "", +"slice_138/save_to_file/enabled": false, +"slice_138/save_to_file/keep_custom_tracks": false, +"slice_138/save_to_file/path": "", +"slice_138/start_frame": 0, +"slice_139/end_frame": 0, +"slice_139/loop_mode": 0, +"slice_139/name": "", +"slice_139/save_to_file/enabled": false, +"slice_139/save_to_file/keep_custom_tracks": false, +"slice_139/save_to_file/path": "", +"slice_139/start_frame": 0, +"slice_14/end_frame": 0, +"slice_14/loop_mode": 0, +"slice_14/name": "", +"slice_14/save_to_file/enabled": false, +"slice_14/save_to_file/keep_custom_tracks": false, +"slice_14/save_to_file/path": "", +"slice_14/start_frame": 0, +"slice_140/end_frame": 0, +"slice_140/loop_mode": 0, +"slice_140/name": "", +"slice_140/save_to_file/enabled": false, +"slice_140/save_to_file/keep_custom_tracks": false, +"slice_140/save_to_file/path": "", +"slice_140/start_frame": 0, +"slice_141/end_frame": 0, +"slice_141/loop_mode": 0, +"slice_141/name": "", +"slice_141/save_to_file/enabled": false, +"slice_141/save_to_file/keep_custom_tracks": false, +"slice_141/save_to_file/path": "", +"slice_141/start_frame": 0, +"slice_142/end_frame": 0, +"slice_142/loop_mode": 0, +"slice_142/name": "", +"slice_142/save_to_file/enabled": false, +"slice_142/save_to_file/keep_custom_tracks": false, +"slice_142/save_to_file/path": "", +"slice_142/start_frame": 0, +"slice_143/end_frame": 0, +"slice_143/loop_mode": 0, +"slice_143/name": "", +"slice_143/save_to_file/enabled": false, +"slice_143/save_to_file/keep_custom_tracks": false, +"slice_143/save_to_file/path": "", +"slice_143/start_frame": 0, +"slice_144/end_frame": 0, +"slice_144/loop_mode": 0, +"slice_144/name": "", +"slice_144/save_to_file/enabled": false, +"slice_144/save_to_file/keep_custom_tracks": false, +"slice_144/save_to_file/path": "", +"slice_144/start_frame": 0, +"slice_145/end_frame": 0, +"slice_145/loop_mode": 0, +"slice_145/name": "", +"slice_145/save_to_file/enabled": false, +"slice_145/save_to_file/keep_custom_tracks": false, +"slice_145/save_to_file/path": "", +"slice_145/start_frame": 0, +"slice_146/end_frame": 0, +"slice_146/loop_mode": 0, +"slice_146/name": "", +"slice_146/save_to_file/enabled": false, +"slice_146/save_to_file/keep_custom_tracks": false, +"slice_146/save_to_file/path": "", +"slice_146/start_frame": 0, +"slice_147/end_frame": 0, +"slice_147/loop_mode": 0, +"slice_147/name": "", +"slice_147/save_to_file/enabled": false, +"slice_147/save_to_file/keep_custom_tracks": false, +"slice_147/save_to_file/path": "", +"slice_147/start_frame": 0, +"slice_148/end_frame": 0, +"slice_148/loop_mode": 0, +"slice_148/name": "", +"slice_148/save_to_file/enabled": false, +"slice_148/save_to_file/keep_custom_tracks": false, +"slice_148/save_to_file/path": "", +"slice_148/start_frame": 0, +"slice_149/end_frame": 0, +"slice_149/loop_mode": 0, +"slice_149/name": "", +"slice_149/save_to_file/enabled": false, +"slice_149/save_to_file/keep_custom_tracks": false, +"slice_149/save_to_file/path": "", +"slice_149/start_frame": 0, +"slice_15/end_frame": 0, +"slice_15/loop_mode": 0, +"slice_15/name": "", +"slice_15/save_to_file/enabled": false, +"slice_15/save_to_file/keep_custom_tracks": false, +"slice_15/save_to_file/path": "", +"slice_15/start_frame": 0, +"slice_150/end_frame": 0, +"slice_150/loop_mode": 0, +"slice_150/name": "", +"slice_150/save_to_file/enabled": false, +"slice_150/save_to_file/keep_custom_tracks": false, +"slice_150/save_to_file/path": "", +"slice_150/start_frame": 0, +"slice_151/end_frame": 0, +"slice_151/loop_mode": 0, +"slice_151/name": "", +"slice_151/save_to_file/enabled": false, +"slice_151/save_to_file/keep_custom_tracks": false, +"slice_151/save_to_file/path": "", +"slice_151/start_frame": 0, +"slice_152/end_frame": 0, +"slice_152/loop_mode": 0, +"slice_152/name": "", +"slice_152/save_to_file/enabled": false, +"slice_152/save_to_file/keep_custom_tracks": false, +"slice_152/save_to_file/path": "", +"slice_152/start_frame": 0, +"slice_153/end_frame": 0, +"slice_153/loop_mode": 0, +"slice_153/name": "", +"slice_153/save_to_file/enabled": false, +"slice_153/save_to_file/keep_custom_tracks": false, +"slice_153/save_to_file/path": "", +"slice_153/start_frame": 0, +"slice_154/end_frame": 0, +"slice_154/loop_mode": 0, +"slice_154/name": "", +"slice_154/save_to_file/enabled": false, +"slice_154/save_to_file/keep_custom_tracks": false, +"slice_154/save_to_file/path": "", +"slice_154/start_frame": 0, +"slice_155/end_frame": 0, +"slice_155/loop_mode": 0, +"slice_155/name": "", +"slice_155/save_to_file/enabled": false, +"slice_155/save_to_file/keep_custom_tracks": false, +"slice_155/save_to_file/path": "", +"slice_155/start_frame": 0, +"slice_156/end_frame": 0, +"slice_156/loop_mode": 0, +"slice_156/name": "", +"slice_156/save_to_file/enabled": false, +"slice_156/save_to_file/keep_custom_tracks": false, +"slice_156/save_to_file/path": "", +"slice_156/start_frame": 0, +"slice_157/end_frame": 0, +"slice_157/loop_mode": 0, +"slice_157/name": "", +"slice_157/save_to_file/enabled": false, +"slice_157/save_to_file/keep_custom_tracks": false, +"slice_157/save_to_file/path": "", +"slice_157/start_frame": 0, +"slice_158/end_frame": 0, +"slice_158/loop_mode": 0, +"slice_158/name": "", +"slice_158/save_to_file/enabled": false, +"slice_158/save_to_file/keep_custom_tracks": false, +"slice_158/save_to_file/path": "", +"slice_158/start_frame": 0, +"slice_159/end_frame": 0, +"slice_159/loop_mode": 0, +"slice_159/name": "", +"slice_159/save_to_file/enabled": false, +"slice_159/save_to_file/keep_custom_tracks": false, +"slice_159/save_to_file/path": "", +"slice_159/start_frame": 0, +"slice_16/end_frame": 0, +"slice_16/loop_mode": 0, +"slice_16/name": "", +"slice_16/save_to_file/enabled": false, +"slice_16/save_to_file/keep_custom_tracks": false, +"slice_16/save_to_file/path": "", +"slice_16/start_frame": 0, +"slice_160/end_frame": 0, +"slice_160/loop_mode": 0, +"slice_160/name": "", +"slice_160/save_to_file/enabled": false, +"slice_160/save_to_file/keep_custom_tracks": false, +"slice_160/save_to_file/path": "", +"slice_160/start_frame": 0, +"slice_161/end_frame": 0, +"slice_161/loop_mode": 0, +"slice_161/name": "", +"slice_161/save_to_file/enabled": false, +"slice_161/save_to_file/keep_custom_tracks": false, +"slice_161/save_to_file/path": "", +"slice_161/start_frame": 0, +"slice_162/end_frame": 0, +"slice_162/loop_mode": 0, +"slice_162/name": "", +"slice_162/save_to_file/enabled": false, +"slice_162/save_to_file/keep_custom_tracks": false, +"slice_162/save_to_file/path": "", +"slice_162/start_frame": 0, +"slice_163/end_frame": 0, +"slice_163/loop_mode": 0, +"slice_163/name": "", +"slice_163/save_to_file/enabled": false, +"slice_163/save_to_file/keep_custom_tracks": false, +"slice_163/save_to_file/path": "", +"slice_163/start_frame": 0, +"slice_164/end_frame": 0, +"slice_164/loop_mode": 0, +"slice_164/name": "", +"slice_164/save_to_file/enabled": false, +"slice_164/save_to_file/keep_custom_tracks": false, +"slice_164/save_to_file/path": "", +"slice_164/start_frame": 0, +"slice_165/end_frame": 0, +"slice_165/loop_mode": 0, +"slice_165/name": "", +"slice_165/save_to_file/enabled": false, +"slice_165/save_to_file/keep_custom_tracks": false, +"slice_165/save_to_file/path": "", +"slice_165/start_frame": 0, +"slice_166/end_frame": 0, +"slice_166/loop_mode": 0, +"slice_166/name": "", +"slice_166/save_to_file/enabled": false, +"slice_166/save_to_file/keep_custom_tracks": false, +"slice_166/save_to_file/path": "", +"slice_166/start_frame": 0, +"slice_167/end_frame": 0, +"slice_167/loop_mode": 0, +"slice_167/name": "", +"slice_167/save_to_file/enabled": false, +"slice_167/save_to_file/keep_custom_tracks": false, +"slice_167/save_to_file/path": "", +"slice_167/start_frame": 0, +"slice_168/end_frame": 0, +"slice_168/loop_mode": 0, +"slice_168/name": "", +"slice_168/save_to_file/enabled": false, +"slice_168/save_to_file/keep_custom_tracks": false, +"slice_168/save_to_file/path": "", +"slice_168/start_frame": 0, +"slice_169/end_frame": 0, +"slice_169/loop_mode": 0, +"slice_169/name": "", +"slice_169/save_to_file/enabled": false, +"slice_169/save_to_file/keep_custom_tracks": false, +"slice_169/save_to_file/path": "", +"slice_169/start_frame": 0, +"slice_17/end_frame": 0, +"slice_17/loop_mode": 0, +"slice_17/name": "", +"slice_17/save_to_file/enabled": false, +"slice_17/save_to_file/keep_custom_tracks": false, +"slice_17/save_to_file/path": "", +"slice_17/start_frame": 0, +"slice_170/end_frame": 0, +"slice_170/loop_mode": 0, +"slice_170/name": "", +"slice_170/save_to_file/enabled": false, +"slice_170/save_to_file/keep_custom_tracks": false, +"slice_170/save_to_file/path": "", +"slice_170/start_frame": 0, +"slice_171/end_frame": 0, +"slice_171/loop_mode": 0, +"slice_171/name": "", +"slice_171/save_to_file/enabled": false, +"slice_171/save_to_file/keep_custom_tracks": false, +"slice_171/save_to_file/path": "", +"slice_171/start_frame": 0, +"slice_172/end_frame": 0, +"slice_172/loop_mode": 0, +"slice_172/name": "", +"slice_172/save_to_file/enabled": false, +"slice_172/save_to_file/keep_custom_tracks": false, +"slice_172/save_to_file/path": "", +"slice_172/start_frame": 0, +"slice_173/end_frame": 0, +"slice_173/loop_mode": 0, +"slice_173/name": "", +"slice_173/save_to_file/enabled": false, +"slice_173/save_to_file/keep_custom_tracks": false, +"slice_173/save_to_file/path": "", +"slice_173/start_frame": 0, +"slice_174/end_frame": 0, +"slice_174/loop_mode": 0, +"slice_174/name": "", +"slice_174/save_to_file/enabled": false, +"slice_174/save_to_file/keep_custom_tracks": false, +"slice_174/save_to_file/path": "", +"slice_174/start_frame": 0, +"slice_175/end_frame": 0, +"slice_175/loop_mode": 0, +"slice_175/name": "", +"slice_175/save_to_file/enabled": false, +"slice_175/save_to_file/keep_custom_tracks": false, +"slice_175/save_to_file/path": "", +"slice_175/start_frame": 0, +"slice_176/end_frame": 0, +"slice_176/loop_mode": 0, +"slice_176/name": "", +"slice_176/save_to_file/enabled": false, +"slice_176/save_to_file/keep_custom_tracks": false, +"slice_176/save_to_file/path": "", +"slice_176/start_frame": 0, +"slice_177/end_frame": 0, +"slice_177/loop_mode": 0, +"slice_177/name": "", +"slice_177/save_to_file/enabled": false, +"slice_177/save_to_file/keep_custom_tracks": false, +"slice_177/save_to_file/path": "", +"slice_177/start_frame": 0, +"slice_178/end_frame": 0, +"slice_178/loop_mode": 0, +"slice_178/name": "", +"slice_178/save_to_file/enabled": false, +"slice_178/save_to_file/keep_custom_tracks": false, +"slice_178/save_to_file/path": "", +"slice_178/start_frame": 0, +"slice_179/end_frame": 0, +"slice_179/loop_mode": 0, +"slice_179/name": "", +"slice_179/save_to_file/enabled": false, +"slice_179/save_to_file/keep_custom_tracks": false, +"slice_179/save_to_file/path": "", +"slice_179/start_frame": 0, +"slice_18/end_frame": 0, +"slice_18/loop_mode": 0, +"slice_18/name": "", +"slice_18/save_to_file/enabled": false, +"slice_18/save_to_file/keep_custom_tracks": false, +"slice_18/save_to_file/path": "", +"slice_18/start_frame": 0, +"slice_180/end_frame": 0, +"slice_180/loop_mode": 0, +"slice_180/name": "", +"slice_180/save_to_file/enabled": false, +"slice_180/save_to_file/keep_custom_tracks": false, +"slice_180/save_to_file/path": "", +"slice_180/start_frame": 0, +"slice_181/end_frame": 0, +"slice_181/loop_mode": 0, +"slice_181/name": "", +"slice_181/save_to_file/enabled": false, +"slice_181/save_to_file/keep_custom_tracks": false, +"slice_181/save_to_file/path": "", +"slice_181/start_frame": 0, +"slice_182/end_frame": 0, +"slice_182/loop_mode": 0, +"slice_182/name": "", +"slice_182/save_to_file/enabled": false, +"slice_182/save_to_file/keep_custom_tracks": false, +"slice_182/save_to_file/path": "", +"slice_182/start_frame": 0, +"slice_183/end_frame": 0, +"slice_183/loop_mode": 0, +"slice_183/name": "", +"slice_183/save_to_file/enabled": false, +"slice_183/save_to_file/keep_custom_tracks": false, +"slice_183/save_to_file/path": "", +"slice_183/start_frame": 0, +"slice_184/end_frame": 0, +"slice_184/loop_mode": 0, +"slice_184/name": "", +"slice_184/save_to_file/enabled": false, +"slice_184/save_to_file/keep_custom_tracks": false, +"slice_184/save_to_file/path": "", +"slice_184/start_frame": 0, +"slice_185/end_frame": 0, +"slice_185/loop_mode": 0, +"slice_185/name": "", +"slice_185/save_to_file/enabled": false, +"slice_185/save_to_file/keep_custom_tracks": false, +"slice_185/save_to_file/path": "", +"slice_185/start_frame": 0, +"slice_186/end_frame": 0, +"slice_186/loop_mode": 0, +"slice_186/name": "", +"slice_186/save_to_file/enabled": false, +"slice_186/save_to_file/keep_custom_tracks": false, +"slice_186/save_to_file/path": "", +"slice_186/start_frame": 0, +"slice_187/end_frame": 0, +"slice_187/loop_mode": 0, +"slice_187/name": "", +"slice_187/save_to_file/enabled": false, +"slice_187/save_to_file/keep_custom_tracks": false, +"slice_187/save_to_file/path": "", +"slice_187/start_frame": 0, +"slice_188/end_frame": 0, +"slice_188/loop_mode": 0, +"slice_188/name": "", +"slice_188/save_to_file/enabled": false, +"slice_188/save_to_file/keep_custom_tracks": false, +"slice_188/save_to_file/path": "", +"slice_188/start_frame": 0, +"slice_189/end_frame": 0, +"slice_189/loop_mode": 0, +"slice_189/name": "", +"slice_189/save_to_file/enabled": false, +"slice_189/save_to_file/keep_custom_tracks": false, +"slice_189/save_to_file/path": "", +"slice_189/start_frame": 0, +"slice_19/end_frame": 0, +"slice_19/loop_mode": 0, +"slice_19/name": "", +"slice_19/save_to_file/enabled": false, +"slice_19/save_to_file/keep_custom_tracks": false, +"slice_19/save_to_file/path": "", +"slice_19/start_frame": 0, +"slice_190/end_frame": 0, +"slice_190/loop_mode": 0, +"slice_190/name": "", +"slice_190/save_to_file/enabled": false, +"slice_190/save_to_file/keep_custom_tracks": false, +"slice_190/save_to_file/path": "", +"slice_190/start_frame": 0, +"slice_191/end_frame": 0, +"slice_191/loop_mode": 0, +"slice_191/name": "", +"slice_191/save_to_file/enabled": false, +"slice_191/save_to_file/keep_custom_tracks": false, +"slice_191/save_to_file/path": "", +"slice_191/start_frame": 0, +"slice_192/end_frame": 0, +"slice_192/loop_mode": 0, +"slice_192/name": "", +"slice_192/save_to_file/enabled": false, +"slice_192/save_to_file/keep_custom_tracks": false, +"slice_192/save_to_file/path": "", +"slice_192/start_frame": 0, +"slice_193/end_frame": 0, +"slice_193/loop_mode": 0, +"slice_193/name": "", +"slice_193/save_to_file/enabled": false, +"slice_193/save_to_file/keep_custom_tracks": false, +"slice_193/save_to_file/path": "", +"slice_193/start_frame": 0, +"slice_194/end_frame": 0, +"slice_194/loop_mode": 0, +"slice_194/name": "", +"slice_194/save_to_file/enabled": false, +"slice_194/save_to_file/keep_custom_tracks": false, +"slice_194/save_to_file/path": "", +"slice_194/start_frame": 0, +"slice_195/end_frame": 0, +"slice_195/loop_mode": 0, +"slice_195/name": "", +"slice_195/save_to_file/enabled": false, +"slice_195/save_to_file/keep_custom_tracks": false, +"slice_195/save_to_file/path": "", +"slice_195/start_frame": 0, +"slice_196/end_frame": 0, +"slice_196/loop_mode": 0, +"slice_196/name": "", +"slice_196/save_to_file/enabled": false, +"slice_196/save_to_file/keep_custom_tracks": false, +"slice_196/save_to_file/path": "", +"slice_196/start_frame": 0, +"slice_197/end_frame": 0, +"slice_197/loop_mode": 0, +"slice_197/name": "", +"slice_197/save_to_file/enabled": false, +"slice_197/save_to_file/keep_custom_tracks": false, +"slice_197/save_to_file/path": "", +"slice_197/start_frame": 0, +"slice_198/end_frame": 0, +"slice_198/loop_mode": 0, +"slice_198/name": "", +"slice_198/save_to_file/enabled": false, +"slice_198/save_to_file/keep_custom_tracks": false, +"slice_198/save_to_file/path": "", +"slice_198/start_frame": 0, +"slice_199/end_frame": 0, +"slice_199/loop_mode": 0, +"slice_199/name": "", +"slice_199/save_to_file/enabled": false, +"slice_199/save_to_file/keep_custom_tracks": false, +"slice_199/save_to_file/path": "", +"slice_199/start_frame": 0, +"slice_2/end_frame": 0, +"slice_2/loop_mode": 0, +"slice_2/name": "", +"slice_2/save_to_file/enabled": false, +"slice_2/save_to_file/keep_custom_tracks": false, +"slice_2/save_to_file/path": "", +"slice_2/start_frame": 0, +"slice_20/end_frame": 0, +"slice_20/loop_mode": 0, +"slice_20/name": "", +"slice_20/save_to_file/enabled": false, +"slice_20/save_to_file/keep_custom_tracks": false, +"slice_20/save_to_file/path": "", +"slice_20/start_frame": 0, +"slice_200/end_frame": 0, +"slice_200/loop_mode": 0, +"slice_200/name": "", +"slice_200/save_to_file/enabled": false, +"slice_200/save_to_file/keep_custom_tracks": false, +"slice_200/save_to_file/path": "", +"slice_200/start_frame": 0, +"slice_201/end_frame": 0, +"slice_201/loop_mode": 0, +"slice_201/name": "", +"slice_201/save_to_file/enabled": false, +"slice_201/save_to_file/keep_custom_tracks": false, +"slice_201/save_to_file/path": "", +"slice_201/start_frame": 0, +"slice_202/end_frame": 0, +"slice_202/loop_mode": 0, +"slice_202/name": "", +"slice_202/save_to_file/enabled": false, +"slice_202/save_to_file/keep_custom_tracks": false, +"slice_202/save_to_file/path": "", +"slice_202/start_frame": 0, +"slice_203/end_frame": 0, +"slice_203/loop_mode": 0, +"slice_203/name": "", +"slice_203/save_to_file/enabled": false, +"slice_203/save_to_file/keep_custom_tracks": false, +"slice_203/save_to_file/path": "", +"slice_203/start_frame": 0, +"slice_204/end_frame": 0, +"slice_204/loop_mode": 0, +"slice_204/name": "", +"slice_204/save_to_file/enabled": false, +"slice_204/save_to_file/keep_custom_tracks": false, +"slice_204/save_to_file/path": "", +"slice_204/start_frame": 0, +"slice_205/end_frame": 0, +"slice_205/loop_mode": 0, +"slice_205/name": "", +"slice_205/save_to_file/enabled": false, +"slice_205/save_to_file/keep_custom_tracks": false, +"slice_205/save_to_file/path": "", +"slice_205/start_frame": 0, +"slice_206/end_frame": 0, +"slice_206/loop_mode": 0, +"slice_206/name": "", +"slice_206/save_to_file/enabled": false, +"slice_206/save_to_file/keep_custom_tracks": false, +"slice_206/save_to_file/path": "", +"slice_206/start_frame": 0, +"slice_207/end_frame": 0, +"slice_207/loop_mode": 0, +"slice_207/name": "", +"slice_207/save_to_file/enabled": false, +"slice_207/save_to_file/keep_custom_tracks": false, +"slice_207/save_to_file/path": "", +"slice_207/start_frame": 0, +"slice_208/end_frame": 0, +"slice_208/loop_mode": 0, +"slice_208/name": "", +"slice_208/save_to_file/enabled": false, +"slice_208/save_to_file/keep_custom_tracks": false, +"slice_208/save_to_file/path": "", +"slice_208/start_frame": 0, +"slice_209/end_frame": 0, +"slice_209/loop_mode": 0, +"slice_209/name": "", +"slice_209/save_to_file/enabled": false, +"slice_209/save_to_file/keep_custom_tracks": false, +"slice_209/save_to_file/path": "", +"slice_209/start_frame": 0, +"slice_21/end_frame": 0, +"slice_21/loop_mode": 0, +"slice_21/name": "", +"slice_21/save_to_file/enabled": false, +"slice_21/save_to_file/keep_custom_tracks": false, +"slice_21/save_to_file/path": "", +"slice_21/start_frame": 0, +"slice_210/end_frame": 0, +"slice_210/loop_mode": 0, +"slice_210/name": "", +"slice_210/save_to_file/enabled": false, +"slice_210/save_to_file/keep_custom_tracks": false, +"slice_210/save_to_file/path": "", +"slice_210/start_frame": 0, +"slice_211/end_frame": 0, +"slice_211/loop_mode": 0, +"slice_211/name": "", +"slice_211/save_to_file/enabled": false, +"slice_211/save_to_file/keep_custom_tracks": false, +"slice_211/save_to_file/path": "", +"slice_211/start_frame": 0, +"slice_212/end_frame": 0, +"slice_212/loop_mode": 0, +"slice_212/name": "", +"slice_212/save_to_file/enabled": false, +"slice_212/save_to_file/keep_custom_tracks": false, +"slice_212/save_to_file/path": "", +"slice_212/start_frame": 0, +"slice_213/end_frame": 0, +"slice_213/loop_mode": 0, +"slice_213/name": "", +"slice_213/save_to_file/enabled": false, +"slice_213/save_to_file/keep_custom_tracks": false, +"slice_213/save_to_file/path": "", +"slice_213/start_frame": 0, +"slice_214/end_frame": 0, +"slice_214/loop_mode": 0, +"slice_214/name": "", +"slice_214/save_to_file/enabled": false, +"slice_214/save_to_file/keep_custom_tracks": false, +"slice_214/save_to_file/path": "", +"slice_214/start_frame": 0, +"slice_215/end_frame": 0, +"slice_215/loop_mode": 0, +"slice_215/name": "", +"slice_215/save_to_file/enabled": false, +"slice_215/save_to_file/keep_custom_tracks": false, +"slice_215/save_to_file/path": "", +"slice_215/start_frame": 0, +"slice_216/end_frame": 0, +"slice_216/loop_mode": 0, +"slice_216/name": "", +"slice_216/save_to_file/enabled": false, +"slice_216/save_to_file/keep_custom_tracks": false, +"slice_216/save_to_file/path": "", +"slice_216/start_frame": 0, +"slice_217/end_frame": 0, +"slice_217/loop_mode": 0, +"slice_217/name": "", +"slice_217/save_to_file/enabled": false, +"slice_217/save_to_file/keep_custom_tracks": false, +"slice_217/save_to_file/path": "", +"slice_217/start_frame": 0, +"slice_218/end_frame": 0, +"slice_218/loop_mode": 0, +"slice_218/name": "", +"slice_218/save_to_file/enabled": false, +"slice_218/save_to_file/keep_custom_tracks": false, +"slice_218/save_to_file/path": "", +"slice_218/start_frame": 0, +"slice_219/end_frame": 0, +"slice_219/loop_mode": 0, +"slice_219/name": "", +"slice_219/save_to_file/enabled": false, +"slice_219/save_to_file/keep_custom_tracks": false, +"slice_219/save_to_file/path": "", +"slice_219/start_frame": 0, +"slice_22/end_frame": 0, +"slice_22/loop_mode": 0, +"slice_22/name": "", +"slice_22/save_to_file/enabled": false, +"slice_22/save_to_file/keep_custom_tracks": false, +"slice_22/save_to_file/path": "", +"slice_22/start_frame": 0, +"slice_220/end_frame": 0, +"slice_220/loop_mode": 0, +"slice_220/name": "", +"slice_220/save_to_file/enabled": false, +"slice_220/save_to_file/keep_custom_tracks": false, +"slice_220/save_to_file/path": "", +"slice_220/start_frame": 0, +"slice_221/end_frame": 0, +"slice_221/loop_mode": 0, +"slice_221/name": "", +"slice_221/save_to_file/enabled": false, +"slice_221/save_to_file/keep_custom_tracks": false, +"slice_221/save_to_file/path": "", +"slice_221/start_frame": 0, +"slice_222/end_frame": 0, +"slice_222/loop_mode": 0, +"slice_222/name": "", +"slice_222/save_to_file/enabled": false, +"slice_222/save_to_file/keep_custom_tracks": false, +"slice_222/save_to_file/path": "", +"slice_222/start_frame": 0, +"slice_223/end_frame": 0, +"slice_223/loop_mode": 0, +"slice_223/name": "", +"slice_223/save_to_file/enabled": false, +"slice_223/save_to_file/keep_custom_tracks": false, +"slice_223/save_to_file/path": "", +"slice_223/start_frame": 0, +"slice_224/end_frame": 0, +"slice_224/loop_mode": 0, +"slice_224/name": "", +"slice_224/save_to_file/enabled": false, +"slice_224/save_to_file/keep_custom_tracks": false, +"slice_224/save_to_file/path": "", +"slice_224/start_frame": 0, +"slice_225/end_frame": 0, +"slice_225/loop_mode": 0, +"slice_225/name": "", +"slice_225/save_to_file/enabled": false, +"slice_225/save_to_file/keep_custom_tracks": false, +"slice_225/save_to_file/path": "", +"slice_225/start_frame": 0, +"slice_226/end_frame": 0, +"slice_226/loop_mode": 0, +"slice_226/name": "", +"slice_226/save_to_file/enabled": false, +"slice_226/save_to_file/keep_custom_tracks": false, +"slice_226/save_to_file/path": "", +"slice_226/start_frame": 0, +"slice_227/end_frame": 0, +"slice_227/loop_mode": 0, +"slice_227/name": "", +"slice_227/save_to_file/enabled": false, +"slice_227/save_to_file/keep_custom_tracks": false, +"slice_227/save_to_file/path": "", +"slice_227/start_frame": 0, +"slice_228/end_frame": 0, +"slice_228/loop_mode": 0, +"slice_228/name": "", +"slice_228/save_to_file/enabled": false, +"slice_228/save_to_file/keep_custom_tracks": false, +"slice_228/save_to_file/path": "", +"slice_228/start_frame": 0, +"slice_229/end_frame": 0, +"slice_229/loop_mode": 0, +"slice_229/name": "", +"slice_229/save_to_file/enabled": false, +"slice_229/save_to_file/keep_custom_tracks": false, +"slice_229/save_to_file/path": "", +"slice_229/start_frame": 0, +"slice_23/end_frame": 0, +"slice_23/loop_mode": 0, +"slice_23/name": "", +"slice_23/save_to_file/enabled": false, +"slice_23/save_to_file/keep_custom_tracks": false, +"slice_23/save_to_file/path": "", +"slice_23/start_frame": 0, +"slice_230/end_frame": 0, +"slice_230/loop_mode": 0, +"slice_230/name": "", +"slice_230/save_to_file/enabled": false, +"slice_230/save_to_file/keep_custom_tracks": false, +"slice_230/save_to_file/path": "", +"slice_230/start_frame": 0, +"slice_231/end_frame": 0, +"slice_231/loop_mode": 0, +"slice_231/name": "", +"slice_231/save_to_file/enabled": false, +"slice_231/save_to_file/keep_custom_tracks": false, +"slice_231/save_to_file/path": "", +"slice_231/start_frame": 0, +"slice_232/end_frame": 0, +"slice_232/loop_mode": 0, +"slice_232/name": "", +"slice_232/save_to_file/enabled": false, +"slice_232/save_to_file/keep_custom_tracks": false, +"slice_232/save_to_file/path": "", +"slice_232/start_frame": 0, +"slice_233/end_frame": 0, +"slice_233/loop_mode": 0, +"slice_233/name": "", +"slice_233/save_to_file/enabled": false, +"slice_233/save_to_file/keep_custom_tracks": false, +"slice_233/save_to_file/path": "", +"slice_233/start_frame": 0, +"slice_234/end_frame": 0, +"slice_234/loop_mode": 0, +"slice_234/name": "", +"slice_234/save_to_file/enabled": false, +"slice_234/save_to_file/keep_custom_tracks": false, +"slice_234/save_to_file/path": "", +"slice_234/start_frame": 0, +"slice_235/end_frame": 0, +"slice_235/loop_mode": 0, +"slice_235/name": "", +"slice_235/save_to_file/enabled": false, +"slice_235/save_to_file/keep_custom_tracks": false, +"slice_235/save_to_file/path": "", +"slice_235/start_frame": 0, +"slice_236/end_frame": 0, +"slice_236/loop_mode": 0, +"slice_236/name": "", +"slice_236/save_to_file/enabled": false, +"slice_236/save_to_file/keep_custom_tracks": false, +"slice_236/save_to_file/path": "", +"slice_236/start_frame": 0, +"slice_237/end_frame": 0, +"slice_237/loop_mode": 0, +"slice_237/name": "", +"slice_237/save_to_file/enabled": false, +"slice_237/save_to_file/keep_custom_tracks": false, +"slice_237/save_to_file/path": "", +"slice_237/start_frame": 0, +"slice_238/end_frame": 0, +"slice_238/loop_mode": 0, +"slice_238/name": "", +"slice_238/save_to_file/enabled": false, +"slice_238/save_to_file/keep_custom_tracks": false, +"slice_238/save_to_file/path": "", +"slice_238/start_frame": 0, +"slice_239/end_frame": 0, +"slice_239/loop_mode": 0, +"slice_239/name": "", +"slice_239/save_to_file/enabled": false, +"slice_239/save_to_file/keep_custom_tracks": false, +"slice_239/save_to_file/path": "", +"slice_239/start_frame": 0, +"slice_24/end_frame": 0, +"slice_24/loop_mode": 0, +"slice_24/name": "", +"slice_24/save_to_file/enabled": false, +"slice_24/save_to_file/keep_custom_tracks": false, +"slice_24/save_to_file/path": "", +"slice_24/start_frame": 0, +"slice_240/end_frame": 0, +"slice_240/loop_mode": 0, +"slice_240/name": "", +"slice_240/save_to_file/enabled": false, +"slice_240/save_to_file/keep_custom_tracks": false, +"slice_240/save_to_file/path": "", +"slice_240/start_frame": 0, +"slice_241/end_frame": 0, +"slice_241/loop_mode": 0, +"slice_241/name": "", +"slice_241/save_to_file/enabled": false, +"slice_241/save_to_file/keep_custom_tracks": false, +"slice_241/save_to_file/path": "", +"slice_241/start_frame": 0, +"slice_242/end_frame": 0, +"slice_242/loop_mode": 0, +"slice_242/name": "", +"slice_242/save_to_file/enabled": false, +"slice_242/save_to_file/keep_custom_tracks": false, +"slice_242/save_to_file/path": "", +"slice_242/start_frame": 0, +"slice_243/end_frame": 0, +"slice_243/loop_mode": 0, +"slice_243/name": "", +"slice_243/save_to_file/enabled": false, +"slice_243/save_to_file/keep_custom_tracks": false, +"slice_243/save_to_file/path": "", +"slice_243/start_frame": 0, +"slice_244/end_frame": 0, +"slice_244/loop_mode": 0, +"slice_244/name": "", +"slice_244/save_to_file/enabled": false, +"slice_244/save_to_file/keep_custom_tracks": false, +"slice_244/save_to_file/path": "", +"slice_244/start_frame": 0, +"slice_245/end_frame": 0, +"slice_245/loop_mode": 0, +"slice_245/name": "", +"slice_245/save_to_file/enabled": false, +"slice_245/save_to_file/keep_custom_tracks": false, +"slice_245/save_to_file/path": "", +"slice_245/start_frame": 0, +"slice_246/end_frame": 0, +"slice_246/loop_mode": 0, +"slice_246/name": "", +"slice_246/save_to_file/enabled": false, +"slice_246/save_to_file/keep_custom_tracks": false, +"slice_246/save_to_file/path": "", +"slice_246/start_frame": 0, +"slice_247/end_frame": 0, +"slice_247/loop_mode": 0, +"slice_247/name": "", +"slice_247/save_to_file/enabled": false, +"slice_247/save_to_file/keep_custom_tracks": false, +"slice_247/save_to_file/path": "", +"slice_247/start_frame": 0, +"slice_248/end_frame": 0, +"slice_248/loop_mode": 0, +"slice_248/name": "", +"slice_248/save_to_file/enabled": false, +"slice_248/save_to_file/keep_custom_tracks": false, +"slice_248/save_to_file/path": "", +"slice_248/start_frame": 0, +"slice_249/end_frame": 0, +"slice_249/loop_mode": 0, +"slice_249/name": "", +"slice_249/save_to_file/enabled": false, +"slice_249/save_to_file/keep_custom_tracks": false, +"slice_249/save_to_file/path": "", +"slice_249/start_frame": 0, +"slice_25/end_frame": 0, +"slice_25/loop_mode": 0, +"slice_25/name": "", +"slice_25/save_to_file/enabled": false, +"slice_25/save_to_file/keep_custom_tracks": false, +"slice_25/save_to_file/path": "", +"slice_25/start_frame": 0, +"slice_250/end_frame": 0, +"slice_250/loop_mode": 0, +"slice_250/name": "", +"slice_250/save_to_file/enabled": false, +"slice_250/save_to_file/keep_custom_tracks": false, +"slice_250/save_to_file/path": "", +"slice_250/start_frame": 0, +"slice_251/end_frame": 0, +"slice_251/loop_mode": 0, +"slice_251/name": "", +"slice_251/save_to_file/enabled": false, +"slice_251/save_to_file/keep_custom_tracks": false, +"slice_251/save_to_file/path": "", +"slice_251/start_frame": 0, +"slice_252/end_frame": 0, +"slice_252/loop_mode": 0, +"slice_252/name": "", +"slice_252/save_to_file/enabled": false, +"slice_252/save_to_file/keep_custom_tracks": false, +"slice_252/save_to_file/path": "", +"slice_252/start_frame": 0, +"slice_253/end_frame": 0, +"slice_253/loop_mode": 0, +"slice_253/name": "", +"slice_253/save_to_file/enabled": false, +"slice_253/save_to_file/keep_custom_tracks": false, +"slice_253/save_to_file/path": "", +"slice_253/start_frame": 0, +"slice_254/end_frame": 0, +"slice_254/loop_mode": 0, +"slice_254/name": "", +"slice_254/save_to_file/enabled": false, +"slice_254/save_to_file/keep_custom_tracks": false, +"slice_254/save_to_file/path": "", +"slice_254/start_frame": 0, +"slice_255/end_frame": 0, +"slice_255/loop_mode": 0, +"slice_255/name": "", +"slice_255/save_to_file/enabled": false, +"slice_255/save_to_file/keep_custom_tracks": false, +"slice_255/save_to_file/path": "", +"slice_255/start_frame": 0, +"slice_256/end_frame": 0, +"slice_256/loop_mode": 0, +"slice_256/name": "", +"slice_256/save_to_file/enabled": false, +"slice_256/save_to_file/keep_custom_tracks": false, +"slice_256/save_to_file/path": "", +"slice_256/start_frame": 0, +"slice_26/end_frame": 0, +"slice_26/loop_mode": 0, +"slice_26/name": "", +"slice_26/save_to_file/enabled": false, +"slice_26/save_to_file/keep_custom_tracks": false, +"slice_26/save_to_file/path": "", +"slice_26/start_frame": 0, +"slice_27/end_frame": 0, +"slice_27/loop_mode": 0, +"slice_27/name": "", +"slice_27/save_to_file/enabled": false, +"slice_27/save_to_file/keep_custom_tracks": false, +"slice_27/save_to_file/path": "", +"slice_27/start_frame": 0, +"slice_28/end_frame": 0, +"slice_28/loop_mode": 0, +"slice_28/name": "", +"slice_28/save_to_file/enabled": false, +"slice_28/save_to_file/keep_custom_tracks": false, +"slice_28/save_to_file/path": "", +"slice_28/start_frame": 0, +"slice_29/end_frame": 0, +"slice_29/loop_mode": 0, +"slice_29/name": "", +"slice_29/save_to_file/enabled": false, +"slice_29/save_to_file/keep_custom_tracks": false, +"slice_29/save_to_file/path": "", +"slice_29/start_frame": 0, +"slice_3/end_frame": 0, +"slice_3/loop_mode": 0, +"slice_3/name": "", +"slice_3/save_to_file/enabled": false, +"slice_3/save_to_file/keep_custom_tracks": false, +"slice_3/save_to_file/path": "", +"slice_3/start_frame": 0, +"slice_30/end_frame": 0, +"slice_30/loop_mode": 0, +"slice_30/name": "", +"slice_30/save_to_file/enabled": false, +"slice_30/save_to_file/keep_custom_tracks": false, +"slice_30/save_to_file/path": "", +"slice_30/start_frame": 0, +"slice_31/end_frame": 0, +"slice_31/loop_mode": 0, +"slice_31/name": "", +"slice_31/save_to_file/enabled": false, +"slice_31/save_to_file/keep_custom_tracks": false, +"slice_31/save_to_file/path": "", +"slice_31/start_frame": 0, +"slice_32/end_frame": 0, +"slice_32/loop_mode": 0, +"slice_32/name": "", +"slice_32/save_to_file/enabled": false, +"slice_32/save_to_file/keep_custom_tracks": false, +"slice_32/save_to_file/path": "", +"slice_32/start_frame": 0, +"slice_33/end_frame": 0, +"slice_33/loop_mode": 0, +"slice_33/name": "", +"slice_33/save_to_file/enabled": false, +"slice_33/save_to_file/keep_custom_tracks": false, +"slice_33/save_to_file/path": "", +"slice_33/start_frame": 0, +"slice_34/end_frame": 0, +"slice_34/loop_mode": 0, +"slice_34/name": "", +"slice_34/save_to_file/enabled": false, +"slice_34/save_to_file/keep_custom_tracks": false, +"slice_34/save_to_file/path": "", +"slice_34/start_frame": 0, +"slice_35/end_frame": 0, +"slice_35/loop_mode": 0, +"slice_35/name": "", +"slice_35/save_to_file/enabled": false, +"slice_35/save_to_file/keep_custom_tracks": false, +"slice_35/save_to_file/path": "", +"slice_35/start_frame": 0, +"slice_36/end_frame": 0, +"slice_36/loop_mode": 0, +"slice_36/name": "", +"slice_36/save_to_file/enabled": false, +"slice_36/save_to_file/keep_custom_tracks": false, +"slice_36/save_to_file/path": "", +"slice_36/start_frame": 0, +"slice_37/end_frame": 0, +"slice_37/loop_mode": 0, +"slice_37/name": "", +"slice_37/save_to_file/enabled": false, +"slice_37/save_to_file/keep_custom_tracks": false, +"slice_37/save_to_file/path": "", +"slice_37/start_frame": 0, +"slice_38/end_frame": 0, +"slice_38/loop_mode": 0, +"slice_38/name": "", +"slice_38/save_to_file/enabled": false, +"slice_38/save_to_file/keep_custom_tracks": false, +"slice_38/save_to_file/path": "", +"slice_38/start_frame": 0, +"slice_39/end_frame": 0, +"slice_39/loop_mode": 0, +"slice_39/name": "", +"slice_39/save_to_file/enabled": false, +"slice_39/save_to_file/keep_custom_tracks": false, +"slice_39/save_to_file/path": "", +"slice_39/start_frame": 0, +"slice_4/end_frame": 0, +"slice_4/loop_mode": 0, +"slice_4/name": "", +"slice_4/save_to_file/enabled": false, +"slice_4/save_to_file/keep_custom_tracks": false, +"slice_4/save_to_file/path": "", +"slice_4/start_frame": 0, +"slice_40/end_frame": 0, +"slice_40/loop_mode": 0, +"slice_40/name": "", +"slice_40/save_to_file/enabled": false, +"slice_40/save_to_file/keep_custom_tracks": false, +"slice_40/save_to_file/path": "", +"slice_40/start_frame": 0, +"slice_41/end_frame": 0, +"slice_41/loop_mode": 0, +"slice_41/name": "", +"slice_41/save_to_file/enabled": false, +"slice_41/save_to_file/keep_custom_tracks": false, +"slice_41/save_to_file/path": "", +"slice_41/start_frame": 0, +"slice_42/end_frame": 0, +"slice_42/loop_mode": 0, +"slice_42/name": "", +"slice_42/save_to_file/enabled": false, +"slice_42/save_to_file/keep_custom_tracks": false, +"slice_42/save_to_file/path": "", +"slice_42/start_frame": 0, +"slice_43/end_frame": 0, +"slice_43/loop_mode": 0, +"slice_43/name": "", +"slice_43/save_to_file/enabled": false, +"slice_43/save_to_file/keep_custom_tracks": false, +"slice_43/save_to_file/path": "", +"slice_43/start_frame": 0, +"slice_44/end_frame": 0, +"slice_44/loop_mode": 0, +"slice_44/name": "", +"slice_44/save_to_file/enabled": false, +"slice_44/save_to_file/keep_custom_tracks": false, +"slice_44/save_to_file/path": "", +"slice_44/start_frame": 0, +"slice_45/end_frame": 0, +"slice_45/loop_mode": 0, +"slice_45/name": "", +"slice_45/save_to_file/enabled": false, +"slice_45/save_to_file/keep_custom_tracks": false, +"slice_45/save_to_file/path": "", +"slice_45/start_frame": 0, +"slice_46/end_frame": 0, +"slice_46/loop_mode": 0, +"slice_46/name": "", +"slice_46/save_to_file/enabled": false, +"slice_46/save_to_file/keep_custom_tracks": false, +"slice_46/save_to_file/path": "", +"slice_46/start_frame": 0, +"slice_47/end_frame": 0, +"slice_47/loop_mode": 0, +"slice_47/name": "", +"slice_47/save_to_file/enabled": false, +"slice_47/save_to_file/keep_custom_tracks": false, +"slice_47/save_to_file/path": "", +"slice_47/start_frame": 0, +"slice_48/end_frame": 0, +"slice_48/loop_mode": 0, +"slice_48/name": "", +"slice_48/save_to_file/enabled": false, +"slice_48/save_to_file/keep_custom_tracks": false, +"slice_48/save_to_file/path": "", +"slice_48/start_frame": 0, +"slice_49/end_frame": 0, +"slice_49/loop_mode": 0, +"slice_49/name": "", +"slice_49/save_to_file/enabled": false, +"slice_49/save_to_file/keep_custom_tracks": false, +"slice_49/save_to_file/path": "", +"slice_49/start_frame": 0, +"slice_5/end_frame": 0, +"slice_5/loop_mode": 0, +"slice_5/name": "", +"slice_5/save_to_file/enabled": false, +"slice_5/save_to_file/keep_custom_tracks": false, +"slice_5/save_to_file/path": "", +"slice_5/start_frame": 0, +"slice_50/end_frame": 0, +"slice_50/loop_mode": 0, +"slice_50/name": "", +"slice_50/save_to_file/enabled": false, +"slice_50/save_to_file/keep_custom_tracks": false, +"slice_50/save_to_file/path": "", +"slice_50/start_frame": 0, +"slice_51/end_frame": 0, +"slice_51/loop_mode": 0, +"slice_51/name": "", +"slice_51/save_to_file/enabled": false, +"slice_51/save_to_file/keep_custom_tracks": false, +"slice_51/save_to_file/path": "", +"slice_51/start_frame": 0, +"slice_52/end_frame": 0, +"slice_52/loop_mode": 0, +"slice_52/name": "", +"slice_52/save_to_file/enabled": false, +"slice_52/save_to_file/keep_custom_tracks": false, +"slice_52/save_to_file/path": "", +"slice_52/start_frame": 0, +"slice_53/end_frame": 0, +"slice_53/loop_mode": 0, +"slice_53/name": "", +"slice_53/save_to_file/enabled": false, +"slice_53/save_to_file/keep_custom_tracks": false, +"slice_53/save_to_file/path": "", +"slice_53/start_frame": 0, +"slice_54/end_frame": 0, +"slice_54/loop_mode": 0, +"slice_54/name": "", +"slice_54/save_to_file/enabled": false, +"slice_54/save_to_file/keep_custom_tracks": false, +"slice_54/save_to_file/path": "", +"slice_54/start_frame": 0, +"slice_55/end_frame": 0, +"slice_55/loop_mode": 0, +"slice_55/name": "", +"slice_55/save_to_file/enabled": false, +"slice_55/save_to_file/keep_custom_tracks": false, +"slice_55/save_to_file/path": "", +"slice_55/start_frame": 0, +"slice_56/end_frame": 0, +"slice_56/loop_mode": 0, +"slice_56/name": "", +"slice_56/save_to_file/enabled": false, +"slice_56/save_to_file/keep_custom_tracks": false, +"slice_56/save_to_file/path": "", +"slice_56/start_frame": 0, +"slice_57/end_frame": 0, +"slice_57/loop_mode": 0, +"slice_57/name": "", +"slice_57/save_to_file/enabled": false, +"slice_57/save_to_file/keep_custom_tracks": false, +"slice_57/save_to_file/path": "", +"slice_57/start_frame": 0, +"slice_58/end_frame": 0, +"slice_58/loop_mode": 0, +"slice_58/name": "", +"slice_58/save_to_file/enabled": false, +"slice_58/save_to_file/keep_custom_tracks": false, +"slice_58/save_to_file/path": "", +"slice_58/start_frame": 0, +"slice_59/end_frame": 0, +"slice_59/loop_mode": 0, +"slice_59/name": "", +"slice_59/save_to_file/enabled": false, +"slice_59/save_to_file/keep_custom_tracks": false, +"slice_59/save_to_file/path": "", +"slice_59/start_frame": 0, +"slice_6/end_frame": 0, +"slice_6/loop_mode": 0, +"slice_6/name": "", +"slice_6/save_to_file/enabled": false, +"slice_6/save_to_file/keep_custom_tracks": false, +"slice_6/save_to_file/path": "", +"slice_6/start_frame": 0, +"slice_60/end_frame": 0, +"slice_60/loop_mode": 0, +"slice_60/name": "", +"slice_60/save_to_file/enabled": false, +"slice_60/save_to_file/keep_custom_tracks": false, +"slice_60/save_to_file/path": "", +"slice_60/start_frame": 0, +"slice_61/end_frame": 0, +"slice_61/loop_mode": 0, +"slice_61/name": "", +"slice_61/save_to_file/enabled": false, +"slice_61/save_to_file/keep_custom_tracks": false, +"slice_61/save_to_file/path": "", +"slice_61/start_frame": 0, +"slice_62/end_frame": 0, +"slice_62/loop_mode": 0, +"slice_62/name": "", +"slice_62/save_to_file/enabled": false, +"slice_62/save_to_file/keep_custom_tracks": false, +"slice_62/save_to_file/path": "", +"slice_62/start_frame": 0, +"slice_63/end_frame": 0, +"slice_63/loop_mode": 0, +"slice_63/name": "", +"slice_63/save_to_file/enabled": false, +"slice_63/save_to_file/keep_custom_tracks": false, +"slice_63/save_to_file/path": "", +"slice_63/start_frame": 0, +"slice_64/end_frame": 0, +"slice_64/loop_mode": 0, +"slice_64/name": "", +"slice_64/save_to_file/enabled": false, +"slice_64/save_to_file/keep_custom_tracks": false, +"slice_64/save_to_file/path": "", +"slice_64/start_frame": 0, +"slice_65/end_frame": 0, +"slice_65/loop_mode": 0, +"slice_65/name": "", +"slice_65/save_to_file/enabled": false, +"slice_65/save_to_file/keep_custom_tracks": false, +"slice_65/save_to_file/path": "", +"slice_65/start_frame": 0, +"slice_66/end_frame": 0, +"slice_66/loop_mode": 0, +"slice_66/name": "", +"slice_66/save_to_file/enabled": false, +"slice_66/save_to_file/keep_custom_tracks": false, +"slice_66/save_to_file/path": "", +"slice_66/start_frame": 0, +"slice_67/end_frame": 0, +"slice_67/loop_mode": 0, +"slice_67/name": "", +"slice_67/save_to_file/enabled": false, +"slice_67/save_to_file/keep_custom_tracks": false, +"slice_67/save_to_file/path": "", +"slice_67/start_frame": 0, +"slice_68/end_frame": 0, +"slice_68/loop_mode": 0, +"slice_68/name": "", +"slice_68/save_to_file/enabled": false, +"slice_68/save_to_file/keep_custom_tracks": false, +"slice_68/save_to_file/path": "", +"slice_68/start_frame": 0, +"slice_69/end_frame": 0, +"slice_69/loop_mode": 0, +"slice_69/name": "", +"slice_69/save_to_file/enabled": false, +"slice_69/save_to_file/keep_custom_tracks": false, +"slice_69/save_to_file/path": "", +"slice_69/start_frame": 0, +"slice_7/end_frame": 0, +"slice_7/loop_mode": 0, +"slice_7/name": "", +"slice_7/save_to_file/enabled": false, +"slice_7/save_to_file/keep_custom_tracks": false, +"slice_7/save_to_file/path": "", +"slice_7/start_frame": 0, +"slice_70/end_frame": 0, +"slice_70/loop_mode": 0, +"slice_70/name": "", +"slice_70/save_to_file/enabled": false, +"slice_70/save_to_file/keep_custom_tracks": false, +"slice_70/save_to_file/path": "", +"slice_70/start_frame": 0, +"slice_71/end_frame": 0, +"slice_71/loop_mode": 0, +"slice_71/name": "", +"slice_71/save_to_file/enabled": false, +"slice_71/save_to_file/keep_custom_tracks": false, +"slice_71/save_to_file/path": "", +"slice_71/start_frame": 0, +"slice_72/end_frame": 0, +"slice_72/loop_mode": 0, +"slice_72/name": "", +"slice_72/save_to_file/enabled": false, +"slice_72/save_to_file/keep_custom_tracks": false, +"slice_72/save_to_file/path": "", +"slice_72/start_frame": 0, +"slice_73/end_frame": 0, +"slice_73/loop_mode": 0, +"slice_73/name": "", +"slice_73/save_to_file/enabled": false, +"slice_73/save_to_file/keep_custom_tracks": false, +"slice_73/save_to_file/path": "", +"slice_73/start_frame": 0, +"slice_74/end_frame": 0, +"slice_74/loop_mode": 0, +"slice_74/name": "", +"slice_74/save_to_file/enabled": false, +"slice_74/save_to_file/keep_custom_tracks": false, +"slice_74/save_to_file/path": "", +"slice_74/start_frame": 0, +"slice_75/end_frame": 0, +"slice_75/loop_mode": 0, +"slice_75/name": "", +"slice_75/save_to_file/enabled": false, +"slice_75/save_to_file/keep_custom_tracks": false, +"slice_75/save_to_file/path": "", +"slice_75/start_frame": 0, +"slice_76/end_frame": 0, +"slice_76/loop_mode": 0, +"slice_76/name": "", +"slice_76/save_to_file/enabled": false, +"slice_76/save_to_file/keep_custom_tracks": false, +"slice_76/save_to_file/path": "", +"slice_76/start_frame": 0, +"slice_77/end_frame": 0, +"slice_77/loop_mode": 0, +"slice_77/name": "", +"slice_77/save_to_file/enabled": false, +"slice_77/save_to_file/keep_custom_tracks": false, +"slice_77/save_to_file/path": "", +"slice_77/start_frame": 0, +"slice_78/end_frame": 0, +"slice_78/loop_mode": 0, +"slice_78/name": "", +"slice_78/save_to_file/enabled": false, +"slice_78/save_to_file/keep_custom_tracks": false, +"slice_78/save_to_file/path": "", +"slice_78/start_frame": 0, +"slice_79/end_frame": 0, +"slice_79/loop_mode": 0, +"slice_79/name": "", +"slice_79/save_to_file/enabled": false, +"slice_79/save_to_file/keep_custom_tracks": false, +"slice_79/save_to_file/path": "", +"slice_79/start_frame": 0, +"slice_8/end_frame": 0, +"slice_8/loop_mode": 0, +"slice_8/name": "", +"slice_8/save_to_file/enabled": false, +"slice_8/save_to_file/keep_custom_tracks": false, +"slice_8/save_to_file/path": "", +"slice_8/start_frame": 0, +"slice_80/end_frame": 0, +"slice_80/loop_mode": 0, +"slice_80/name": "", +"slice_80/save_to_file/enabled": false, +"slice_80/save_to_file/keep_custom_tracks": false, +"slice_80/save_to_file/path": "", +"slice_80/start_frame": 0, +"slice_81/end_frame": 0, +"slice_81/loop_mode": 0, +"slice_81/name": "", +"slice_81/save_to_file/enabled": false, +"slice_81/save_to_file/keep_custom_tracks": false, +"slice_81/save_to_file/path": "", +"slice_81/start_frame": 0, +"slice_82/end_frame": 0, +"slice_82/loop_mode": 0, +"slice_82/name": "", +"slice_82/save_to_file/enabled": false, +"slice_82/save_to_file/keep_custom_tracks": false, +"slice_82/save_to_file/path": "", +"slice_82/start_frame": 0, +"slice_83/end_frame": 0, +"slice_83/loop_mode": 0, +"slice_83/name": "", +"slice_83/save_to_file/enabled": false, +"slice_83/save_to_file/keep_custom_tracks": false, +"slice_83/save_to_file/path": "", +"slice_83/start_frame": 0, +"slice_84/end_frame": 0, +"slice_84/loop_mode": 0, +"slice_84/name": "", +"slice_84/save_to_file/enabled": false, +"slice_84/save_to_file/keep_custom_tracks": false, +"slice_84/save_to_file/path": "", +"slice_84/start_frame": 0, +"slice_85/end_frame": 0, +"slice_85/loop_mode": 0, +"slice_85/name": "", +"slice_85/save_to_file/enabled": false, +"slice_85/save_to_file/keep_custom_tracks": false, +"slice_85/save_to_file/path": "", +"slice_85/start_frame": 0, +"slice_86/end_frame": 0, +"slice_86/loop_mode": 0, +"slice_86/name": "", +"slice_86/save_to_file/enabled": false, +"slice_86/save_to_file/keep_custom_tracks": false, +"slice_86/save_to_file/path": "", +"slice_86/start_frame": 0, +"slice_87/end_frame": 0, +"slice_87/loop_mode": 0, +"slice_87/name": "", +"slice_87/save_to_file/enabled": false, +"slice_87/save_to_file/keep_custom_tracks": false, +"slice_87/save_to_file/path": "", +"slice_87/start_frame": 0, +"slice_88/end_frame": 0, +"slice_88/loop_mode": 0, +"slice_88/name": "", +"slice_88/save_to_file/enabled": false, +"slice_88/save_to_file/keep_custom_tracks": false, +"slice_88/save_to_file/path": "", +"slice_88/start_frame": 0, +"slice_89/end_frame": 0, +"slice_89/loop_mode": 0, +"slice_89/name": "", +"slice_89/save_to_file/enabled": false, +"slice_89/save_to_file/keep_custom_tracks": false, +"slice_89/save_to_file/path": "", +"slice_89/start_frame": 0, +"slice_9/end_frame": 0, +"slice_9/loop_mode": 0, +"slice_9/name": "", +"slice_9/save_to_file/enabled": false, +"slice_9/save_to_file/keep_custom_tracks": false, +"slice_9/save_to_file/path": "", +"slice_9/start_frame": 0, +"slice_90/end_frame": 0, +"slice_90/loop_mode": 0, +"slice_90/name": "", +"slice_90/save_to_file/enabled": false, +"slice_90/save_to_file/keep_custom_tracks": false, +"slice_90/save_to_file/path": "", +"slice_90/start_frame": 0, +"slice_91/end_frame": 0, +"slice_91/loop_mode": 0, +"slice_91/name": "", +"slice_91/save_to_file/enabled": false, +"slice_91/save_to_file/keep_custom_tracks": false, +"slice_91/save_to_file/path": "", +"slice_91/start_frame": 0, +"slice_92/end_frame": 0, +"slice_92/loop_mode": 0, +"slice_92/name": "", +"slice_92/save_to_file/enabled": false, +"slice_92/save_to_file/keep_custom_tracks": false, +"slice_92/save_to_file/path": "", +"slice_92/start_frame": 0, +"slice_93/end_frame": 0, +"slice_93/loop_mode": 0, +"slice_93/name": "", +"slice_93/save_to_file/enabled": false, +"slice_93/save_to_file/keep_custom_tracks": false, +"slice_93/save_to_file/path": "", +"slice_93/start_frame": 0, +"slice_94/end_frame": 0, +"slice_94/loop_mode": 0, +"slice_94/name": "", +"slice_94/save_to_file/enabled": false, +"slice_94/save_to_file/keep_custom_tracks": false, +"slice_94/save_to_file/path": "", +"slice_94/start_frame": 0, +"slice_95/end_frame": 0, +"slice_95/loop_mode": 0, +"slice_95/name": "", +"slice_95/save_to_file/enabled": false, +"slice_95/save_to_file/keep_custom_tracks": false, +"slice_95/save_to_file/path": "", +"slice_95/start_frame": 0, +"slice_96/end_frame": 0, +"slice_96/loop_mode": 0, +"slice_96/name": "", +"slice_96/save_to_file/enabled": false, +"slice_96/save_to_file/keep_custom_tracks": false, +"slice_96/save_to_file/path": "", +"slice_96/start_frame": 0, +"slice_97/end_frame": 0, +"slice_97/loop_mode": 0, +"slice_97/name": "", +"slice_97/save_to_file/enabled": false, +"slice_97/save_to_file/keep_custom_tracks": false, +"slice_97/save_to_file/path": "", +"slice_97/start_frame": 0, +"slice_98/end_frame": 0, +"slice_98/loop_mode": 0, +"slice_98/name": "", +"slice_98/save_to_file/enabled": false, +"slice_98/save_to_file/keep_custom_tracks": false, +"slice_98/save_to_file/path": "", +"slice_98/start_frame": 0, +"slice_99/end_frame": 0, +"slice_99/loop_mode": 0, +"slice_99/name": "", +"slice_99/save_to_file/enabled": false, +"slice_99/save_to_file/keep_custom_tracks": false, +"slice_99/save_to_file/path": "", +"slice_99/start_frame": 0, +"slices/amount": null +}, +"idle": { +"save_to_file/enabled": false, +"save_to_file/keep_custom_tracks": "", +"save_to_file/path": "", +"settings/loop_mode": 1, +"slice_1/end_frame": 0, +"slice_1/loop_mode": 0, +"slice_1/name": "", +"slice_1/save_to_file/enabled": false, +"slice_1/save_to_file/keep_custom_tracks": false, +"slice_1/save_to_file/path": "", +"slice_1/start_frame": 0, +"slice_10/end_frame": 0, +"slice_10/loop_mode": 0, +"slice_10/name": "", +"slice_10/save_to_file/enabled": false, +"slice_10/save_to_file/keep_custom_tracks": false, +"slice_10/save_to_file/path": "", +"slice_10/start_frame": 0, +"slice_100/end_frame": 0, +"slice_100/loop_mode": 0, +"slice_100/name": "", +"slice_100/save_to_file/enabled": false, +"slice_100/save_to_file/keep_custom_tracks": false, +"slice_100/save_to_file/path": "", +"slice_100/start_frame": 0, +"slice_101/end_frame": 0, +"slice_101/loop_mode": 0, +"slice_101/name": "", +"slice_101/save_to_file/enabled": false, +"slice_101/save_to_file/keep_custom_tracks": false, +"slice_101/save_to_file/path": "", +"slice_101/start_frame": 0, +"slice_102/end_frame": 0, +"slice_102/loop_mode": 0, +"slice_102/name": "", +"slice_102/save_to_file/enabled": false, +"slice_102/save_to_file/keep_custom_tracks": false, +"slice_102/save_to_file/path": "", +"slice_102/start_frame": 0, +"slice_103/end_frame": 0, +"slice_103/loop_mode": 0, +"slice_103/name": "", +"slice_103/save_to_file/enabled": false, +"slice_103/save_to_file/keep_custom_tracks": false, +"slice_103/save_to_file/path": "", +"slice_103/start_frame": 0, +"slice_104/end_frame": 0, +"slice_104/loop_mode": 0, +"slice_104/name": "", +"slice_104/save_to_file/enabled": false, +"slice_104/save_to_file/keep_custom_tracks": false, +"slice_104/save_to_file/path": "", +"slice_104/start_frame": 0, +"slice_105/end_frame": 0, +"slice_105/loop_mode": 0, +"slice_105/name": "", +"slice_105/save_to_file/enabled": false, +"slice_105/save_to_file/keep_custom_tracks": false, +"slice_105/save_to_file/path": "", +"slice_105/start_frame": 0, +"slice_106/end_frame": 0, +"slice_106/loop_mode": 0, +"slice_106/name": "", +"slice_106/save_to_file/enabled": false, +"slice_106/save_to_file/keep_custom_tracks": false, +"slice_106/save_to_file/path": "", +"slice_106/start_frame": 0, +"slice_107/end_frame": 0, +"slice_107/loop_mode": 0, +"slice_107/name": "", +"slice_107/save_to_file/enabled": false, +"slice_107/save_to_file/keep_custom_tracks": false, +"slice_107/save_to_file/path": "", +"slice_107/start_frame": 0, +"slice_108/end_frame": 0, +"slice_108/loop_mode": 0, +"slice_108/name": "", +"slice_108/save_to_file/enabled": false, +"slice_108/save_to_file/keep_custom_tracks": false, +"slice_108/save_to_file/path": "", +"slice_108/start_frame": 0, +"slice_109/end_frame": 0, +"slice_109/loop_mode": 0, +"slice_109/name": "", +"slice_109/save_to_file/enabled": false, +"slice_109/save_to_file/keep_custom_tracks": false, +"slice_109/save_to_file/path": "", +"slice_109/start_frame": 0, +"slice_11/end_frame": 0, +"slice_11/loop_mode": 0, +"slice_11/name": "", +"slice_11/save_to_file/enabled": false, +"slice_11/save_to_file/keep_custom_tracks": false, +"slice_11/save_to_file/path": "", +"slice_11/start_frame": 0, +"slice_110/end_frame": 0, +"slice_110/loop_mode": 0, +"slice_110/name": "", +"slice_110/save_to_file/enabled": false, +"slice_110/save_to_file/keep_custom_tracks": false, +"slice_110/save_to_file/path": "", +"slice_110/start_frame": 0, +"slice_111/end_frame": 0, +"slice_111/loop_mode": 0, +"slice_111/name": "", +"slice_111/save_to_file/enabled": false, +"slice_111/save_to_file/keep_custom_tracks": false, +"slice_111/save_to_file/path": "", +"slice_111/start_frame": 0, +"slice_112/end_frame": 0, +"slice_112/loop_mode": 0, +"slice_112/name": "", +"slice_112/save_to_file/enabled": false, +"slice_112/save_to_file/keep_custom_tracks": false, +"slice_112/save_to_file/path": "", +"slice_112/start_frame": 0, +"slice_113/end_frame": 0, +"slice_113/loop_mode": 0, +"slice_113/name": "", +"slice_113/save_to_file/enabled": false, +"slice_113/save_to_file/keep_custom_tracks": false, +"slice_113/save_to_file/path": "", +"slice_113/start_frame": 0, +"slice_114/end_frame": 0, +"slice_114/loop_mode": 0, +"slice_114/name": "", +"slice_114/save_to_file/enabled": false, +"slice_114/save_to_file/keep_custom_tracks": false, +"slice_114/save_to_file/path": "", +"slice_114/start_frame": 0, +"slice_115/end_frame": 0, +"slice_115/loop_mode": 0, +"slice_115/name": "", +"slice_115/save_to_file/enabled": false, +"slice_115/save_to_file/keep_custom_tracks": false, +"slice_115/save_to_file/path": "", +"slice_115/start_frame": 0, +"slice_116/end_frame": 0, +"slice_116/loop_mode": 0, +"slice_116/name": "", +"slice_116/save_to_file/enabled": false, +"slice_116/save_to_file/keep_custom_tracks": false, +"slice_116/save_to_file/path": "", +"slice_116/start_frame": 0, +"slice_117/end_frame": 0, +"slice_117/loop_mode": 0, +"slice_117/name": "", +"slice_117/save_to_file/enabled": false, +"slice_117/save_to_file/keep_custom_tracks": false, +"slice_117/save_to_file/path": "", +"slice_117/start_frame": 0, +"slice_118/end_frame": 0, +"slice_118/loop_mode": 0, +"slice_118/name": "", +"slice_118/save_to_file/enabled": false, +"slice_118/save_to_file/keep_custom_tracks": false, +"slice_118/save_to_file/path": "", +"slice_118/start_frame": 0, +"slice_119/end_frame": 0, +"slice_119/loop_mode": 0, +"slice_119/name": "", +"slice_119/save_to_file/enabled": false, +"slice_119/save_to_file/keep_custom_tracks": false, +"slice_119/save_to_file/path": "", +"slice_119/start_frame": 0, +"slice_12/end_frame": 0, +"slice_12/loop_mode": 0, +"slice_12/name": "", +"slice_12/save_to_file/enabled": false, +"slice_12/save_to_file/keep_custom_tracks": false, +"slice_12/save_to_file/path": "", +"slice_12/start_frame": 0, +"slice_120/end_frame": 0, +"slice_120/loop_mode": 0, +"slice_120/name": "", +"slice_120/save_to_file/enabled": false, +"slice_120/save_to_file/keep_custom_tracks": false, +"slice_120/save_to_file/path": "", +"slice_120/start_frame": 0, +"slice_121/end_frame": 0, +"slice_121/loop_mode": 0, +"slice_121/name": "", +"slice_121/save_to_file/enabled": false, +"slice_121/save_to_file/keep_custom_tracks": false, +"slice_121/save_to_file/path": "", +"slice_121/start_frame": 0, +"slice_122/end_frame": 0, +"slice_122/loop_mode": 0, +"slice_122/name": "", +"slice_122/save_to_file/enabled": false, +"slice_122/save_to_file/keep_custom_tracks": false, +"slice_122/save_to_file/path": "", +"slice_122/start_frame": 0, +"slice_123/end_frame": 0, +"slice_123/loop_mode": 0, +"slice_123/name": "", +"slice_123/save_to_file/enabled": false, +"slice_123/save_to_file/keep_custom_tracks": false, +"slice_123/save_to_file/path": "", +"slice_123/start_frame": 0, +"slice_124/end_frame": 0, +"slice_124/loop_mode": 0, +"slice_124/name": "", +"slice_124/save_to_file/enabled": false, +"slice_124/save_to_file/keep_custom_tracks": false, +"slice_124/save_to_file/path": "", +"slice_124/start_frame": 0, +"slice_125/end_frame": 0, +"slice_125/loop_mode": 0, +"slice_125/name": "", +"slice_125/save_to_file/enabled": false, +"slice_125/save_to_file/keep_custom_tracks": false, +"slice_125/save_to_file/path": "", +"slice_125/start_frame": 0, +"slice_126/end_frame": 0, +"slice_126/loop_mode": 0, +"slice_126/name": "", +"slice_126/save_to_file/enabled": false, +"slice_126/save_to_file/keep_custom_tracks": false, +"slice_126/save_to_file/path": "", +"slice_126/start_frame": 0, +"slice_127/end_frame": 0, +"slice_127/loop_mode": 0, +"slice_127/name": "", +"slice_127/save_to_file/enabled": false, +"slice_127/save_to_file/keep_custom_tracks": false, +"slice_127/save_to_file/path": "", +"slice_127/start_frame": 0, +"slice_128/end_frame": 0, +"slice_128/loop_mode": 0, +"slice_128/name": "", +"slice_128/save_to_file/enabled": false, +"slice_128/save_to_file/keep_custom_tracks": false, +"slice_128/save_to_file/path": "", +"slice_128/start_frame": 0, +"slice_129/end_frame": 0, +"slice_129/loop_mode": 0, +"slice_129/name": "", +"slice_129/save_to_file/enabled": false, +"slice_129/save_to_file/keep_custom_tracks": false, +"slice_129/save_to_file/path": "", +"slice_129/start_frame": 0, +"slice_13/end_frame": 0, +"slice_13/loop_mode": 0, +"slice_13/name": "", +"slice_13/save_to_file/enabled": false, +"slice_13/save_to_file/keep_custom_tracks": false, +"slice_13/save_to_file/path": "", +"slice_13/start_frame": 0, +"slice_130/end_frame": 0, +"slice_130/loop_mode": 0, +"slice_130/name": "", +"slice_130/save_to_file/enabled": false, +"slice_130/save_to_file/keep_custom_tracks": false, +"slice_130/save_to_file/path": "", +"slice_130/start_frame": 0, +"slice_131/end_frame": 0, +"slice_131/loop_mode": 0, +"slice_131/name": "", +"slice_131/save_to_file/enabled": false, +"slice_131/save_to_file/keep_custom_tracks": false, +"slice_131/save_to_file/path": "", +"slice_131/start_frame": 0, +"slice_132/end_frame": 0, +"slice_132/loop_mode": 0, +"slice_132/name": "", +"slice_132/save_to_file/enabled": false, +"slice_132/save_to_file/keep_custom_tracks": false, +"slice_132/save_to_file/path": "", +"slice_132/start_frame": 0, +"slice_133/end_frame": 0, +"slice_133/loop_mode": 0, +"slice_133/name": "", +"slice_133/save_to_file/enabled": false, +"slice_133/save_to_file/keep_custom_tracks": false, +"slice_133/save_to_file/path": "", +"slice_133/start_frame": 0, +"slice_134/end_frame": 0, +"slice_134/loop_mode": 0, +"slice_134/name": "", +"slice_134/save_to_file/enabled": false, +"slice_134/save_to_file/keep_custom_tracks": false, +"slice_134/save_to_file/path": "", +"slice_134/start_frame": 0, +"slice_135/end_frame": 0, +"slice_135/loop_mode": 0, +"slice_135/name": "", +"slice_135/save_to_file/enabled": false, +"slice_135/save_to_file/keep_custom_tracks": false, +"slice_135/save_to_file/path": "", +"slice_135/start_frame": 0, +"slice_136/end_frame": 0, +"slice_136/loop_mode": 0, +"slice_136/name": "", +"slice_136/save_to_file/enabled": false, +"slice_136/save_to_file/keep_custom_tracks": false, +"slice_136/save_to_file/path": "", +"slice_136/start_frame": 0, +"slice_137/end_frame": 0, +"slice_137/loop_mode": 0, +"slice_137/name": "", +"slice_137/save_to_file/enabled": false, +"slice_137/save_to_file/keep_custom_tracks": false, +"slice_137/save_to_file/path": "", +"slice_137/start_frame": 0, +"slice_138/end_frame": 0, +"slice_138/loop_mode": 0, +"slice_138/name": "", +"slice_138/save_to_file/enabled": false, +"slice_138/save_to_file/keep_custom_tracks": false, +"slice_138/save_to_file/path": "", +"slice_138/start_frame": 0, +"slice_139/end_frame": 0, +"slice_139/loop_mode": 0, +"slice_139/name": "", +"slice_139/save_to_file/enabled": false, +"slice_139/save_to_file/keep_custom_tracks": false, +"slice_139/save_to_file/path": "", +"slice_139/start_frame": 0, +"slice_14/end_frame": 0, +"slice_14/loop_mode": 0, +"slice_14/name": "", +"slice_14/save_to_file/enabled": false, +"slice_14/save_to_file/keep_custom_tracks": false, +"slice_14/save_to_file/path": "", +"slice_14/start_frame": 0, +"slice_140/end_frame": 0, +"slice_140/loop_mode": 0, +"slice_140/name": "", +"slice_140/save_to_file/enabled": false, +"slice_140/save_to_file/keep_custom_tracks": false, +"slice_140/save_to_file/path": "", +"slice_140/start_frame": 0, +"slice_141/end_frame": 0, +"slice_141/loop_mode": 0, +"slice_141/name": "", +"slice_141/save_to_file/enabled": false, +"slice_141/save_to_file/keep_custom_tracks": false, +"slice_141/save_to_file/path": "", +"slice_141/start_frame": 0, +"slice_142/end_frame": 0, +"slice_142/loop_mode": 0, +"slice_142/name": "", +"slice_142/save_to_file/enabled": false, +"slice_142/save_to_file/keep_custom_tracks": false, +"slice_142/save_to_file/path": "", +"slice_142/start_frame": 0, +"slice_143/end_frame": 0, +"slice_143/loop_mode": 0, +"slice_143/name": "", +"slice_143/save_to_file/enabled": false, +"slice_143/save_to_file/keep_custom_tracks": false, +"slice_143/save_to_file/path": "", +"slice_143/start_frame": 0, +"slice_144/end_frame": 0, +"slice_144/loop_mode": 0, +"slice_144/name": "", +"slice_144/save_to_file/enabled": false, +"slice_144/save_to_file/keep_custom_tracks": false, +"slice_144/save_to_file/path": "", +"slice_144/start_frame": 0, +"slice_145/end_frame": 0, +"slice_145/loop_mode": 0, +"slice_145/name": "", +"slice_145/save_to_file/enabled": false, +"slice_145/save_to_file/keep_custom_tracks": false, +"slice_145/save_to_file/path": "", +"slice_145/start_frame": 0, +"slice_146/end_frame": 0, +"slice_146/loop_mode": 0, +"slice_146/name": "", +"slice_146/save_to_file/enabled": false, +"slice_146/save_to_file/keep_custom_tracks": false, +"slice_146/save_to_file/path": "", +"slice_146/start_frame": 0, +"slice_147/end_frame": 0, +"slice_147/loop_mode": 0, +"slice_147/name": "", +"slice_147/save_to_file/enabled": false, +"slice_147/save_to_file/keep_custom_tracks": false, +"slice_147/save_to_file/path": "", +"slice_147/start_frame": 0, +"slice_148/end_frame": 0, +"slice_148/loop_mode": 0, +"slice_148/name": "", +"slice_148/save_to_file/enabled": false, +"slice_148/save_to_file/keep_custom_tracks": false, +"slice_148/save_to_file/path": "", +"slice_148/start_frame": 0, +"slice_149/end_frame": 0, +"slice_149/loop_mode": 0, +"slice_149/name": "", +"slice_149/save_to_file/enabled": false, +"slice_149/save_to_file/keep_custom_tracks": false, +"slice_149/save_to_file/path": "", +"slice_149/start_frame": 0, +"slice_15/end_frame": 0, +"slice_15/loop_mode": 0, +"slice_15/name": "", +"slice_15/save_to_file/enabled": false, +"slice_15/save_to_file/keep_custom_tracks": false, +"slice_15/save_to_file/path": "", +"slice_15/start_frame": 0, +"slice_150/end_frame": 0, +"slice_150/loop_mode": 0, +"slice_150/name": "", +"slice_150/save_to_file/enabled": false, +"slice_150/save_to_file/keep_custom_tracks": false, +"slice_150/save_to_file/path": "", +"slice_150/start_frame": 0, +"slice_151/end_frame": 0, +"slice_151/loop_mode": 0, +"slice_151/name": "", +"slice_151/save_to_file/enabled": false, +"slice_151/save_to_file/keep_custom_tracks": false, +"slice_151/save_to_file/path": "", +"slice_151/start_frame": 0, +"slice_152/end_frame": 0, +"slice_152/loop_mode": 0, +"slice_152/name": "", +"slice_152/save_to_file/enabled": false, +"slice_152/save_to_file/keep_custom_tracks": false, +"slice_152/save_to_file/path": "", +"slice_152/start_frame": 0, +"slice_153/end_frame": 0, +"slice_153/loop_mode": 0, +"slice_153/name": "", +"slice_153/save_to_file/enabled": false, +"slice_153/save_to_file/keep_custom_tracks": false, +"slice_153/save_to_file/path": "", +"slice_153/start_frame": 0, +"slice_154/end_frame": 0, +"slice_154/loop_mode": 0, +"slice_154/name": "", +"slice_154/save_to_file/enabled": false, +"slice_154/save_to_file/keep_custom_tracks": false, +"slice_154/save_to_file/path": "", +"slice_154/start_frame": 0, +"slice_155/end_frame": 0, +"slice_155/loop_mode": 0, +"slice_155/name": "", +"slice_155/save_to_file/enabled": false, +"slice_155/save_to_file/keep_custom_tracks": false, +"slice_155/save_to_file/path": "", +"slice_155/start_frame": 0, +"slice_156/end_frame": 0, +"slice_156/loop_mode": 0, +"slice_156/name": "", +"slice_156/save_to_file/enabled": false, +"slice_156/save_to_file/keep_custom_tracks": false, +"slice_156/save_to_file/path": "", +"slice_156/start_frame": 0, +"slice_157/end_frame": 0, +"slice_157/loop_mode": 0, +"slice_157/name": "", +"slice_157/save_to_file/enabled": false, +"slice_157/save_to_file/keep_custom_tracks": false, +"slice_157/save_to_file/path": "", +"slice_157/start_frame": 0, +"slice_158/end_frame": 0, +"slice_158/loop_mode": 0, +"slice_158/name": "", +"slice_158/save_to_file/enabled": false, +"slice_158/save_to_file/keep_custom_tracks": false, +"slice_158/save_to_file/path": "", +"slice_158/start_frame": 0, +"slice_159/end_frame": 0, +"slice_159/loop_mode": 0, +"slice_159/name": "", +"slice_159/save_to_file/enabled": false, +"slice_159/save_to_file/keep_custom_tracks": false, +"slice_159/save_to_file/path": "", +"slice_159/start_frame": 0, +"slice_16/end_frame": 0, +"slice_16/loop_mode": 0, +"slice_16/name": "", +"slice_16/save_to_file/enabled": false, +"slice_16/save_to_file/keep_custom_tracks": false, +"slice_16/save_to_file/path": "", +"slice_16/start_frame": 0, +"slice_160/end_frame": 0, +"slice_160/loop_mode": 0, +"slice_160/name": "", +"slice_160/save_to_file/enabled": false, +"slice_160/save_to_file/keep_custom_tracks": false, +"slice_160/save_to_file/path": "", +"slice_160/start_frame": 0, +"slice_161/end_frame": 0, +"slice_161/loop_mode": 0, +"slice_161/name": "", +"slice_161/save_to_file/enabled": false, +"slice_161/save_to_file/keep_custom_tracks": false, +"slice_161/save_to_file/path": "", +"slice_161/start_frame": 0, +"slice_162/end_frame": 0, +"slice_162/loop_mode": 0, +"slice_162/name": "", +"slice_162/save_to_file/enabled": false, +"slice_162/save_to_file/keep_custom_tracks": false, +"slice_162/save_to_file/path": "", +"slice_162/start_frame": 0, +"slice_163/end_frame": 0, +"slice_163/loop_mode": 0, +"slice_163/name": "", +"slice_163/save_to_file/enabled": false, +"slice_163/save_to_file/keep_custom_tracks": false, +"slice_163/save_to_file/path": "", +"slice_163/start_frame": 0, +"slice_164/end_frame": 0, +"slice_164/loop_mode": 0, +"slice_164/name": "", +"slice_164/save_to_file/enabled": false, +"slice_164/save_to_file/keep_custom_tracks": false, +"slice_164/save_to_file/path": "", +"slice_164/start_frame": 0, +"slice_165/end_frame": 0, +"slice_165/loop_mode": 0, +"slice_165/name": "", +"slice_165/save_to_file/enabled": false, +"slice_165/save_to_file/keep_custom_tracks": false, +"slice_165/save_to_file/path": "", +"slice_165/start_frame": 0, +"slice_166/end_frame": 0, +"slice_166/loop_mode": 0, +"slice_166/name": "", +"slice_166/save_to_file/enabled": false, +"slice_166/save_to_file/keep_custom_tracks": false, +"slice_166/save_to_file/path": "", +"slice_166/start_frame": 0, +"slice_167/end_frame": 0, +"slice_167/loop_mode": 0, +"slice_167/name": "", +"slice_167/save_to_file/enabled": false, +"slice_167/save_to_file/keep_custom_tracks": false, +"slice_167/save_to_file/path": "", +"slice_167/start_frame": 0, +"slice_168/end_frame": 0, +"slice_168/loop_mode": 0, +"slice_168/name": "", +"slice_168/save_to_file/enabled": false, +"slice_168/save_to_file/keep_custom_tracks": false, +"slice_168/save_to_file/path": "", +"slice_168/start_frame": 0, +"slice_169/end_frame": 0, +"slice_169/loop_mode": 0, +"slice_169/name": "", +"slice_169/save_to_file/enabled": false, +"slice_169/save_to_file/keep_custom_tracks": false, +"slice_169/save_to_file/path": "", +"slice_169/start_frame": 0, +"slice_17/end_frame": 0, +"slice_17/loop_mode": 0, +"slice_17/name": "", +"slice_17/save_to_file/enabled": false, +"slice_17/save_to_file/keep_custom_tracks": false, +"slice_17/save_to_file/path": "", +"slice_17/start_frame": 0, +"slice_170/end_frame": 0, +"slice_170/loop_mode": 0, +"slice_170/name": "", +"slice_170/save_to_file/enabled": false, +"slice_170/save_to_file/keep_custom_tracks": false, +"slice_170/save_to_file/path": "", +"slice_170/start_frame": 0, +"slice_171/end_frame": 0, +"slice_171/loop_mode": 0, +"slice_171/name": "", +"slice_171/save_to_file/enabled": false, +"slice_171/save_to_file/keep_custom_tracks": false, +"slice_171/save_to_file/path": "", +"slice_171/start_frame": 0, +"slice_172/end_frame": 0, +"slice_172/loop_mode": 0, +"slice_172/name": "", +"slice_172/save_to_file/enabled": false, +"slice_172/save_to_file/keep_custom_tracks": false, +"slice_172/save_to_file/path": "", +"slice_172/start_frame": 0, +"slice_173/end_frame": 0, +"slice_173/loop_mode": 0, +"slice_173/name": "", +"slice_173/save_to_file/enabled": false, +"slice_173/save_to_file/keep_custom_tracks": false, +"slice_173/save_to_file/path": "", +"slice_173/start_frame": 0, +"slice_174/end_frame": 0, +"slice_174/loop_mode": 0, +"slice_174/name": "", +"slice_174/save_to_file/enabled": false, +"slice_174/save_to_file/keep_custom_tracks": false, +"slice_174/save_to_file/path": "", +"slice_174/start_frame": 0, +"slice_175/end_frame": 0, +"slice_175/loop_mode": 0, +"slice_175/name": "", +"slice_175/save_to_file/enabled": false, +"slice_175/save_to_file/keep_custom_tracks": false, +"slice_175/save_to_file/path": "", +"slice_175/start_frame": 0, +"slice_176/end_frame": 0, +"slice_176/loop_mode": 0, +"slice_176/name": "", +"slice_176/save_to_file/enabled": false, +"slice_176/save_to_file/keep_custom_tracks": false, +"slice_176/save_to_file/path": "", +"slice_176/start_frame": 0, +"slice_177/end_frame": 0, +"slice_177/loop_mode": 0, +"slice_177/name": "", +"slice_177/save_to_file/enabled": false, +"slice_177/save_to_file/keep_custom_tracks": false, +"slice_177/save_to_file/path": "", +"slice_177/start_frame": 0, +"slice_178/end_frame": 0, +"slice_178/loop_mode": 0, +"slice_178/name": "", +"slice_178/save_to_file/enabled": false, +"slice_178/save_to_file/keep_custom_tracks": false, +"slice_178/save_to_file/path": "", +"slice_178/start_frame": 0, +"slice_179/end_frame": 0, +"slice_179/loop_mode": 0, +"slice_179/name": "", +"slice_179/save_to_file/enabled": false, +"slice_179/save_to_file/keep_custom_tracks": false, +"slice_179/save_to_file/path": "", +"slice_179/start_frame": 0, +"slice_18/end_frame": 0, +"slice_18/loop_mode": 0, +"slice_18/name": "", +"slice_18/save_to_file/enabled": false, +"slice_18/save_to_file/keep_custom_tracks": false, +"slice_18/save_to_file/path": "", +"slice_18/start_frame": 0, +"slice_180/end_frame": 0, +"slice_180/loop_mode": 0, +"slice_180/name": "", +"slice_180/save_to_file/enabled": false, +"slice_180/save_to_file/keep_custom_tracks": false, +"slice_180/save_to_file/path": "", +"slice_180/start_frame": 0, +"slice_181/end_frame": 0, +"slice_181/loop_mode": 0, +"slice_181/name": "", +"slice_181/save_to_file/enabled": false, +"slice_181/save_to_file/keep_custom_tracks": false, +"slice_181/save_to_file/path": "", +"slice_181/start_frame": 0, +"slice_182/end_frame": 0, +"slice_182/loop_mode": 0, +"slice_182/name": "", +"slice_182/save_to_file/enabled": false, +"slice_182/save_to_file/keep_custom_tracks": false, +"slice_182/save_to_file/path": "", +"slice_182/start_frame": 0, +"slice_183/end_frame": 0, +"slice_183/loop_mode": 0, +"slice_183/name": "", +"slice_183/save_to_file/enabled": false, +"slice_183/save_to_file/keep_custom_tracks": false, +"slice_183/save_to_file/path": "", +"slice_183/start_frame": 0, +"slice_184/end_frame": 0, +"slice_184/loop_mode": 0, +"slice_184/name": "", +"slice_184/save_to_file/enabled": false, +"slice_184/save_to_file/keep_custom_tracks": false, +"slice_184/save_to_file/path": "", +"slice_184/start_frame": 0, +"slice_185/end_frame": 0, +"slice_185/loop_mode": 0, +"slice_185/name": "", +"slice_185/save_to_file/enabled": false, +"slice_185/save_to_file/keep_custom_tracks": false, +"slice_185/save_to_file/path": "", +"slice_185/start_frame": 0, +"slice_186/end_frame": 0, +"slice_186/loop_mode": 0, +"slice_186/name": "", +"slice_186/save_to_file/enabled": false, +"slice_186/save_to_file/keep_custom_tracks": false, +"slice_186/save_to_file/path": "", +"slice_186/start_frame": 0, +"slice_187/end_frame": 0, +"slice_187/loop_mode": 0, +"slice_187/name": "", +"slice_187/save_to_file/enabled": false, +"slice_187/save_to_file/keep_custom_tracks": false, +"slice_187/save_to_file/path": "", +"slice_187/start_frame": 0, +"slice_188/end_frame": 0, +"slice_188/loop_mode": 0, +"slice_188/name": "", +"slice_188/save_to_file/enabled": false, +"slice_188/save_to_file/keep_custom_tracks": false, +"slice_188/save_to_file/path": "", +"slice_188/start_frame": 0, +"slice_189/end_frame": 0, +"slice_189/loop_mode": 0, +"slice_189/name": "", +"slice_189/save_to_file/enabled": false, +"slice_189/save_to_file/keep_custom_tracks": false, +"slice_189/save_to_file/path": "", +"slice_189/start_frame": 0, +"slice_19/end_frame": 0, +"slice_19/loop_mode": 0, +"slice_19/name": "", +"slice_19/save_to_file/enabled": false, +"slice_19/save_to_file/keep_custom_tracks": false, +"slice_19/save_to_file/path": "", +"slice_19/start_frame": 0, +"slice_190/end_frame": 0, +"slice_190/loop_mode": 0, +"slice_190/name": "", +"slice_190/save_to_file/enabled": false, +"slice_190/save_to_file/keep_custom_tracks": false, +"slice_190/save_to_file/path": "", +"slice_190/start_frame": 0, +"slice_191/end_frame": 0, +"slice_191/loop_mode": 0, +"slice_191/name": "", +"slice_191/save_to_file/enabled": false, +"slice_191/save_to_file/keep_custom_tracks": false, +"slice_191/save_to_file/path": "", +"slice_191/start_frame": 0, +"slice_192/end_frame": 0, +"slice_192/loop_mode": 0, +"slice_192/name": "", +"slice_192/save_to_file/enabled": false, +"slice_192/save_to_file/keep_custom_tracks": false, +"slice_192/save_to_file/path": "", +"slice_192/start_frame": 0, +"slice_193/end_frame": 0, +"slice_193/loop_mode": 0, +"slice_193/name": "", +"slice_193/save_to_file/enabled": false, +"slice_193/save_to_file/keep_custom_tracks": false, +"slice_193/save_to_file/path": "", +"slice_193/start_frame": 0, +"slice_194/end_frame": 0, +"slice_194/loop_mode": 0, +"slice_194/name": "", +"slice_194/save_to_file/enabled": false, +"slice_194/save_to_file/keep_custom_tracks": false, +"slice_194/save_to_file/path": "", +"slice_194/start_frame": 0, +"slice_195/end_frame": 0, +"slice_195/loop_mode": 0, +"slice_195/name": "", +"slice_195/save_to_file/enabled": false, +"slice_195/save_to_file/keep_custom_tracks": false, +"slice_195/save_to_file/path": "", +"slice_195/start_frame": 0, +"slice_196/end_frame": 0, +"slice_196/loop_mode": 0, +"slice_196/name": "", +"slice_196/save_to_file/enabled": false, +"slice_196/save_to_file/keep_custom_tracks": false, +"slice_196/save_to_file/path": "", +"slice_196/start_frame": 0, +"slice_197/end_frame": 0, +"slice_197/loop_mode": 0, +"slice_197/name": "", +"slice_197/save_to_file/enabled": false, +"slice_197/save_to_file/keep_custom_tracks": false, +"slice_197/save_to_file/path": "", +"slice_197/start_frame": 0, +"slice_198/end_frame": 0, +"slice_198/loop_mode": 0, +"slice_198/name": "", +"slice_198/save_to_file/enabled": false, +"slice_198/save_to_file/keep_custom_tracks": false, +"slice_198/save_to_file/path": "", +"slice_198/start_frame": 0, +"slice_199/end_frame": 0, +"slice_199/loop_mode": 0, +"slice_199/name": "", +"slice_199/save_to_file/enabled": false, +"slice_199/save_to_file/keep_custom_tracks": false, +"slice_199/save_to_file/path": "", +"slice_199/start_frame": 0, +"slice_2/end_frame": 0, +"slice_2/loop_mode": 0, +"slice_2/name": "", +"slice_2/save_to_file/enabled": false, +"slice_2/save_to_file/keep_custom_tracks": false, +"slice_2/save_to_file/path": "", +"slice_2/start_frame": 0, +"slice_20/end_frame": 0, +"slice_20/loop_mode": 0, +"slice_20/name": "", +"slice_20/save_to_file/enabled": false, +"slice_20/save_to_file/keep_custom_tracks": false, +"slice_20/save_to_file/path": "", +"slice_20/start_frame": 0, +"slice_200/end_frame": 0, +"slice_200/loop_mode": 0, +"slice_200/name": "", +"slice_200/save_to_file/enabled": false, +"slice_200/save_to_file/keep_custom_tracks": false, +"slice_200/save_to_file/path": "", +"slice_200/start_frame": 0, +"slice_201/end_frame": 0, +"slice_201/loop_mode": 0, +"slice_201/name": "", +"slice_201/save_to_file/enabled": false, +"slice_201/save_to_file/keep_custom_tracks": false, +"slice_201/save_to_file/path": "", +"slice_201/start_frame": 0, +"slice_202/end_frame": 0, +"slice_202/loop_mode": 0, +"slice_202/name": "", +"slice_202/save_to_file/enabled": false, +"slice_202/save_to_file/keep_custom_tracks": false, +"slice_202/save_to_file/path": "", +"slice_202/start_frame": 0, +"slice_203/end_frame": 0, +"slice_203/loop_mode": 0, +"slice_203/name": "", +"slice_203/save_to_file/enabled": false, +"slice_203/save_to_file/keep_custom_tracks": false, +"slice_203/save_to_file/path": "", +"slice_203/start_frame": 0, +"slice_204/end_frame": 0, +"slice_204/loop_mode": 0, +"slice_204/name": "", +"slice_204/save_to_file/enabled": false, +"slice_204/save_to_file/keep_custom_tracks": false, +"slice_204/save_to_file/path": "", +"slice_204/start_frame": 0, +"slice_205/end_frame": 0, +"slice_205/loop_mode": 0, +"slice_205/name": "", +"slice_205/save_to_file/enabled": false, +"slice_205/save_to_file/keep_custom_tracks": false, +"slice_205/save_to_file/path": "", +"slice_205/start_frame": 0, +"slice_206/end_frame": 0, +"slice_206/loop_mode": 0, +"slice_206/name": "", +"slice_206/save_to_file/enabled": false, +"slice_206/save_to_file/keep_custom_tracks": false, +"slice_206/save_to_file/path": "", +"slice_206/start_frame": 0, +"slice_207/end_frame": 0, +"slice_207/loop_mode": 0, +"slice_207/name": "", +"slice_207/save_to_file/enabled": false, +"slice_207/save_to_file/keep_custom_tracks": false, +"slice_207/save_to_file/path": "", +"slice_207/start_frame": 0, +"slice_208/end_frame": 0, +"slice_208/loop_mode": 0, +"slice_208/name": "", +"slice_208/save_to_file/enabled": false, +"slice_208/save_to_file/keep_custom_tracks": false, +"slice_208/save_to_file/path": "", +"slice_208/start_frame": 0, +"slice_209/end_frame": 0, +"slice_209/loop_mode": 0, +"slice_209/name": "", +"slice_209/save_to_file/enabled": false, +"slice_209/save_to_file/keep_custom_tracks": false, +"slice_209/save_to_file/path": "", +"slice_209/start_frame": 0, +"slice_21/end_frame": 0, +"slice_21/loop_mode": 0, +"slice_21/name": "", +"slice_21/save_to_file/enabled": false, +"slice_21/save_to_file/keep_custom_tracks": false, +"slice_21/save_to_file/path": "", +"slice_21/start_frame": 0, +"slice_210/end_frame": 0, +"slice_210/loop_mode": 0, +"slice_210/name": "", +"slice_210/save_to_file/enabled": false, +"slice_210/save_to_file/keep_custom_tracks": false, +"slice_210/save_to_file/path": "", +"slice_210/start_frame": 0, +"slice_211/end_frame": 0, +"slice_211/loop_mode": 0, +"slice_211/name": "", +"slice_211/save_to_file/enabled": false, +"slice_211/save_to_file/keep_custom_tracks": false, +"slice_211/save_to_file/path": "", +"slice_211/start_frame": 0, +"slice_212/end_frame": 0, +"slice_212/loop_mode": 0, +"slice_212/name": "", +"slice_212/save_to_file/enabled": false, +"slice_212/save_to_file/keep_custom_tracks": false, +"slice_212/save_to_file/path": "", +"slice_212/start_frame": 0, +"slice_213/end_frame": 0, +"slice_213/loop_mode": 0, +"slice_213/name": "", +"slice_213/save_to_file/enabled": false, +"slice_213/save_to_file/keep_custom_tracks": false, +"slice_213/save_to_file/path": "", +"slice_213/start_frame": 0, +"slice_214/end_frame": 0, +"slice_214/loop_mode": 0, +"slice_214/name": "", +"slice_214/save_to_file/enabled": false, +"slice_214/save_to_file/keep_custom_tracks": false, +"slice_214/save_to_file/path": "", +"slice_214/start_frame": 0, +"slice_215/end_frame": 0, +"slice_215/loop_mode": 0, +"slice_215/name": "", +"slice_215/save_to_file/enabled": false, +"slice_215/save_to_file/keep_custom_tracks": false, +"slice_215/save_to_file/path": "", +"slice_215/start_frame": 0, +"slice_216/end_frame": 0, +"slice_216/loop_mode": 0, +"slice_216/name": "", +"slice_216/save_to_file/enabled": false, +"slice_216/save_to_file/keep_custom_tracks": false, +"slice_216/save_to_file/path": "", +"slice_216/start_frame": 0, +"slice_217/end_frame": 0, +"slice_217/loop_mode": 0, +"slice_217/name": "", +"slice_217/save_to_file/enabled": false, +"slice_217/save_to_file/keep_custom_tracks": false, +"slice_217/save_to_file/path": "", +"slice_217/start_frame": 0, +"slice_218/end_frame": 0, +"slice_218/loop_mode": 0, +"slice_218/name": "", +"slice_218/save_to_file/enabled": false, +"slice_218/save_to_file/keep_custom_tracks": false, +"slice_218/save_to_file/path": "", +"slice_218/start_frame": 0, +"slice_219/end_frame": 0, +"slice_219/loop_mode": 0, +"slice_219/name": "", +"slice_219/save_to_file/enabled": false, +"slice_219/save_to_file/keep_custom_tracks": false, +"slice_219/save_to_file/path": "", +"slice_219/start_frame": 0, +"slice_22/end_frame": 0, +"slice_22/loop_mode": 0, +"slice_22/name": "", +"slice_22/save_to_file/enabled": false, +"slice_22/save_to_file/keep_custom_tracks": false, +"slice_22/save_to_file/path": "", +"slice_22/start_frame": 0, +"slice_220/end_frame": 0, +"slice_220/loop_mode": 0, +"slice_220/name": "", +"slice_220/save_to_file/enabled": false, +"slice_220/save_to_file/keep_custom_tracks": false, +"slice_220/save_to_file/path": "", +"slice_220/start_frame": 0, +"slice_221/end_frame": 0, +"slice_221/loop_mode": 0, +"slice_221/name": "", +"slice_221/save_to_file/enabled": false, +"slice_221/save_to_file/keep_custom_tracks": false, +"slice_221/save_to_file/path": "", +"slice_221/start_frame": 0, +"slice_222/end_frame": 0, +"slice_222/loop_mode": 0, +"slice_222/name": "", +"slice_222/save_to_file/enabled": false, +"slice_222/save_to_file/keep_custom_tracks": false, +"slice_222/save_to_file/path": "", +"slice_222/start_frame": 0, +"slice_223/end_frame": 0, +"slice_223/loop_mode": 0, +"slice_223/name": "", +"slice_223/save_to_file/enabled": false, +"slice_223/save_to_file/keep_custom_tracks": false, +"slice_223/save_to_file/path": "", +"slice_223/start_frame": 0, +"slice_224/end_frame": 0, +"slice_224/loop_mode": 0, +"slice_224/name": "", +"slice_224/save_to_file/enabled": false, +"slice_224/save_to_file/keep_custom_tracks": false, +"slice_224/save_to_file/path": "", +"slice_224/start_frame": 0, +"slice_225/end_frame": 0, +"slice_225/loop_mode": 0, +"slice_225/name": "", +"slice_225/save_to_file/enabled": false, +"slice_225/save_to_file/keep_custom_tracks": false, +"slice_225/save_to_file/path": "", +"slice_225/start_frame": 0, +"slice_226/end_frame": 0, +"slice_226/loop_mode": 0, +"slice_226/name": "", +"slice_226/save_to_file/enabled": false, +"slice_226/save_to_file/keep_custom_tracks": false, +"slice_226/save_to_file/path": "", +"slice_226/start_frame": 0, +"slice_227/end_frame": 0, +"slice_227/loop_mode": 0, +"slice_227/name": "", +"slice_227/save_to_file/enabled": false, +"slice_227/save_to_file/keep_custom_tracks": false, +"slice_227/save_to_file/path": "", +"slice_227/start_frame": 0, +"slice_228/end_frame": 0, +"slice_228/loop_mode": 0, +"slice_228/name": "", +"slice_228/save_to_file/enabled": false, +"slice_228/save_to_file/keep_custom_tracks": false, +"slice_228/save_to_file/path": "", +"slice_228/start_frame": 0, +"slice_229/end_frame": 0, +"slice_229/loop_mode": 0, +"slice_229/name": "", +"slice_229/save_to_file/enabled": false, +"slice_229/save_to_file/keep_custom_tracks": false, +"slice_229/save_to_file/path": "", +"slice_229/start_frame": 0, +"slice_23/end_frame": 0, +"slice_23/loop_mode": 0, +"slice_23/name": "", +"slice_23/save_to_file/enabled": false, +"slice_23/save_to_file/keep_custom_tracks": false, +"slice_23/save_to_file/path": "", +"slice_23/start_frame": 0, +"slice_230/end_frame": 0, +"slice_230/loop_mode": 0, +"slice_230/name": "", +"slice_230/save_to_file/enabled": false, +"slice_230/save_to_file/keep_custom_tracks": false, +"slice_230/save_to_file/path": "", +"slice_230/start_frame": 0, +"slice_231/end_frame": 0, +"slice_231/loop_mode": 0, +"slice_231/name": "", +"slice_231/save_to_file/enabled": false, +"slice_231/save_to_file/keep_custom_tracks": false, +"slice_231/save_to_file/path": "", +"slice_231/start_frame": 0, +"slice_232/end_frame": 0, +"slice_232/loop_mode": 0, +"slice_232/name": "", +"slice_232/save_to_file/enabled": false, +"slice_232/save_to_file/keep_custom_tracks": false, +"slice_232/save_to_file/path": "", +"slice_232/start_frame": 0, +"slice_233/end_frame": 0, +"slice_233/loop_mode": 0, +"slice_233/name": "", +"slice_233/save_to_file/enabled": false, +"slice_233/save_to_file/keep_custom_tracks": false, +"slice_233/save_to_file/path": "", +"slice_233/start_frame": 0, +"slice_234/end_frame": 0, +"slice_234/loop_mode": 0, +"slice_234/name": "", +"slice_234/save_to_file/enabled": false, +"slice_234/save_to_file/keep_custom_tracks": false, +"slice_234/save_to_file/path": "", +"slice_234/start_frame": 0, +"slice_235/end_frame": 0, +"slice_235/loop_mode": 0, +"slice_235/name": "", +"slice_235/save_to_file/enabled": false, +"slice_235/save_to_file/keep_custom_tracks": false, +"slice_235/save_to_file/path": "", +"slice_235/start_frame": 0, +"slice_236/end_frame": 0, +"slice_236/loop_mode": 0, +"slice_236/name": "", +"slice_236/save_to_file/enabled": false, +"slice_236/save_to_file/keep_custom_tracks": false, +"slice_236/save_to_file/path": "", +"slice_236/start_frame": 0, +"slice_237/end_frame": 0, +"slice_237/loop_mode": 0, +"slice_237/name": "", +"slice_237/save_to_file/enabled": false, +"slice_237/save_to_file/keep_custom_tracks": false, +"slice_237/save_to_file/path": "", +"slice_237/start_frame": 0, +"slice_238/end_frame": 0, +"slice_238/loop_mode": 0, +"slice_238/name": "", +"slice_238/save_to_file/enabled": false, +"slice_238/save_to_file/keep_custom_tracks": false, +"slice_238/save_to_file/path": "", +"slice_238/start_frame": 0, +"slice_239/end_frame": 0, +"slice_239/loop_mode": 0, +"slice_239/name": "", +"slice_239/save_to_file/enabled": false, +"slice_239/save_to_file/keep_custom_tracks": false, +"slice_239/save_to_file/path": "", +"slice_239/start_frame": 0, +"slice_24/end_frame": 0, +"slice_24/loop_mode": 0, +"slice_24/name": "", +"slice_24/save_to_file/enabled": false, +"slice_24/save_to_file/keep_custom_tracks": false, +"slice_24/save_to_file/path": "", +"slice_24/start_frame": 0, +"slice_240/end_frame": 0, +"slice_240/loop_mode": 0, +"slice_240/name": "", +"slice_240/save_to_file/enabled": false, +"slice_240/save_to_file/keep_custom_tracks": false, +"slice_240/save_to_file/path": "", +"slice_240/start_frame": 0, +"slice_241/end_frame": 0, +"slice_241/loop_mode": 0, +"slice_241/name": "", +"slice_241/save_to_file/enabled": false, +"slice_241/save_to_file/keep_custom_tracks": false, +"slice_241/save_to_file/path": "", +"slice_241/start_frame": 0, +"slice_242/end_frame": 0, +"slice_242/loop_mode": 0, +"slice_242/name": "", +"slice_242/save_to_file/enabled": false, +"slice_242/save_to_file/keep_custom_tracks": false, +"slice_242/save_to_file/path": "", +"slice_242/start_frame": 0, +"slice_243/end_frame": 0, +"slice_243/loop_mode": 0, +"slice_243/name": "", +"slice_243/save_to_file/enabled": false, +"slice_243/save_to_file/keep_custom_tracks": false, +"slice_243/save_to_file/path": "", +"slice_243/start_frame": 0, +"slice_244/end_frame": 0, +"slice_244/loop_mode": 0, +"slice_244/name": "", +"slice_244/save_to_file/enabled": false, +"slice_244/save_to_file/keep_custom_tracks": false, +"slice_244/save_to_file/path": "", +"slice_244/start_frame": 0, +"slice_245/end_frame": 0, +"slice_245/loop_mode": 0, +"slice_245/name": "", +"slice_245/save_to_file/enabled": false, +"slice_245/save_to_file/keep_custom_tracks": false, +"slice_245/save_to_file/path": "", +"slice_245/start_frame": 0, +"slice_246/end_frame": 0, +"slice_246/loop_mode": 0, +"slice_246/name": "", +"slice_246/save_to_file/enabled": false, +"slice_246/save_to_file/keep_custom_tracks": false, +"slice_246/save_to_file/path": "", +"slice_246/start_frame": 0, +"slice_247/end_frame": 0, +"slice_247/loop_mode": 0, +"slice_247/name": "", +"slice_247/save_to_file/enabled": false, +"slice_247/save_to_file/keep_custom_tracks": false, +"slice_247/save_to_file/path": "", +"slice_247/start_frame": 0, +"slice_248/end_frame": 0, +"slice_248/loop_mode": 0, +"slice_248/name": "", +"slice_248/save_to_file/enabled": false, +"slice_248/save_to_file/keep_custom_tracks": false, +"slice_248/save_to_file/path": "", +"slice_248/start_frame": 0, +"slice_249/end_frame": 0, +"slice_249/loop_mode": 0, +"slice_249/name": "", +"slice_249/save_to_file/enabled": false, +"slice_249/save_to_file/keep_custom_tracks": false, +"slice_249/save_to_file/path": "", +"slice_249/start_frame": 0, +"slice_25/end_frame": 0, +"slice_25/loop_mode": 0, +"slice_25/name": "", +"slice_25/save_to_file/enabled": false, +"slice_25/save_to_file/keep_custom_tracks": false, +"slice_25/save_to_file/path": "", +"slice_25/start_frame": 0, +"slice_250/end_frame": 0, +"slice_250/loop_mode": 0, +"slice_250/name": "", +"slice_250/save_to_file/enabled": false, +"slice_250/save_to_file/keep_custom_tracks": false, +"slice_250/save_to_file/path": "", +"slice_250/start_frame": 0, +"slice_251/end_frame": 0, +"slice_251/loop_mode": 0, +"slice_251/name": "", +"slice_251/save_to_file/enabled": false, +"slice_251/save_to_file/keep_custom_tracks": false, +"slice_251/save_to_file/path": "", +"slice_251/start_frame": 0, +"slice_252/end_frame": 0, +"slice_252/loop_mode": 0, +"slice_252/name": "", +"slice_252/save_to_file/enabled": false, +"slice_252/save_to_file/keep_custom_tracks": false, +"slice_252/save_to_file/path": "", +"slice_252/start_frame": 0, +"slice_253/end_frame": 0, +"slice_253/loop_mode": 0, +"slice_253/name": "", +"slice_253/save_to_file/enabled": false, +"slice_253/save_to_file/keep_custom_tracks": false, +"slice_253/save_to_file/path": "", +"slice_253/start_frame": 0, +"slice_254/end_frame": 0, +"slice_254/loop_mode": 0, +"slice_254/name": "", +"slice_254/save_to_file/enabled": false, +"slice_254/save_to_file/keep_custom_tracks": false, +"slice_254/save_to_file/path": "", +"slice_254/start_frame": 0, +"slice_255/end_frame": 0, +"slice_255/loop_mode": 0, +"slice_255/name": "", +"slice_255/save_to_file/enabled": false, +"slice_255/save_to_file/keep_custom_tracks": false, +"slice_255/save_to_file/path": "", +"slice_255/start_frame": 0, +"slice_256/end_frame": 0, +"slice_256/loop_mode": 0, +"slice_256/name": "", +"slice_256/save_to_file/enabled": false, +"slice_256/save_to_file/keep_custom_tracks": false, +"slice_256/save_to_file/path": "", +"slice_256/start_frame": 0, +"slice_26/end_frame": 0, +"slice_26/loop_mode": 0, +"slice_26/name": "", +"slice_26/save_to_file/enabled": false, +"slice_26/save_to_file/keep_custom_tracks": false, +"slice_26/save_to_file/path": "", +"slice_26/start_frame": 0, +"slice_27/end_frame": 0, +"slice_27/loop_mode": 0, +"slice_27/name": "", +"slice_27/save_to_file/enabled": false, +"slice_27/save_to_file/keep_custom_tracks": false, +"slice_27/save_to_file/path": "", +"slice_27/start_frame": 0, +"slice_28/end_frame": 0, +"slice_28/loop_mode": 0, +"slice_28/name": "", +"slice_28/save_to_file/enabled": false, +"slice_28/save_to_file/keep_custom_tracks": false, +"slice_28/save_to_file/path": "", +"slice_28/start_frame": 0, +"slice_29/end_frame": 0, +"slice_29/loop_mode": 0, +"slice_29/name": "", +"slice_29/save_to_file/enabled": false, +"slice_29/save_to_file/keep_custom_tracks": false, +"slice_29/save_to_file/path": "", +"slice_29/start_frame": 0, +"slice_3/end_frame": 0, +"slice_3/loop_mode": 0, +"slice_3/name": "", +"slice_3/save_to_file/enabled": false, +"slice_3/save_to_file/keep_custom_tracks": false, +"slice_3/save_to_file/path": "", +"slice_3/start_frame": 0, +"slice_30/end_frame": 0, +"slice_30/loop_mode": 0, +"slice_30/name": "", +"slice_30/save_to_file/enabled": false, +"slice_30/save_to_file/keep_custom_tracks": false, +"slice_30/save_to_file/path": "", +"slice_30/start_frame": 0, +"slice_31/end_frame": 0, +"slice_31/loop_mode": 0, +"slice_31/name": "", +"slice_31/save_to_file/enabled": false, +"slice_31/save_to_file/keep_custom_tracks": false, +"slice_31/save_to_file/path": "", +"slice_31/start_frame": 0, +"slice_32/end_frame": 0, +"slice_32/loop_mode": 0, +"slice_32/name": "", +"slice_32/save_to_file/enabled": false, +"slice_32/save_to_file/keep_custom_tracks": false, +"slice_32/save_to_file/path": "", +"slice_32/start_frame": 0, +"slice_33/end_frame": 0, +"slice_33/loop_mode": 0, +"slice_33/name": "", +"slice_33/save_to_file/enabled": false, +"slice_33/save_to_file/keep_custom_tracks": false, +"slice_33/save_to_file/path": "", +"slice_33/start_frame": 0, +"slice_34/end_frame": 0, +"slice_34/loop_mode": 0, +"slice_34/name": "", +"slice_34/save_to_file/enabled": false, +"slice_34/save_to_file/keep_custom_tracks": false, +"slice_34/save_to_file/path": "", +"slice_34/start_frame": 0, +"slice_35/end_frame": 0, +"slice_35/loop_mode": 0, +"slice_35/name": "", +"slice_35/save_to_file/enabled": false, +"slice_35/save_to_file/keep_custom_tracks": false, +"slice_35/save_to_file/path": "", +"slice_35/start_frame": 0, +"slice_36/end_frame": 0, +"slice_36/loop_mode": 0, +"slice_36/name": "", +"slice_36/save_to_file/enabled": false, +"slice_36/save_to_file/keep_custom_tracks": false, +"slice_36/save_to_file/path": "", +"slice_36/start_frame": 0, +"slice_37/end_frame": 0, +"slice_37/loop_mode": 0, +"slice_37/name": "", +"slice_37/save_to_file/enabled": false, +"slice_37/save_to_file/keep_custom_tracks": false, +"slice_37/save_to_file/path": "", +"slice_37/start_frame": 0, +"slice_38/end_frame": 0, +"slice_38/loop_mode": 0, +"slice_38/name": "", +"slice_38/save_to_file/enabled": false, +"slice_38/save_to_file/keep_custom_tracks": false, +"slice_38/save_to_file/path": "", +"slice_38/start_frame": 0, +"slice_39/end_frame": 0, +"slice_39/loop_mode": 0, +"slice_39/name": "", +"slice_39/save_to_file/enabled": false, +"slice_39/save_to_file/keep_custom_tracks": false, +"slice_39/save_to_file/path": "", +"slice_39/start_frame": 0, +"slice_4/end_frame": 0, +"slice_4/loop_mode": 0, +"slice_4/name": "", +"slice_4/save_to_file/enabled": false, +"slice_4/save_to_file/keep_custom_tracks": false, +"slice_4/save_to_file/path": "", +"slice_4/start_frame": 0, +"slice_40/end_frame": 0, +"slice_40/loop_mode": 0, +"slice_40/name": "", +"slice_40/save_to_file/enabled": false, +"slice_40/save_to_file/keep_custom_tracks": false, +"slice_40/save_to_file/path": "", +"slice_40/start_frame": 0, +"slice_41/end_frame": 0, +"slice_41/loop_mode": 0, +"slice_41/name": "", +"slice_41/save_to_file/enabled": false, +"slice_41/save_to_file/keep_custom_tracks": false, +"slice_41/save_to_file/path": "", +"slice_41/start_frame": 0, +"slice_42/end_frame": 0, +"slice_42/loop_mode": 0, +"slice_42/name": "", +"slice_42/save_to_file/enabled": false, +"slice_42/save_to_file/keep_custom_tracks": false, +"slice_42/save_to_file/path": "", +"slice_42/start_frame": 0, +"slice_43/end_frame": 0, +"slice_43/loop_mode": 0, +"slice_43/name": "", +"slice_43/save_to_file/enabled": false, +"slice_43/save_to_file/keep_custom_tracks": false, +"slice_43/save_to_file/path": "", +"slice_43/start_frame": 0, +"slice_44/end_frame": 0, +"slice_44/loop_mode": 0, +"slice_44/name": "", +"slice_44/save_to_file/enabled": false, +"slice_44/save_to_file/keep_custom_tracks": false, +"slice_44/save_to_file/path": "", +"slice_44/start_frame": 0, +"slice_45/end_frame": 0, +"slice_45/loop_mode": 0, +"slice_45/name": "", +"slice_45/save_to_file/enabled": false, +"slice_45/save_to_file/keep_custom_tracks": false, +"slice_45/save_to_file/path": "", +"slice_45/start_frame": 0, +"slice_46/end_frame": 0, +"slice_46/loop_mode": 0, +"slice_46/name": "", +"slice_46/save_to_file/enabled": false, +"slice_46/save_to_file/keep_custom_tracks": false, +"slice_46/save_to_file/path": "", +"slice_46/start_frame": 0, +"slice_47/end_frame": 0, +"slice_47/loop_mode": 0, +"slice_47/name": "", +"slice_47/save_to_file/enabled": false, +"slice_47/save_to_file/keep_custom_tracks": false, +"slice_47/save_to_file/path": "", +"slice_47/start_frame": 0, +"slice_48/end_frame": 0, +"slice_48/loop_mode": 0, +"slice_48/name": "", +"slice_48/save_to_file/enabled": false, +"slice_48/save_to_file/keep_custom_tracks": false, +"slice_48/save_to_file/path": "", +"slice_48/start_frame": 0, +"slice_49/end_frame": 0, +"slice_49/loop_mode": 0, +"slice_49/name": "", +"slice_49/save_to_file/enabled": false, +"slice_49/save_to_file/keep_custom_tracks": false, +"slice_49/save_to_file/path": "", +"slice_49/start_frame": 0, +"slice_5/end_frame": 0, +"slice_5/loop_mode": 0, +"slice_5/name": "", +"slice_5/save_to_file/enabled": false, +"slice_5/save_to_file/keep_custom_tracks": false, +"slice_5/save_to_file/path": "", +"slice_5/start_frame": 0, +"slice_50/end_frame": 0, +"slice_50/loop_mode": 0, +"slice_50/name": "", +"slice_50/save_to_file/enabled": false, +"slice_50/save_to_file/keep_custom_tracks": false, +"slice_50/save_to_file/path": "", +"slice_50/start_frame": 0, +"slice_51/end_frame": 0, +"slice_51/loop_mode": 0, +"slice_51/name": "", +"slice_51/save_to_file/enabled": false, +"slice_51/save_to_file/keep_custom_tracks": false, +"slice_51/save_to_file/path": "", +"slice_51/start_frame": 0, +"slice_52/end_frame": 0, +"slice_52/loop_mode": 0, +"slice_52/name": "", +"slice_52/save_to_file/enabled": false, +"slice_52/save_to_file/keep_custom_tracks": false, +"slice_52/save_to_file/path": "", +"slice_52/start_frame": 0, +"slice_53/end_frame": 0, +"slice_53/loop_mode": 0, +"slice_53/name": "", +"slice_53/save_to_file/enabled": false, +"slice_53/save_to_file/keep_custom_tracks": false, +"slice_53/save_to_file/path": "", +"slice_53/start_frame": 0, +"slice_54/end_frame": 0, +"slice_54/loop_mode": 0, +"slice_54/name": "", +"slice_54/save_to_file/enabled": false, +"slice_54/save_to_file/keep_custom_tracks": false, +"slice_54/save_to_file/path": "", +"slice_54/start_frame": 0, +"slice_55/end_frame": 0, +"slice_55/loop_mode": 0, +"slice_55/name": "", +"slice_55/save_to_file/enabled": false, +"slice_55/save_to_file/keep_custom_tracks": false, +"slice_55/save_to_file/path": "", +"slice_55/start_frame": 0, +"slice_56/end_frame": 0, +"slice_56/loop_mode": 0, +"slice_56/name": "", +"slice_56/save_to_file/enabled": false, +"slice_56/save_to_file/keep_custom_tracks": false, +"slice_56/save_to_file/path": "", +"slice_56/start_frame": 0, +"slice_57/end_frame": 0, +"slice_57/loop_mode": 0, +"slice_57/name": "", +"slice_57/save_to_file/enabled": false, +"slice_57/save_to_file/keep_custom_tracks": false, +"slice_57/save_to_file/path": "", +"slice_57/start_frame": 0, +"slice_58/end_frame": 0, +"slice_58/loop_mode": 0, +"slice_58/name": "", +"slice_58/save_to_file/enabled": false, +"slice_58/save_to_file/keep_custom_tracks": false, +"slice_58/save_to_file/path": "", +"slice_58/start_frame": 0, +"slice_59/end_frame": 0, +"slice_59/loop_mode": 0, +"slice_59/name": "", +"slice_59/save_to_file/enabled": false, +"slice_59/save_to_file/keep_custom_tracks": false, +"slice_59/save_to_file/path": "", +"slice_59/start_frame": 0, +"slice_6/end_frame": 0, +"slice_6/loop_mode": 0, +"slice_6/name": "", +"slice_6/save_to_file/enabled": false, +"slice_6/save_to_file/keep_custom_tracks": false, +"slice_6/save_to_file/path": "", +"slice_6/start_frame": 0, +"slice_60/end_frame": 0, +"slice_60/loop_mode": 0, +"slice_60/name": "", +"slice_60/save_to_file/enabled": false, +"slice_60/save_to_file/keep_custom_tracks": false, +"slice_60/save_to_file/path": "", +"slice_60/start_frame": 0, +"slice_61/end_frame": 0, +"slice_61/loop_mode": 0, +"slice_61/name": "", +"slice_61/save_to_file/enabled": false, +"slice_61/save_to_file/keep_custom_tracks": false, +"slice_61/save_to_file/path": "", +"slice_61/start_frame": 0, +"slice_62/end_frame": 0, +"slice_62/loop_mode": 0, +"slice_62/name": "", +"slice_62/save_to_file/enabled": false, +"slice_62/save_to_file/keep_custom_tracks": false, +"slice_62/save_to_file/path": "", +"slice_62/start_frame": 0, +"slice_63/end_frame": 0, +"slice_63/loop_mode": 0, +"slice_63/name": "", +"slice_63/save_to_file/enabled": false, +"slice_63/save_to_file/keep_custom_tracks": false, +"slice_63/save_to_file/path": "", +"slice_63/start_frame": 0, +"slice_64/end_frame": 0, +"slice_64/loop_mode": 0, +"slice_64/name": "", +"slice_64/save_to_file/enabled": false, +"slice_64/save_to_file/keep_custom_tracks": false, +"slice_64/save_to_file/path": "", +"slice_64/start_frame": 0, +"slice_65/end_frame": 0, +"slice_65/loop_mode": 0, +"slice_65/name": "", +"slice_65/save_to_file/enabled": false, +"slice_65/save_to_file/keep_custom_tracks": false, +"slice_65/save_to_file/path": "", +"slice_65/start_frame": 0, +"slice_66/end_frame": 0, +"slice_66/loop_mode": 0, +"slice_66/name": "", +"slice_66/save_to_file/enabled": false, +"slice_66/save_to_file/keep_custom_tracks": false, +"slice_66/save_to_file/path": "", +"slice_66/start_frame": 0, +"slice_67/end_frame": 0, +"slice_67/loop_mode": 0, +"slice_67/name": "", +"slice_67/save_to_file/enabled": false, +"slice_67/save_to_file/keep_custom_tracks": false, +"slice_67/save_to_file/path": "", +"slice_67/start_frame": 0, +"slice_68/end_frame": 0, +"slice_68/loop_mode": 0, +"slice_68/name": "", +"slice_68/save_to_file/enabled": false, +"slice_68/save_to_file/keep_custom_tracks": false, +"slice_68/save_to_file/path": "", +"slice_68/start_frame": 0, +"slice_69/end_frame": 0, +"slice_69/loop_mode": 0, +"slice_69/name": "", +"slice_69/save_to_file/enabled": false, +"slice_69/save_to_file/keep_custom_tracks": false, +"slice_69/save_to_file/path": "", +"slice_69/start_frame": 0, +"slice_7/end_frame": 0, +"slice_7/loop_mode": 0, +"slice_7/name": "", +"slice_7/save_to_file/enabled": false, +"slice_7/save_to_file/keep_custom_tracks": false, +"slice_7/save_to_file/path": "", +"slice_7/start_frame": 0, +"slice_70/end_frame": 0, +"slice_70/loop_mode": 0, +"slice_70/name": "", +"slice_70/save_to_file/enabled": false, +"slice_70/save_to_file/keep_custom_tracks": false, +"slice_70/save_to_file/path": "", +"slice_70/start_frame": 0, +"slice_71/end_frame": 0, +"slice_71/loop_mode": 0, +"slice_71/name": "", +"slice_71/save_to_file/enabled": false, +"slice_71/save_to_file/keep_custom_tracks": false, +"slice_71/save_to_file/path": "", +"slice_71/start_frame": 0, +"slice_72/end_frame": 0, +"slice_72/loop_mode": 0, +"slice_72/name": "", +"slice_72/save_to_file/enabled": false, +"slice_72/save_to_file/keep_custom_tracks": false, +"slice_72/save_to_file/path": "", +"slice_72/start_frame": 0, +"slice_73/end_frame": 0, +"slice_73/loop_mode": 0, +"slice_73/name": "", +"slice_73/save_to_file/enabled": false, +"slice_73/save_to_file/keep_custom_tracks": false, +"slice_73/save_to_file/path": "", +"slice_73/start_frame": 0, +"slice_74/end_frame": 0, +"slice_74/loop_mode": 0, +"slice_74/name": "", +"slice_74/save_to_file/enabled": false, +"slice_74/save_to_file/keep_custom_tracks": false, +"slice_74/save_to_file/path": "", +"slice_74/start_frame": 0, +"slice_75/end_frame": 0, +"slice_75/loop_mode": 0, +"slice_75/name": "", +"slice_75/save_to_file/enabled": false, +"slice_75/save_to_file/keep_custom_tracks": false, +"slice_75/save_to_file/path": "", +"slice_75/start_frame": 0, +"slice_76/end_frame": 0, +"slice_76/loop_mode": 0, +"slice_76/name": "", +"slice_76/save_to_file/enabled": false, +"slice_76/save_to_file/keep_custom_tracks": false, +"slice_76/save_to_file/path": "", +"slice_76/start_frame": 0, +"slice_77/end_frame": 0, +"slice_77/loop_mode": 0, +"slice_77/name": "", +"slice_77/save_to_file/enabled": false, +"slice_77/save_to_file/keep_custom_tracks": false, +"slice_77/save_to_file/path": "", +"slice_77/start_frame": 0, +"slice_78/end_frame": 0, +"slice_78/loop_mode": 0, +"slice_78/name": "", +"slice_78/save_to_file/enabled": false, +"slice_78/save_to_file/keep_custom_tracks": false, +"slice_78/save_to_file/path": "", +"slice_78/start_frame": 0, +"slice_79/end_frame": 0, +"slice_79/loop_mode": 0, +"slice_79/name": "", +"slice_79/save_to_file/enabled": false, +"slice_79/save_to_file/keep_custom_tracks": false, +"slice_79/save_to_file/path": "", +"slice_79/start_frame": 0, +"slice_8/end_frame": 0, +"slice_8/loop_mode": 0, +"slice_8/name": "", +"slice_8/save_to_file/enabled": false, +"slice_8/save_to_file/keep_custom_tracks": false, +"slice_8/save_to_file/path": "", +"slice_8/start_frame": 0, +"slice_80/end_frame": 0, +"slice_80/loop_mode": 0, +"slice_80/name": "", +"slice_80/save_to_file/enabled": false, +"slice_80/save_to_file/keep_custom_tracks": false, +"slice_80/save_to_file/path": "", +"slice_80/start_frame": 0, +"slice_81/end_frame": 0, +"slice_81/loop_mode": 0, +"slice_81/name": "", +"slice_81/save_to_file/enabled": false, +"slice_81/save_to_file/keep_custom_tracks": false, +"slice_81/save_to_file/path": "", +"slice_81/start_frame": 0, +"slice_82/end_frame": 0, +"slice_82/loop_mode": 0, +"slice_82/name": "", +"slice_82/save_to_file/enabled": false, +"slice_82/save_to_file/keep_custom_tracks": false, +"slice_82/save_to_file/path": "", +"slice_82/start_frame": 0, +"slice_83/end_frame": 0, +"slice_83/loop_mode": 0, +"slice_83/name": "", +"slice_83/save_to_file/enabled": false, +"slice_83/save_to_file/keep_custom_tracks": false, +"slice_83/save_to_file/path": "", +"slice_83/start_frame": 0, +"slice_84/end_frame": 0, +"slice_84/loop_mode": 0, +"slice_84/name": "", +"slice_84/save_to_file/enabled": false, +"slice_84/save_to_file/keep_custom_tracks": false, +"slice_84/save_to_file/path": "", +"slice_84/start_frame": 0, +"slice_85/end_frame": 0, +"slice_85/loop_mode": 0, +"slice_85/name": "", +"slice_85/save_to_file/enabled": false, +"slice_85/save_to_file/keep_custom_tracks": false, +"slice_85/save_to_file/path": "", +"slice_85/start_frame": 0, +"slice_86/end_frame": 0, +"slice_86/loop_mode": 0, +"slice_86/name": "", +"slice_86/save_to_file/enabled": false, +"slice_86/save_to_file/keep_custom_tracks": false, +"slice_86/save_to_file/path": "", +"slice_86/start_frame": 0, +"slice_87/end_frame": 0, +"slice_87/loop_mode": 0, +"slice_87/name": "", +"slice_87/save_to_file/enabled": false, +"slice_87/save_to_file/keep_custom_tracks": false, +"slice_87/save_to_file/path": "", +"slice_87/start_frame": 0, +"slice_88/end_frame": 0, +"slice_88/loop_mode": 0, +"slice_88/name": "", +"slice_88/save_to_file/enabled": false, +"slice_88/save_to_file/keep_custom_tracks": false, +"slice_88/save_to_file/path": "", +"slice_88/start_frame": 0, +"slice_89/end_frame": 0, +"slice_89/loop_mode": 0, +"slice_89/name": "", +"slice_89/save_to_file/enabled": false, +"slice_89/save_to_file/keep_custom_tracks": false, +"slice_89/save_to_file/path": "", +"slice_89/start_frame": 0, +"slice_9/end_frame": 0, +"slice_9/loop_mode": 0, +"slice_9/name": "", +"slice_9/save_to_file/enabled": false, +"slice_9/save_to_file/keep_custom_tracks": false, +"slice_9/save_to_file/path": "", +"slice_9/start_frame": 0, +"slice_90/end_frame": 0, +"slice_90/loop_mode": 0, +"slice_90/name": "", +"slice_90/save_to_file/enabled": false, +"slice_90/save_to_file/keep_custom_tracks": false, +"slice_90/save_to_file/path": "", +"slice_90/start_frame": 0, +"slice_91/end_frame": 0, +"slice_91/loop_mode": 0, +"slice_91/name": "", +"slice_91/save_to_file/enabled": false, +"slice_91/save_to_file/keep_custom_tracks": false, +"slice_91/save_to_file/path": "", +"slice_91/start_frame": 0, +"slice_92/end_frame": 0, +"slice_92/loop_mode": 0, +"slice_92/name": "", +"slice_92/save_to_file/enabled": false, +"slice_92/save_to_file/keep_custom_tracks": false, +"slice_92/save_to_file/path": "", +"slice_92/start_frame": 0, +"slice_93/end_frame": 0, +"slice_93/loop_mode": 0, +"slice_93/name": "", +"slice_93/save_to_file/enabled": false, +"slice_93/save_to_file/keep_custom_tracks": false, +"slice_93/save_to_file/path": "", +"slice_93/start_frame": 0, +"slice_94/end_frame": 0, +"slice_94/loop_mode": 0, +"slice_94/name": "", +"slice_94/save_to_file/enabled": false, +"slice_94/save_to_file/keep_custom_tracks": false, +"slice_94/save_to_file/path": "", +"slice_94/start_frame": 0, +"slice_95/end_frame": 0, +"slice_95/loop_mode": 0, +"slice_95/name": "", +"slice_95/save_to_file/enabled": false, +"slice_95/save_to_file/keep_custom_tracks": false, +"slice_95/save_to_file/path": "", +"slice_95/start_frame": 0, +"slice_96/end_frame": 0, +"slice_96/loop_mode": 0, +"slice_96/name": "", +"slice_96/save_to_file/enabled": false, +"slice_96/save_to_file/keep_custom_tracks": false, +"slice_96/save_to_file/path": "", +"slice_96/start_frame": 0, +"slice_97/end_frame": 0, +"slice_97/loop_mode": 0, +"slice_97/name": "", +"slice_97/save_to_file/enabled": false, +"slice_97/save_to_file/keep_custom_tracks": false, +"slice_97/save_to_file/path": "", +"slice_97/start_frame": 0, +"slice_98/end_frame": 0, +"slice_98/loop_mode": 0, +"slice_98/name": "", +"slice_98/save_to_file/enabled": false, +"slice_98/save_to_file/keep_custom_tracks": false, +"slice_98/save_to_file/path": "", +"slice_98/start_frame": 0, +"slice_99/end_frame": 0, +"slice_99/loop_mode": 0, +"slice_99/name": "", +"slice_99/save_to_file/enabled": false, +"slice_99/save_to_file/keep_custom_tracks": false, +"slice_99/save_to_file/path": "", +"slice_99/start_frame": 0, +"slices/amount": null +} +}, +"materials": { +"Material": { +"use_external/enabled": true, +"use_external/path": "res://materials/MainTexture.tres" +}, +"Material.001": { +"use_external/enabled": true, +"use_external/path": "res://materials/MainTextureTransparent.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/models/captain_D_general_texture-Recovered.png b/models/captain_D_general_texture-Recovered.png new file mode 100644 index 0000000..0e044be --- /dev/null +++ b/models/captain_D_general_texture-Recovered.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a2d3495241fb1a817c31d098f6a0fc588d84619e0568dc3913506e8a1091d2a8 +size 3111 diff --git a/models/captain_D_general_texture-Recovered.png.import b/models/captain_D_general_texture-Recovered.png.import new file mode 100644 index 0000000..d0353ad --- /dev/null +++ b/models/captain_D_general_texture-Recovered.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://mq2flspcw5ol" +path.s3tc="res://.godot/imported/captain_D_general_texture-Recovered.png-cf4e497fa88d1c67d05018c2f6240479.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={} + +[deps] + +source_file="res://models/captain_D_general_texture-Recovered.png" +dest_files=["res://.godot/imported/captain_D_general_texture-Recovered.png-cf4e497fa88d1c67d05018c2f6240479.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/models/casa.glb b/models/casa.glb new file mode 100644 index 0000000..c185238 --- /dev/null +++ b/models/casa.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8e59cfca33514bd184ff74a20786b833549cf385f4844ba79412325bdcedf21a +size 52672 diff --git a/models/casa.glb.import b/models/casa.glb.import new file mode 100644 index 0000000..b690a13 --- /dev/null +++ b/models/casa.glb.import @@ -0,0 +1,39 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dlrjt17qoqtrd" +path="res://.godot/imported/casa.glb-b9379fd6a504f89bb9fc6f8790321269.scn" + +[deps] + +source_file="res://models/casa.glb" +dest_files=["res://.godot/imported/casa.glb-b9379fd6a504f89bb9fc6f8790321269.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Material": { +"use_external/enabled": true, +"use_external/path": "res://materials/opaque_terrains.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/models/casa_vegetation_terrains.png b/models/casa_vegetation_terrains.png new file mode 100644 index 0000000..a8a1615 --- /dev/null +++ b/models/casa_vegetation_terrains.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3c6a71b88f9b27a10be50ecb8f904fb08eb185a7350e77bc30081e7a7ba4c4c +size 4698 diff --git a/models/casa_vegetation_terrains.png.import b/models/casa_vegetation_terrains.png.import new file mode 100644 index 0000000..8dac6be --- /dev/null +++ b/models/casa_vegetation_terrains.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cq3r20yyid2rq" +path.s3tc="res://.godot/imported/casa_vegetation_terrains.png-a75f83bcd2626648d5e5a965d16ceef3.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={} + +[deps] + +source_file="res://models/casa_vegetation_terrains.png" +dest_files=["res://.godot/imported/casa_vegetation_terrains.png-a75f83bcd2626648d5e5a965d16ceef3.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/models/cesped.glb b/models/cesped.glb new file mode 100644 index 0000000..3f2112f --- /dev/null +++ b/models/cesped.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9805944dfb4c408ad5ee5e6fb3852588ba5fc2476275d13bb63a8c89549dfc7a +size 10904 diff --git a/models/cesped.glb.import b/models/cesped.glb.import new file mode 100644 index 0000000..a65aeb8 --- /dev/null +++ b/models/cesped.glb.import @@ -0,0 +1,39 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://btotume67l0wv" +path="res://.godot/imported/cesped.glb-005468d77b1ca1c324cb71e0c90bef83.scn" + +[deps] + +source_file="res://models/cesped.glb" +dest_files=["res://.godot/imported/cesped.glb-005468d77b1ca1c324cb71e0c90bef83.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Material.038": { +"use_external/enabled": true, +"use_external/path": "res://materials/plants_opacity.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/models/cesped_vegetation_terrains.png b/models/cesped_vegetation_terrains.png new file mode 100644 index 0000000..187dff1 --- /dev/null +++ b/models/cesped_vegetation_terrains.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:800029739505df93467b3463612aad78d90f19fe15b18b46d672f66ea83585b0 +size 4870 diff --git a/models/cesped_vegetation_terrains.png.import b/models/cesped_vegetation_terrains.png.import new file mode 100644 index 0000000..2bbe034 --- /dev/null +++ b/models/cesped_vegetation_terrains.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://clkdgmd87i7ck" +path="res://.godot/imported/cesped_vegetation_terrains.png-5288dd5fb363c1a3e83d454cde07b73f.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={} + +[deps] + +source_file="res://models/cesped_vegetation_terrains.png" +dest_files=["res://.godot/imported/cesped_vegetation_terrains.png-5288dd5fb363c1a3e83d454cde07b73f.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=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=1 diff --git a/models/dawg.glb b/models/dawg.glb new file mode 100644 index 0000000..b39986f --- /dev/null +++ b/models/dawg.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1df3ed80b81c6d5b57f640951d32a5f6350478b30bbbf20d2c2c1ac9af58ab3c +size 65748 diff --git a/models/dawg.glb.import b/models/dawg.glb.import new file mode 100644 index 0000000..3f74d38 --- /dev/null +++ b/models/dawg.glb.import @@ -0,0 +1,3639 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://c5j5kw70le1ng" +path="res://.godot/imported/dawg.glb-59c130e55b45951ce73c2c83d7862c79.scn" + +[deps] + +source_file="res://models/dawg.glb" +dest_files=["res://.godot/imported/dawg.glb-59c130e55b45951ce73c2c83d7862c79.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=0.2 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"animations": { +"idle": { +"save_to_file/enabled": false, +"save_to_file/keep_custom_tracks": "", +"save_to_file/path": "", +"settings/loop_mode": 1, +"slice_1/end_frame": 0, +"slice_1/loop_mode": 0, +"slice_1/name": "", +"slice_1/save_to_file/enabled": false, +"slice_1/save_to_file/keep_custom_tracks": false, +"slice_1/save_to_file/path": "", +"slice_1/start_frame": 0, +"slice_10/end_frame": 0, +"slice_10/loop_mode": 0, +"slice_10/name": "", +"slice_10/save_to_file/enabled": false, +"slice_10/save_to_file/keep_custom_tracks": false, +"slice_10/save_to_file/path": "", +"slice_10/start_frame": 0, +"slice_100/end_frame": 0, +"slice_100/loop_mode": 0, +"slice_100/name": "", +"slice_100/save_to_file/enabled": false, +"slice_100/save_to_file/keep_custom_tracks": false, +"slice_100/save_to_file/path": "", +"slice_100/start_frame": 0, +"slice_101/end_frame": 0, +"slice_101/loop_mode": 0, +"slice_101/name": "", +"slice_101/save_to_file/enabled": false, +"slice_101/save_to_file/keep_custom_tracks": false, +"slice_101/save_to_file/path": "", +"slice_101/start_frame": 0, +"slice_102/end_frame": 0, +"slice_102/loop_mode": 0, +"slice_102/name": "", +"slice_102/save_to_file/enabled": false, +"slice_102/save_to_file/keep_custom_tracks": false, +"slice_102/save_to_file/path": "", +"slice_102/start_frame": 0, +"slice_103/end_frame": 0, +"slice_103/loop_mode": 0, +"slice_103/name": "", +"slice_103/save_to_file/enabled": false, +"slice_103/save_to_file/keep_custom_tracks": false, +"slice_103/save_to_file/path": "", +"slice_103/start_frame": 0, +"slice_104/end_frame": 0, +"slice_104/loop_mode": 0, +"slice_104/name": "", +"slice_104/save_to_file/enabled": false, +"slice_104/save_to_file/keep_custom_tracks": false, +"slice_104/save_to_file/path": "", +"slice_104/start_frame": 0, +"slice_105/end_frame": 0, +"slice_105/loop_mode": 0, +"slice_105/name": "", +"slice_105/save_to_file/enabled": false, +"slice_105/save_to_file/keep_custom_tracks": false, +"slice_105/save_to_file/path": "", +"slice_105/start_frame": 0, +"slice_106/end_frame": 0, +"slice_106/loop_mode": 0, +"slice_106/name": "", +"slice_106/save_to_file/enabled": false, +"slice_106/save_to_file/keep_custom_tracks": false, +"slice_106/save_to_file/path": "", +"slice_106/start_frame": 0, +"slice_107/end_frame": 0, +"slice_107/loop_mode": 0, +"slice_107/name": "", +"slice_107/save_to_file/enabled": false, +"slice_107/save_to_file/keep_custom_tracks": false, +"slice_107/save_to_file/path": "", +"slice_107/start_frame": 0, +"slice_108/end_frame": 0, +"slice_108/loop_mode": 0, +"slice_108/name": "", +"slice_108/save_to_file/enabled": false, +"slice_108/save_to_file/keep_custom_tracks": false, +"slice_108/save_to_file/path": "", +"slice_108/start_frame": 0, +"slice_109/end_frame": 0, +"slice_109/loop_mode": 0, +"slice_109/name": "", +"slice_109/save_to_file/enabled": false, +"slice_109/save_to_file/keep_custom_tracks": false, +"slice_109/save_to_file/path": "", +"slice_109/start_frame": 0, +"slice_11/end_frame": 0, +"slice_11/loop_mode": 0, +"slice_11/name": "", +"slice_11/save_to_file/enabled": false, +"slice_11/save_to_file/keep_custom_tracks": false, +"slice_11/save_to_file/path": "", +"slice_11/start_frame": 0, +"slice_110/end_frame": 0, +"slice_110/loop_mode": 0, +"slice_110/name": "", +"slice_110/save_to_file/enabled": false, +"slice_110/save_to_file/keep_custom_tracks": false, +"slice_110/save_to_file/path": "", +"slice_110/start_frame": 0, +"slice_111/end_frame": 0, +"slice_111/loop_mode": 0, +"slice_111/name": "", +"slice_111/save_to_file/enabled": false, +"slice_111/save_to_file/keep_custom_tracks": false, +"slice_111/save_to_file/path": "", +"slice_111/start_frame": 0, +"slice_112/end_frame": 0, +"slice_112/loop_mode": 0, +"slice_112/name": "", +"slice_112/save_to_file/enabled": false, +"slice_112/save_to_file/keep_custom_tracks": false, +"slice_112/save_to_file/path": "", +"slice_112/start_frame": 0, +"slice_113/end_frame": 0, +"slice_113/loop_mode": 0, +"slice_113/name": "", +"slice_113/save_to_file/enabled": false, +"slice_113/save_to_file/keep_custom_tracks": false, +"slice_113/save_to_file/path": "", +"slice_113/start_frame": 0, +"slice_114/end_frame": 0, +"slice_114/loop_mode": 0, +"slice_114/name": "", +"slice_114/save_to_file/enabled": false, +"slice_114/save_to_file/keep_custom_tracks": false, +"slice_114/save_to_file/path": "", +"slice_114/start_frame": 0, +"slice_115/end_frame": 0, +"slice_115/loop_mode": 0, +"slice_115/name": "", +"slice_115/save_to_file/enabled": false, +"slice_115/save_to_file/keep_custom_tracks": false, +"slice_115/save_to_file/path": "", +"slice_115/start_frame": 0, +"slice_116/end_frame": 0, +"slice_116/loop_mode": 0, +"slice_116/name": "", +"slice_116/save_to_file/enabled": false, +"slice_116/save_to_file/keep_custom_tracks": false, +"slice_116/save_to_file/path": "", +"slice_116/start_frame": 0, +"slice_117/end_frame": 0, +"slice_117/loop_mode": 0, +"slice_117/name": "", +"slice_117/save_to_file/enabled": false, +"slice_117/save_to_file/keep_custom_tracks": false, +"slice_117/save_to_file/path": "", +"slice_117/start_frame": 0, +"slice_118/end_frame": 0, +"slice_118/loop_mode": 0, +"slice_118/name": "", +"slice_118/save_to_file/enabled": false, +"slice_118/save_to_file/keep_custom_tracks": false, +"slice_118/save_to_file/path": "", +"slice_118/start_frame": 0, +"slice_119/end_frame": 0, +"slice_119/loop_mode": 0, +"slice_119/name": "", +"slice_119/save_to_file/enabled": false, +"slice_119/save_to_file/keep_custom_tracks": false, +"slice_119/save_to_file/path": "", +"slice_119/start_frame": 0, +"slice_12/end_frame": 0, +"slice_12/loop_mode": 0, +"slice_12/name": "", +"slice_12/save_to_file/enabled": false, +"slice_12/save_to_file/keep_custom_tracks": false, +"slice_12/save_to_file/path": "", +"slice_12/start_frame": 0, +"slice_120/end_frame": 0, +"slice_120/loop_mode": 0, +"slice_120/name": "", +"slice_120/save_to_file/enabled": false, +"slice_120/save_to_file/keep_custom_tracks": false, +"slice_120/save_to_file/path": "", +"slice_120/start_frame": 0, +"slice_121/end_frame": 0, +"slice_121/loop_mode": 0, +"slice_121/name": "", +"slice_121/save_to_file/enabled": false, +"slice_121/save_to_file/keep_custom_tracks": false, +"slice_121/save_to_file/path": "", +"slice_121/start_frame": 0, +"slice_122/end_frame": 0, +"slice_122/loop_mode": 0, +"slice_122/name": "", +"slice_122/save_to_file/enabled": false, +"slice_122/save_to_file/keep_custom_tracks": false, +"slice_122/save_to_file/path": "", +"slice_122/start_frame": 0, +"slice_123/end_frame": 0, +"slice_123/loop_mode": 0, +"slice_123/name": "", +"slice_123/save_to_file/enabled": false, +"slice_123/save_to_file/keep_custom_tracks": false, +"slice_123/save_to_file/path": "", +"slice_123/start_frame": 0, +"slice_124/end_frame": 0, +"slice_124/loop_mode": 0, +"slice_124/name": "", +"slice_124/save_to_file/enabled": false, +"slice_124/save_to_file/keep_custom_tracks": false, +"slice_124/save_to_file/path": "", +"slice_124/start_frame": 0, +"slice_125/end_frame": 0, +"slice_125/loop_mode": 0, +"slice_125/name": "", +"slice_125/save_to_file/enabled": false, +"slice_125/save_to_file/keep_custom_tracks": false, +"slice_125/save_to_file/path": "", +"slice_125/start_frame": 0, +"slice_126/end_frame": 0, +"slice_126/loop_mode": 0, +"slice_126/name": "", +"slice_126/save_to_file/enabled": false, +"slice_126/save_to_file/keep_custom_tracks": false, +"slice_126/save_to_file/path": "", +"slice_126/start_frame": 0, +"slice_127/end_frame": 0, +"slice_127/loop_mode": 0, +"slice_127/name": "", +"slice_127/save_to_file/enabled": false, +"slice_127/save_to_file/keep_custom_tracks": false, +"slice_127/save_to_file/path": "", +"slice_127/start_frame": 0, +"slice_128/end_frame": 0, +"slice_128/loop_mode": 0, +"slice_128/name": "", +"slice_128/save_to_file/enabled": false, +"slice_128/save_to_file/keep_custom_tracks": false, +"slice_128/save_to_file/path": "", +"slice_128/start_frame": 0, +"slice_129/end_frame": 0, +"slice_129/loop_mode": 0, +"slice_129/name": "", +"slice_129/save_to_file/enabled": false, +"slice_129/save_to_file/keep_custom_tracks": false, +"slice_129/save_to_file/path": "", +"slice_129/start_frame": 0, +"slice_13/end_frame": 0, +"slice_13/loop_mode": 0, +"slice_13/name": "", +"slice_13/save_to_file/enabled": false, +"slice_13/save_to_file/keep_custom_tracks": false, +"slice_13/save_to_file/path": "", +"slice_13/start_frame": 0, +"slice_130/end_frame": 0, +"slice_130/loop_mode": 0, +"slice_130/name": "", +"slice_130/save_to_file/enabled": false, +"slice_130/save_to_file/keep_custom_tracks": false, +"slice_130/save_to_file/path": "", +"slice_130/start_frame": 0, +"slice_131/end_frame": 0, +"slice_131/loop_mode": 0, +"slice_131/name": "", +"slice_131/save_to_file/enabled": false, +"slice_131/save_to_file/keep_custom_tracks": false, +"slice_131/save_to_file/path": "", +"slice_131/start_frame": 0, +"slice_132/end_frame": 0, +"slice_132/loop_mode": 0, +"slice_132/name": "", +"slice_132/save_to_file/enabled": false, +"slice_132/save_to_file/keep_custom_tracks": false, +"slice_132/save_to_file/path": "", +"slice_132/start_frame": 0, +"slice_133/end_frame": 0, +"slice_133/loop_mode": 0, +"slice_133/name": "", +"slice_133/save_to_file/enabled": false, +"slice_133/save_to_file/keep_custom_tracks": false, +"slice_133/save_to_file/path": "", +"slice_133/start_frame": 0, +"slice_134/end_frame": 0, +"slice_134/loop_mode": 0, +"slice_134/name": "", +"slice_134/save_to_file/enabled": false, +"slice_134/save_to_file/keep_custom_tracks": false, +"slice_134/save_to_file/path": "", +"slice_134/start_frame": 0, +"slice_135/end_frame": 0, +"slice_135/loop_mode": 0, +"slice_135/name": "", +"slice_135/save_to_file/enabled": false, +"slice_135/save_to_file/keep_custom_tracks": false, +"slice_135/save_to_file/path": "", +"slice_135/start_frame": 0, +"slice_136/end_frame": 0, +"slice_136/loop_mode": 0, +"slice_136/name": "", +"slice_136/save_to_file/enabled": false, +"slice_136/save_to_file/keep_custom_tracks": false, +"slice_136/save_to_file/path": "", +"slice_136/start_frame": 0, +"slice_137/end_frame": 0, +"slice_137/loop_mode": 0, +"slice_137/name": "", +"slice_137/save_to_file/enabled": false, +"slice_137/save_to_file/keep_custom_tracks": false, +"slice_137/save_to_file/path": "", +"slice_137/start_frame": 0, +"slice_138/end_frame": 0, +"slice_138/loop_mode": 0, +"slice_138/name": "", +"slice_138/save_to_file/enabled": false, +"slice_138/save_to_file/keep_custom_tracks": false, +"slice_138/save_to_file/path": "", +"slice_138/start_frame": 0, +"slice_139/end_frame": 0, +"slice_139/loop_mode": 0, +"slice_139/name": "", +"slice_139/save_to_file/enabled": false, +"slice_139/save_to_file/keep_custom_tracks": false, +"slice_139/save_to_file/path": "", +"slice_139/start_frame": 0, +"slice_14/end_frame": 0, +"slice_14/loop_mode": 0, +"slice_14/name": "", +"slice_14/save_to_file/enabled": false, +"slice_14/save_to_file/keep_custom_tracks": false, +"slice_14/save_to_file/path": "", +"slice_14/start_frame": 0, +"slice_140/end_frame": 0, +"slice_140/loop_mode": 0, +"slice_140/name": "", +"slice_140/save_to_file/enabled": false, +"slice_140/save_to_file/keep_custom_tracks": false, +"slice_140/save_to_file/path": "", +"slice_140/start_frame": 0, +"slice_141/end_frame": 0, +"slice_141/loop_mode": 0, +"slice_141/name": "", +"slice_141/save_to_file/enabled": false, +"slice_141/save_to_file/keep_custom_tracks": false, +"slice_141/save_to_file/path": "", +"slice_141/start_frame": 0, +"slice_142/end_frame": 0, +"slice_142/loop_mode": 0, +"slice_142/name": "", +"slice_142/save_to_file/enabled": false, +"slice_142/save_to_file/keep_custom_tracks": false, +"slice_142/save_to_file/path": "", +"slice_142/start_frame": 0, +"slice_143/end_frame": 0, +"slice_143/loop_mode": 0, +"slice_143/name": "", +"slice_143/save_to_file/enabled": false, +"slice_143/save_to_file/keep_custom_tracks": false, +"slice_143/save_to_file/path": "", +"slice_143/start_frame": 0, +"slice_144/end_frame": 0, +"slice_144/loop_mode": 0, +"slice_144/name": "", +"slice_144/save_to_file/enabled": false, +"slice_144/save_to_file/keep_custom_tracks": false, +"slice_144/save_to_file/path": "", +"slice_144/start_frame": 0, +"slice_145/end_frame": 0, +"slice_145/loop_mode": 0, +"slice_145/name": "", +"slice_145/save_to_file/enabled": false, +"slice_145/save_to_file/keep_custom_tracks": false, +"slice_145/save_to_file/path": "", +"slice_145/start_frame": 0, +"slice_146/end_frame": 0, +"slice_146/loop_mode": 0, +"slice_146/name": "", +"slice_146/save_to_file/enabled": false, +"slice_146/save_to_file/keep_custom_tracks": false, +"slice_146/save_to_file/path": "", +"slice_146/start_frame": 0, +"slice_147/end_frame": 0, +"slice_147/loop_mode": 0, +"slice_147/name": "", +"slice_147/save_to_file/enabled": false, +"slice_147/save_to_file/keep_custom_tracks": false, +"slice_147/save_to_file/path": "", +"slice_147/start_frame": 0, +"slice_148/end_frame": 0, +"slice_148/loop_mode": 0, +"slice_148/name": "", +"slice_148/save_to_file/enabled": false, +"slice_148/save_to_file/keep_custom_tracks": false, +"slice_148/save_to_file/path": "", +"slice_148/start_frame": 0, +"slice_149/end_frame": 0, +"slice_149/loop_mode": 0, +"slice_149/name": "", +"slice_149/save_to_file/enabled": false, +"slice_149/save_to_file/keep_custom_tracks": false, +"slice_149/save_to_file/path": "", +"slice_149/start_frame": 0, +"slice_15/end_frame": 0, +"slice_15/loop_mode": 0, +"slice_15/name": "", +"slice_15/save_to_file/enabled": false, +"slice_15/save_to_file/keep_custom_tracks": false, +"slice_15/save_to_file/path": "", +"slice_15/start_frame": 0, +"slice_150/end_frame": 0, +"slice_150/loop_mode": 0, +"slice_150/name": "", +"slice_150/save_to_file/enabled": false, +"slice_150/save_to_file/keep_custom_tracks": false, +"slice_150/save_to_file/path": "", +"slice_150/start_frame": 0, +"slice_151/end_frame": 0, +"slice_151/loop_mode": 0, +"slice_151/name": "", +"slice_151/save_to_file/enabled": false, +"slice_151/save_to_file/keep_custom_tracks": false, +"slice_151/save_to_file/path": "", +"slice_151/start_frame": 0, +"slice_152/end_frame": 0, +"slice_152/loop_mode": 0, +"slice_152/name": "", +"slice_152/save_to_file/enabled": false, +"slice_152/save_to_file/keep_custom_tracks": false, +"slice_152/save_to_file/path": "", +"slice_152/start_frame": 0, +"slice_153/end_frame": 0, +"slice_153/loop_mode": 0, +"slice_153/name": "", +"slice_153/save_to_file/enabled": false, +"slice_153/save_to_file/keep_custom_tracks": false, +"slice_153/save_to_file/path": "", +"slice_153/start_frame": 0, +"slice_154/end_frame": 0, +"slice_154/loop_mode": 0, +"slice_154/name": "", +"slice_154/save_to_file/enabled": false, +"slice_154/save_to_file/keep_custom_tracks": false, +"slice_154/save_to_file/path": "", +"slice_154/start_frame": 0, +"slice_155/end_frame": 0, +"slice_155/loop_mode": 0, +"slice_155/name": "", +"slice_155/save_to_file/enabled": false, +"slice_155/save_to_file/keep_custom_tracks": false, +"slice_155/save_to_file/path": "", +"slice_155/start_frame": 0, +"slice_156/end_frame": 0, +"slice_156/loop_mode": 0, +"slice_156/name": "", +"slice_156/save_to_file/enabled": false, +"slice_156/save_to_file/keep_custom_tracks": false, +"slice_156/save_to_file/path": "", +"slice_156/start_frame": 0, +"slice_157/end_frame": 0, +"slice_157/loop_mode": 0, +"slice_157/name": "", +"slice_157/save_to_file/enabled": false, +"slice_157/save_to_file/keep_custom_tracks": false, +"slice_157/save_to_file/path": "", +"slice_157/start_frame": 0, +"slice_158/end_frame": 0, +"slice_158/loop_mode": 0, +"slice_158/name": "", +"slice_158/save_to_file/enabled": false, +"slice_158/save_to_file/keep_custom_tracks": false, +"slice_158/save_to_file/path": "", +"slice_158/start_frame": 0, +"slice_159/end_frame": 0, +"slice_159/loop_mode": 0, +"slice_159/name": "", +"slice_159/save_to_file/enabled": false, +"slice_159/save_to_file/keep_custom_tracks": false, +"slice_159/save_to_file/path": "", +"slice_159/start_frame": 0, +"slice_16/end_frame": 0, +"slice_16/loop_mode": 0, +"slice_16/name": "", +"slice_16/save_to_file/enabled": false, +"slice_16/save_to_file/keep_custom_tracks": false, +"slice_16/save_to_file/path": "", +"slice_16/start_frame": 0, +"slice_160/end_frame": 0, +"slice_160/loop_mode": 0, +"slice_160/name": "", +"slice_160/save_to_file/enabled": false, +"slice_160/save_to_file/keep_custom_tracks": false, +"slice_160/save_to_file/path": "", +"slice_160/start_frame": 0, +"slice_161/end_frame": 0, +"slice_161/loop_mode": 0, +"slice_161/name": "", +"slice_161/save_to_file/enabled": false, +"slice_161/save_to_file/keep_custom_tracks": false, +"slice_161/save_to_file/path": "", +"slice_161/start_frame": 0, +"slice_162/end_frame": 0, +"slice_162/loop_mode": 0, +"slice_162/name": "", +"slice_162/save_to_file/enabled": false, +"slice_162/save_to_file/keep_custom_tracks": false, +"slice_162/save_to_file/path": "", +"slice_162/start_frame": 0, +"slice_163/end_frame": 0, +"slice_163/loop_mode": 0, +"slice_163/name": "", +"slice_163/save_to_file/enabled": false, +"slice_163/save_to_file/keep_custom_tracks": false, +"slice_163/save_to_file/path": "", +"slice_163/start_frame": 0, +"slice_164/end_frame": 0, +"slice_164/loop_mode": 0, +"slice_164/name": "", +"slice_164/save_to_file/enabled": false, +"slice_164/save_to_file/keep_custom_tracks": false, +"slice_164/save_to_file/path": "", +"slice_164/start_frame": 0, +"slice_165/end_frame": 0, +"slice_165/loop_mode": 0, +"slice_165/name": "", +"slice_165/save_to_file/enabled": false, +"slice_165/save_to_file/keep_custom_tracks": false, +"slice_165/save_to_file/path": "", +"slice_165/start_frame": 0, +"slice_166/end_frame": 0, +"slice_166/loop_mode": 0, +"slice_166/name": "", +"slice_166/save_to_file/enabled": false, +"slice_166/save_to_file/keep_custom_tracks": false, +"slice_166/save_to_file/path": "", +"slice_166/start_frame": 0, +"slice_167/end_frame": 0, +"slice_167/loop_mode": 0, +"slice_167/name": "", +"slice_167/save_to_file/enabled": false, +"slice_167/save_to_file/keep_custom_tracks": false, +"slice_167/save_to_file/path": "", +"slice_167/start_frame": 0, +"slice_168/end_frame": 0, +"slice_168/loop_mode": 0, +"slice_168/name": "", +"slice_168/save_to_file/enabled": false, +"slice_168/save_to_file/keep_custom_tracks": false, +"slice_168/save_to_file/path": "", +"slice_168/start_frame": 0, +"slice_169/end_frame": 0, +"slice_169/loop_mode": 0, +"slice_169/name": "", +"slice_169/save_to_file/enabled": false, +"slice_169/save_to_file/keep_custom_tracks": false, +"slice_169/save_to_file/path": "", +"slice_169/start_frame": 0, +"slice_17/end_frame": 0, +"slice_17/loop_mode": 0, +"slice_17/name": "", +"slice_17/save_to_file/enabled": false, +"slice_17/save_to_file/keep_custom_tracks": false, +"slice_17/save_to_file/path": "", +"slice_17/start_frame": 0, +"slice_170/end_frame": 0, +"slice_170/loop_mode": 0, +"slice_170/name": "", +"slice_170/save_to_file/enabled": false, +"slice_170/save_to_file/keep_custom_tracks": false, +"slice_170/save_to_file/path": "", +"slice_170/start_frame": 0, +"slice_171/end_frame": 0, +"slice_171/loop_mode": 0, +"slice_171/name": "", +"slice_171/save_to_file/enabled": false, +"slice_171/save_to_file/keep_custom_tracks": false, +"slice_171/save_to_file/path": "", +"slice_171/start_frame": 0, +"slice_172/end_frame": 0, +"slice_172/loop_mode": 0, +"slice_172/name": "", +"slice_172/save_to_file/enabled": false, +"slice_172/save_to_file/keep_custom_tracks": false, +"slice_172/save_to_file/path": "", +"slice_172/start_frame": 0, +"slice_173/end_frame": 0, +"slice_173/loop_mode": 0, +"slice_173/name": "", +"slice_173/save_to_file/enabled": false, +"slice_173/save_to_file/keep_custom_tracks": false, +"slice_173/save_to_file/path": "", +"slice_173/start_frame": 0, +"slice_174/end_frame": 0, +"slice_174/loop_mode": 0, +"slice_174/name": "", +"slice_174/save_to_file/enabled": false, +"slice_174/save_to_file/keep_custom_tracks": false, +"slice_174/save_to_file/path": "", +"slice_174/start_frame": 0, +"slice_175/end_frame": 0, +"slice_175/loop_mode": 0, +"slice_175/name": "", +"slice_175/save_to_file/enabled": false, +"slice_175/save_to_file/keep_custom_tracks": false, +"slice_175/save_to_file/path": "", +"slice_175/start_frame": 0, +"slice_176/end_frame": 0, +"slice_176/loop_mode": 0, +"slice_176/name": "", +"slice_176/save_to_file/enabled": false, +"slice_176/save_to_file/keep_custom_tracks": false, +"slice_176/save_to_file/path": "", +"slice_176/start_frame": 0, +"slice_177/end_frame": 0, +"slice_177/loop_mode": 0, +"slice_177/name": "", +"slice_177/save_to_file/enabled": false, +"slice_177/save_to_file/keep_custom_tracks": false, +"slice_177/save_to_file/path": "", +"slice_177/start_frame": 0, +"slice_178/end_frame": 0, +"slice_178/loop_mode": 0, +"slice_178/name": "", +"slice_178/save_to_file/enabled": false, +"slice_178/save_to_file/keep_custom_tracks": false, +"slice_178/save_to_file/path": "", +"slice_178/start_frame": 0, +"slice_179/end_frame": 0, +"slice_179/loop_mode": 0, +"slice_179/name": "", +"slice_179/save_to_file/enabled": false, +"slice_179/save_to_file/keep_custom_tracks": false, +"slice_179/save_to_file/path": "", +"slice_179/start_frame": 0, +"slice_18/end_frame": 0, +"slice_18/loop_mode": 0, +"slice_18/name": "", +"slice_18/save_to_file/enabled": false, +"slice_18/save_to_file/keep_custom_tracks": false, +"slice_18/save_to_file/path": "", +"slice_18/start_frame": 0, +"slice_180/end_frame": 0, +"slice_180/loop_mode": 0, +"slice_180/name": "", +"slice_180/save_to_file/enabled": false, +"slice_180/save_to_file/keep_custom_tracks": false, +"slice_180/save_to_file/path": "", +"slice_180/start_frame": 0, +"slice_181/end_frame": 0, +"slice_181/loop_mode": 0, +"slice_181/name": "", +"slice_181/save_to_file/enabled": false, +"slice_181/save_to_file/keep_custom_tracks": false, +"slice_181/save_to_file/path": "", +"slice_181/start_frame": 0, +"slice_182/end_frame": 0, +"slice_182/loop_mode": 0, +"slice_182/name": "", +"slice_182/save_to_file/enabled": false, +"slice_182/save_to_file/keep_custom_tracks": false, +"slice_182/save_to_file/path": "", +"slice_182/start_frame": 0, +"slice_183/end_frame": 0, +"slice_183/loop_mode": 0, +"slice_183/name": "", +"slice_183/save_to_file/enabled": false, +"slice_183/save_to_file/keep_custom_tracks": false, +"slice_183/save_to_file/path": "", +"slice_183/start_frame": 0, +"slice_184/end_frame": 0, +"slice_184/loop_mode": 0, +"slice_184/name": "", +"slice_184/save_to_file/enabled": false, +"slice_184/save_to_file/keep_custom_tracks": false, +"slice_184/save_to_file/path": "", +"slice_184/start_frame": 0, +"slice_185/end_frame": 0, +"slice_185/loop_mode": 0, +"slice_185/name": "", +"slice_185/save_to_file/enabled": false, +"slice_185/save_to_file/keep_custom_tracks": false, +"slice_185/save_to_file/path": "", +"slice_185/start_frame": 0, +"slice_186/end_frame": 0, +"slice_186/loop_mode": 0, +"slice_186/name": "", +"slice_186/save_to_file/enabled": false, +"slice_186/save_to_file/keep_custom_tracks": false, +"slice_186/save_to_file/path": "", +"slice_186/start_frame": 0, +"slice_187/end_frame": 0, +"slice_187/loop_mode": 0, +"slice_187/name": "", +"slice_187/save_to_file/enabled": false, +"slice_187/save_to_file/keep_custom_tracks": false, +"slice_187/save_to_file/path": "", +"slice_187/start_frame": 0, +"slice_188/end_frame": 0, +"slice_188/loop_mode": 0, +"slice_188/name": "", +"slice_188/save_to_file/enabled": false, +"slice_188/save_to_file/keep_custom_tracks": false, +"slice_188/save_to_file/path": "", +"slice_188/start_frame": 0, +"slice_189/end_frame": 0, +"slice_189/loop_mode": 0, +"slice_189/name": "", +"slice_189/save_to_file/enabled": false, +"slice_189/save_to_file/keep_custom_tracks": false, +"slice_189/save_to_file/path": "", +"slice_189/start_frame": 0, +"slice_19/end_frame": 0, +"slice_19/loop_mode": 0, +"slice_19/name": "", +"slice_19/save_to_file/enabled": false, +"slice_19/save_to_file/keep_custom_tracks": false, +"slice_19/save_to_file/path": "", +"slice_19/start_frame": 0, +"slice_190/end_frame": 0, +"slice_190/loop_mode": 0, +"slice_190/name": "", +"slice_190/save_to_file/enabled": false, +"slice_190/save_to_file/keep_custom_tracks": false, +"slice_190/save_to_file/path": "", +"slice_190/start_frame": 0, +"slice_191/end_frame": 0, +"slice_191/loop_mode": 0, +"slice_191/name": "", +"slice_191/save_to_file/enabled": false, +"slice_191/save_to_file/keep_custom_tracks": false, +"slice_191/save_to_file/path": "", +"slice_191/start_frame": 0, +"slice_192/end_frame": 0, +"slice_192/loop_mode": 0, +"slice_192/name": "", +"slice_192/save_to_file/enabled": false, +"slice_192/save_to_file/keep_custom_tracks": false, +"slice_192/save_to_file/path": "", +"slice_192/start_frame": 0, +"slice_193/end_frame": 0, +"slice_193/loop_mode": 0, +"slice_193/name": "", +"slice_193/save_to_file/enabled": false, +"slice_193/save_to_file/keep_custom_tracks": false, +"slice_193/save_to_file/path": "", +"slice_193/start_frame": 0, +"slice_194/end_frame": 0, +"slice_194/loop_mode": 0, +"slice_194/name": "", +"slice_194/save_to_file/enabled": false, +"slice_194/save_to_file/keep_custom_tracks": false, +"slice_194/save_to_file/path": "", +"slice_194/start_frame": 0, +"slice_195/end_frame": 0, +"slice_195/loop_mode": 0, +"slice_195/name": "", +"slice_195/save_to_file/enabled": false, +"slice_195/save_to_file/keep_custom_tracks": false, +"slice_195/save_to_file/path": "", +"slice_195/start_frame": 0, +"slice_196/end_frame": 0, +"slice_196/loop_mode": 0, +"slice_196/name": "", +"slice_196/save_to_file/enabled": false, +"slice_196/save_to_file/keep_custom_tracks": false, +"slice_196/save_to_file/path": "", +"slice_196/start_frame": 0, +"slice_197/end_frame": 0, +"slice_197/loop_mode": 0, +"slice_197/name": "", +"slice_197/save_to_file/enabled": false, +"slice_197/save_to_file/keep_custom_tracks": false, +"slice_197/save_to_file/path": "", +"slice_197/start_frame": 0, +"slice_198/end_frame": 0, +"slice_198/loop_mode": 0, +"slice_198/name": "", +"slice_198/save_to_file/enabled": false, +"slice_198/save_to_file/keep_custom_tracks": false, +"slice_198/save_to_file/path": "", +"slice_198/start_frame": 0, +"slice_199/end_frame": 0, +"slice_199/loop_mode": 0, +"slice_199/name": "", +"slice_199/save_to_file/enabled": false, +"slice_199/save_to_file/keep_custom_tracks": false, +"slice_199/save_to_file/path": "", +"slice_199/start_frame": 0, +"slice_2/end_frame": 0, +"slice_2/loop_mode": 0, +"slice_2/name": "", +"slice_2/save_to_file/enabled": false, +"slice_2/save_to_file/keep_custom_tracks": false, +"slice_2/save_to_file/path": "", +"slice_2/start_frame": 0, +"slice_20/end_frame": 0, +"slice_20/loop_mode": 0, +"slice_20/name": "", +"slice_20/save_to_file/enabled": false, +"slice_20/save_to_file/keep_custom_tracks": false, +"slice_20/save_to_file/path": "", +"slice_20/start_frame": 0, +"slice_200/end_frame": 0, +"slice_200/loop_mode": 0, +"slice_200/name": "", +"slice_200/save_to_file/enabled": false, +"slice_200/save_to_file/keep_custom_tracks": false, +"slice_200/save_to_file/path": "", +"slice_200/start_frame": 0, +"slice_201/end_frame": 0, +"slice_201/loop_mode": 0, +"slice_201/name": "", +"slice_201/save_to_file/enabled": false, +"slice_201/save_to_file/keep_custom_tracks": false, +"slice_201/save_to_file/path": "", +"slice_201/start_frame": 0, +"slice_202/end_frame": 0, +"slice_202/loop_mode": 0, +"slice_202/name": "", +"slice_202/save_to_file/enabled": false, +"slice_202/save_to_file/keep_custom_tracks": false, +"slice_202/save_to_file/path": "", +"slice_202/start_frame": 0, +"slice_203/end_frame": 0, +"slice_203/loop_mode": 0, +"slice_203/name": "", +"slice_203/save_to_file/enabled": false, +"slice_203/save_to_file/keep_custom_tracks": false, +"slice_203/save_to_file/path": "", +"slice_203/start_frame": 0, +"slice_204/end_frame": 0, +"slice_204/loop_mode": 0, +"slice_204/name": "", +"slice_204/save_to_file/enabled": false, +"slice_204/save_to_file/keep_custom_tracks": false, +"slice_204/save_to_file/path": "", +"slice_204/start_frame": 0, +"slice_205/end_frame": 0, +"slice_205/loop_mode": 0, +"slice_205/name": "", +"slice_205/save_to_file/enabled": false, +"slice_205/save_to_file/keep_custom_tracks": false, +"slice_205/save_to_file/path": "", +"slice_205/start_frame": 0, +"slice_206/end_frame": 0, +"slice_206/loop_mode": 0, +"slice_206/name": "", +"slice_206/save_to_file/enabled": false, +"slice_206/save_to_file/keep_custom_tracks": false, +"slice_206/save_to_file/path": "", +"slice_206/start_frame": 0, +"slice_207/end_frame": 0, +"slice_207/loop_mode": 0, +"slice_207/name": "", +"slice_207/save_to_file/enabled": false, +"slice_207/save_to_file/keep_custom_tracks": false, +"slice_207/save_to_file/path": "", +"slice_207/start_frame": 0, +"slice_208/end_frame": 0, +"slice_208/loop_mode": 0, +"slice_208/name": "", +"slice_208/save_to_file/enabled": false, +"slice_208/save_to_file/keep_custom_tracks": false, +"slice_208/save_to_file/path": "", +"slice_208/start_frame": 0, +"slice_209/end_frame": 0, +"slice_209/loop_mode": 0, +"slice_209/name": "", +"slice_209/save_to_file/enabled": false, +"slice_209/save_to_file/keep_custom_tracks": false, +"slice_209/save_to_file/path": "", +"slice_209/start_frame": 0, +"slice_21/end_frame": 0, +"slice_21/loop_mode": 0, +"slice_21/name": "", +"slice_21/save_to_file/enabled": false, +"slice_21/save_to_file/keep_custom_tracks": false, +"slice_21/save_to_file/path": "", +"slice_21/start_frame": 0, +"slice_210/end_frame": 0, +"slice_210/loop_mode": 0, +"slice_210/name": "", +"slice_210/save_to_file/enabled": false, +"slice_210/save_to_file/keep_custom_tracks": false, +"slice_210/save_to_file/path": "", +"slice_210/start_frame": 0, +"slice_211/end_frame": 0, +"slice_211/loop_mode": 0, +"slice_211/name": "", +"slice_211/save_to_file/enabled": false, +"slice_211/save_to_file/keep_custom_tracks": false, +"slice_211/save_to_file/path": "", +"slice_211/start_frame": 0, +"slice_212/end_frame": 0, +"slice_212/loop_mode": 0, +"slice_212/name": "", +"slice_212/save_to_file/enabled": false, +"slice_212/save_to_file/keep_custom_tracks": false, +"slice_212/save_to_file/path": "", +"slice_212/start_frame": 0, +"slice_213/end_frame": 0, +"slice_213/loop_mode": 0, +"slice_213/name": "", +"slice_213/save_to_file/enabled": false, +"slice_213/save_to_file/keep_custom_tracks": false, +"slice_213/save_to_file/path": "", +"slice_213/start_frame": 0, +"slice_214/end_frame": 0, +"slice_214/loop_mode": 0, +"slice_214/name": "", +"slice_214/save_to_file/enabled": false, +"slice_214/save_to_file/keep_custom_tracks": false, +"slice_214/save_to_file/path": "", +"slice_214/start_frame": 0, +"slice_215/end_frame": 0, +"slice_215/loop_mode": 0, +"slice_215/name": "", +"slice_215/save_to_file/enabled": false, +"slice_215/save_to_file/keep_custom_tracks": false, +"slice_215/save_to_file/path": "", +"slice_215/start_frame": 0, +"slice_216/end_frame": 0, +"slice_216/loop_mode": 0, +"slice_216/name": "", +"slice_216/save_to_file/enabled": false, +"slice_216/save_to_file/keep_custom_tracks": false, +"slice_216/save_to_file/path": "", +"slice_216/start_frame": 0, +"slice_217/end_frame": 0, +"slice_217/loop_mode": 0, +"slice_217/name": "", +"slice_217/save_to_file/enabled": false, +"slice_217/save_to_file/keep_custom_tracks": false, +"slice_217/save_to_file/path": "", +"slice_217/start_frame": 0, +"slice_218/end_frame": 0, +"slice_218/loop_mode": 0, +"slice_218/name": "", +"slice_218/save_to_file/enabled": false, +"slice_218/save_to_file/keep_custom_tracks": false, +"slice_218/save_to_file/path": "", +"slice_218/start_frame": 0, +"slice_219/end_frame": 0, +"slice_219/loop_mode": 0, +"slice_219/name": "", +"slice_219/save_to_file/enabled": false, +"slice_219/save_to_file/keep_custom_tracks": false, +"slice_219/save_to_file/path": "", +"slice_219/start_frame": 0, +"slice_22/end_frame": 0, +"slice_22/loop_mode": 0, +"slice_22/name": "", +"slice_22/save_to_file/enabled": false, +"slice_22/save_to_file/keep_custom_tracks": false, +"slice_22/save_to_file/path": "", +"slice_22/start_frame": 0, +"slice_220/end_frame": 0, +"slice_220/loop_mode": 0, +"slice_220/name": "", +"slice_220/save_to_file/enabled": false, +"slice_220/save_to_file/keep_custom_tracks": false, +"slice_220/save_to_file/path": "", +"slice_220/start_frame": 0, +"slice_221/end_frame": 0, +"slice_221/loop_mode": 0, +"slice_221/name": "", +"slice_221/save_to_file/enabled": false, +"slice_221/save_to_file/keep_custom_tracks": false, +"slice_221/save_to_file/path": "", +"slice_221/start_frame": 0, +"slice_222/end_frame": 0, +"slice_222/loop_mode": 0, +"slice_222/name": "", +"slice_222/save_to_file/enabled": false, +"slice_222/save_to_file/keep_custom_tracks": false, +"slice_222/save_to_file/path": "", +"slice_222/start_frame": 0, +"slice_223/end_frame": 0, +"slice_223/loop_mode": 0, +"slice_223/name": "", +"slice_223/save_to_file/enabled": false, +"slice_223/save_to_file/keep_custom_tracks": false, +"slice_223/save_to_file/path": "", +"slice_223/start_frame": 0, +"slice_224/end_frame": 0, +"slice_224/loop_mode": 0, +"slice_224/name": "", +"slice_224/save_to_file/enabled": false, +"slice_224/save_to_file/keep_custom_tracks": false, +"slice_224/save_to_file/path": "", +"slice_224/start_frame": 0, +"slice_225/end_frame": 0, +"slice_225/loop_mode": 0, +"slice_225/name": "", +"slice_225/save_to_file/enabled": false, +"slice_225/save_to_file/keep_custom_tracks": false, +"slice_225/save_to_file/path": "", +"slice_225/start_frame": 0, +"slice_226/end_frame": 0, +"slice_226/loop_mode": 0, +"slice_226/name": "", +"slice_226/save_to_file/enabled": false, +"slice_226/save_to_file/keep_custom_tracks": false, +"slice_226/save_to_file/path": "", +"slice_226/start_frame": 0, +"slice_227/end_frame": 0, +"slice_227/loop_mode": 0, +"slice_227/name": "", +"slice_227/save_to_file/enabled": false, +"slice_227/save_to_file/keep_custom_tracks": false, +"slice_227/save_to_file/path": "", +"slice_227/start_frame": 0, +"slice_228/end_frame": 0, +"slice_228/loop_mode": 0, +"slice_228/name": "", +"slice_228/save_to_file/enabled": false, +"slice_228/save_to_file/keep_custom_tracks": false, +"slice_228/save_to_file/path": "", +"slice_228/start_frame": 0, +"slice_229/end_frame": 0, +"slice_229/loop_mode": 0, +"slice_229/name": "", +"slice_229/save_to_file/enabled": false, +"slice_229/save_to_file/keep_custom_tracks": false, +"slice_229/save_to_file/path": "", +"slice_229/start_frame": 0, +"slice_23/end_frame": 0, +"slice_23/loop_mode": 0, +"slice_23/name": "", +"slice_23/save_to_file/enabled": false, +"slice_23/save_to_file/keep_custom_tracks": false, +"slice_23/save_to_file/path": "", +"slice_23/start_frame": 0, +"slice_230/end_frame": 0, +"slice_230/loop_mode": 0, +"slice_230/name": "", +"slice_230/save_to_file/enabled": false, +"slice_230/save_to_file/keep_custom_tracks": false, +"slice_230/save_to_file/path": "", +"slice_230/start_frame": 0, +"slice_231/end_frame": 0, +"slice_231/loop_mode": 0, +"slice_231/name": "", +"slice_231/save_to_file/enabled": false, +"slice_231/save_to_file/keep_custom_tracks": false, +"slice_231/save_to_file/path": "", +"slice_231/start_frame": 0, +"slice_232/end_frame": 0, +"slice_232/loop_mode": 0, +"slice_232/name": "", +"slice_232/save_to_file/enabled": false, +"slice_232/save_to_file/keep_custom_tracks": false, +"slice_232/save_to_file/path": "", +"slice_232/start_frame": 0, +"slice_233/end_frame": 0, +"slice_233/loop_mode": 0, +"slice_233/name": "", +"slice_233/save_to_file/enabled": false, +"slice_233/save_to_file/keep_custom_tracks": false, +"slice_233/save_to_file/path": "", +"slice_233/start_frame": 0, +"slice_234/end_frame": 0, +"slice_234/loop_mode": 0, +"slice_234/name": "", +"slice_234/save_to_file/enabled": false, +"slice_234/save_to_file/keep_custom_tracks": false, +"slice_234/save_to_file/path": "", +"slice_234/start_frame": 0, +"slice_235/end_frame": 0, +"slice_235/loop_mode": 0, +"slice_235/name": "", +"slice_235/save_to_file/enabled": false, +"slice_235/save_to_file/keep_custom_tracks": false, +"slice_235/save_to_file/path": "", +"slice_235/start_frame": 0, +"slice_236/end_frame": 0, +"slice_236/loop_mode": 0, +"slice_236/name": "", +"slice_236/save_to_file/enabled": false, +"slice_236/save_to_file/keep_custom_tracks": false, +"slice_236/save_to_file/path": "", +"slice_236/start_frame": 0, +"slice_237/end_frame": 0, +"slice_237/loop_mode": 0, +"slice_237/name": "", +"slice_237/save_to_file/enabled": false, +"slice_237/save_to_file/keep_custom_tracks": false, +"slice_237/save_to_file/path": "", +"slice_237/start_frame": 0, +"slice_238/end_frame": 0, +"slice_238/loop_mode": 0, +"slice_238/name": "", +"slice_238/save_to_file/enabled": false, +"slice_238/save_to_file/keep_custom_tracks": false, +"slice_238/save_to_file/path": "", +"slice_238/start_frame": 0, +"slice_239/end_frame": 0, +"slice_239/loop_mode": 0, +"slice_239/name": "", +"slice_239/save_to_file/enabled": false, +"slice_239/save_to_file/keep_custom_tracks": false, +"slice_239/save_to_file/path": "", +"slice_239/start_frame": 0, +"slice_24/end_frame": 0, +"slice_24/loop_mode": 0, +"slice_24/name": "", +"slice_24/save_to_file/enabled": false, +"slice_24/save_to_file/keep_custom_tracks": false, +"slice_24/save_to_file/path": "", +"slice_24/start_frame": 0, +"slice_240/end_frame": 0, +"slice_240/loop_mode": 0, +"slice_240/name": "", +"slice_240/save_to_file/enabled": false, +"slice_240/save_to_file/keep_custom_tracks": false, +"slice_240/save_to_file/path": "", +"slice_240/start_frame": 0, +"slice_241/end_frame": 0, +"slice_241/loop_mode": 0, +"slice_241/name": "", +"slice_241/save_to_file/enabled": false, +"slice_241/save_to_file/keep_custom_tracks": false, +"slice_241/save_to_file/path": "", +"slice_241/start_frame": 0, +"slice_242/end_frame": 0, +"slice_242/loop_mode": 0, +"slice_242/name": "", +"slice_242/save_to_file/enabled": false, +"slice_242/save_to_file/keep_custom_tracks": false, +"slice_242/save_to_file/path": "", +"slice_242/start_frame": 0, +"slice_243/end_frame": 0, +"slice_243/loop_mode": 0, +"slice_243/name": "", +"slice_243/save_to_file/enabled": false, +"slice_243/save_to_file/keep_custom_tracks": false, +"slice_243/save_to_file/path": "", +"slice_243/start_frame": 0, +"slice_244/end_frame": 0, +"slice_244/loop_mode": 0, +"slice_244/name": "", +"slice_244/save_to_file/enabled": false, +"slice_244/save_to_file/keep_custom_tracks": false, +"slice_244/save_to_file/path": "", +"slice_244/start_frame": 0, +"slice_245/end_frame": 0, +"slice_245/loop_mode": 0, +"slice_245/name": "", +"slice_245/save_to_file/enabled": false, +"slice_245/save_to_file/keep_custom_tracks": false, +"slice_245/save_to_file/path": "", +"slice_245/start_frame": 0, +"slice_246/end_frame": 0, +"slice_246/loop_mode": 0, +"slice_246/name": "", +"slice_246/save_to_file/enabled": false, +"slice_246/save_to_file/keep_custom_tracks": false, +"slice_246/save_to_file/path": "", +"slice_246/start_frame": 0, +"slice_247/end_frame": 0, +"slice_247/loop_mode": 0, +"slice_247/name": "", +"slice_247/save_to_file/enabled": false, +"slice_247/save_to_file/keep_custom_tracks": false, +"slice_247/save_to_file/path": "", +"slice_247/start_frame": 0, +"slice_248/end_frame": 0, +"slice_248/loop_mode": 0, +"slice_248/name": "", +"slice_248/save_to_file/enabled": false, +"slice_248/save_to_file/keep_custom_tracks": false, +"slice_248/save_to_file/path": "", +"slice_248/start_frame": 0, +"slice_249/end_frame": 0, +"slice_249/loop_mode": 0, +"slice_249/name": "", +"slice_249/save_to_file/enabled": false, +"slice_249/save_to_file/keep_custom_tracks": false, +"slice_249/save_to_file/path": "", +"slice_249/start_frame": 0, +"slice_25/end_frame": 0, +"slice_25/loop_mode": 0, +"slice_25/name": "", +"slice_25/save_to_file/enabled": false, +"slice_25/save_to_file/keep_custom_tracks": false, +"slice_25/save_to_file/path": "", +"slice_25/start_frame": 0, +"slice_250/end_frame": 0, +"slice_250/loop_mode": 0, +"slice_250/name": "", +"slice_250/save_to_file/enabled": false, +"slice_250/save_to_file/keep_custom_tracks": false, +"slice_250/save_to_file/path": "", +"slice_250/start_frame": 0, +"slice_251/end_frame": 0, +"slice_251/loop_mode": 0, +"slice_251/name": "", +"slice_251/save_to_file/enabled": false, +"slice_251/save_to_file/keep_custom_tracks": false, +"slice_251/save_to_file/path": "", +"slice_251/start_frame": 0, +"slice_252/end_frame": 0, +"slice_252/loop_mode": 0, +"slice_252/name": "", +"slice_252/save_to_file/enabled": false, +"slice_252/save_to_file/keep_custom_tracks": false, +"slice_252/save_to_file/path": "", +"slice_252/start_frame": 0, +"slice_253/end_frame": 0, +"slice_253/loop_mode": 0, +"slice_253/name": "", +"slice_253/save_to_file/enabled": false, +"slice_253/save_to_file/keep_custom_tracks": false, +"slice_253/save_to_file/path": "", +"slice_253/start_frame": 0, +"slice_254/end_frame": 0, +"slice_254/loop_mode": 0, +"slice_254/name": "", +"slice_254/save_to_file/enabled": false, +"slice_254/save_to_file/keep_custom_tracks": false, +"slice_254/save_to_file/path": "", +"slice_254/start_frame": 0, +"slice_255/end_frame": 0, +"slice_255/loop_mode": 0, +"slice_255/name": "", +"slice_255/save_to_file/enabled": false, +"slice_255/save_to_file/keep_custom_tracks": false, +"slice_255/save_to_file/path": "", +"slice_255/start_frame": 0, +"slice_256/end_frame": 0, +"slice_256/loop_mode": 0, +"slice_256/name": "", +"slice_256/save_to_file/enabled": false, +"slice_256/save_to_file/keep_custom_tracks": false, +"slice_256/save_to_file/path": "", +"slice_256/start_frame": 0, +"slice_26/end_frame": 0, +"slice_26/loop_mode": 0, +"slice_26/name": "", +"slice_26/save_to_file/enabled": false, +"slice_26/save_to_file/keep_custom_tracks": false, +"slice_26/save_to_file/path": "", +"slice_26/start_frame": 0, +"slice_27/end_frame": 0, +"slice_27/loop_mode": 0, +"slice_27/name": "", +"slice_27/save_to_file/enabled": false, +"slice_27/save_to_file/keep_custom_tracks": false, +"slice_27/save_to_file/path": "", +"slice_27/start_frame": 0, +"slice_28/end_frame": 0, +"slice_28/loop_mode": 0, +"slice_28/name": "", +"slice_28/save_to_file/enabled": false, +"slice_28/save_to_file/keep_custom_tracks": false, +"slice_28/save_to_file/path": "", +"slice_28/start_frame": 0, +"slice_29/end_frame": 0, +"slice_29/loop_mode": 0, +"slice_29/name": "", +"slice_29/save_to_file/enabled": false, +"slice_29/save_to_file/keep_custom_tracks": false, +"slice_29/save_to_file/path": "", +"slice_29/start_frame": 0, +"slice_3/end_frame": 0, +"slice_3/loop_mode": 0, +"slice_3/name": "", +"slice_3/save_to_file/enabled": false, +"slice_3/save_to_file/keep_custom_tracks": false, +"slice_3/save_to_file/path": "", +"slice_3/start_frame": 0, +"slice_30/end_frame": 0, +"slice_30/loop_mode": 0, +"slice_30/name": "", +"slice_30/save_to_file/enabled": false, +"slice_30/save_to_file/keep_custom_tracks": false, +"slice_30/save_to_file/path": "", +"slice_30/start_frame": 0, +"slice_31/end_frame": 0, +"slice_31/loop_mode": 0, +"slice_31/name": "", +"slice_31/save_to_file/enabled": false, +"slice_31/save_to_file/keep_custom_tracks": false, +"slice_31/save_to_file/path": "", +"slice_31/start_frame": 0, +"slice_32/end_frame": 0, +"slice_32/loop_mode": 0, +"slice_32/name": "", +"slice_32/save_to_file/enabled": false, +"slice_32/save_to_file/keep_custom_tracks": false, +"slice_32/save_to_file/path": "", +"slice_32/start_frame": 0, +"slice_33/end_frame": 0, +"slice_33/loop_mode": 0, +"slice_33/name": "", +"slice_33/save_to_file/enabled": false, +"slice_33/save_to_file/keep_custom_tracks": false, +"slice_33/save_to_file/path": "", +"slice_33/start_frame": 0, +"slice_34/end_frame": 0, +"slice_34/loop_mode": 0, +"slice_34/name": "", +"slice_34/save_to_file/enabled": false, +"slice_34/save_to_file/keep_custom_tracks": false, +"slice_34/save_to_file/path": "", +"slice_34/start_frame": 0, +"slice_35/end_frame": 0, +"slice_35/loop_mode": 0, +"slice_35/name": "", +"slice_35/save_to_file/enabled": false, +"slice_35/save_to_file/keep_custom_tracks": false, +"slice_35/save_to_file/path": "", +"slice_35/start_frame": 0, +"slice_36/end_frame": 0, +"slice_36/loop_mode": 0, +"slice_36/name": "", +"slice_36/save_to_file/enabled": false, +"slice_36/save_to_file/keep_custom_tracks": false, +"slice_36/save_to_file/path": "", +"slice_36/start_frame": 0, +"slice_37/end_frame": 0, +"slice_37/loop_mode": 0, +"slice_37/name": "", +"slice_37/save_to_file/enabled": false, +"slice_37/save_to_file/keep_custom_tracks": false, +"slice_37/save_to_file/path": "", +"slice_37/start_frame": 0, +"slice_38/end_frame": 0, +"slice_38/loop_mode": 0, +"slice_38/name": "", +"slice_38/save_to_file/enabled": false, +"slice_38/save_to_file/keep_custom_tracks": false, +"slice_38/save_to_file/path": "", +"slice_38/start_frame": 0, +"slice_39/end_frame": 0, +"slice_39/loop_mode": 0, +"slice_39/name": "", +"slice_39/save_to_file/enabled": false, +"slice_39/save_to_file/keep_custom_tracks": false, +"slice_39/save_to_file/path": "", +"slice_39/start_frame": 0, +"slice_4/end_frame": 0, +"slice_4/loop_mode": 0, +"slice_4/name": "", +"slice_4/save_to_file/enabled": false, +"slice_4/save_to_file/keep_custom_tracks": false, +"slice_4/save_to_file/path": "", +"slice_4/start_frame": 0, +"slice_40/end_frame": 0, +"slice_40/loop_mode": 0, +"slice_40/name": "", +"slice_40/save_to_file/enabled": false, +"slice_40/save_to_file/keep_custom_tracks": false, +"slice_40/save_to_file/path": "", +"slice_40/start_frame": 0, +"slice_41/end_frame": 0, +"slice_41/loop_mode": 0, +"slice_41/name": "", +"slice_41/save_to_file/enabled": false, +"slice_41/save_to_file/keep_custom_tracks": false, +"slice_41/save_to_file/path": "", +"slice_41/start_frame": 0, +"slice_42/end_frame": 0, +"slice_42/loop_mode": 0, +"slice_42/name": "", +"slice_42/save_to_file/enabled": false, +"slice_42/save_to_file/keep_custom_tracks": false, +"slice_42/save_to_file/path": "", +"slice_42/start_frame": 0, +"slice_43/end_frame": 0, +"slice_43/loop_mode": 0, +"slice_43/name": "", +"slice_43/save_to_file/enabled": false, +"slice_43/save_to_file/keep_custom_tracks": false, +"slice_43/save_to_file/path": "", +"slice_43/start_frame": 0, +"slice_44/end_frame": 0, +"slice_44/loop_mode": 0, +"slice_44/name": "", +"slice_44/save_to_file/enabled": false, +"slice_44/save_to_file/keep_custom_tracks": false, +"slice_44/save_to_file/path": "", +"slice_44/start_frame": 0, +"slice_45/end_frame": 0, +"slice_45/loop_mode": 0, +"slice_45/name": "", +"slice_45/save_to_file/enabled": false, +"slice_45/save_to_file/keep_custom_tracks": false, +"slice_45/save_to_file/path": "", +"slice_45/start_frame": 0, +"slice_46/end_frame": 0, +"slice_46/loop_mode": 0, +"slice_46/name": "", +"slice_46/save_to_file/enabled": false, +"slice_46/save_to_file/keep_custom_tracks": false, +"slice_46/save_to_file/path": "", +"slice_46/start_frame": 0, +"slice_47/end_frame": 0, +"slice_47/loop_mode": 0, +"slice_47/name": "", +"slice_47/save_to_file/enabled": false, +"slice_47/save_to_file/keep_custom_tracks": false, +"slice_47/save_to_file/path": "", +"slice_47/start_frame": 0, +"slice_48/end_frame": 0, +"slice_48/loop_mode": 0, +"slice_48/name": "", +"slice_48/save_to_file/enabled": false, +"slice_48/save_to_file/keep_custom_tracks": false, +"slice_48/save_to_file/path": "", +"slice_48/start_frame": 0, +"slice_49/end_frame": 0, +"slice_49/loop_mode": 0, +"slice_49/name": "", +"slice_49/save_to_file/enabled": false, +"slice_49/save_to_file/keep_custom_tracks": false, +"slice_49/save_to_file/path": "", +"slice_49/start_frame": 0, +"slice_5/end_frame": 0, +"slice_5/loop_mode": 0, +"slice_5/name": "", +"slice_5/save_to_file/enabled": false, +"slice_5/save_to_file/keep_custom_tracks": false, +"slice_5/save_to_file/path": "", +"slice_5/start_frame": 0, +"slice_50/end_frame": 0, +"slice_50/loop_mode": 0, +"slice_50/name": "", +"slice_50/save_to_file/enabled": false, +"slice_50/save_to_file/keep_custom_tracks": false, +"slice_50/save_to_file/path": "", +"slice_50/start_frame": 0, +"slice_51/end_frame": 0, +"slice_51/loop_mode": 0, +"slice_51/name": "", +"slice_51/save_to_file/enabled": false, +"slice_51/save_to_file/keep_custom_tracks": false, +"slice_51/save_to_file/path": "", +"slice_51/start_frame": 0, +"slice_52/end_frame": 0, +"slice_52/loop_mode": 0, +"slice_52/name": "", +"slice_52/save_to_file/enabled": false, +"slice_52/save_to_file/keep_custom_tracks": false, +"slice_52/save_to_file/path": "", +"slice_52/start_frame": 0, +"slice_53/end_frame": 0, +"slice_53/loop_mode": 0, +"slice_53/name": "", +"slice_53/save_to_file/enabled": false, +"slice_53/save_to_file/keep_custom_tracks": false, +"slice_53/save_to_file/path": "", +"slice_53/start_frame": 0, +"slice_54/end_frame": 0, +"slice_54/loop_mode": 0, +"slice_54/name": "", +"slice_54/save_to_file/enabled": false, +"slice_54/save_to_file/keep_custom_tracks": false, +"slice_54/save_to_file/path": "", +"slice_54/start_frame": 0, +"slice_55/end_frame": 0, +"slice_55/loop_mode": 0, +"slice_55/name": "", +"slice_55/save_to_file/enabled": false, +"slice_55/save_to_file/keep_custom_tracks": false, +"slice_55/save_to_file/path": "", +"slice_55/start_frame": 0, +"slice_56/end_frame": 0, +"slice_56/loop_mode": 0, +"slice_56/name": "", +"slice_56/save_to_file/enabled": false, +"slice_56/save_to_file/keep_custom_tracks": false, +"slice_56/save_to_file/path": "", +"slice_56/start_frame": 0, +"slice_57/end_frame": 0, +"slice_57/loop_mode": 0, +"slice_57/name": "", +"slice_57/save_to_file/enabled": false, +"slice_57/save_to_file/keep_custom_tracks": false, +"slice_57/save_to_file/path": "", +"slice_57/start_frame": 0, +"slice_58/end_frame": 0, +"slice_58/loop_mode": 0, +"slice_58/name": "", +"slice_58/save_to_file/enabled": false, +"slice_58/save_to_file/keep_custom_tracks": false, +"slice_58/save_to_file/path": "", +"slice_58/start_frame": 0, +"slice_59/end_frame": 0, +"slice_59/loop_mode": 0, +"slice_59/name": "", +"slice_59/save_to_file/enabled": false, +"slice_59/save_to_file/keep_custom_tracks": false, +"slice_59/save_to_file/path": "", +"slice_59/start_frame": 0, +"slice_6/end_frame": 0, +"slice_6/loop_mode": 0, +"slice_6/name": "", +"slice_6/save_to_file/enabled": false, +"slice_6/save_to_file/keep_custom_tracks": false, +"slice_6/save_to_file/path": "", +"slice_6/start_frame": 0, +"slice_60/end_frame": 0, +"slice_60/loop_mode": 0, +"slice_60/name": "", +"slice_60/save_to_file/enabled": false, +"slice_60/save_to_file/keep_custom_tracks": false, +"slice_60/save_to_file/path": "", +"slice_60/start_frame": 0, +"slice_61/end_frame": 0, +"slice_61/loop_mode": 0, +"slice_61/name": "", +"slice_61/save_to_file/enabled": false, +"slice_61/save_to_file/keep_custom_tracks": false, +"slice_61/save_to_file/path": "", +"slice_61/start_frame": 0, +"slice_62/end_frame": 0, +"slice_62/loop_mode": 0, +"slice_62/name": "", +"slice_62/save_to_file/enabled": false, +"slice_62/save_to_file/keep_custom_tracks": false, +"slice_62/save_to_file/path": "", +"slice_62/start_frame": 0, +"slice_63/end_frame": 0, +"slice_63/loop_mode": 0, +"slice_63/name": "", +"slice_63/save_to_file/enabled": false, +"slice_63/save_to_file/keep_custom_tracks": false, +"slice_63/save_to_file/path": "", +"slice_63/start_frame": 0, +"slice_64/end_frame": 0, +"slice_64/loop_mode": 0, +"slice_64/name": "", +"slice_64/save_to_file/enabled": false, +"slice_64/save_to_file/keep_custom_tracks": false, +"slice_64/save_to_file/path": "", +"slice_64/start_frame": 0, +"slice_65/end_frame": 0, +"slice_65/loop_mode": 0, +"slice_65/name": "", +"slice_65/save_to_file/enabled": false, +"slice_65/save_to_file/keep_custom_tracks": false, +"slice_65/save_to_file/path": "", +"slice_65/start_frame": 0, +"slice_66/end_frame": 0, +"slice_66/loop_mode": 0, +"slice_66/name": "", +"slice_66/save_to_file/enabled": false, +"slice_66/save_to_file/keep_custom_tracks": false, +"slice_66/save_to_file/path": "", +"slice_66/start_frame": 0, +"slice_67/end_frame": 0, +"slice_67/loop_mode": 0, +"slice_67/name": "", +"slice_67/save_to_file/enabled": false, +"slice_67/save_to_file/keep_custom_tracks": false, +"slice_67/save_to_file/path": "", +"slice_67/start_frame": 0, +"slice_68/end_frame": 0, +"slice_68/loop_mode": 0, +"slice_68/name": "", +"slice_68/save_to_file/enabled": false, +"slice_68/save_to_file/keep_custom_tracks": false, +"slice_68/save_to_file/path": "", +"slice_68/start_frame": 0, +"slice_69/end_frame": 0, +"slice_69/loop_mode": 0, +"slice_69/name": "", +"slice_69/save_to_file/enabled": false, +"slice_69/save_to_file/keep_custom_tracks": false, +"slice_69/save_to_file/path": "", +"slice_69/start_frame": 0, +"slice_7/end_frame": 0, +"slice_7/loop_mode": 0, +"slice_7/name": "", +"slice_7/save_to_file/enabled": false, +"slice_7/save_to_file/keep_custom_tracks": false, +"slice_7/save_to_file/path": "", +"slice_7/start_frame": 0, +"slice_70/end_frame": 0, +"slice_70/loop_mode": 0, +"slice_70/name": "", +"slice_70/save_to_file/enabled": false, +"slice_70/save_to_file/keep_custom_tracks": false, +"slice_70/save_to_file/path": "", +"slice_70/start_frame": 0, +"slice_71/end_frame": 0, +"slice_71/loop_mode": 0, +"slice_71/name": "", +"slice_71/save_to_file/enabled": false, +"slice_71/save_to_file/keep_custom_tracks": false, +"slice_71/save_to_file/path": "", +"slice_71/start_frame": 0, +"slice_72/end_frame": 0, +"slice_72/loop_mode": 0, +"slice_72/name": "", +"slice_72/save_to_file/enabled": false, +"slice_72/save_to_file/keep_custom_tracks": false, +"slice_72/save_to_file/path": "", +"slice_72/start_frame": 0, +"slice_73/end_frame": 0, +"slice_73/loop_mode": 0, +"slice_73/name": "", +"slice_73/save_to_file/enabled": false, +"slice_73/save_to_file/keep_custom_tracks": false, +"slice_73/save_to_file/path": "", +"slice_73/start_frame": 0, +"slice_74/end_frame": 0, +"slice_74/loop_mode": 0, +"slice_74/name": "", +"slice_74/save_to_file/enabled": false, +"slice_74/save_to_file/keep_custom_tracks": false, +"slice_74/save_to_file/path": "", +"slice_74/start_frame": 0, +"slice_75/end_frame": 0, +"slice_75/loop_mode": 0, +"slice_75/name": "", +"slice_75/save_to_file/enabled": false, +"slice_75/save_to_file/keep_custom_tracks": false, +"slice_75/save_to_file/path": "", +"slice_75/start_frame": 0, +"slice_76/end_frame": 0, +"slice_76/loop_mode": 0, +"slice_76/name": "", +"slice_76/save_to_file/enabled": false, +"slice_76/save_to_file/keep_custom_tracks": false, +"slice_76/save_to_file/path": "", +"slice_76/start_frame": 0, +"slice_77/end_frame": 0, +"slice_77/loop_mode": 0, +"slice_77/name": "", +"slice_77/save_to_file/enabled": false, +"slice_77/save_to_file/keep_custom_tracks": false, +"slice_77/save_to_file/path": "", +"slice_77/start_frame": 0, +"slice_78/end_frame": 0, +"slice_78/loop_mode": 0, +"slice_78/name": "", +"slice_78/save_to_file/enabled": false, +"slice_78/save_to_file/keep_custom_tracks": false, +"slice_78/save_to_file/path": "", +"slice_78/start_frame": 0, +"slice_79/end_frame": 0, +"slice_79/loop_mode": 0, +"slice_79/name": "", +"slice_79/save_to_file/enabled": false, +"slice_79/save_to_file/keep_custom_tracks": false, +"slice_79/save_to_file/path": "", +"slice_79/start_frame": 0, +"slice_8/end_frame": 0, +"slice_8/loop_mode": 0, +"slice_8/name": "", +"slice_8/save_to_file/enabled": false, +"slice_8/save_to_file/keep_custom_tracks": false, +"slice_8/save_to_file/path": "", +"slice_8/start_frame": 0, +"slice_80/end_frame": 0, +"slice_80/loop_mode": 0, +"slice_80/name": "", +"slice_80/save_to_file/enabled": false, +"slice_80/save_to_file/keep_custom_tracks": false, +"slice_80/save_to_file/path": "", +"slice_80/start_frame": 0, +"slice_81/end_frame": 0, +"slice_81/loop_mode": 0, +"slice_81/name": "", +"slice_81/save_to_file/enabled": false, +"slice_81/save_to_file/keep_custom_tracks": false, +"slice_81/save_to_file/path": "", +"slice_81/start_frame": 0, +"slice_82/end_frame": 0, +"slice_82/loop_mode": 0, +"slice_82/name": "", +"slice_82/save_to_file/enabled": false, +"slice_82/save_to_file/keep_custom_tracks": false, +"slice_82/save_to_file/path": "", +"slice_82/start_frame": 0, +"slice_83/end_frame": 0, +"slice_83/loop_mode": 0, +"slice_83/name": "", +"slice_83/save_to_file/enabled": false, +"slice_83/save_to_file/keep_custom_tracks": false, +"slice_83/save_to_file/path": "", +"slice_83/start_frame": 0, +"slice_84/end_frame": 0, +"slice_84/loop_mode": 0, +"slice_84/name": "", +"slice_84/save_to_file/enabled": false, +"slice_84/save_to_file/keep_custom_tracks": false, +"slice_84/save_to_file/path": "", +"slice_84/start_frame": 0, +"slice_85/end_frame": 0, +"slice_85/loop_mode": 0, +"slice_85/name": "", +"slice_85/save_to_file/enabled": false, +"slice_85/save_to_file/keep_custom_tracks": false, +"slice_85/save_to_file/path": "", +"slice_85/start_frame": 0, +"slice_86/end_frame": 0, +"slice_86/loop_mode": 0, +"slice_86/name": "", +"slice_86/save_to_file/enabled": false, +"slice_86/save_to_file/keep_custom_tracks": false, +"slice_86/save_to_file/path": "", +"slice_86/start_frame": 0, +"slice_87/end_frame": 0, +"slice_87/loop_mode": 0, +"slice_87/name": "", +"slice_87/save_to_file/enabled": false, +"slice_87/save_to_file/keep_custom_tracks": false, +"slice_87/save_to_file/path": "", +"slice_87/start_frame": 0, +"slice_88/end_frame": 0, +"slice_88/loop_mode": 0, +"slice_88/name": "", +"slice_88/save_to_file/enabled": false, +"slice_88/save_to_file/keep_custom_tracks": false, +"slice_88/save_to_file/path": "", +"slice_88/start_frame": 0, +"slice_89/end_frame": 0, +"slice_89/loop_mode": 0, +"slice_89/name": "", +"slice_89/save_to_file/enabled": false, +"slice_89/save_to_file/keep_custom_tracks": false, +"slice_89/save_to_file/path": "", +"slice_89/start_frame": 0, +"slice_9/end_frame": 0, +"slice_9/loop_mode": 0, +"slice_9/name": "", +"slice_9/save_to_file/enabled": false, +"slice_9/save_to_file/keep_custom_tracks": false, +"slice_9/save_to_file/path": "", +"slice_9/start_frame": 0, +"slice_90/end_frame": 0, +"slice_90/loop_mode": 0, +"slice_90/name": "", +"slice_90/save_to_file/enabled": false, +"slice_90/save_to_file/keep_custom_tracks": false, +"slice_90/save_to_file/path": "", +"slice_90/start_frame": 0, +"slice_91/end_frame": 0, +"slice_91/loop_mode": 0, +"slice_91/name": "", +"slice_91/save_to_file/enabled": false, +"slice_91/save_to_file/keep_custom_tracks": false, +"slice_91/save_to_file/path": "", +"slice_91/start_frame": 0, +"slice_92/end_frame": 0, +"slice_92/loop_mode": 0, +"slice_92/name": "", +"slice_92/save_to_file/enabled": false, +"slice_92/save_to_file/keep_custom_tracks": false, +"slice_92/save_to_file/path": "", +"slice_92/start_frame": 0, +"slice_93/end_frame": 0, +"slice_93/loop_mode": 0, +"slice_93/name": "", +"slice_93/save_to_file/enabled": false, +"slice_93/save_to_file/keep_custom_tracks": false, +"slice_93/save_to_file/path": "", +"slice_93/start_frame": 0, +"slice_94/end_frame": 0, +"slice_94/loop_mode": 0, +"slice_94/name": "", +"slice_94/save_to_file/enabled": false, +"slice_94/save_to_file/keep_custom_tracks": false, +"slice_94/save_to_file/path": "", +"slice_94/start_frame": 0, +"slice_95/end_frame": 0, +"slice_95/loop_mode": 0, +"slice_95/name": "", +"slice_95/save_to_file/enabled": false, +"slice_95/save_to_file/keep_custom_tracks": false, +"slice_95/save_to_file/path": "", +"slice_95/start_frame": 0, +"slice_96/end_frame": 0, +"slice_96/loop_mode": 0, +"slice_96/name": "", +"slice_96/save_to_file/enabled": false, +"slice_96/save_to_file/keep_custom_tracks": false, +"slice_96/save_to_file/path": "", +"slice_96/start_frame": 0, +"slice_97/end_frame": 0, +"slice_97/loop_mode": 0, +"slice_97/name": "", +"slice_97/save_to_file/enabled": false, +"slice_97/save_to_file/keep_custom_tracks": false, +"slice_97/save_to_file/path": "", +"slice_97/start_frame": 0, +"slice_98/end_frame": 0, +"slice_98/loop_mode": 0, +"slice_98/name": "", +"slice_98/save_to_file/enabled": false, +"slice_98/save_to_file/keep_custom_tracks": false, +"slice_98/save_to_file/path": "", +"slice_98/start_frame": 0, +"slice_99/end_frame": 0, +"slice_99/loop_mode": 0, +"slice_99/name": "", +"slice_99/save_to_file/enabled": false, +"slice_99/save_to_file/keep_custom_tracks": false, +"slice_99/save_to_file/path": "", +"slice_99/start_frame": 0, +"slices/amount": null +}, +"walk": { +"save_to_file/enabled": false, +"save_to_file/keep_custom_tracks": "", +"save_to_file/path": "", +"settings/loop_mode": 1, +"slice_1/end_frame": 0, +"slice_1/loop_mode": 0, +"slice_1/name": "", +"slice_1/save_to_file/enabled": false, +"slice_1/save_to_file/keep_custom_tracks": false, +"slice_1/save_to_file/path": "", +"slice_1/start_frame": 0, +"slice_10/end_frame": 0, +"slice_10/loop_mode": 0, +"slice_10/name": "", +"slice_10/save_to_file/enabled": false, +"slice_10/save_to_file/keep_custom_tracks": false, +"slice_10/save_to_file/path": "", +"slice_10/start_frame": 0, +"slice_100/end_frame": 0, +"slice_100/loop_mode": 0, +"slice_100/name": "", +"slice_100/save_to_file/enabled": false, +"slice_100/save_to_file/keep_custom_tracks": false, +"slice_100/save_to_file/path": "", +"slice_100/start_frame": 0, +"slice_101/end_frame": 0, +"slice_101/loop_mode": 0, +"slice_101/name": "", +"slice_101/save_to_file/enabled": false, +"slice_101/save_to_file/keep_custom_tracks": false, +"slice_101/save_to_file/path": "", +"slice_101/start_frame": 0, +"slice_102/end_frame": 0, +"slice_102/loop_mode": 0, +"slice_102/name": "", +"slice_102/save_to_file/enabled": false, +"slice_102/save_to_file/keep_custom_tracks": false, +"slice_102/save_to_file/path": "", +"slice_102/start_frame": 0, +"slice_103/end_frame": 0, +"slice_103/loop_mode": 0, +"slice_103/name": "", +"slice_103/save_to_file/enabled": false, +"slice_103/save_to_file/keep_custom_tracks": false, +"slice_103/save_to_file/path": "", +"slice_103/start_frame": 0, +"slice_104/end_frame": 0, +"slice_104/loop_mode": 0, +"slice_104/name": "", +"slice_104/save_to_file/enabled": false, +"slice_104/save_to_file/keep_custom_tracks": false, +"slice_104/save_to_file/path": "", +"slice_104/start_frame": 0, +"slice_105/end_frame": 0, +"slice_105/loop_mode": 0, +"slice_105/name": "", +"slice_105/save_to_file/enabled": false, +"slice_105/save_to_file/keep_custom_tracks": false, +"slice_105/save_to_file/path": "", +"slice_105/start_frame": 0, +"slice_106/end_frame": 0, +"slice_106/loop_mode": 0, +"slice_106/name": "", +"slice_106/save_to_file/enabled": false, +"slice_106/save_to_file/keep_custom_tracks": false, +"slice_106/save_to_file/path": "", +"slice_106/start_frame": 0, +"slice_107/end_frame": 0, +"slice_107/loop_mode": 0, +"slice_107/name": "", +"slice_107/save_to_file/enabled": false, +"slice_107/save_to_file/keep_custom_tracks": false, +"slice_107/save_to_file/path": "", +"slice_107/start_frame": 0, +"slice_108/end_frame": 0, +"slice_108/loop_mode": 0, +"slice_108/name": "", +"slice_108/save_to_file/enabled": false, +"slice_108/save_to_file/keep_custom_tracks": false, +"slice_108/save_to_file/path": "", +"slice_108/start_frame": 0, +"slice_109/end_frame": 0, +"slice_109/loop_mode": 0, +"slice_109/name": "", +"slice_109/save_to_file/enabled": false, +"slice_109/save_to_file/keep_custom_tracks": false, +"slice_109/save_to_file/path": "", +"slice_109/start_frame": 0, +"slice_11/end_frame": 0, +"slice_11/loop_mode": 0, +"slice_11/name": "", +"slice_11/save_to_file/enabled": false, +"slice_11/save_to_file/keep_custom_tracks": false, +"slice_11/save_to_file/path": "", +"slice_11/start_frame": 0, +"slice_110/end_frame": 0, +"slice_110/loop_mode": 0, +"slice_110/name": "", +"slice_110/save_to_file/enabled": false, +"slice_110/save_to_file/keep_custom_tracks": false, +"slice_110/save_to_file/path": "", +"slice_110/start_frame": 0, +"slice_111/end_frame": 0, +"slice_111/loop_mode": 0, +"slice_111/name": "", +"slice_111/save_to_file/enabled": false, +"slice_111/save_to_file/keep_custom_tracks": false, +"slice_111/save_to_file/path": "", +"slice_111/start_frame": 0, +"slice_112/end_frame": 0, +"slice_112/loop_mode": 0, +"slice_112/name": "", +"slice_112/save_to_file/enabled": false, +"slice_112/save_to_file/keep_custom_tracks": false, +"slice_112/save_to_file/path": "", +"slice_112/start_frame": 0, +"slice_113/end_frame": 0, +"slice_113/loop_mode": 0, +"slice_113/name": "", +"slice_113/save_to_file/enabled": false, +"slice_113/save_to_file/keep_custom_tracks": false, +"slice_113/save_to_file/path": "", +"slice_113/start_frame": 0, +"slice_114/end_frame": 0, +"slice_114/loop_mode": 0, +"slice_114/name": "", +"slice_114/save_to_file/enabled": false, +"slice_114/save_to_file/keep_custom_tracks": false, +"slice_114/save_to_file/path": "", +"slice_114/start_frame": 0, +"slice_115/end_frame": 0, +"slice_115/loop_mode": 0, +"slice_115/name": "", +"slice_115/save_to_file/enabled": false, +"slice_115/save_to_file/keep_custom_tracks": false, +"slice_115/save_to_file/path": "", +"slice_115/start_frame": 0, +"slice_116/end_frame": 0, +"slice_116/loop_mode": 0, +"slice_116/name": "", +"slice_116/save_to_file/enabled": false, +"slice_116/save_to_file/keep_custom_tracks": false, +"slice_116/save_to_file/path": "", +"slice_116/start_frame": 0, +"slice_117/end_frame": 0, +"slice_117/loop_mode": 0, +"slice_117/name": "", +"slice_117/save_to_file/enabled": false, +"slice_117/save_to_file/keep_custom_tracks": false, +"slice_117/save_to_file/path": "", +"slice_117/start_frame": 0, +"slice_118/end_frame": 0, +"slice_118/loop_mode": 0, +"slice_118/name": "", +"slice_118/save_to_file/enabled": false, +"slice_118/save_to_file/keep_custom_tracks": false, +"slice_118/save_to_file/path": "", +"slice_118/start_frame": 0, +"slice_119/end_frame": 0, +"slice_119/loop_mode": 0, +"slice_119/name": "", +"slice_119/save_to_file/enabled": false, +"slice_119/save_to_file/keep_custom_tracks": false, +"slice_119/save_to_file/path": "", +"slice_119/start_frame": 0, +"slice_12/end_frame": 0, +"slice_12/loop_mode": 0, +"slice_12/name": "", +"slice_12/save_to_file/enabled": false, +"slice_12/save_to_file/keep_custom_tracks": false, +"slice_12/save_to_file/path": "", +"slice_12/start_frame": 0, +"slice_120/end_frame": 0, +"slice_120/loop_mode": 0, +"slice_120/name": "", +"slice_120/save_to_file/enabled": false, +"slice_120/save_to_file/keep_custom_tracks": false, +"slice_120/save_to_file/path": "", +"slice_120/start_frame": 0, +"slice_121/end_frame": 0, +"slice_121/loop_mode": 0, +"slice_121/name": "", +"slice_121/save_to_file/enabled": false, +"slice_121/save_to_file/keep_custom_tracks": false, +"slice_121/save_to_file/path": "", +"slice_121/start_frame": 0, +"slice_122/end_frame": 0, +"slice_122/loop_mode": 0, +"slice_122/name": "", +"slice_122/save_to_file/enabled": false, +"slice_122/save_to_file/keep_custom_tracks": false, +"slice_122/save_to_file/path": "", +"slice_122/start_frame": 0, +"slice_123/end_frame": 0, +"slice_123/loop_mode": 0, +"slice_123/name": "", +"slice_123/save_to_file/enabled": false, +"slice_123/save_to_file/keep_custom_tracks": false, +"slice_123/save_to_file/path": "", +"slice_123/start_frame": 0, +"slice_124/end_frame": 0, +"slice_124/loop_mode": 0, +"slice_124/name": "", +"slice_124/save_to_file/enabled": false, +"slice_124/save_to_file/keep_custom_tracks": false, +"slice_124/save_to_file/path": "", +"slice_124/start_frame": 0, +"slice_125/end_frame": 0, +"slice_125/loop_mode": 0, +"slice_125/name": "", +"slice_125/save_to_file/enabled": false, +"slice_125/save_to_file/keep_custom_tracks": false, +"slice_125/save_to_file/path": "", +"slice_125/start_frame": 0, +"slice_126/end_frame": 0, +"slice_126/loop_mode": 0, +"slice_126/name": "", +"slice_126/save_to_file/enabled": false, +"slice_126/save_to_file/keep_custom_tracks": false, +"slice_126/save_to_file/path": "", +"slice_126/start_frame": 0, +"slice_127/end_frame": 0, +"slice_127/loop_mode": 0, +"slice_127/name": "", +"slice_127/save_to_file/enabled": false, +"slice_127/save_to_file/keep_custom_tracks": false, +"slice_127/save_to_file/path": "", +"slice_127/start_frame": 0, +"slice_128/end_frame": 0, +"slice_128/loop_mode": 0, +"slice_128/name": "", +"slice_128/save_to_file/enabled": false, +"slice_128/save_to_file/keep_custom_tracks": false, +"slice_128/save_to_file/path": "", +"slice_128/start_frame": 0, +"slice_129/end_frame": 0, +"slice_129/loop_mode": 0, +"slice_129/name": "", +"slice_129/save_to_file/enabled": false, +"slice_129/save_to_file/keep_custom_tracks": false, +"slice_129/save_to_file/path": "", +"slice_129/start_frame": 0, +"slice_13/end_frame": 0, +"slice_13/loop_mode": 0, +"slice_13/name": "", +"slice_13/save_to_file/enabled": false, +"slice_13/save_to_file/keep_custom_tracks": false, +"slice_13/save_to_file/path": "", +"slice_13/start_frame": 0, +"slice_130/end_frame": 0, +"slice_130/loop_mode": 0, +"slice_130/name": "", +"slice_130/save_to_file/enabled": false, +"slice_130/save_to_file/keep_custom_tracks": false, +"slice_130/save_to_file/path": "", +"slice_130/start_frame": 0, +"slice_131/end_frame": 0, +"slice_131/loop_mode": 0, +"slice_131/name": "", +"slice_131/save_to_file/enabled": false, +"slice_131/save_to_file/keep_custom_tracks": false, +"slice_131/save_to_file/path": "", +"slice_131/start_frame": 0, +"slice_132/end_frame": 0, +"slice_132/loop_mode": 0, +"slice_132/name": "", +"slice_132/save_to_file/enabled": false, +"slice_132/save_to_file/keep_custom_tracks": false, +"slice_132/save_to_file/path": "", +"slice_132/start_frame": 0, +"slice_133/end_frame": 0, +"slice_133/loop_mode": 0, +"slice_133/name": "", +"slice_133/save_to_file/enabled": false, +"slice_133/save_to_file/keep_custom_tracks": false, +"slice_133/save_to_file/path": "", +"slice_133/start_frame": 0, +"slice_134/end_frame": 0, +"slice_134/loop_mode": 0, +"slice_134/name": "", +"slice_134/save_to_file/enabled": false, +"slice_134/save_to_file/keep_custom_tracks": false, +"slice_134/save_to_file/path": "", +"slice_134/start_frame": 0, +"slice_135/end_frame": 0, +"slice_135/loop_mode": 0, +"slice_135/name": "", +"slice_135/save_to_file/enabled": false, +"slice_135/save_to_file/keep_custom_tracks": false, +"slice_135/save_to_file/path": "", +"slice_135/start_frame": 0, +"slice_136/end_frame": 0, +"slice_136/loop_mode": 0, +"slice_136/name": "", +"slice_136/save_to_file/enabled": false, +"slice_136/save_to_file/keep_custom_tracks": false, +"slice_136/save_to_file/path": "", +"slice_136/start_frame": 0, +"slice_137/end_frame": 0, +"slice_137/loop_mode": 0, +"slice_137/name": "", +"slice_137/save_to_file/enabled": false, +"slice_137/save_to_file/keep_custom_tracks": false, +"slice_137/save_to_file/path": "", +"slice_137/start_frame": 0, +"slice_138/end_frame": 0, +"slice_138/loop_mode": 0, +"slice_138/name": "", +"slice_138/save_to_file/enabled": false, +"slice_138/save_to_file/keep_custom_tracks": false, +"slice_138/save_to_file/path": "", +"slice_138/start_frame": 0, +"slice_139/end_frame": 0, +"slice_139/loop_mode": 0, +"slice_139/name": "", +"slice_139/save_to_file/enabled": false, +"slice_139/save_to_file/keep_custom_tracks": false, +"slice_139/save_to_file/path": "", +"slice_139/start_frame": 0, +"slice_14/end_frame": 0, +"slice_14/loop_mode": 0, +"slice_14/name": "", +"slice_14/save_to_file/enabled": false, +"slice_14/save_to_file/keep_custom_tracks": false, +"slice_14/save_to_file/path": "", +"slice_14/start_frame": 0, +"slice_140/end_frame": 0, +"slice_140/loop_mode": 0, +"slice_140/name": "", +"slice_140/save_to_file/enabled": false, +"slice_140/save_to_file/keep_custom_tracks": false, +"slice_140/save_to_file/path": "", +"slice_140/start_frame": 0, +"slice_141/end_frame": 0, +"slice_141/loop_mode": 0, +"slice_141/name": "", +"slice_141/save_to_file/enabled": false, +"slice_141/save_to_file/keep_custom_tracks": false, +"slice_141/save_to_file/path": "", +"slice_141/start_frame": 0, +"slice_142/end_frame": 0, +"slice_142/loop_mode": 0, +"slice_142/name": "", +"slice_142/save_to_file/enabled": false, +"slice_142/save_to_file/keep_custom_tracks": false, +"slice_142/save_to_file/path": "", +"slice_142/start_frame": 0, +"slice_143/end_frame": 0, +"slice_143/loop_mode": 0, +"slice_143/name": "", +"slice_143/save_to_file/enabled": false, +"slice_143/save_to_file/keep_custom_tracks": false, +"slice_143/save_to_file/path": "", +"slice_143/start_frame": 0, +"slice_144/end_frame": 0, +"slice_144/loop_mode": 0, +"slice_144/name": "", +"slice_144/save_to_file/enabled": false, +"slice_144/save_to_file/keep_custom_tracks": false, +"slice_144/save_to_file/path": "", +"slice_144/start_frame": 0, +"slice_145/end_frame": 0, +"slice_145/loop_mode": 0, +"slice_145/name": "", +"slice_145/save_to_file/enabled": false, +"slice_145/save_to_file/keep_custom_tracks": false, +"slice_145/save_to_file/path": "", +"slice_145/start_frame": 0, +"slice_146/end_frame": 0, +"slice_146/loop_mode": 0, +"slice_146/name": "", +"slice_146/save_to_file/enabled": false, +"slice_146/save_to_file/keep_custom_tracks": false, +"slice_146/save_to_file/path": "", +"slice_146/start_frame": 0, +"slice_147/end_frame": 0, +"slice_147/loop_mode": 0, +"slice_147/name": "", +"slice_147/save_to_file/enabled": false, +"slice_147/save_to_file/keep_custom_tracks": false, +"slice_147/save_to_file/path": "", +"slice_147/start_frame": 0, +"slice_148/end_frame": 0, +"slice_148/loop_mode": 0, +"slice_148/name": "", +"slice_148/save_to_file/enabled": false, +"slice_148/save_to_file/keep_custom_tracks": false, +"slice_148/save_to_file/path": "", +"slice_148/start_frame": 0, +"slice_149/end_frame": 0, +"slice_149/loop_mode": 0, +"slice_149/name": "", +"slice_149/save_to_file/enabled": false, +"slice_149/save_to_file/keep_custom_tracks": false, +"slice_149/save_to_file/path": "", +"slice_149/start_frame": 0, +"slice_15/end_frame": 0, +"slice_15/loop_mode": 0, +"slice_15/name": "", +"slice_15/save_to_file/enabled": false, +"slice_15/save_to_file/keep_custom_tracks": false, +"slice_15/save_to_file/path": "", +"slice_15/start_frame": 0, +"slice_150/end_frame": 0, +"slice_150/loop_mode": 0, +"slice_150/name": "", +"slice_150/save_to_file/enabled": false, +"slice_150/save_to_file/keep_custom_tracks": false, +"slice_150/save_to_file/path": "", +"slice_150/start_frame": 0, +"slice_151/end_frame": 0, +"slice_151/loop_mode": 0, +"slice_151/name": "", +"slice_151/save_to_file/enabled": false, +"slice_151/save_to_file/keep_custom_tracks": false, +"slice_151/save_to_file/path": "", +"slice_151/start_frame": 0, +"slice_152/end_frame": 0, +"slice_152/loop_mode": 0, +"slice_152/name": "", +"slice_152/save_to_file/enabled": false, +"slice_152/save_to_file/keep_custom_tracks": false, +"slice_152/save_to_file/path": "", +"slice_152/start_frame": 0, +"slice_153/end_frame": 0, +"slice_153/loop_mode": 0, +"slice_153/name": "", +"slice_153/save_to_file/enabled": false, +"slice_153/save_to_file/keep_custom_tracks": false, +"slice_153/save_to_file/path": "", +"slice_153/start_frame": 0, +"slice_154/end_frame": 0, +"slice_154/loop_mode": 0, +"slice_154/name": "", +"slice_154/save_to_file/enabled": false, +"slice_154/save_to_file/keep_custom_tracks": false, +"slice_154/save_to_file/path": "", +"slice_154/start_frame": 0, +"slice_155/end_frame": 0, +"slice_155/loop_mode": 0, +"slice_155/name": "", +"slice_155/save_to_file/enabled": false, +"slice_155/save_to_file/keep_custom_tracks": false, +"slice_155/save_to_file/path": "", +"slice_155/start_frame": 0, +"slice_156/end_frame": 0, +"slice_156/loop_mode": 0, +"slice_156/name": "", +"slice_156/save_to_file/enabled": false, +"slice_156/save_to_file/keep_custom_tracks": false, +"slice_156/save_to_file/path": "", +"slice_156/start_frame": 0, +"slice_157/end_frame": 0, +"slice_157/loop_mode": 0, +"slice_157/name": "", +"slice_157/save_to_file/enabled": false, +"slice_157/save_to_file/keep_custom_tracks": false, +"slice_157/save_to_file/path": "", +"slice_157/start_frame": 0, +"slice_158/end_frame": 0, +"slice_158/loop_mode": 0, +"slice_158/name": "", +"slice_158/save_to_file/enabled": false, +"slice_158/save_to_file/keep_custom_tracks": false, +"slice_158/save_to_file/path": "", +"slice_158/start_frame": 0, +"slice_159/end_frame": 0, +"slice_159/loop_mode": 0, +"slice_159/name": "", +"slice_159/save_to_file/enabled": false, +"slice_159/save_to_file/keep_custom_tracks": false, +"slice_159/save_to_file/path": "", +"slice_159/start_frame": 0, +"slice_16/end_frame": 0, +"slice_16/loop_mode": 0, +"slice_16/name": "", +"slice_16/save_to_file/enabled": false, +"slice_16/save_to_file/keep_custom_tracks": false, +"slice_16/save_to_file/path": "", +"slice_16/start_frame": 0, +"slice_160/end_frame": 0, +"slice_160/loop_mode": 0, +"slice_160/name": "", +"slice_160/save_to_file/enabled": false, +"slice_160/save_to_file/keep_custom_tracks": false, +"slice_160/save_to_file/path": "", +"slice_160/start_frame": 0, +"slice_161/end_frame": 0, +"slice_161/loop_mode": 0, +"slice_161/name": "", +"slice_161/save_to_file/enabled": false, +"slice_161/save_to_file/keep_custom_tracks": false, +"slice_161/save_to_file/path": "", +"slice_161/start_frame": 0, +"slice_162/end_frame": 0, +"slice_162/loop_mode": 0, +"slice_162/name": "", +"slice_162/save_to_file/enabled": false, +"slice_162/save_to_file/keep_custom_tracks": false, +"slice_162/save_to_file/path": "", +"slice_162/start_frame": 0, +"slice_163/end_frame": 0, +"slice_163/loop_mode": 0, +"slice_163/name": "", +"slice_163/save_to_file/enabled": false, +"slice_163/save_to_file/keep_custom_tracks": false, +"slice_163/save_to_file/path": "", +"slice_163/start_frame": 0, +"slice_164/end_frame": 0, +"slice_164/loop_mode": 0, +"slice_164/name": "", +"slice_164/save_to_file/enabled": false, +"slice_164/save_to_file/keep_custom_tracks": false, +"slice_164/save_to_file/path": "", +"slice_164/start_frame": 0, +"slice_165/end_frame": 0, +"slice_165/loop_mode": 0, +"slice_165/name": "", +"slice_165/save_to_file/enabled": false, +"slice_165/save_to_file/keep_custom_tracks": false, +"slice_165/save_to_file/path": "", +"slice_165/start_frame": 0, +"slice_166/end_frame": 0, +"slice_166/loop_mode": 0, +"slice_166/name": "", +"slice_166/save_to_file/enabled": false, +"slice_166/save_to_file/keep_custom_tracks": false, +"slice_166/save_to_file/path": "", +"slice_166/start_frame": 0, +"slice_167/end_frame": 0, +"slice_167/loop_mode": 0, +"slice_167/name": "", +"slice_167/save_to_file/enabled": false, +"slice_167/save_to_file/keep_custom_tracks": false, +"slice_167/save_to_file/path": "", +"slice_167/start_frame": 0, +"slice_168/end_frame": 0, +"slice_168/loop_mode": 0, +"slice_168/name": "", +"slice_168/save_to_file/enabled": false, +"slice_168/save_to_file/keep_custom_tracks": false, +"slice_168/save_to_file/path": "", +"slice_168/start_frame": 0, +"slice_169/end_frame": 0, +"slice_169/loop_mode": 0, +"slice_169/name": "", +"slice_169/save_to_file/enabled": false, +"slice_169/save_to_file/keep_custom_tracks": false, +"slice_169/save_to_file/path": "", +"slice_169/start_frame": 0, +"slice_17/end_frame": 0, +"slice_17/loop_mode": 0, +"slice_17/name": "", +"slice_17/save_to_file/enabled": false, +"slice_17/save_to_file/keep_custom_tracks": false, +"slice_17/save_to_file/path": "", +"slice_17/start_frame": 0, +"slice_170/end_frame": 0, +"slice_170/loop_mode": 0, +"slice_170/name": "", +"slice_170/save_to_file/enabled": false, +"slice_170/save_to_file/keep_custom_tracks": false, +"slice_170/save_to_file/path": "", +"slice_170/start_frame": 0, +"slice_171/end_frame": 0, +"slice_171/loop_mode": 0, +"slice_171/name": "", +"slice_171/save_to_file/enabled": false, +"slice_171/save_to_file/keep_custom_tracks": false, +"slice_171/save_to_file/path": "", +"slice_171/start_frame": 0, +"slice_172/end_frame": 0, +"slice_172/loop_mode": 0, +"slice_172/name": "", +"slice_172/save_to_file/enabled": false, +"slice_172/save_to_file/keep_custom_tracks": false, +"slice_172/save_to_file/path": "", +"slice_172/start_frame": 0, +"slice_173/end_frame": 0, +"slice_173/loop_mode": 0, +"slice_173/name": "", +"slice_173/save_to_file/enabled": false, +"slice_173/save_to_file/keep_custom_tracks": false, +"slice_173/save_to_file/path": "", +"slice_173/start_frame": 0, +"slice_174/end_frame": 0, +"slice_174/loop_mode": 0, +"slice_174/name": "", +"slice_174/save_to_file/enabled": false, +"slice_174/save_to_file/keep_custom_tracks": false, +"slice_174/save_to_file/path": "", +"slice_174/start_frame": 0, +"slice_175/end_frame": 0, +"slice_175/loop_mode": 0, +"slice_175/name": "", +"slice_175/save_to_file/enabled": false, +"slice_175/save_to_file/keep_custom_tracks": false, +"slice_175/save_to_file/path": "", +"slice_175/start_frame": 0, +"slice_176/end_frame": 0, +"slice_176/loop_mode": 0, +"slice_176/name": "", +"slice_176/save_to_file/enabled": false, +"slice_176/save_to_file/keep_custom_tracks": false, +"slice_176/save_to_file/path": "", +"slice_176/start_frame": 0, +"slice_177/end_frame": 0, +"slice_177/loop_mode": 0, +"slice_177/name": "", +"slice_177/save_to_file/enabled": false, +"slice_177/save_to_file/keep_custom_tracks": false, +"slice_177/save_to_file/path": "", +"slice_177/start_frame": 0, +"slice_178/end_frame": 0, +"slice_178/loop_mode": 0, +"slice_178/name": "", +"slice_178/save_to_file/enabled": false, +"slice_178/save_to_file/keep_custom_tracks": false, +"slice_178/save_to_file/path": "", +"slice_178/start_frame": 0, +"slice_179/end_frame": 0, +"slice_179/loop_mode": 0, +"slice_179/name": "", +"slice_179/save_to_file/enabled": false, +"slice_179/save_to_file/keep_custom_tracks": false, +"slice_179/save_to_file/path": "", +"slice_179/start_frame": 0, +"slice_18/end_frame": 0, +"slice_18/loop_mode": 0, +"slice_18/name": "", +"slice_18/save_to_file/enabled": false, +"slice_18/save_to_file/keep_custom_tracks": false, +"slice_18/save_to_file/path": "", +"slice_18/start_frame": 0, +"slice_180/end_frame": 0, +"slice_180/loop_mode": 0, +"slice_180/name": "", +"slice_180/save_to_file/enabled": false, +"slice_180/save_to_file/keep_custom_tracks": false, +"slice_180/save_to_file/path": "", +"slice_180/start_frame": 0, +"slice_181/end_frame": 0, +"slice_181/loop_mode": 0, +"slice_181/name": "", +"slice_181/save_to_file/enabled": false, +"slice_181/save_to_file/keep_custom_tracks": false, +"slice_181/save_to_file/path": "", +"slice_181/start_frame": 0, +"slice_182/end_frame": 0, +"slice_182/loop_mode": 0, +"slice_182/name": "", +"slice_182/save_to_file/enabled": false, +"slice_182/save_to_file/keep_custom_tracks": false, +"slice_182/save_to_file/path": "", +"slice_182/start_frame": 0, +"slice_183/end_frame": 0, +"slice_183/loop_mode": 0, +"slice_183/name": "", +"slice_183/save_to_file/enabled": false, +"slice_183/save_to_file/keep_custom_tracks": false, +"slice_183/save_to_file/path": "", +"slice_183/start_frame": 0, +"slice_184/end_frame": 0, +"slice_184/loop_mode": 0, +"slice_184/name": "", +"slice_184/save_to_file/enabled": false, +"slice_184/save_to_file/keep_custom_tracks": false, +"slice_184/save_to_file/path": "", +"slice_184/start_frame": 0, +"slice_185/end_frame": 0, +"slice_185/loop_mode": 0, +"slice_185/name": "", +"slice_185/save_to_file/enabled": false, +"slice_185/save_to_file/keep_custom_tracks": false, +"slice_185/save_to_file/path": "", +"slice_185/start_frame": 0, +"slice_186/end_frame": 0, +"slice_186/loop_mode": 0, +"slice_186/name": "", +"slice_186/save_to_file/enabled": false, +"slice_186/save_to_file/keep_custom_tracks": false, +"slice_186/save_to_file/path": "", +"slice_186/start_frame": 0, +"slice_187/end_frame": 0, +"slice_187/loop_mode": 0, +"slice_187/name": "", +"slice_187/save_to_file/enabled": false, +"slice_187/save_to_file/keep_custom_tracks": false, +"slice_187/save_to_file/path": "", +"slice_187/start_frame": 0, +"slice_188/end_frame": 0, +"slice_188/loop_mode": 0, +"slice_188/name": "", +"slice_188/save_to_file/enabled": false, +"slice_188/save_to_file/keep_custom_tracks": false, +"slice_188/save_to_file/path": "", +"slice_188/start_frame": 0, +"slice_189/end_frame": 0, +"slice_189/loop_mode": 0, +"slice_189/name": "", +"slice_189/save_to_file/enabled": false, +"slice_189/save_to_file/keep_custom_tracks": false, +"slice_189/save_to_file/path": "", +"slice_189/start_frame": 0, +"slice_19/end_frame": 0, +"slice_19/loop_mode": 0, +"slice_19/name": "", +"slice_19/save_to_file/enabled": false, +"slice_19/save_to_file/keep_custom_tracks": false, +"slice_19/save_to_file/path": "", +"slice_19/start_frame": 0, +"slice_190/end_frame": 0, +"slice_190/loop_mode": 0, +"slice_190/name": "", +"slice_190/save_to_file/enabled": false, +"slice_190/save_to_file/keep_custom_tracks": false, +"slice_190/save_to_file/path": "", +"slice_190/start_frame": 0, +"slice_191/end_frame": 0, +"slice_191/loop_mode": 0, +"slice_191/name": "", +"slice_191/save_to_file/enabled": false, +"slice_191/save_to_file/keep_custom_tracks": false, +"slice_191/save_to_file/path": "", +"slice_191/start_frame": 0, +"slice_192/end_frame": 0, +"slice_192/loop_mode": 0, +"slice_192/name": "", +"slice_192/save_to_file/enabled": false, +"slice_192/save_to_file/keep_custom_tracks": false, +"slice_192/save_to_file/path": "", +"slice_192/start_frame": 0, +"slice_193/end_frame": 0, +"slice_193/loop_mode": 0, +"slice_193/name": "", +"slice_193/save_to_file/enabled": false, +"slice_193/save_to_file/keep_custom_tracks": false, +"slice_193/save_to_file/path": "", +"slice_193/start_frame": 0, +"slice_194/end_frame": 0, +"slice_194/loop_mode": 0, +"slice_194/name": "", +"slice_194/save_to_file/enabled": false, +"slice_194/save_to_file/keep_custom_tracks": false, +"slice_194/save_to_file/path": "", +"slice_194/start_frame": 0, +"slice_195/end_frame": 0, +"slice_195/loop_mode": 0, +"slice_195/name": "", +"slice_195/save_to_file/enabled": false, +"slice_195/save_to_file/keep_custom_tracks": false, +"slice_195/save_to_file/path": "", +"slice_195/start_frame": 0, +"slice_196/end_frame": 0, +"slice_196/loop_mode": 0, +"slice_196/name": "", +"slice_196/save_to_file/enabled": false, +"slice_196/save_to_file/keep_custom_tracks": false, +"slice_196/save_to_file/path": "", +"slice_196/start_frame": 0, +"slice_197/end_frame": 0, +"slice_197/loop_mode": 0, +"slice_197/name": "", +"slice_197/save_to_file/enabled": false, +"slice_197/save_to_file/keep_custom_tracks": false, +"slice_197/save_to_file/path": "", +"slice_197/start_frame": 0, +"slice_198/end_frame": 0, +"slice_198/loop_mode": 0, +"slice_198/name": "", +"slice_198/save_to_file/enabled": false, +"slice_198/save_to_file/keep_custom_tracks": false, +"slice_198/save_to_file/path": "", +"slice_198/start_frame": 0, +"slice_199/end_frame": 0, +"slice_199/loop_mode": 0, +"slice_199/name": "", +"slice_199/save_to_file/enabled": false, +"slice_199/save_to_file/keep_custom_tracks": false, +"slice_199/save_to_file/path": "", +"slice_199/start_frame": 0, +"slice_2/end_frame": 0, +"slice_2/loop_mode": 0, +"slice_2/name": "", +"slice_2/save_to_file/enabled": false, +"slice_2/save_to_file/keep_custom_tracks": false, +"slice_2/save_to_file/path": "", +"slice_2/start_frame": 0, +"slice_20/end_frame": 0, +"slice_20/loop_mode": 0, +"slice_20/name": "", +"slice_20/save_to_file/enabled": false, +"slice_20/save_to_file/keep_custom_tracks": false, +"slice_20/save_to_file/path": "", +"slice_20/start_frame": 0, +"slice_200/end_frame": 0, +"slice_200/loop_mode": 0, +"slice_200/name": "", +"slice_200/save_to_file/enabled": false, +"slice_200/save_to_file/keep_custom_tracks": false, +"slice_200/save_to_file/path": "", +"slice_200/start_frame": 0, +"slice_201/end_frame": 0, +"slice_201/loop_mode": 0, +"slice_201/name": "", +"slice_201/save_to_file/enabled": false, +"slice_201/save_to_file/keep_custom_tracks": false, +"slice_201/save_to_file/path": "", +"slice_201/start_frame": 0, +"slice_202/end_frame": 0, +"slice_202/loop_mode": 0, +"slice_202/name": "", +"slice_202/save_to_file/enabled": false, +"slice_202/save_to_file/keep_custom_tracks": false, +"slice_202/save_to_file/path": "", +"slice_202/start_frame": 0, +"slice_203/end_frame": 0, +"slice_203/loop_mode": 0, +"slice_203/name": "", +"slice_203/save_to_file/enabled": false, +"slice_203/save_to_file/keep_custom_tracks": false, +"slice_203/save_to_file/path": "", +"slice_203/start_frame": 0, +"slice_204/end_frame": 0, +"slice_204/loop_mode": 0, +"slice_204/name": "", +"slice_204/save_to_file/enabled": false, +"slice_204/save_to_file/keep_custom_tracks": false, +"slice_204/save_to_file/path": "", +"slice_204/start_frame": 0, +"slice_205/end_frame": 0, +"slice_205/loop_mode": 0, +"slice_205/name": "", +"slice_205/save_to_file/enabled": false, +"slice_205/save_to_file/keep_custom_tracks": false, +"slice_205/save_to_file/path": "", +"slice_205/start_frame": 0, +"slice_206/end_frame": 0, +"slice_206/loop_mode": 0, +"slice_206/name": "", +"slice_206/save_to_file/enabled": false, +"slice_206/save_to_file/keep_custom_tracks": false, +"slice_206/save_to_file/path": "", +"slice_206/start_frame": 0, +"slice_207/end_frame": 0, +"slice_207/loop_mode": 0, +"slice_207/name": "", +"slice_207/save_to_file/enabled": false, +"slice_207/save_to_file/keep_custom_tracks": false, +"slice_207/save_to_file/path": "", +"slice_207/start_frame": 0, +"slice_208/end_frame": 0, +"slice_208/loop_mode": 0, +"slice_208/name": "", +"slice_208/save_to_file/enabled": false, +"slice_208/save_to_file/keep_custom_tracks": false, +"slice_208/save_to_file/path": "", +"slice_208/start_frame": 0, +"slice_209/end_frame": 0, +"slice_209/loop_mode": 0, +"slice_209/name": "", +"slice_209/save_to_file/enabled": false, +"slice_209/save_to_file/keep_custom_tracks": false, +"slice_209/save_to_file/path": "", +"slice_209/start_frame": 0, +"slice_21/end_frame": 0, +"slice_21/loop_mode": 0, +"slice_21/name": "", +"slice_21/save_to_file/enabled": false, +"slice_21/save_to_file/keep_custom_tracks": false, +"slice_21/save_to_file/path": "", +"slice_21/start_frame": 0, +"slice_210/end_frame": 0, +"slice_210/loop_mode": 0, +"slice_210/name": "", +"slice_210/save_to_file/enabled": false, +"slice_210/save_to_file/keep_custom_tracks": false, +"slice_210/save_to_file/path": "", +"slice_210/start_frame": 0, +"slice_211/end_frame": 0, +"slice_211/loop_mode": 0, +"slice_211/name": "", +"slice_211/save_to_file/enabled": false, +"slice_211/save_to_file/keep_custom_tracks": false, +"slice_211/save_to_file/path": "", +"slice_211/start_frame": 0, +"slice_212/end_frame": 0, +"slice_212/loop_mode": 0, +"slice_212/name": "", +"slice_212/save_to_file/enabled": false, +"slice_212/save_to_file/keep_custom_tracks": false, +"slice_212/save_to_file/path": "", +"slice_212/start_frame": 0, +"slice_213/end_frame": 0, +"slice_213/loop_mode": 0, +"slice_213/name": "", +"slice_213/save_to_file/enabled": false, +"slice_213/save_to_file/keep_custom_tracks": false, +"slice_213/save_to_file/path": "", +"slice_213/start_frame": 0, +"slice_214/end_frame": 0, +"slice_214/loop_mode": 0, +"slice_214/name": "", +"slice_214/save_to_file/enabled": false, +"slice_214/save_to_file/keep_custom_tracks": false, +"slice_214/save_to_file/path": "", +"slice_214/start_frame": 0, +"slice_215/end_frame": 0, +"slice_215/loop_mode": 0, +"slice_215/name": "", +"slice_215/save_to_file/enabled": false, +"slice_215/save_to_file/keep_custom_tracks": false, +"slice_215/save_to_file/path": "", +"slice_215/start_frame": 0, +"slice_216/end_frame": 0, +"slice_216/loop_mode": 0, +"slice_216/name": "", +"slice_216/save_to_file/enabled": false, +"slice_216/save_to_file/keep_custom_tracks": false, +"slice_216/save_to_file/path": "", +"slice_216/start_frame": 0, +"slice_217/end_frame": 0, +"slice_217/loop_mode": 0, +"slice_217/name": "", +"slice_217/save_to_file/enabled": false, +"slice_217/save_to_file/keep_custom_tracks": false, +"slice_217/save_to_file/path": "", +"slice_217/start_frame": 0, +"slice_218/end_frame": 0, +"slice_218/loop_mode": 0, +"slice_218/name": "", +"slice_218/save_to_file/enabled": false, +"slice_218/save_to_file/keep_custom_tracks": false, +"slice_218/save_to_file/path": "", +"slice_218/start_frame": 0, +"slice_219/end_frame": 0, +"slice_219/loop_mode": 0, +"slice_219/name": "", +"slice_219/save_to_file/enabled": false, +"slice_219/save_to_file/keep_custom_tracks": false, +"slice_219/save_to_file/path": "", +"slice_219/start_frame": 0, +"slice_22/end_frame": 0, +"slice_22/loop_mode": 0, +"slice_22/name": "", +"slice_22/save_to_file/enabled": false, +"slice_22/save_to_file/keep_custom_tracks": false, +"slice_22/save_to_file/path": "", +"slice_22/start_frame": 0, +"slice_220/end_frame": 0, +"slice_220/loop_mode": 0, +"slice_220/name": "", +"slice_220/save_to_file/enabled": false, +"slice_220/save_to_file/keep_custom_tracks": false, +"slice_220/save_to_file/path": "", +"slice_220/start_frame": 0, +"slice_221/end_frame": 0, +"slice_221/loop_mode": 0, +"slice_221/name": "", +"slice_221/save_to_file/enabled": false, +"slice_221/save_to_file/keep_custom_tracks": false, +"slice_221/save_to_file/path": "", +"slice_221/start_frame": 0, +"slice_222/end_frame": 0, +"slice_222/loop_mode": 0, +"slice_222/name": "", +"slice_222/save_to_file/enabled": false, +"slice_222/save_to_file/keep_custom_tracks": false, +"slice_222/save_to_file/path": "", +"slice_222/start_frame": 0, +"slice_223/end_frame": 0, +"slice_223/loop_mode": 0, +"slice_223/name": "", +"slice_223/save_to_file/enabled": false, +"slice_223/save_to_file/keep_custom_tracks": false, +"slice_223/save_to_file/path": "", +"slice_223/start_frame": 0, +"slice_224/end_frame": 0, +"slice_224/loop_mode": 0, +"slice_224/name": "", +"slice_224/save_to_file/enabled": false, +"slice_224/save_to_file/keep_custom_tracks": false, +"slice_224/save_to_file/path": "", +"slice_224/start_frame": 0, +"slice_225/end_frame": 0, +"slice_225/loop_mode": 0, +"slice_225/name": "", +"slice_225/save_to_file/enabled": false, +"slice_225/save_to_file/keep_custom_tracks": false, +"slice_225/save_to_file/path": "", +"slice_225/start_frame": 0, +"slice_226/end_frame": 0, +"slice_226/loop_mode": 0, +"slice_226/name": "", +"slice_226/save_to_file/enabled": false, +"slice_226/save_to_file/keep_custom_tracks": false, +"slice_226/save_to_file/path": "", +"slice_226/start_frame": 0, +"slice_227/end_frame": 0, +"slice_227/loop_mode": 0, +"slice_227/name": "", +"slice_227/save_to_file/enabled": false, +"slice_227/save_to_file/keep_custom_tracks": false, +"slice_227/save_to_file/path": "", +"slice_227/start_frame": 0, +"slice_228/end_frame": 0, +"slice_228/loop_mode": 0, +"slice_228/name": "", +"slice_228/save_to_file/enabled": false, +"slice_228/save_to_file/keep_custom_tracks": false, +"slice_228/save_to_file/path": "", +"slice_228/start_frame": 0, +"slice_229/end_frame": 0, +"slice_229/loop_mode": 0, +"slice_229/name": "", +"slice_229/save_to_file/enabled": false, +"slice_229/save_to_file/keep_custom_tracks": false, +"slice_229/save_to_file/path": "", +"slice_229/start_frame": 0, +"slice_23/end_frame": 0, +"slice_23/loop_mode": 0, +"slice_23/name": "", +"slice_23/save_to_file/enabled": false, +"slice_23/save_to_file/keep_custom_tracks": false, +"slice_23/save_to_file/path": "", +"slice_23/start_frame": 0, +"slice_230/end_frame": 0, +"slice_230/loop_mode": 0, +"slice_230/name": "", +"slice_230/save_to_file/enabled": false, +"slice_230/save_to_file/keep_custom_tracks": false, +"slice_230/save_to_file/path": "", +"slice_230/start_frame": 0, +"slice_231/end_frame": 0, +"slice_231/loop_mode": 0, +"slice_231/name": "", +"slice_231/save_to_file/enabled": false, +"slice_231/save_to_file/keep_custom_tracks": false, +"slice_231/save_to_file/path": "", +"slice_231/start_frame": 0, +"slice_232/end_frame": 0, +"slice_232/loop_mode": 0, +"slice_232/name": "", +"slice_232/save_to_file/enabled": false, +"slice_232/save_to_file/keep_custom_tracks": false, +"slice_232/save_to_file/path": "", +"slice_232/start_frame": 0, +"slice_233/end_frame": 0, +"slice_233/loop_mode": 0, +"slice_233/name": "", +"slice_233/save_to_file/enabled": false, +"slice_233/save_to_file/keep_custom_tracks": false, +"slice_233/save_to_file/path": "", +"slice_233/start_frame": 0, +"slice_234/end_frame": 0, +"slice_234/loop_mode": 0, +"slice_234/name": "", +"slice_234/save_to_file/enabled": false, +"slice_234/save_to_file/keep_custom_tracks": false, +"slice_234/save_to_file/path": "", +"slice_234/start_frame": 0, +"slice_235/end_frame": 0, +"slice_235/loop_mode": 0, +"slice_235/name": "", +"slice_235/save_to_file/enabled": false, +"slice_235/save_to_file/keep_custom_tracks": false, +"slice_235/save_to_file/path": "", +"slice_235/start_frame": 0, +"slice_236/end_frame": 0, +"slice_236/loop_mode": 0, +"slice_236/name": "", +"slice_236/save_to_file/enabled": false, +"slice_236/save_to_file/keep_custom_tracks": false, +"slice_236/save_to_file/path": "", +"slice_236/start_frame": 0, +"slice_237/end_frame": 0, +"slice_237/loop_mode": 0, +"slice_237/name": "", +"slice_237/save_to_file/enabled": false, +"slice_237/save_to_file/keep_custom_tracks": false, +"slice_237/save_to_file/path": "", +"slice_237/start_frame": 0, +"slice_238/end_frame": 0, +"slice_238/loop_mode": 0, +"slice_238/name": "", +"slice_238/save_to_file/enabled": false, +"slice_238/save_to_file/keep_custom_tracks": false, +"slice_238/save_to_file/path": "", +"slice_238/start_frame": 0, +"slice_239/end_frame": 0, +"slice_239/loop_mode": 0, +"slice_239/name": "", +"slice_239/save_to_file/enabled": false, +"slice_239/save_to_file/keep_custom_tracks": false, +"slice_239/save_to_file/path": "", +"slice_239/start_frame": 0, +"slice_24/end_frame": 0, +"slice_24/loop_mode": 0, +"slice_24/name": "", +"slice_24/save_to_file/enabled": false, +"slice_24/save_to_file/keep_custom_tracks": false, +"slice_24/save_to_file/path": "", +"slice_24/start_frame": 0, +"slice_240/end_frame": 0, +"slice_240/loop_mode": 0, +"slice_240/name": "", +"slice_240/save_to_file/enabled": false, +"slice_240/save_to_file/keep_custom_tracks": false, +"slice_240/save_to_file/path": "", +"slice_240/start_frame": 0, +"slice_241/end_frame": 0, +"slice_241/loop_mode": 0, +"slice_241/name": "", +"slice_241/save_to_file/enabled": false, +"slice_241/save_to_file/keep_custom_tracks": false, +"slice_241/save_to_file/path": "", +"slice_241/start_frame": 0, +"slice_242/end_frame": 0, +"slice_242/loop_mode": 0, +"slice_242/name": "", +"slice_242/save_to_file/enabled": false, +"slice_242/save_to_file/keep_custom_tracks": false, +"slice_242/save_to_file/path": "", +"slice_242/start_frame": 0, +"slice_243/end_frame": 0, +"slice_243/loop_mode": 0, +"slice_243/name": "", +"slice_243/save_to_file/enabled": false, +"slice_243/save_to_file/keep_custom_tracks": false, +"slice_243/save_to_file/path": "", +"slice_243/start_frame": 0, +"slice_244/end_frame": 0, +"slice_244/loop_mode": 0, +"slice_244/name": "", +"slice_244/save_to_file/enabled": false, +"slice_244/save_to_file/keep_custom_tracks": false, +"slice_244/save_to_file/path": "", +"slice_244/start_frame": 0, +"slice_245/end_frame": 0, +"slice_245/loop_mode": 0, +"slice_245/name": "", +"slice_245/save_to_file/enabled": false, +"slice_245/save_to_file/keep_custom_tracks": false, +"slice_245/save_to_file/path": "", +"slice_245/start_frame": 0, +"slice_246/end_frame": 0, +"slice_246/loop_mode": 0, +"slice_246/name": "", +"slice_246/save_to_file/enabled": false, +"slice_246/save_to_file/keep_custom_tracks": false, +"slice_246/save_to_file/path": "", +"slice_246/start_frame": 0, +"slice_247/end_frame": 0, +"slice_247/loop_mode": 0, +"slice_247/name": "", +"slice_247/save_to_file/enabled": false, +"slice_247/save_to_file/keep_custom_tracks": false, +"slice_247/save_to_file/path": "", +"slice_247/start_frame": 0, +"slice_248/end_frame": 0, +"slice_248/loop_mode": 0, +"slice_248/name": "", +"slice_248/save_to_file/enabled": false, +"slice_248/save_to_file/keep_custom_tracks": false, +"slice_248/save_to_file/path": "", +"slice_248/start_frame": 0, +"slice_249/end_frame": 0, +"slice_249/loop_mode": 0, +"slice_249/name": "", +"slice_249/save_to_file/enabled": false, +"slice_249/save_to_file/keep_custom_tracks": false, +"slice_249/save_to_file/path": "", +"slice_249/start_frame": 0, +"slice_25/end_frame": 0, +"slice_25/loop_mode": 0, +"slice_25/name": "", +"slice_25/save_to_file/enabled": false, +"slice_25/save_to_file/keep_custom_tracks": false, +"slice_25/save_to_file/path": "", +"slice_25/start_frame": 0, +"slice_250/end_frame": 0, +"slice_250/loop_mode": 0, +"slice_250/name": "", +"slice_250/save_to_file/enabled": false, +"slice_250/save_to_file/keep_custom_tracks": false, +"slice_250/save_to_file/path": "", +"slice_250/start_frame": 0, +"slice_251/end_frame": 0, +"slice_251/loop_mode": 0, +"slice_251/name": "", +"slice_251/save_to_file/enabled": false, +"slice_251/save_to_file/keep_custom_tracks": false, +"slice_251/save_to_file/path": "", +"slice_251/start_frame": 0, +"slice_252/end_frame": 0, +"slice_252/loop_mode": 0, +"slice_252/name": "", +"slice_252/save_to_file/enabled": false, +"slice_252/save_to_file/keep_custom_tracks": false, +"slice_252/save_to_file/path": "", +"slice_252/start_frame": 0, +"slice_253/end_frame": 0, +"slice_253/loop_mode": 0, +"slice_253/name": "", +"slice_253/save_to_file/enabled": false, +"slice_253/save_to_file/keep_custom_tracks": false, +"slice_253/save_to_file/path": "", +"slice_253/start_frame": 0, +"slice_254/end_frame": 0, +"slice_254/loop_mode": 0, +"slice_254/name": "", +"slice_254/save_to_file/enabled": false, +"slice_254/save_to_file/keep_custom_tracks": false, +"slice_254/save_to_file/path": "", +"slice_254/start_frame": 0, +"slice_255/end_frame": 0, +"slice_255/loop_mode": 0, +"slice_255/name": "", +"slice_255/save_to_file/enabled": false, +"slice_255/save_to_file/keep_custom_tracks": false, +"slice_255/save_to_file/path": "", +"slice_255/start_frame": 0, +"slice_256/end_frame": 0, +"slice_256/loop_mode": 0, +"slice_256/name": "", +"slice_256/save_to_file/enabled": false, +"slice_256/save_to_file/keep_custom_tracks": false, +"slice_256/save_to_file/path": "", +"slice_256/start_frame": 0, +"slice_26/end_frame": 0, +"slice_26/loop_mode": 0, +"slice_26/name": "", +"slice_26/save_to_file/enabled": false, +"slice_26/save_to_file/keep_custom_tracks": false, +"slice_26/save_to_file/path": "", +"slice_26/start_frame": 0, +"slice_27/end_frame": 0, +"slice_27/loop_mode": 0, +"slice_27/name": "", +"slice_27/save_to_file/enabled": false, +"slice_27/save_to_file/keep_custom_tracks": false, +"slice_27/save_to_file/path": "", +"slice_27/start_frame": 0, +"slice_28/end_frame": 0, +"slice_28/loop_mode": 0, +"slice_28/name": "", +"slice_28/save_to_file/enabled": false, +"slice_28/save_to_file/keep_custom_tracks": false, +"slice_28/save_to_file/path": "", +"slice_28/start_frame": 0, +"slice_29/end_frame": 0, +"slice_29/loop_mode": 0, +"slice_29/name": "", +"slice_29/save_to_file/enabled": false, +"slice_29/save_to_file/keep_custom_tracks": false, +"slice_29/save_to_file/path": "", +"slice_29/start_frame": 0, +"slice_3/end_frame": 0, +"slice_3/loop_mode": 0, +"slice_3/name": "", +"slice_3/save_to_file/enabled": false, +"slice_3/save_to_file/keep_custom_tracks": false, +"slice_3/save_to_file/path": "", +"slice_3/start_frame": 0, +"slice_30/end_frame": 0, +"slice_30/loop_mode": 0, +"slice_30/name": "", +"slice_30/save_to_file/enabled": false, +"slice_30/save_to_file/keep_custom_tracks": false, +"slice_30/save_to_file/path": "", +"slice_30/start_frame": 0, +"slice_31/end_frame": 0, +"slice_31/loop_mode": 0, +"slice_31/name": "", +"slice_31/save_to_file/enabled": false, +"slice_31/save_to_file/keep_custom_tracks": false, +"slice_31/save_to_file/path": "", +"slice_31/start_frame": 0, +"slice_32/end_frame": 0, +"slice_32/loop_mode": 0, +"slice_32/name": "", +"slice_32/save_to_file/enabled": false, +"slice_32/save_to_file/keep_custom_tracks": false, +"slice_32/save_to_file/path": "", +"slice_32/start_frame": 0, +"slice_33/end_frame": 0, +"slice_33/loop_mode": 0, +"slice_33/name": "", +"slice_33/save_to_file/enabled": false, +"slice_33/save_to_file/keep_custom_tracks": false, +"slice_33/save_to_file/path": "", +"slice_33/start_frame": 0, +"slice_34/end_frame": 0, +"slice_34/loop_mode": 0, +"slice_34/name": "", +"slice_34/save_to_file/enabled": false, +"slice_34/save_to_file/keep_custom_tracks": false, +"slice_34/save_to_file/path": "", +"slice_34/start_frame": 0, +"slice_35/end_frame": 0, +"slice_35/loop_mode": 0, +"slice_35/name": "", +"slice_35/save_to_file/enabled": false, +"slice_35/save_to_file/keep_custom_tracks": false, +"slice_35/save_to_file/path": "", +"slice_35/start_frame": 0, +"slice_36/end_frame": 0, +"slice_36/loop_mode": 0, +"slice_36/name": "", +"slice_36/save_to_file/enabled": false, +"slice_36/save_to_file/keep_custom_tracks": false, +"slice_36/save_to_file/path": "", +"slice_36/start_frame": 0, +"slice_37/end_frame": 0, +"slice_37/loop_mode": 0, +"slice_37/name": "", +"slice_37/save_to_file/enabled": false, +"slice_37/save_to_file/keep_custom_tracks": false, +"slice_37/save_to_file/path": "", +"slice_37/start_frame": 0, +"slice_38/end_frame": 0, +"slice_38/loop_mode": 0, +"slice_38/name": "", +"slice_38/save_to_file/enabled": false, +"slice_38/save_to_file/keep_custom_tracks": false, +"slice_38/save_to_file/path": "", +"slice_38/start_frame": 0, +"slice_39/end_frame": 0, +"slice_39/loop_mode": 0, +"slice_39/name": "", +"slice_39/save_to_file/enabled": false, +"slice_39/save_to_file/keep_custom_tracks": false, +"slice_39/save_to_file/path": "", +"slice_39/start_frame": 0, +"slice_4/end_frame": 0, +"slice_4/loop_mode": 0, +"slice_4/name": "", +"slice_4/save_to_file/enabled": false, +"slice_4/save_to_file/keep_custom_tracks": false, +"slice_4/save_to_file/path": "", +"slice_4/start_frame": 0, +"slice_40/end_frame": 0, +"slice_40/loop_mode": 0, +"slice_40/name": "", +"slice_40/save_to_file/enabled": false, +"slice_40/save_to_file/keep_custom_tracks": false, +"slice_40/save_to_file/path": "", +"slice_40/start_frame": 0, +"slice_41/end_frame": 0, +"slice_41/loop_mode": 0, +"slice_41/name": "", +"slice_41/save_to_file/enabled": false, +"slice_41/save_to_file/keep_custom_tracks": false, +"slice_41/save_to_file/path": "", +"slice_41/start_frame": 0, +"slice_42/end_frame": 0, +"slice_42/loop_mode": 0, +"slice_42/name": "", +"slice_42/save_to_file/enabled": false, +"slice_42/save_to_file/keep_custom_tracks": false, +"slice_42/save_to_file/path": "", +"slice_42/start_frame": 0, +"slice_43/end_frame": 0, +"slice_43/loop_mode": 0, +"slice_43/name": "", +"slice_43/save_to_file/enabled": false, +"slice_43/save_to_file/keep_custom_tracks": false, +"slice_43/save_to_file/path": "", +"slice_43/start_frame": 0, +"slice_44/end_frame": 0, +"slice_44/loop_mode": 0, +"slice_44/name": "", +"slice_44/save_to_file/enabled": false, +"slice_44/save_to_file/keep_custom_tracks": false, +"slice_44/save_to_file/path": "", +"slice_44/start_frame": 0, +"slice_45/end_frame": 0, +"slice_45/loop_mode": 0, +"slice_45/name": "", +"slice_45/save_to_file/enabled": false, +"slice_45/save_to_file/keep_custom_tracks": false, +"slice_45/save_to_file/path": "", +"slice_45/start_frame": 0, +"slice_46/end_frame": 0, +"slice_46/loop_mode": 0, +"slice_46/name": "", +"slice_46/save_to_file/enabled": false, +"slice_46/save_to_file/keep_custom_tracks": false, +"slice_46/save_to_file/path": "", +"slice_46/start_frame": 0, +"slice_47/end_frame": 0, +"slice_47/loop_mode": 0, +"slice_47/name": "", +"slice_47/save_to_file/enabled": false, +"slice_47/save_to_file/keep_custom_tracks": false, +"slice_47/save_to_file/path": "", +"slice_47/start_frame": 0, +"slice_48/end_frame": 0, +"slice_48/loop_mode": 0, +"slice_48/name": "", +"slice_48/save_to_file/enabled": false, +"slice_48/save_to_file/keep_custom_tracks": false, +"slice_48/save_to_file/path": "", +"slice_48/start_frame": 0, +"slice_49/end_frame": 0, +"slice_49/loop_mode": 0, +"slice_49/name": "", +"slice_49/save_to_file/enabled": false, +"slice_49/save_to_file/keep_custom_tracks": false, +"slice_49/save_to_file/path": "", +"slice_49/start_frame": 0, +"slice_5/end_frame": 0, +"slice_5/loop_mode": 0, +"slice_5/name": "", +"slice_5/save_to_file/enabled": false, +"slice_5/save_to_file/keep_custom_tracks": false, +"slice_5/save_to_file/path": "", +"slice_5/start_frame": 0, +"slice_50/end_frame": 0, +"slice_50/loop_mode": 0, +"slice_50/name": "", +"slice_50/save_to_file/enabled": false, +"slice_50/save_to_file/keep_custom_tracks": false, +"slice_50/save_to_file/path": "", +"slice_50/start_frame": 0, +"slice_51/end_frame": 0, +"slice_51/loop_mode": 0, +"slice_51/name": "", +"slice_51/save_to_file/enabled": false, +"slice_51/save_to_file/keep_custom_tracks": false, +"slice_51/save_to_file/path": "", +"slice_51/start_frame": 0, +"slice_52/end_frame": 0, +"slice_52/loop_mode": 0, +"slice_52/name": "", +"slice_52/save_to_file/enabled": false, +"slice_52/save_to_file/keep_custom_tracks": false, +"slice_52/save_to_file/path": "", +"slice_52/start_frame": 0, +"slice_53/end_frame": 0, +"slice_53/loop_mode": 0, +"slice_53/name": "", +"slice_53/save_to_file/enabled": false, +"slice_53/save_to_file/keep_custom_tracks": false, +"slice_53/save_to_file/path": "", +"slice_53/start_frame": 0, +"slice_54/end_frame": 0, +"slice_54/loop_mode": 0, +"slice_54/name": "", +"slice_54/save_to_file/enabled": false, +"slice_54/save_to_file/keep_custom_tracks": false, +"slice_54/save_to_file/path": "", +"slice_54/start_frame": 0, +"slice_55/end_frame": 0, +"slice_55/loop_mode": 0, +"slice_55/name": "", +"slice_55/save_to_file/enabled": false, +"slice_55/save_to_file/keep_custom_tracks": false, +"slice_55/save_to_file/path": "", +"slice_55/start_frame": 0, +"slice_56/end_frame": 0, +"slice_56/loop_mode": 0, +"slice_56/name": "", +"slice_56/save_to_file/enabled": false, +"slice_56/save_to_file/keep_custom_tracks": false, +"slice_56/save_to_file/path": "", +"slice_56/start_frame": 0, +"slice_57/end_frame": 0, +"slice_57/loop_mode": 0, +"slice_57/name": "", +"slice_57/save_to_file/enabled": false, +"slice_57/save_to_file/keep_custom_tracks": false, +"slice_57/save_to_file/path": "", +"slice_57/start_frame": 0, +"slice_58/end_frame": 0, +"slice_58/loop_mode": 0, +"slice_58/name": "", +"slice_58/save_to_file/enabled": false, +"slice_58/save_to_file/keep_custom_tracks": false, +"slice_58/save_to_file/path": "", +"slice_58/start_frame": 0, +"slice_59/end_frame": 0, +"slice_59/loop_mode": 0, +"slice_59/name": "", +"slice_59/save_to_file/enabled": false, +"slice_59/save_to_file/keep_custom_tracks": false, +"slice_59/save_to_file/path": "", +"slice_59/start_frame": 0, +"slice_6/end_frame": 0, +"slice_6/loop_mode": 0, +"slice_6/name": "", +"slice_6/save_to_file/enabled": false, +"slice_6/save_to_file/keep_custom_tracks": false, +"slice_6/save_to_file/path": "", +"slice_6/start_frame": 0, +"slice_60/end_frame": 0, +"slice_60/loop_mode": 0, +"slice_60/name": "", +"slice_60/save_to_file/enabled": false, +"slice_60/save_to_file/keep_custom_tracks": false, +"slice_60/save_to_file/path": "", +"slice_60/start_frame": 0, +"slice_61/end_frame": 0, +"slice_61/loop_mode": 0, +"slice_61/name": "", +"slice_61/save_to_file/enabled": false, +"slice_61/save_to_file/keep_custom_tracks": false, +"slice_61/save_to_file/path": "", +"slice_61/start_frame": 0, +"slice_62/end_frame": 0, +"slice_62/loop_mode": 0, +"slice_62/name": "", +"slice_62/save_to_file/enabled": false, +"slice_62/save_to_file/keep_custom_tracks": false, +"slice_62/save_to_file/path": "", +"slice_62/start_frame": 0, +"slice_63/end_frame": 0, +"slice_63/loop_mode": 0, +"slice_63/name": "", +"slice_63/save_to_file/enabled": false, +"slice_63/save_to_file/keep_custom_tracks": false, +"slice_63/save_to_file/path": "", +"slice_63/start_frame": 0, +"slice_64/end_frame": 0, +"slice_64/loop_mode": 0, +"slice_64/name": "", +"slice_64/save_to_file/enabled": false, +"slice_64/save_to_file/keep_custom_tracks": false, +"slice_64/save_to_file/path": "", +"slice_64/start_frame": 0, +"slice_65/end_frame": 0, +"slice_65/loop_mode": 0, +"slice_65/name": "", +"slice_65/save_to_file/enabled": false, +"slice_65/save_to_file/keep_custom_tracks": false, +"slice_65/save_to_file/path": "", +"slice_65/start_frame": 0, +"slice_66/end_frame": 0, +"slice_66/loop_mode": 0, +"slice_66/name": "", +"slice_66/save_to_file/enabled": false, +"slice_66/save_to_file/keep_custom_tracks": false, +"slice_66/save_to_file/path": "", +"slice_66/start_frame": 0, +"slice_67/end_frame": 0, +"slice_67/loop_mode": 0, +"slice_67/name": "", +"slice_67/save_to_file/enabled": false, +"slice_67/save_to_file/keep_custom_tracks": false, +"slice_67/save_to_file/path": "", +"slice_67/start_frame": 0, +"slice_68/end_frame": 0, +"slice_68/loop_mode": 0, +"slice_68/name": "", +"slice_68/save_to_file/enabled": false, +"slice_68/save_to_file/keep_custom_tracks": false, +"slice_68/save_to_file/path": "", +"slice_68/start_frame": 0, +"slice_69/end_frame": 0, +"slice_69/loop_mode": 0, +"slice_69/name": "", +"slice_69/save_to_file/enabled": false, +"slice_69/save_to_file/keep_custom_tracks": false, +"slice_69/save_to_file/path": "", +"slice_69/start_frame": 0, +"slice_7/end_frame": 0, +"slice_7/loop_mode": 0, +"slice_7/name": "", +"slice_7/save_to_file/enabled": false, +"slice_7/save_to_file/keep_custom_tracks": false, +"slice_7/save_to_file/path": "", +"slice_7/start_frame": 0, +"slice_70/end_frame": 0, +"slice_70/loop_mode": 0, +"slice_70/name": "", +"slice_70/save_to_file/enabled": false, +"slice_70/save_to_file/keep_custom_tracks": false, +"slice_70/save_to_file/path": "", +"slice_70/start_frame": 0, +"slice_71/end_frame": 0, +"slice_71/loop_mode": 0, +"slice_71/name": "", +"slice_71/save_to_file/enabled": false, +"slice_71/save_to_file/keep_custom_tracks": false, +"slice_71/save_to_file/path": "", +"slice_71/start_frame": 0, +"slice_72/end_frame": 0, +"slice_72/loop_mode": 0, +"slice_72/name": "", +"slice_72/save_to_file/enabled": false, +"slice_72/save_to_file/keep_custom_tracks": false, +"slice_72/save_to_file/path": "", +"slice_72/start_frame": 0, +"slice_73/end_frame": 0, +"slice_73/loop_mode": 0, +"slice_73/name": "", +"slice_73/save_to_file/enabled": false, +"slice_73/save_to_file/keep_custom_tracks": false, +"slice_73/save_to_file/path": "", +"slice_73/start_frame": 0, +"slice_74/end_frame": 0, +"slice_74/loop_mode": 0, +"slice_74/name": "", +"slice_74/save_to_file/enabled": false, +"slice_74/save_to_file/keep_custom_tracks": false, +"slice_74/save_to_file/path": "", +"slice_74/start_frame": 0, +"slice_75/end_frame": 0, +"slice_75/loop_mode": 0, +"slice_75/name": "", +"slice_75/save_to_file/enabled": false, +"slice_75/save_to_file/keep_custom_tracks": false, +"slice_75/save_to_file/path": "", +"slice_75/start_frame": 0, +"slice_76/end_frame": 0, +"slice_76/loop_mode": 0, +"slice_76/name": "", +"slice_76/save_to_file/enabled": false, +"slice_76/save_to_file/keep_custom_tracks": false, +"slice_76/save_to_file/path": "", +"slice_76/start_frame": 0, +"slice_77/end_frame": 0, +"slice_77/loop_mode": 0, +"slice_77/name": "", +"slice_77/save_to_file/enabled": false, +"slice_77/save_to_file/keep_custom_tracks": false, +"slice_77/save_to_file/path": "", +"slice_77/start_frame": 0, +"slice_78/end_frame": 0, +"slice_78/loop_mode": 0, +"slice_78/name": "", +"slice_78/save_to_file/enabled": false, +"slice_78/save_to_file/keep_custom_tracks": false, +"slice_78/save_to_file/path": "", +"slice_78/start_frame": 0, +"slice_79/end_frame": 0, +"slice_79/loop_mode": 0, +"slice_79/name": "", +"slice_79/save_to_file/enabled": false, +"slice_79/save_to_file/keep_custom_tracks": false, +"slice_79/save_to_file/path": "", +"slice_79/start_frame": 0, +"slice_8/end_frame": 0, +"slice_8/loop_mode": 0, +"slice_8/name": "", +"slice_8/save_to_file/enabled": false, +"slice_8/save_to_file/keep_custom_tracks": false, +"slice_8/save_to_file/path": "", +"slice_8/start_frame": 0, +"slice_80/end_frame": 0, +"slice_80/loop_mode": 0, +"slice_80/name": "", +"slice_80/save_to_file/enabled": false, +"slice_80/save_to_file/keep_custom_tracks": false, +"slice_80/save_to_file/path": "", +"slice_80/start_frame": 0, +"slice_81/end_frame": 0, +"slice_81/loop_mode": 0, +"slice_81/name": "", +"slice_81/save_to_file/enabled": false, +"slice_81/save_to_file/keep_custom_tracks": false, +"slice_81/save_to_file/path": "", +"slice_81/start_frame": 0, +"slice_82/end_frame": 0, +"slice_82/loop_mode": 0, +"slice_82/name": "", +"slice_82/save_to_file/enabled": false, +"slice_82/save_to_file/keep_custom_tracks": false, +"slice_82/save_to_file/path": "", +"slice_82/start_frame": 0, +"slice_83/end_frame": 0, +"slice_83/loop_mode": 0, +"slice_83/name": "", +"slice_83/save_to_file/enabled": false, +"slice_83/save_to_file/keep_custom_tracks": false, +"slice_83/save_to_file/path": "", +"slice_83/start_frame": 0, +"slice_84/end_frame": 0, +"slice_84/loop_mode": 0, +"slice_84/name": "", +"slice_84/save_to_file/enabled": false, +"slice_84/save_to_file/keep_custom_tracks": false, +"slice_84/save_to_file/path": "", +"slice_84/start_frame": 0, +"slice_85/end_frame": 0, +"slice_85/loop_mode": 0, +"slice_85/name": "", +"slice_85/save_to_file/enabled": false, +"slice_85/save_to_file/keep_custom_tracks": false, +"slice_85/save_to_file/path": "", +"slice_85/start_frame": 0, +"slice_86/end_frame": 0, +"slice_86/loop_mode": 0, +"slice_86/name": "", +"slice_86/save_to_file/enabled": false, +"slice_86/save_to_file/keep_custom_tracks": false, +"slice_86/save_to_file/path": "", +"slice_86/start_frame": 0, +"slice_87/end_frame": 0, +"slice_87/loop_mode": 0, +"slice_87/name": "", +"slice_87/save_to_file/enabled": false, +"slice_87/save_to_file/keep_custom_tracks": false, +"slice_87/save_to_file/path": "", +"slice_87/start_frame": 0, +"slice_88/end_frame": 0, +"slice_88/loop_mode": 0, +"slice_88/name": "", +"slice_88/save_to_file/enabled": false, +"slice_88/save_to_file/keep_custom_tracks": false, +"slice_88/save_to_file/path": "", +"slice_88/start_frame": 0, +"slice_89/end_frame": 0, +"slice_89/loop_mode": 0, +"slice_89/name": "", +"slice_89/save_to_file/enabled": false, +"slice_89/save_to_file/keep_custom_tracks": false, +"slice_89/save_to_file/path": "", +"slice_89/start_frame": 0, +"slice_9/end_frame": 0, +"slice_9/loop_mode": 0, +"slice_9/name": "", +"slice_9/save_to_file/enabled": false, +"slice_9/save_to_file/keep_custom_tracks": false, +"slice_9/save_to_file/path": "", +"slice_9/start_frame": 0, +"slice_90/end_frame": 0, +"slice_90/loop_mode": 0, +"slice_90/name": "", +"slice_90/save_to_file/enabled": false, +"slice_90/save_to_file/keep_custom_tracks": false, +"slice_90/save_to_file/path": "", +"slice_90/start_frame": 0, +"slice_91/end_frame": 0, +"slice_91/loop_mode": 0, +"slice_91/name": "", +"slice_91/save_to_file/enabled": false, +"slice_91/save_to_file/keep_custom_tracks": false, +"slice_91/save_to_file/path": "", +"slice_91/start_frame": 0, +"slice_92/end_frame": 0, +"slice_92/loop_mode": 0, +"slice_92/name": "", +"slice_92/save_to_file/enabled": false, +"slice_92/save_to_file/keep_custom_tracks": false, +"slice_92/save_to_file/path": "", +"slice_92/start_frame": 0, +"slice_93/end_frame": 0, +"slice_93/loop_mode": 0, +"slice_93/name": "", +"slice_93/save_to_file/enabled": false, +"slice_93/save_to_file/keep_custom_tracks": false, +"slice_93/save_to_file/path": "", +"slice_93/start_frame": 0, +"slice_94/end_frame": 0, +"slice_94/loop_mode": 0, +"slice_94/name": "", +"slice_94/save_to_file/enabled": false, +"slice_94/save_to_file/keep_custom_tracks": false, +"slice_94/save_to_file/path": "", +"slice_94/start_frame": 0, +"slice_95/end_frame": 0, +"slice_95/loop_mode": 0, +"slice_95/name": "", +"slice_95/save_to_file/enabled": false, +"slice_95/save_to_file/keep_custom_tracks": false, +"slice_95/save_to_file/path": "", +"slice_95/start_frame": 0, +"slice_96/end_frame": 0, +"slice_96/loop_mode": 0, +"slice_96/name": "", +"slice_96/save_to_file/enabled": false, +"slice_96/save_to_file/keep_custom_tracks": false, +"slice_96/save_to_file/path": "", +"slice_96/start_frame": 0, +"slice_97/end_frame": 0, +"slice_97/loop_mode": 0, +"slice_97/name": "", +"slice_97/save_to_file/enabled": false, +"slice_97/save_to_file/keep_custom_tracks": false, +"slice_97/save_to_file/path": "", +"slice_97/start_frame": 0, +"slice_98/end_frame": 0, +"slice_98/loop_mode": 0, +"slice_98/name": "", +"slice_98/save_to_file/enabled": false, +"slice_98/save_to_file/keep_custom_tracks": false, +"slice_98/save_to_file/path": "", +"slice_98/start_frame": 0, +"slice_99/end_frame": 0, +"slice_99/loop_mode": 0, +"slice_99/name": "", +"slice_99/save_to_file/enabled": false, +"slice_99/save_to_file/keep_custom_tracks": false, +"slice_99/save_to_file/path": "", +"slice_99/start_frame": 0, +"slices/amount": null +} +}, +"materials": { +"Material.001": { +"use_external/enabled": true, +"use_external/path": "res://materials/MainTexture.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/models/dawg_general_texture-Recovered.png b/models/dawg_general_texture-Recovered.png new file mode 100644 index 0000000..0b910d6 --- /dev/null +++ b/models/dawg_general_texture-Recovered.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:24a39f755860329732d41adac412304872330b90ba87042e7716bedeb1e8b9dd +size 2386 diff --git a/models/dawg_general_texture-Recovered.png.import b/models/dawg_general_texture-Recovered.png.import new file mode 100644 index 0000000..4340d97 --- /dev/null +++ b/models/dawg_general_texture-Recovered.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b0iv0jma3u73m" +path.s3tc="res://.godot/imported/dawg_general_texture-Recovered.png-1b5de3bb7d6f8105aced4d6ab7e47bac.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={} + +[deps] + +source_file="res://models/dawg_general_texture-Recovered.png" +dest_files=["res://.godot/imported/dawg_general_texture-Recovered.png-1b5de3bb7d6f8105aced4d6ab7e47bac.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/models/faro.glb b/models/faro.glb new file mode 100644 index 0000000..d09bc0c --- /dev/null +++ b/models/faro.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f7e0f702e6b05d5eb5beacdb8c6a8aa53462e848639a9d5c822513e786965e4 +size 21812 diff --git a/models/faro.glb.import b/models/faro.glb.import new file mode 100644 index 0000000..4eefd8c --- /dev/null +++ b/models/faro.glb.import @@ -0,0 +1,39 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://2tsrd7068wqg" +path="res://.godot/imported/faro.glb-33709c02d3e690df381ad977fa3c8877.scn" + +[deps] + +source_file="res://models/faro.glb" +dest_files=["res://.godot/imported/faro.glb-33709c02d3e690df381ad977fa3c8877.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Material": { +"use_external/enabled": true, +"use_external/path": "res://materials/opaque_terrains.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/models/faro_vegetation_terrains.png b/models/faro_vegetation_terrains.png new file mode 100644 index 0000000..a8a1615 --- /dev/null +++ b/models/faro_vegetation_terrains.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3c6a71b88f9b27a10be50ecb8f904fb08eb185a7350e77bc30081e7a7ba4c4c +size 4698 diff --git a/models/faro_vegetation_terrains.png.import b/models/faro_vegetation_terrains.png.import new file mode 100644 index 0000000..b16880b --- /dev/null +++ b/models/faro_vegetation_terrains.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://h74keukjbby8" +path.s3tc="res://.godot/imported/faro_vegetation_terrains.png-40a1bf085d08ac93470f9d7e4c7c85da.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={} + +[deps] + +source_file="res://models/faro_vegetation_terrains.png" +dest_files=["res://.godot/imported/faro_vegetation_terrains.png-40a1bf085d08ac93470f9d7e4c7c85da.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/models/fence.glb b/models/fence.glb new file mode 100644 index 0000000..5c49d18 --- /dev/null +++ b/models/fence.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ebd9751f2c94c958f73b7573b3e4ad2d4c07c078825b75b30b6b3dd86570832a +size 14008 diff --git a/models/fence.glb.import b/models/fence.glb.import new file mode 100644 index 0000000..921a057 --- /dev/null +++ b/models/fence.glb.import @@ -0,0 +1,39 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://yeveffvhk02h" +path="res://.godot/imported/fence.glb-c6c668d695330cc80f850615d91adddd.scn" + +[deps] + +source_file="res://models/fence.glb" +dest_files=["res://.godot/imported/fence.glb-c6c668d695330cc80f850615d91adddd.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Material.005": { +"use_external/enabled": true, +"use_external/path": "res://materials/opaque_terrains.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/models/fence_vegetation_terrains.png b/models/fence_vegetation_terrains.png new file mode 100644 index 0000000..187dff1 --- /dev/null +++ b/models/fence_vegetation_terrains.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:800029739505df93467b3463612aad78d90f19fe15b18b46d672f66ea83585b0 +size 4870 diff --git a/models/fence_vegetation_terrains.png.import b/models/fence_vegetation_terrains.png.import new file mode 100644 index 0000000..83ff12e --- /dev/null +++ b/models/fence_vegetation_terrains.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cdefi84k7o4qe" +path="res://.godot/imported/fence_vegetation_terrains.png-75fa8004605e1eb6492fea5ce6bf7b9a.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={} + +[deps] + +source_file="res://models/fence_vegetation_terrains.png" +dest_files=["res://.godot/imported/fence_vegetation_terrains.png-75fa8004605e1eb6492fea5ce6bf7b9a.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=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=1 diff --git a/models/floor.glb b/models/floor.glb new file mode 100644 index 0000000..f15311e --- /dev/null +++ b/models/floor.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bceaf730f6a3c2eae948eafe8b7fb2507e240976fe2eceb946aaefa40c8dfa4d +size 248048 diff --git a/models/floor.glb.import b/models/floor.glb.import new file mode 100644 index 0000000..e699c48 --- /dev/null +++ b/models/floor.glb.import @@ -0,0 +1,43 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dh0dk0ir8v4nd" +path="res://.godot/imported/floor.glb-5082ff8a88b784c94ed743a360c78a98.scn" + +[deps] + +source_file="res://models/floor.glb" +dest_files=["res://.godot/imported/floor.glb-5082ff8a88b784c94ed743a360c78a98.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Material.001": { +"use_external/enabled": true, +"use_external/path": "res://materials/opaque_plane.tres" +}, +"Material.005": { +"use_external/enabled": true, +"use_external/path": "res://materials/opaque_terrains.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/models/floor_Myd_general_texture-Recovered.png.import b/models/floor_Myd_general_texture-Recovered.png.import new file mode 100644 index 0000000..be899f8 --- /dev/null +++ b/models/floor_Myd_general_texture-Recovered.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cn0xujkj73m51" +path="res://.godot/imported/floor_Myd_general_texture-Recovered.png-889192ca9efe4c2f77180b8ff74633b5.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={} + +[deps] + +source_file="res://models/floor_Myd_general_texture-Recovered.png" +dest_files=["res://.godot/imported/floor_Myd_general_texture-Recovered.png-889192ca9efe4c2f77180b8ff74633b5.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/models/floor_vegetation_terrains.png b/models/floor_vegetation_terrains.png new file mode 100644 index 0000000..a8a1615 --- /dev/null +++ b/models/floor_vegetation_terrains.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3c6a71b88f9b27a10be50ecb8f904fb08eb185a7350e77bc30081e7a7ba4c4c +size 4698 diff --git a/models/floor_vegetation_terrains.png.import b/models/floor_vegetation_terrains.png.import new file mode 100644 index 0000000..5518814 --- /dev/null +++ b/models/floor_vegetation_terrains.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bux80hwmnox2n" +path.s3tc="res://.godot/imported/floor_vegetation_terrains.png-288ce3082bc8858199e3bcb55d8e709f.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={} + +[deps] + +source_file="res://models/floor_vegetation_terrains.png" +dest_files=["res://.godot/imported/floor_vegetation_terrains.png-288ce3082bc8858199e3bcb55d8e709f.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/models/flotador.glb b/models/flotador.glb new file mode 100644 index 0000000..837dfec --- /dev/null +++ b/models/flotador.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2177b9db94d72f98689000208b00e63c13ce38743f444bb0576c16ee77277b00 +size 9784 diff --git a/models/flotador.glb.import b/models/flotador.glb.import new file mode 100644 index 0000000..335d162 --- /dev/null +++ b/models/flotador.glb.import @@ -0,0 +1,39 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://n6ycq7if5qsx" +path="res://.godot/imported/flotador.glb-5f9f133330e74c5dab205c81339ef73a.scn" + +[deps] + +source_file="res://models/flotador.glb" +dest_files=["res://.godot/imported/flotador.glb-5f9f133330e74c5dab205c81339ef73a.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Material.005": { +"use_external/enabled": true, +"use_external/path": "res://materials/opaque_terrains.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/models/flotador_vegetation_terrains.png b/models/flotador_vegetation_terrains.png new file mode 100644 index 0000000..e2a6c00 --- /dev/null +++ b/models/flotador_vegetation_terrains.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d916979fd12621a154208fa370488dec8a6b359cd62520e43763c4d932069bed +size 1155 diff --git a/models/flotador_vegetation_terrains.png.import b/models/flotador_vegetation_terrains.png.import new file mode 100644 index 0000000..2de6c6e --- /dev/null +++ b/models/flotador_vegetation_terrains.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://5fml7kl833gg" +path="res://.godot/imported/flotador_vegetation_terrains.png-b5fd7caa33cca06945ce8774e4da3dde.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={} + +[deps] + +source_file="res://models/flotador_vegetation_terrains.png" +dest_files=["res://.godot/imported/flotador_vegetation_terrains.png-b5fd7caa33cca06945ce8774e4da3dde.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=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=1 diff --git a/models/hojas_suelo.glb b/models/hojas_suelo.glb new file mode 100644 index 0000000..1e8be17 --- /dev/null +++ b/models/hojas_suelo.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dcf28c919ab7caef3ec0f422e43159d31443248b3bb9b6b3a89cb96b94aa125d +size 5136 diff --git a/models/hojas_suelo.glb.import b/models/hojas_suelo.glb.import new file mode 100644 index 0000000..b88202e --- /dev/null +++ b/models/hojas_suelo.glb.import @@ -0,0 +1,39 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://csd24okp7sge6" +path="res://.godot/imported/hojas_suelo.glb-ef495d8d6d04c76329c600d02e0f097c.scn" + +[deps] + +source_file="res://models/hojas_suelo.glb" +dest_files=["res://.godot/imported/hojas_suelo.glb-ef495d8d6d04c76329c600d02e0f097c.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Material.040": { +"use_external/enabled": true, +"use_external/path": "res://materials/tree1.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/models/hojas_suelo_hojas_2.png b/models/hojas_suelo_hojas_2.png new file mode 100644 index 0000000..62b365c --- /dev/null +++ b/models/hojas_suelo_hojas_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea3820f1a63a9fb48037385e804232ff3858d42084307650862498a7fb88d6ec +size 1071 diff --git a/models/hojas_suelo_hojas_2.png.import b/models/hojas_suelo_hojas_2.png.import new file mode 100644 index 0000000..9c9d4de --- /dev/null +++ b/models/hojas_suelo_hojas_2.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cmyg8jjkqv1j0" +path.s3tc="res://.godot/imported/hojas_suelo_hojas_2.png-20c1a590a14f86144cacccacbd20e373.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={} + +[deps] + +source_file="res://models/hojas_suelo_hojas_2.png" +dest_files=["res://.godot/imported/hojas_suelo_hojas_2.png-20c1a590a14f86144cacccacbd20e373.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/models/lianas.glb b/models/lianas.glb new file mode 100644 index 0000000..985bddb --- /dev/null +++ b/models/lianas.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8e72e1348189b3248a8bfb5febd6e2c53b018fbd8c9aa45189c85248a6d10baa +size 8444 diff --git a/models/lianas.glb.import b/models/lianas.glb.import new file mode 100644 index 0000000..c964b75 --- /dev/null +++ b/models/lianas.glb.import @@ -0,0 +1,39 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://n7pe7q7brnn1" +path="res://.godot/imported/lianas.glb-c8ae38a567b3bbd5ca87e03ecd187f66.scn" + +[deps] + +source_file="res://models/lianas.glb" +dest_files=["res://.godot/imported/lianas.glb-c8ae38a567b3bbd5ca87e03ecd187f66.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Material": { +"use_external/enabled": true, +"use_external/path": "res://materials/plants_opacity.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/models/lianas_vegetation_terrains.png b/models/lianas_vegetation_terrains.png new file mode 100644 index 0000000..a8a1615 --- /dev/null +++ b/models/lianas_vegetation_terrains.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3c6a71b88f9b27a10be50ecb8f904fb08eb185a7350e77bc30081e7a7ba4c4c +size 4698 diff --git a/models/lianas_vegetation_terrains.png.import b/models/lianas_vegetation_terrains.png.import new file mode 100644 index 0000000..0909ce7 --- /dev/null +++ b/models/lianas_vegetation_terrains.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d03edus1pa8c0" +path="res://.godot/imported/lianas_vegetation_terrains.png-83966b49ab773bb8b8ea883a19a82568.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={} + +[deps] + +source_file="res://models/lianas_vegetation_terrains.png" +dest_files=["res://.godot/imported/lianas_vegetation_terrains.png-83966b49ab773bb8b8ea883a19a82568.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=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=1 diff --git a/models/madera.glb b/models/madera.glb new file mode 100644 index 0000000..19e1e10 --- /dev/null +++ b/models/madera.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90aad0073a86634084e2b61ee4bac312082434f13a01599558f453a2d2b44819 +size 7544 diff --git a/models/madera.glb.import b/models/madera.glb.import new file mode 100644 index 0000000..66006d0 --- /dev/null +++ b/models/madera.glb.import @@ -0,0 +1,39 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bi5267du5vnl1" +path="res://.godot/imported/madera.glb-aa56ba11adbfb6c2f80b2d50d5de4ef5.scn" + +[deps] + +source_file="res://models/madera.glb" +dest_files=["res://.godot/imported/madera.glb-aa56ba11adbfb6c2f80b2d50d5de4ef5.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Material": { +"use_external/enabled": true, +"use_external/path": "res://materials/opaque_terrains.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/models/madera_vegetation_terrains.png b/models/madera_vegetation_terrains.png new file mode 100644 index 0000000..a8a1615 --- /dev/null +++ b/models/madera_vegetation_terrains.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3c6a71b88f9b27a10be50ecb8f904fb08eb185a7350e77bc30081e7a7ba4c4c +size 4698 diff --git a/models/madera_vegetation_terrains.png.import b/models/madera_vegetation_terrains.png.import new file mode 100644 index 0000000..95b186d --- /dev/null +++ b/models/madera_vegetation_terrains.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://4frqf0tksp0s" +path="res://.godot/imported/madera_vegetation_terrains.png-94cc806493cd085e61ddff41586eb6f0.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={} + +[deps] + +source_file="res://models/madera_vegetation_terrains.png" +dest_files=["res://.godot/imported/madera_vegetation_terrains.png-94cc806493cd085e61ddff41586eb6f0.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=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=1 diff --git a/models/mueele.glb b/models/mueele.glb new file mode 100644 index 0000000..273eeb1 --- /dev/null +++ b/models/mueele.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0598faf1cf1814b23532b985aff8eeb2a3593edc1930bd843062c5e271abc96f +size 71668 diff --git a/models/mueele.glb.import b/models/mueele.glb.import new file mode 100644 index 0000000..b3726e3 --- /dev/null +++ b/models/mueele.glb.import @@ -0,0 +1,43 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bsn2twdsact8y" +path="res://.godot/imported/mueele.glb-b158e521f44b3fec33a1f37c251594a1.scn" + +[deps] + +source_file="res://models/mueele.glb" +dest_files=["res://.godot/imported/mueele.glb-b158e521f44b3fec33a1f37c251594a1.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Material.004": { +"use_external/enabled": true, +"use_external/path": "res://materials/opaque_terrains.tres" +}, +"Material.006": { +"use_external/enabled": true, +"use_external/path": "res://materials/opaque_plane.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/models/mueele_Myd_general_texture-Recovered.png b/models/mueele_Myd_general_texture-Recovered.png new file mode 100644 index 0000000..0552203 --- /dev/null +++ b/models/mueele_Myd_general_texture-Recovered.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cfa207305bac8f7ade51a110a98d50dde87a404eb5d3f91e39019fc9b0d53ae4 +size 2003 diff --git a/models/mueele_Myd_general_texture-Recovered.png.import b/models/mueele_Myd_general_texture-Recovered.png.import new file mode 100644 index 0000000..2461c70 --- /dev/null +++ b/models/mueele_Myd_general_texture-Recovered.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b070n5uyin3or" +path.s3tc="res://.godot/imported/mueele_Myd_general_texture-Recovered.png-9d22bbb6a548847d7c30120352e8bff1.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={} + +[deps] + +source_file="res://models/mueele_Myd_general_texture-Recovered.png" +dest_files=["res://.godot/imported/mueele_Myd_general_texture-Recovered.png-9d22bbb6a548847d7c30120352e8bff1.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/models/mueele_vegetation_terrains.png b/models/mueele_vegetation_terrains.png new file mode 100644 index 0000000..770cac0 --- /dev/null +++ b/models/mueele_vegetation_terrains.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5cf2c3da4317195710af91e7c6eb69725e88751920b5443d0cf1a517f55505e2 +size 5491 diff --git a/models/mueele_vegetation_terrains.png.import b/models/mueele_vegetation_terrains.png.import new file mode 100644 index 0000000..f6458fe --- /dev/null +++ b/models/mueele_vegetation_terrains.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c28axpqrfcgje" +path.s3tc="res://.godot/imported/mueele_vegetation_terrains.png-1b264512cdb929c69122735670116e21.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={} + +[deps] + +source_file="res://models/mueele_vegetation_terrains.png" +dest_files=["res://.godot/imported/mueele_vegetation_terrains.png-1b264512cdb929c69122735670116e21.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/models/mum.glb b/models/mum.glb new file mode 100644 index 0000000..8b8ae8b --- /dev/null +++ b/models/mum.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cd68ffac3e3829dbb464fb9603499fd8bfeb2f96e69d2417327df94df002f06c +size 158924 diff --git a/models/mum.glb.import b/models/mum.glb.import new file mode 100644 index 0000000..39fcca1 --- /dev/null +++ b/models/mum.glb.import @@ -0,0 +1,3639 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dystsbccdabog" +path="res://.godot/imported/mum.glb-325bc4d581e53a31c05b1aa2fd07707a.scn" + +[deps] + +source_file="res://models/mum.glb" +dest_files=["res://.godot/imported/mum.glb-325bc4d581e53a31c05b1aa2fd07707a.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=0.2 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"animations": { +"idle": { +"save_to_file/enabled": false, +"save_to_file/keep_custom_tracks": "", +"save_to_file/path": "", +"settings/loop_mode": 1, +"slice_1/end_frame": 0, +"slice_1/loop_mode": 0, +"slice_1/name": "", +"slice_1/save_to_file/enabled": false, +"slice_1/save_to_file/keep_custom_tracks": false, +"slice_1/save_to_file/path": "", +"slice_1/start_frame": 0, +"slice_10/end_frame": 0, +"slice_10/loop_mode": 0, +"slice_10/name": "", +"slice_10/save_to_file/enabled": false, +"slice_10/save_to_file/keep_custom_tracks": false, +"slice_10/save_to_file/path": "", +"slice_10/start_frame": 0, +"slice_100/end_frame": 0, +"slice_100/loop_mode": 0, +"slice_100/name": "", +"slice_100/save_to_file/enabled": false, +"slice_100/save_to_file/keep_custom_tracks": false, +"slice_100/save_to_file/path": "", +"slice_100/start_frame": 0, +"slice_101/end_frame": 0, +"slice_101/loop_mode": 0, +"slice_101/name": "", +"slice_101/save_to_file/enabled": false, +"slice_101/save_to_file/keep_custom_tracks": false, +"slice_101/save_to_file/path": "", +"slice_101/start_frame": 0, +"slice_102/end_frame": 0, +"slice_102/loop_mode": 0, +"slice_102/name": "", +"slice_102/save_to_file/enabled": false, +"slice_102/save_to_file/keep_custom_tracks": false, +"slice_102/save_to_file/path": "", +"slice_102/start_frame": 0, +"slice_103/end_frame": 0, +"slice_103/loop_mode": 0, +"slice_103/name": "", +"slice_103/save_to_file/enabled": false, +"slice_103/save_to_file/keep_custom_tracks": false, +"slice_103/save_to_file/path": "", +"slice_103/start_frame": 0, +"slice_104/end_frame": 0, +"slice_104/loop_mode": 0, +"slice_104/name": "", +"slice_104/save_to_file/enabled": false, +"slice_104/save_to_file/keep_custom_tracks": false, +"slice_104/save_to_file/path": "", +"slice_104/start_frame": 0, +"slice_105/end_frame": 0, +"slice_105/loop_mode": 0, +"slice_105/name": "", +"slice_105/save_to_file/enabled": false, +"slice_105/save_to_file/keep_custom_tracks": false, +"slice_105/save_to_file/path": "", +"slice_105/start_frame": 0, +"slice_106/end_frame": 0, +"slice_106/loop_mode": 0, +"slice_106/name": "", +"slice_106/save_to_file/enabled": false, +"slice_106/save_to_file/keep_custom_tracks": false, +"slice_106/save_to_file/path": "", +"slice_106/start_frame": 0, +"slice_107/end_frame": 0, +"slice_107/loop_mode": 0, +"slice_107/name": "", +"slice_107/save_to_file/enabled": false, +"slice_107/save_to_file/keep_custom_tracks": false, +"slice_107/save_to_file/path": "", +"slice_107/start_frame": 0, +"slice_108/end_frame": 0, +"slice_108/loop_mode": 0, +"slice_108/name": "", +"slice_108/save_to_file/enabled": false, +"slice_108/save_to_file/keep_custom_tracks": false, +"slice_108/save_to_file/path": "", +"slice_108/start_frame": 0, +"slice_109/end_frame": 0, +"slice_109/loop_mode": 0, +"slice_109/name": "", +"slice_109/save_to_file/enabled": false, +"slice_109/save_to_file/keep_custom_tracks": false, +"slice_109/save_to_file/path": "", +"slice_109/start_frame": 0, +"slice_11/end_frame": 0, +"slice_11/loop_mode": 0, +"slice_11/name": "", +"slice_11/save_to_file/enabled": false, +"slice_11/save_to_file/keep_custom_tracks": false, +"slice_11/save_to_file/path": "", +"slice_11/start_frame": 0, +"slice_110/end_frame": 0, +"slice_110/loop_mode": 0, +"slice_110/name": "", +"slice_110/save_to_file/enabled": false, +"slice_110/save_to_file/keep_custom_tracks": false, +"slice_110/save_to_file/path": "", +"slice_110/start_frame": 0, +"slice_111/end_frame": 0, +"slice_111/loop_mode": 0, +"slice_111/name": "", +"slice_111/save_to_file/enabled": false, +"slice_111/save_to_file/keep_custom_tracks": false, +"slice_111/save_to_file/path": "", +"slice_111/start_frame": 0, +"slice_112/end_frame": 0, +"slice_112/loop_mode": 0, +"slice_112/name": "", +"slice_112/save_to_file/enabled": false, +"slice_112/save_to_file/keep_custom_tracks": false, +"slice_112/save_to_file/path": "", +"slice_112/start_frame": 0, +"slice_113/end_frame": 0, +"slice_113/loop_mode": 0, +"slice_113/name": "", +"slice_113/save_to_file/enabled": false, +"slice_113/save_to_file/keep_custom_tracks": false, +"slice_113/save_to_file/path": "", +"slice_113/start_frame": 0, +"slice_114/end_frame": 0, +"slice_114/loop_mode": 0, +"slice_114/name": "", +"slice_114/save_to_file/enabled": false, +"slice_114/save_to_file/keep_custom_tracks": false, +"slice_114/save_to_file/path": "", +"slice_114/start_frame": 0, +"slice_115/end_frame": 0, +"slice_115/loop_mode": 0, +"slice_115/name": "", +"slice_115/save_to_file/enabled": false, +"slice_115/save_to_file/keep_custom_tracks": false, +"slice_115/save_to_file/path": "", +"slice_115/start_frame": 0, +"slice_116/end_frame": 0, +"slice_116/loop_mode": 0, +"slice_116/name": "", +"slice_116/save_to_file/enabled": false, +"slice_116/save_to_file/keep_custom_tracks": false, +"slice_116/save_to_file/path": "", +"slice_116/start_frame": 0, +"slice_117/end_frame": 0, +"slice_117/loop_mode": 0, +"slice_117/name": "", +"slice_117/save_to_file/enabled": false, +"slice_117/save_to_file/keep_custom_tracks": false, +"slice_117/save_to_file/path": "", +"slice_117/start_frame": 0, +"slice_118/end_frame": 0, +"slice_118/loop_mode": 0, +"slice_118/name": "", +"slice_118/save_to_file/enabled": false, +"slice_118/save_to_file/keep_custom_tracks": false, +"slice_118/save_to_file/path": "", +"slice_118/start_frame": 0, +"slice_119/end_frame": 0, +"slice_119/loop_mode": 0, +"slice_119/name": "", +"slice_119/save_to_file/enabled": false, +"slice_119/save_to_file/keep_custom_tracks": false, +"slice_119/save_to_file/path": "", +"slice_119/start_frame": 0, +"slice_12/end_frame": 0, +"slice_12/loop_mode": 0, +"slice_12/name": "", +"slice_12/save_to_file/enabled": false, +"slice_12/save_to_file/keep_custom_tracks": false, +"slice_12/save_to_file/path": "", +"slice_12/start_frame": 0, +"slice_120/end_frame": 0, +"slice_120/loop_mode": 0, +"slice_120/name": "", +"slice_120/save_to_file/enabled": false, +"slice_120/save_to_file/keep_custom_tracks": false, +"slice_120/save_to_file/path": "", +"slice_120/start_frame": 0, +"slice_121/end_frame": 0, +"slice_121/loop_mode": 0, +"slice_121/name": "", +"slice_121/save_to_file/enabled": false, +"slice_121/save_to_file/keep_custom_tracks": false, +"slice_121/save_to_file/path": "", +"slice_121/start_frame": 0, +"slice_122/end_frame": 0, +"slice_122/loop_mode": 0, +"slice_122/name": "", +"slice_122/save_to_file/enabled": false, +"slice_122/save_to_file/keep_custom_tracks": false, +"slice_122/save_to_file/path": "", +"slice_122/start_frame": 0, +"slice_123/end_frame": 0, +"slice_123/loop_mode": 0, +"slice_123/name": "", +"slice_123/save_to_file/enabled": false, +"slice_123/save_to_file/keep_custom_tracks": false, +"slice_123/save_to_file/path": "", +"slice_123/start_frame": 0, +"slice_124/end_frame": 0, +"slice_124/loop_mode": 0, +"slice_124/name": "", +"slice_124/save_to_file/enabled": false, +"slice_124/save_to_file/keep_custom_tracks": false, +"slice_124/save_to_file/path": "", +"slice_124/start_frame": 0, +"slice_125/end_frame": 0, +"slice_125/loop_mode": 0, +"slice_125/name": "", +"slice_125/save_to_file/enabled": false, +"slice_125/save_to_file/keep_custom_tracks": false, +"slice_125/save_to_file/path": "", +"slice_125/start_frame": 0, +"slice_126/end_frame": 0, +"slice_126/loop_mode": 0, +"slice_126/name": "", +"slice_126/save_to_file/enabled": false, +"slice_126/save_to_file/keep_custom_tracks": false, +"slice_126/save_to_file/path": "", +"slice_126/start_frame": 0, +"slice_127/end_frame": 0, +"slice_127/loop_mode": 0, +"slice_127/name": "", +"slice_127/save_to_file/enabled": false, +"slice_127/save_to_file/keep_custom_tracks": false, +"slice_127/save_to_file/path": "", +"slice_127/start_frame": 0, +"slice_128/end_frame": 0, +"slice_128/loop_mode": 0, +"slice_128/name": "", +"slice_128/save_to_file/enabled": false, +"slice_128/save_to_file/keep_custom_tracks": false, +"slice_128/save_to_file/path": "", +"slice_128/start_frame": 0, +"slice_129/end_frame": 0, +"slice_129/loop_mode": 0, +"slice_129/name": "", +"slice_129/save_to_file/enabled": false, +"slice_129/save_to_file/keep_custom_tracks": false, +"slice_129/save_to_file/path": "", +"slice_129/start_frame": 0, +"slice_13/end_frame": 0, +"slice_13/loop_mode": 0, +"slice_13/name": "", +"slice_13/save_to_file/enabled": false, +"slice_13/save_to_file/keep_custom_tracks": false, +"slice_13/save_to_file/path": "", +"slice_13/start_frame": 0, +"slice_130/end_frame": 0, +"slice_130/loop_mode": 0, +"slice_130/name": "", +"slice_130/save_to_file/enabled": false, +"slice_130/save_to_file/keep_custom_tracks": false, +"slice_130/save_to_file/path": "", +"slice_130/start_frame": 0, +"slice_131/end_frame": 0, +"slice_131/loop_mode": 0, +"slice_131/name": "", +"slice_131/save_to_file/enabled": false, +"slice_131/save_to_file/keep_custom_tracks": false, +"slice_131/save_to_file/path": "", +"slice_131/start_frame": 0, +"slice_132/end_frame": 0, +"slice_132/loop_mode": 0, +"slice_132/name": "", +"slice_132/save_to_file/enabled": false, +"slice_132/save_to_file/keep_custom_tracks": false, +"slice_132/save_to_file/path": "", +"slice_132/start_frame": 0, +"slice_133/end_frame": 0, +"slice_133/loop_mode": 0, +"slice_133/name": "", +"slice_133/save_to_file/enabled": false, +"slice_133/save_to_file/keep_custom_tracks": false, +"slice_133/save_to_file/path": "", +"slice_133/start_frame": 0, +"slice_134/end_frame": 0, +"slice_134/loop_mode": 0, +"slice_134/name": "", +"slice_134/save_to_file/enabled": false, +"slice_134/save_to_file/keep_custom_tracks": false, +"slice_134/save_to_file/path": "", +"slice_134/start_frame": 0, +"slice_135/end_frame": 0, +"slice_135/loop_mode": 0, +"slice_135/name": "", +"slice_135/save_to_file/enabled": false, +"slice_135/save_to_file/keep_custom_tracks": false, +"slice_135/save_to_file/path": "", +"slice_135/start_frame": 0, +"slice_136/end_frame": 0, +"slice_136/loop_mode": 0, +"slice_136/name": "", +"slice_136/save_to_file/enabled": false, +"slice_136/save_to_file/keep_custom_tracks": false, +"slice_136/save_to_file/path": "", +"slice_136/start_frame": 0, +"slice_137/end_frame": 0, +"slice_137/loop_mode": 0, +"slice_137/name": "", +"slice_137/save_to_file/enabled": false, +"slice_137/save_to_file/keep_custom_tracks": false, +"slice_137/save_to_file/path": "", +"slice_137/start_frame": 0, +"slice_138/end_frame": 0, +"slice_138/loop_mode": 0, +"slice_138/name": "", +"slice_138/save_to_file/enabled": false, +"slice_138/save_to_file/keep_custom_tracks": false, +"slice_138/save_to_file/path": "", +"slice_138/start_frame": 0, +"slice_139/end_frame": 0, +"slice_139/loop_mode": 0, +"slice_139/name": "", +"slice_139/save_to_file/enabled": false, +"slice_139/save_to_file/keep_custom_tracks": false, +"slice_139/save_to_file/path": "", +"slice_139/start_frame": 0, +"slice_14/end_frame": 0, +"slice_14/loop_mode": 0, +"slice_14/name": "", +"slice_14/save_to_file/enabled": false, +"slice_14/save_to_file/keep_custom_tracks": false, +"slice_14/save_to_file/path": "", +"slice_14/start_frame": 0, +"slice_140/end_frame": 0, +"slice_140/loop_mode": 0, +"slice_140/name": "", +"slice_140/save_to_file/enabled": false, +"slice_140/save_to_file/keep_custom_tracks": false, +"slice_140/save_to_file/path": "", +"slice_140/start_frame": 0, +"slice_141/end_frame": 0, +"slice_141/loop_mode": 0, +"slice_141/name": "", +"slice_141/save_to_file/enabled": false, +"slice_141/save_to_file/keep_custom_tracks": false, +"slice_141/save_to_file/path": "", +"slice_141/start_frame": 0, +"slice_142/end_frame": 0, +"slice_142/loop_mode": 0, +"slice_142/name": "", +"slice_142/save_to_file/enabled": false, +"slice_142/save_to_file/keep_custom_tracks": false, +"slice_142/save_to_file/path": "", +"slice_142/start_frame": 0, +"slice_143/end_frame": 0, +"slice_143/loop_mode": 0, +"slice_143/name": "", +"slice_143/save_to_file/enabled": false, +"slice_143/save_to_file/keep_custom_tracks": false, +"slice_143/save_to_file/path": "", +"slice_143/start_frame": 0, +"slice_144/end_frame": 0, +"slice_144/loop_mode": 0, +"slice_144/name": "", +"slice_144/save_to_file/enabled": false, +"slice_144/save_to_file/keep_custom_tracks": false, +"slice_144/save_to_file/path": "", +"slice_144/start_frame": 0, +"slice_145/end_frame": 0, +"slice_145/loop_mode": 0, +"slice_145/name": "", +"slice_145/save_to_file/enabled": false, +"slice_145/save_to_file/keep_custom_tracks": false, +"slice_145/save_to_file/path": "", +"slice_145/start_frame": 0, +"slice_146/end_frame": 0, +"slice_146/loop_mode": 0, +"slice_146/name": "", +"slice_146/save_to_file/enabled": false, +"slice_146/save_to_file/keep_custom_tracks": false, +"slice_146/save_to_file/path": "", +"slice_146/start_frame": 0, +"slice_147/end_frame": 0, +"slice_147/loop_mode": 0, +"slice_147/name": "", +"slice_147/save_to_file/enabled": false, +"slice_147/save_to_file/keep_custom_tracks": false, +"slice_147/save_to_file/path": "", +"slice_147/start_frame": 0, +"slice_148/end_frame": 0, +"slice_148/loop_mode": 0, +"slice_148/name": "", +"slice_148/save_to_file/enabled": false, +"slice_148/save_to_file/keep_custom_tracks": false, +"slice_148/save_to_file/path": "", +"slice_148/start_frame": 0, +"slice_149/end_frame": 0, +"slice_149/loop_mode": 0, +"slice_149/name": "", +"slice_149/save_to_file/enabled": false, +"slice_149/save_to_file/keep_custom_tracks": false, +"slice_149/save_to_file/path": "", +"slice_149/start_frame": 0, +"slice_15/end_frame": 0, +"slice_15/loop_mode": 0, +"slice_15/name": "", +"slice_15/save_to_file/enabled": false, +"slice_15/save_to_file/keep_custom_tracks": false, +"slice_15/save_to_file/path": "", +"slice_15/start_frame": 0, +"slice_150/end_frame": 0, +"slice_150/loop_mode": 0, +"slice_150/name": "", +"slice_150/save_to_file/enabled": false, +"slice_150/save_to_file/keep_custom_tracks": false, +"slice_150/save_to_file/path": "", +"slice_150/start_frame": 0, +"slice_151/end_frame": 0, +"slice_151/loop_mode": 0, +"slice_151/name": "", +"slice_151/save_to_file/enabled": false, +"slice_151/save_to_file/keep_custom_tracks": false, +"slice_151/save_to_file/path": "", +"slice_151/start_frame": 0, +"slice_152/end_frame": 0, +"slice_152/loop_mode": 0, +"slice_152/name": "", +"slice_152/save_to_file/enabled": false, +"slice_152/save_to_file/keep_custom_tracks": false, +"slice_152/save_to_file/path": "", +"slice_152/start_frame": 0, +"slice_153/end_frame": 0, +"slice_153/loop_mode": 0, +"slice_153/name": "", +"slice_153/save_to_file/enabled": false, +"slice_153/save_to_file/keep_custom_tracks": false, +"slice_153/save_to_file/path": "", +"slice_153/start_frame": 0, +"slice_154/end_frame": 0, +"slice_154/loop_mode": 0, +"slice_154/name": "", +"slice_154/save_to_file/enabled": false, +"slice_154/save_to_file/keep_custom_tracks": false, +"slice_154/save_to_file/path": "", +"slice_154/start_frame": 0, +"slice_155/end_frame": 0, +"slice_155/loop_mode": 0, +"slice_155/name": "", +"slice_155/save_to_file/enabled": false, +"slice_155/save_to_file/keep_custom_tracks": false, +"slice_155/save_to_file/path": "", +"slice_155/start_frame": 0, +"slice_156/end_frame": 0, +"slice_156/loop_mode": 0, +"slice_156/name": "", +"slice_156/save_to_file/enabled": false, +"slice_156/save_to_file/keep_custom_tracks": false, +"slice_156/save_to_file/path": "", +"slice_156/start_frame": 0, +"slice_157/end_frame": 0, +"slice_157/loop_mode": 0, +"slice_157/name": "", +"slice_157/save_to_file/enabled": false, +"slice_157/save_to_file/keep_custom_tracks": false, +"slice_157/save_to_file/path": "", +"slice_157/start_frame": 0, +"slice_158/end_frame": 0, +"slice_158/loop_mode": 0, +"slice_158/name": "", +"slice_158/save_to_file/enabled": false, +"slice_158/save_to_file/keep_custom_tracks": false, +"slice_158/save_to_file/path": "", +"slice_158/start_frame": 0, +"slice_159/end_frame": 0, +"slice_159/loop_mode": 0, +"slice_159/name": "", +"slice_159/save_to_file/enabled": false, +"slice_159/save_to_file/keep_custom_tracks": false, +"slice_159/save_to_file/path": "", +"slice_159/start_frame": 0, +"slice_16/end_frame": 0, +"slice_16/loop_mode": 0, +"slice_16/name": "", +"slice_16/save_to_file/enabled": false, +"slice_16/save_to_file/keep_custom_tracks": false, +"slice_16/save_to_file/path": "", +"slice_16/start_frame": 0, +"slice_160/end_frame": 0, +"slice_160/loop_mode": 0, +"slice_160/name": "", +"slice_160/save_to_file/enabled": false, +"slice_160/save_to_file/keep_custom_tracks": false, +"slice_160/save_to_file/path": "", +"slice_160/start_frame": 0, +"slice_161/end_frame": 0, +"slice_161/loop_mode": 0, +"slice_161/name": "", +"slice_161/save_to_file/enabled": false, +"slice_161/save_to_file/keep_custom_tracks": false, +"slice_161/save_to_file/path": "", +"slice_161/start_frame": 0, +"slice_162/end_frame": 0, +"slice_162/loop_mode": 0, +"slice_162/name": "", +"slice_162/save_to_file/enabled": false, +"slice_162/save_to_file/keep_custom_tracks": false, +"slice_162/save_to_file/path": "", +"slice_162/start_frame": 0, +"slice_163/end_frame": 0, +"slice_163/loop_mode": 0, +"slice_163/name": "", +"slice_163/save_to_file/enabled": false, +"slice_163/save_to_file/keep_custom_tracks": false, +"slice_163/save_to_file/path": "", +"slice_163/start_frame": 0, +"slice_164/end_frame": 0, +"slice_164/loop_mode": 0, +"slice_164/name": "", +"slice_164/save_to_file/enabled": false, +"slice_164/save_to_file/keep_custom_tracks": false, +"slice_164/save_to_file/path": "", +"slice_164/start_frame": 0, +"slice_165/end_frame": 0, +"slice_165/loop_mode": 0, +"slice_165/name": "", +"slice_165/save_to_file/enabled": false, +"slice_165/save_to_file/keep_custom_tracks": false, +"slice_165/save_to_file/path": "", +"slice_165/start_frame": 0, +"slice_166/end_frame": 0, +"slice_166/loop_mode": 0, +"slice_166/name": "", +"slice_166/save_to_file/enabled": false, +"slice_166/save_to_file/keep_custom_tracks": false, +"slice_166/save_to_file/path": "", +"slice_166/start_frame": 0, +"slice_167/end_frame": 0, +"slice_167/loop_mode": 0, +"slice_167/name": "", +"slice_167/save_to_file/enabled": false, +"slice_167/save_to_file/keep_custom_tracks": false, +"slice_167/save_to_file/path": "", +"slice_167/start_frame": 0, +"slice_168/end_frame": 0, +"slice_168/loop_mode": 0, +"slice_168/name": "", +"slice_168/save_to_file/enabled": false, +"slice_168/save_to_file/keep_custom_tracks": false, +"slice_168/save_to_file/path": "", +"slice_168/start_frame": 0, +"slice_169/end_frame": 0, +"slice_169/loop_mode": 0, +"slice_169/name": "", +"slice_169/save_to_file/enabled": false, +"slice_169/save_to_file/keep_custom_tracks": false, +"slice_169/save_to_file/path": "", +"slice_169/start_frame": 0, +"slice_17/end_frame": 0, +"slice_17/loop_mode": 0, +"slice_17/name": "", +"slice_17/save_to_file/enabled": false, +"slice_17/save_to_file/keep_custom_tracks": false, +"slice_17/save_to_file/path": "", +"slice_17/start_frame": 0, +"slice_170/end_frame": 0, +"slice_170/loop_mode": 0, +"slice_170/name": "", +"slice_170/save_to_file/enabled": false, +"slice_170/save_to_file/keep_custom_tracks": false, +"slice_170/save_to_file/path": "", +"slice_170/start_frame": 0, +"slice_171/end_frame": 0, +"slice_171/loop_mode": 0, +"slice_171/name": "", +"slice_171/save_to_file/enabled": false, +"slice_171/save_to_file/keep_custom_tracks": false, +"slice_171/save_to_file/path": "", +"slice_171/start_frame": 0, +"slice_172/end_frame": 0, +"slice_172/loop_mode": 0, +"slice_172/name": "", +"slice_172/save_to_file/enabled": false, +"slice_172/save_to_file/keep_custom_tracks": false, +"slice_172/save_to_file/path": "", +"slice_172/start_frame": 0, +"slice_173/end_frame": 0, +"slice_173/loop_mode": 0, +"slice_173/name": "", +"slice_173/save_to_file/enabled": false, +"slice_173/save_to_file/keep_custom_tracks": false, +"slice_173/save_to_file/path": "", +"slice_173/start_frame": 0, +"slice_174/end_frame": 0, +"slice_174/loop_mode": 0, +"slice_174/name": "", +"slice_174/save_to_file/enabled": false, +"slice_174/save_to_file/keep_custom_tracks": false, +"slice_174/save_to_file/path": "", +"slice_174/start_frame": 0, +"slice_175/end_frame": 0, +"slice_175/loop_mode": 0, +"slice_175/name": "", +"slice_175/save_to_file/enabled": false, +"slice_175/save_to_file/keep_custom_tracks": false, +"slice_175/save_to_file/path": "", +"slice_175/start_frame": 0, +"slice_176/end_frame": 0, +"slice_176/loop_mode": 0, +"slice_176/name": "", +"slice_176/save_to_file/enabled": false, +"slice_176/save_to_file/keep_custom_tracks": false, +"slice_176/save_to_file/path": "", +"slice_176/start_frame": 0, +"slice_177/end_frame": 0, +"slice_177/loop_mode": 0, +"slice_177/name": "", +"slice_177/save_to_file/enabled": false, +"slice_177/save_to_file/keep_custom_tracks": false, +"slice_177/save_to_file/path": "", +"slice_177/start_frame": 0, +"slice_178/end_frame": 0, +"slice_178/loop_mode": 0, +"slice_178/name": "", +"slice_178/save_to_file/enabled": false, +"slice_178/save_to_file/keep_custom_tracks": false, +"slice_178/save_to_file/path": "", +"slice_178/start_frame": 0, +"slice_179/end_frame": 0, +"slice_179/loop_mode": 0, +"slice_179/name": "", +"slice_179/save_to_file/enabled": false, +"slice_179/save_to_file/keep_custom_tracks": false, +"slice_179/save_to_file/path": "", +"slice_179/start_frame": 0, +"slice_18/end_frame": 0, +"slice_18/loop_mode": 0, +"slice_18/name": "", +"slice_18/save_to_file/enabled": false, +"slice_18/save_to_file/keep_custom_tracks": false, +"slice_18/save_to_file/path": "", +"slice_18/start_frame": 0, +"slice_180/end_frame": 0, +"slice_180/loop_mode": 0, +"slice_180/name": "", +"slice_180/save_to_file/enabled": false, +"slice_180/save_to_file/keep_custom_tracks": false, +"slice_180/save_to_file/path": "", +"slice_180/start_frame": 0, +"slice_181/end_frame": 0, +"slice_181/loop_mode": 0, +"slice_181/name": "", +"slice_181/save_to_file/enabled": false, +"slice_181/save_to_file/keep_custom_tracks": false, +"slice_181/save_to_file/path": "", +"slice_181/start_frame": 0, +"slice_182/end_frame": 0, +"slice_182/loop_mode": 0, +"slice_182/name": "", +"slice_182/save_to_file/enabled": false, +"slice_182/save_to_file/keep_custom_tracks": false, +"slice_182/save_to_file/path": "", +"slice_182/start_frame": 0, +"slice_183/end_frame": 0, +"slice_183/loop_mode": 0, +"slice_183/name": "", +"slice_183/save_to_file/enabled": false, +"slice_183/save_to_file/keep_custom_tracks": false, +"slice_183/save_to_file/path": "", +"slice_183/start_frame": 0, +"slice_184/end_frame": 0, +"slice_184/loop_mode": 0, +"slice_184/name": "", +"slice_184/save_to_file/enabled": false, +"slice_184/save_to_file/keep_custom_tracks": false, +"slice_184/save_to_file/path": "", +"slice_184/start_frame": 0, +"slice_185/end_frame": 0, +"slice_185/loop_mode": 0, +"slice_185/name": "", +"slice_185/save_to_file/enabled": false, +"slice_185/save_to_file/keep_custom_tracks": false, +"slice_185/save_to_file/path": "", +"slice_185/start_frame": 0, +"slice_186/end_frame": 0, +"slice_186/loop_mode": 0, +"slice_186/name": "", +"slice_186/save_to_file/enabled": false, +"slice_186/save_to_file/keep_custom_tracks": false, +"slice_186/save_to_file/path": "", +"slice_186/start_frame": 0, +"slice_187/end_frame": 0, +"slice_187/loop_mode": 0, +"slice_187/name": "", +"slice_187/save_to_file/enabled": false, +"slice_187/save_to_file/keep_custom_tracks": false, +"slice_187/save_to_file/path": "", +"slice_187/start_frame": 0, +"slice_188/end_frame": 0, +"slice_188/loop_mode": 0, +"slice_188/name": "", +"slice_188/save_to_file/enabled": false, +"slice_188/save_to_file/keep_custom_tracks": false, +"slice_188/save_to_file/path": "", +"slice_188/start_frame": 0, +"slice_189/end_frame": 0, +"slice_189/loop_mode": 0, +"slice_189/name": "", +"slice_189/save_to_file/enabled": false, +"slice_189/save_to_file/keep_custom_tracks": false, +"slice_189/save_to_file/path": "", +"slice_189/start_frame": 0, +"slice_19/end_frame": 0, +"slice_19/loop_mode": 0, +"slice_19/name": "", +"slice_19/save_to_file/enabled": false, +"slice_19/save_to_file/keep_custom_tracks": false, +"slice_19/save_to_file/path": "", +"slice_19/start_frame": 0, +"slice_190/end_frame": 0, +"slice_190/loop_mode": 0, +"slice_190/name": "", +"slice_190/save_to_file/enabled": false, +"slice_190/save_to_file/keep_custom_tracks": false, +"slice_190/save_to_file/path": "", +"slice_190/start_frame": 0, +"slice_191/end_frame": 0, +"slice_191/loop_mode": 0, +"slice_191/name": "", +"slice_191/save_to_file/enabled": false, +"slice_191/save_to_file/keep_custom_tracks": false, +"slice_191/save_to_file/path": "", +"slice_191/start_frame": 0, +"slice_192/end_frame": 0, +"slice_192/loop_mode": 0, +"slice_192/name": "", +"slice_192/save_to_file/enabled": false, +"slice_192/save_to_file/keep_custom_tracks": false, +"slice_192/save_to_file/path": "", +"slice_192/start_frame": 0, +"slice_193/end_frame": 0, +"slice_193/loop_mode": 0, +"slice_193/name": "", +"slice_193/save_to_file/enabled": false, +"slice_193/save_to_file/keep_custom_tracks": false, +"slice_193/save_to_file/path": "", +"slice_193/start_frame": 0, +"slice_194/end_frame": 0, +"slice_194/loop_mode": 0, +"slice_194/name": "", +"slice_194/save_to_file/enabled": false, +"slice_194/save_to_file/keep_custom_tracks": false, +"slice_194/save_to_file/path": "", +"slice_194/start_frame": 0, +"slice_195/end_frame": 0, +"slice_195/loop_mode": 0, +"slice_195/name": "", +"slice_195/save_to_file/enabled": false, +"slice_195/save_to_file/keep_custom_tracks": false, +"slice_195/save_to_file/path": "", +"slice_195/start_frame": 0, +"slice_196/end_frame": 0, +"slice_196/loop_mode": 0, +"slice_196/name": "", +"slice_196/save_to_file/enabled": false, +"slice_196/save_to_file/keep_custom_tracks": false, +"slice_196/save_to_file/path": "", +"slice_196/start_frame": 0, +"slice_197/end_frame": 0, +"slice_197/loop_mode": 0, +"slice_197/name": "", +"slice_197/save_to_file/enabled": false, +"slice_197/save_to_file/keep_custom_tracks": false, +"slice_197/save_to_file/path": "", +"slice_197/start_frame": 0, +"slice_198/end_frame": 0, +"slice_198/loop_mode": 0, +"slice_198/name": "", +"slice_198/save_to_file/enabled": false, +"slice_198/save_to_file/keep_custom_tracks": false, +"slice_198/save_to_file/path": "", +"slice_198/start_frame": 0, +"slice_199/end_frame": 0, +"slice_199/loop_mode": 0, +"slice_199/name": "", +"slice_199/save_to_file/enabled": false, +"slice_199/save_to_file/keep_custom_tracks": false, +"slice_199/save_to_file/path": "", +"slice_199/start_frame": 0, +"slice_2/end_frame": 0, +"slice_2/loop_mode": 0, +"slice_2/name": "", +"slice_2/save_to_file/enabled": false, +"slice_2/save_to_file/keep_custom_tracks": false, +"slice_2/save_to_file/path": "", +"slice_2/start_frame": 0, +"slice_20/end_frame": 0, +"slice_20/loop_mode": 0, +"slice_20/name": "", +"slice_20/save_to_file/enabled": false, +"slice_20/save_to_file/keep_custom_tracks": false, +"slice_20/save_to_file/path": "", +"slice_20/start_frame": 0, +"slice_200/end_frame": 0, +"slice_200/loop_mode": 0, +"slice_200/name": "", +"slice_200/save_to_file/enabled": false, +"slice_200/save_to_file/keep_custom_tracks": false, +"slice_200/save_to_file/path": "", +"slice_200/start_frame": 0, +"slice_201/end_frame": 0, +"slice_201/loop_mode": 0, +"slice_201/name": "", +"slice_201/save_to_file/enabled": false, +"slice_201/save_to_file/keep_custom_tracks": false, +"slice_201/save_to_file/path": "", +"slice_201/start_frame": 0, +"slice_202/end_frame": 0, +"slice_202/loop_mode": 0, +"slice_202/name": "", +"slice_202/save_to_file/enabled": false, +"slice_202/save_to_file/keep_custom_tracks": false, +"slice_202/save_to_file/path": "", +"slice_202/start_frame": 0, +"slice_203/end_frame": 0, +"slice_203/loop_mode": 0, +"slice_203/name": "", +"slice_203/save_to_file/enabled": false, +"slice_203/save_to_file/keep_custom_tracks": false, +"slice_203/save_to_file/path": "", +"slice_203/start_frame": 0, +"slice_204/end_frame": 0, +"slice_204/loop_mode": 0, +"slice_204/name": "", +"slice_204/save_to_file/enabled": false, +"slice_204/save_to_file/keep_custom_tracks": false, +"slice_204/save_to_file/path": "", +"slice_204/start_frame": 0, +"slice_205/end_frame": 0, +"slice_205/loop_mode": 0, +"slice_205/name": "", +"slice_205/save_to_file/enabled": false, +"slice_205/save_to_file/keep_custom_tracks": false, +"slice_205/save_to_file/path": "", +"slice_205/start_frame": 0, +"slice_206/end_frame": 0, +"slice_206/loop_mode": 0, +"slice_206/name": "", +"slice_206/save_to_file/enabled": false, +"slice_206/save_to_file/keep_custom_tracks": false, +"slice_206/save_to_file/path": "", +"slice_206/start_frame": 0, +"slice_207/end_frame": 0, +"slice_207/loop_mode": 0, +"slice_207/name": "", +"slice_207/save_to_file/enabled": false, +"slice_207/save_to_file/keep_custom_tracks": false, +"slice_207/save_to_file/path": "", +"slice_207/start_frame": 0, +"slice_208/end_frame": 0, +"slice_208/loop_mode": 0, +"slice_208/name": "", +"slice_208/save_to_file/enabled": false, +"slice_208/save_to_file/keep_custom_tracks": false, +"slice_208/save_to_file/path": "", +"slice_208/start_frame": 0, +"slice_209/end_frame": 0, +"slice_209/loop_mode": 0, +"slice_209/name": "", +"slice_209/save_to_file/enabled": false, +"slice_209/save_to_file/keep_custom_tracks": false, +"slice_209/save_to_file/path": "", +"slice_209/start_frame": 0, +"slice_21/end_frame": 0, +"slice_21/loop_mode": 0, +"slice_21/name": "", +"slice_21/save_to_file/enabled": false, +"slice_21/save_to_file/keep_custom_tracks": false, +"slice_21/save_to_file/path": "", +"slice_21/start_frame": 0, +"slice_210/end_frame": 0, +"slice_210/loop_mode": 0, +"slice_210/name": "", +"slice_210/save_to_file/enabled": false, +"slice_210/save_to_file/keep_custom_tracks": false, +"slice_210/save_to_file/path": "", +"slice_210/start_frame": 0, +"slice_211/end_frame": 0, +"slice_211/loop_mode": 0, +"slice_211/name": "", +"slice_211/save_to_file/enabled": false, +"slice_211/save_to_file/keep_custom_tracks": false, +"slice_211/save_to_file/path": "", +"slice_211/start_frame": 0, +"slice_212/end_frame": 0, +"slice_212/loop_mode": 0, +"slice_212/name": "", +"slice_212/save_to_file/enabled": false, +"slice_212/save_to_file/keep_custom_tracks": false, +"slice_212/save_to_file/path": "", +"slice_212/start_frame": 0, +"slice_213/end_frame": 0, +"slice_213/loop_mode": 0, +"slice_213/name": "", +"slice_213/save_to_file/enabled": false, +"slice_213/save_to_file/keep_custom_tracks": false, +"slice_213/save_to_file/path": "", +"slice_213/start_frame": 0, +"slice_214/end_frame": 0, +"slice_214/loop_mode": 0, +"slice_214/name": "", +"slice_214/save_to_file/enabled": false, +"slice_214/save_to_file/keep_custom_tracks": false, +"slice_214/save_to_file/path": "", +"slice_214/start_frame": 0, +"slice_215/end_frame": 0, +"slice_215/loop_mode": 0, +"slice_215/name": "", +"slice_215/save_to_file/enabled": false, +"slice_215/save_to_file/keep_custom_tracks": false, +"slice_215/save_to_file/path": "", +"slice_215/start_frame": 0, +"slice_216/end_frame": 0, +"slice_216/loop_mode": 0, +"slice_216/name": "", +"slice_216/save_to_file/enabled": false, +"slice_216/save_to_file/keep_custom_tracks": false, +"slice_216/save_to_file/path": "", +"slice_216/start_frame": 0, +"slice_217/end_frame": 0, +"slice_217/loop_mode": 0, +"slice_217/name": "", +"slice_217/save_to_file/enabled": false, +"slice_217/save_to_file/keep_custom_tracks": false, +"slice_217/save_to_file/path": "", +"slice_217/start_frame": 0, +"slice_218/end_frame": 0, +"slice_218/loop_mode": 0, +"slice_218/name": "", +"slice_218/save_to_file/enabled": false, +"slice_218/save_to_file/keep_custom_tracks": false, +"slice_218/save_to_file/path": "", +"slice_218/start_frame": 0, +"slice_219/end_frame": 0, +"slice_219/loop_mode": 0, +"slice_219/name": "", +"slice_219/save_to_file/enabled": false, +"slice_219/save_to_file/keep_custom_tracks": false, +"slice_219/save_to_file/path": "", +"slice_219/start_frame": 0, +"slice_22/end_frame": 0, +"slice_22/loop_mode": 0, +"slice_22/name": "", +"slice_22/save_to_file/enabled": false, +"slice_22/save_to_file/keep_custom_tracks": false, +"slice_22/save_to_file/path": "", +"slice_22/start_frame": 0, +"slice_220/end_frame": 0, +"slice_220/loop_mode": 0, +"slice_220/name": "", +"slice_220/save_to_file/enabled": false, +"slice_220/save_to_file/keep_custom_tracks": false, +"slice_220/save_to_file/path": "", +"slice_220/start_frame": 0, +"slice_221/end_frame": 0, +"slice_221/loop_mode": 0, +"slice_221/name": "", +"slice_221/save_to_file/enabled": false, +"slice_221/save_to_file/keep_custom_tracks": false, +"slice_221/save_to_file/path": "", +"slice_221/start_frame": 0, +"slice_222/end_frame": 0, +"slice_222/loop_mode": 0, +"slice_222/name": "", +"slice_222/save_to_file/enabled": false, +"slice_222/save_to_file/keep_custom_tracks": false, +"slice_222/save_to_file/path": "", +"slice_222/start_frame": 0, +"slice_223/end_frame": 0, +"slice_223/loop_mode": 0, +"slice_223/name": "", +"slice_223/save_to_file/enabled": false, +"slice_223/save_to_file/keep_custom_tracks": false, +"slice_223/save_to_file/path": "", +"slice_223/start_frame": 0, +"slice_224/end_frame": 0, +"slice_224/loop_mode": 0, +"slice_224/name": "", +"slice_224/save_to_file/enabled": false, +"slice_224/save_to_file/keep_custom_tracks": false, +"slice_224/save_to_file/path": "", +"slice_224/start_frame": 0, +"slice_225/end_frame": 0, +"slice_225/loop_mode": 0, +"slice_225/name": "", +"slice_225/save_to_file/enabled": false, +"slice_225/save_to_file/keep_custom_tracks": false, +"slice_225/save_to_file/path": "", +"slice_225/start_frame": 0, +"slice_226/end_frame": 0, +"slice_226/loop_mode": 0, +"slice_226/name": "", +"slice_226/save_to_file/enabled": false, +"slice_226/save_to_file/keep_custom_tracks": false, +"slice_226/save_to_file/path": "", +"slice_226/start_frame": 0, +"slice_227/end_frame": 0, +"slice_227/loop_mode": 0, +"slice_227/name": "", +"slice_227/save_to_file/enabled": false, +"slice_227/save_to_file/keep_custom_tracks": false, +"slice_227/save_to_file/path": "", +"slice_227/start_frame": 0, +"slice_228/end_frame": 0, +"slice_228/loop_mode": 0, +"slice_228/name": "", +"slice_228/save_to_file/enabled": false, +"slice_228/save_to_file/keep_custom_tracks": false, +"slice_228/save_to_file/path": "", +"slice_228/start_frame": 0, +"slice_229/end_frame": 0, +"slice_229/loop_mode": 0, +"slice_229/name": "", +"slice_229/save_to_file/enabled": false, +"slice_229/save_to_file/keep_custom_tracks": false, +"slice_229/save_to_file/path": "", +"slice_229/start_frame": 0, +"slice_23/end_frame": 0, +"slice_23/loop_mode": 0, +"slice_23/name": "", +"slice_23/save_to_file/enabled": false, +"slice_23/save_to_file/keep_custom_tracks": false, +"slice_23/save_to_file/path": "", +"slice_23/start_frame": 0, +"slice_230/end_frame": 0, +"slice_230/loop_mode": 0, +"slice_230/name": "", +"slice_230/save_to_file/enabled": false, +"slice_230/save_to_file/keep_custom_tracks": false, +"slice_230/save_to_file/path": "", +"slice_230/start_frame": 0, +"slice_231/end_frame": 0, +"slice_231/loop_mode": 0, +"slice_231/name": "", +"slice_231/save_to_file/enabled": false, +"slice_231/save_to_file/keep_custom_tracks": false, +"slice_231/save_to_file/path": "", +"slice_231/start_frame": 0, +"slice_232/end_frame": 0, +"slice_232/loop_mode": 0, +"slice_232/name": "", +"slice_232/save_to_file/enabled": false, +"slice_232/save_to_file/keep_custom_tracks": false, +"slice_232/save_to_file/path": "", +"slice_232/start_frame": 0, +"slice_233/end_frame": 0, +"slice_233/loop_mode": 0, +"slice_233/name": "", +"slice_233/save_to_file/enabled": false, +"slice_233/save_to_file/keep_custom_tracks": false, +"slice_233/save_to_file/path": "", +"slice_233/start_frame": 0, +"slice_234/end_frame": 0, +"slice_234/loop_mode": 0, +"slice_234/name": "", +"slice_234/save_to_file/enabled": false, +"slice_234/save_to_file/keep_custom_tracks": false, +"slice_234/save_to_file/path": "", +"slice_234/start_frame": 0, +"slice_235/end_frame": 0, +"slice_235/loop_mode": 0, +"slice_235/name": "", +"slice_235/save_to_file/enabled": false, +"slice_235/save_to_file/keep_custom_tracks": false, +"slice_235/save_to_file/path": "", +"slice_235/start_frame": 0, +"slice_236/end_frame": 0, +"slice_236/loop_mode": 0, +"slice_236/name": "", +"slice_236/save_to_file/enabled": false, +"slice_236/save_to_file/keep_custom_tracks": false, +"slice_236/save_to_file/path": "", +"slice_236/start_frame": 0, +"slice_237/end_frame": 0, +"slice_237/loop_mode": 0, +"slice_237/name": "", +"slice_237/save_to_file/enabled": false, +"slice_237/save_to_file/keep_custom_tracks": false, +"slice_237/save_to_file/path": "", +"slice_237/start_frame": 0, +"slice_238/end_frame": 0, +"slice_238/loop_mode": 0, +"slice_238/name": "", +"slice_238/save_to_file/enabled": false, +"slice_238/save_to_file/keep_custom_tracks": false, +"slice_238/save_to_file/path": "", +"slice_238/start_frame": 0, +"slice_239/end_frame": 0, +"slice_239/loop_mode": 0, +"slice_239/name": "", +"slice_239/save_to_file/enabled": false, +"slice_239/save_to_file/keep_custom_tracks": false, +"slice_239/save_to_file/path": "", +"slice_239/start_frame": 0, +"slice_24/end_frame": 0, +"slice_24/loop_mode": 0, +"slice_24/name": "", +"slice_24/save_to_file/enabled": false, +"slice_24/save_to_file/keep_custom_tracks": false, +"slice_24/save_to_file/path": "", +"slice_24/start_frame": 0, +"slice_240/end_frame": 0, +"slice_240/loop_mode": 0, +"slice_240/name": "", +"slice_240/save_to_file/enabled": false, +"slice_240/save_to_file/keep_custom_tracks": false, +"slice_240/save_to_file/path": "", +"slice_240/start_frame": 0, +"slice_241/end_frame": 0, +"slice_241/loop_mode": 0, +"slice_241/name": "", +"slice_241/save_to_file/enabled": false, +"slice_241/save_to_file/keep_custom_tracks": false, +"slice_241/save_to_file/path": "", +"slice_241/start_frame": 0, +"slice_242/end_frame": 0, +"slice_242/loop_mode": 0, +"slice_242/name": "", +"slice_242/save_to_file/enabled": false, +"slice_242/save_to_file/keep_custom_tracks": false, +"slice_242/save_to_file/path": "", +"slice_242/start_frame": 0, +"slice_243/end_frame": 0, +"slice_243/loop_mode": 0, +"slice_243/name": "", +"slice_243/save_to_file/enabled": false, +"slice_243/save_to_file/keep_custom_tracks": false, +"slice_243/save_to_file/path": "", +"slice_243/start_frame": 0, +"slice_244/end_frame": 0, +"slice_244/loop_mode": 0, +"slice_244/name": "", +"slice_244/save_to_file/enabled": false, +"slice_244/save_to_file/keep_custom_tracks": false, +"slice_244/save_to_file/path": "", +"slice_244/start_frame": 0, +"slice_245/end_frame": 0, +"slice_245/loop_mode": 0, +"slice_245/name": "", +"slice_245/save_to_file/enabled": false, +"slice_245/save_to_file/keep_custom_tracks": false, +"slice_245/save_to_file/path": "", +"slice_245/start_frame": 0, +"slice_246/end_frame": 0, +"slice_246/loop_mode": 0, +"slice_246/name": "", +"slice_246/save_to_file/enabled": false, +"slice_246/save_to_file/keep_custom_tracks": false, +"slice_246/save_to_file/path": "", +"slice_246/start_frame": 0, +"slice_247/end_frame": 0, +"slice_247/loop_mode": 0, +"slice_247/name": "", +"slice_247/save_to_file/enabled": false, +"slice_247/save_to_file/keep_custom_tracks": false, +"slice_247/save_to_file/path": "", +"slice_247/start_frame": 0, +"slice_248/end_frame": 0, +"slice_248/loop_mode": 0, +"slice_248/name": "", +"slice_248/save_to_file/enabled": false, +"slice_248/save_to_file/keep_custom_tracks": false, +"slice_248/save_to_file/path": "", +"slice_248/start_frame": 0, +"slice_249/end_frame": 0, +"slice_249/loop_mode": 0, +"slice_249/name": "", +"slice_249/save_to_file/enabled": false, +"slice_249/save_to_file/keep_custom_tracks": false, +"slice_249/save_to_file/path": "", +"slice_249/start_frame": 0, +"slice_25/end_frame": 0, +"slice_25/loop_mode": 0, +"slice_25/name": "", +"slice_25/save_to_file/enabled": false, +"slice_25/save_to_file/keep_custom_tracks": false, +"slice_25/save_to_file/path": "", +"slice_25/start_frame": 0, +"slice_250/end_frame": 0, +"slice_250/loop_mode": 0, +"slice_250/name": "", +"slice_250/save_to_file/enabled": false, +"slice_250/save_to_file/keep_custom_tracks": false, +"slice_250/save_to_file/path": "", +"slice_250/start_frame": 0, +"slice_251/end_frame": 0, +"slice_251/loop_mode": 0, +"slice_251/name": "", +"slice_251/save_to_file/enabled": false, +"slice_251/save_to_file/keep_custom_tracks": false, +"slice_251/save_to_file/path": "", +"slice_251/start_frame": 0, +"slice_252/end_frame": 0, +"slice_252/loop_mode": 0, +"slice_252/name": "", +"slice_252/save_to_file/enabled": false, +"slice_252/save_to_file/keep_custom_tracks": false, +"slice_252/save_to_file/path": "", +"slice_252/start_frame": 0, +"slice_253/end_frame": 0, +"slice_253/loop_mode": 0, +"slice_253/name": "", +"slice_253/save_to_file/enabled": false, +"slice_253/save_to_file/keep_custom_tracks": false, +"slice_253/save_to_file/path": "", +"slice_253/start_frame": 0, +"slice_254/end_frame": 0, +"slice_254/loop_mode": 0, +"slice_254/name": "", +"slice_254/save_to_file/enabled": false, +"slice_254/save_to_file/keep_custom_tracks": false, +"slice_254/save_to_file/path": "", +"slice_254/start_frame": 0, +"slice_255/end_frame": 0, +"slice_255/loop_mode": 0, +"slice_255/name": "", +"slice_255/save_to_file/enabled": false, +"slice_255/save_to_file/keep_custom_tracks": false, +"slice_255/save_to_file/path": "", +"slice_255/start_frame": 0, +"slice_256/end_frame": 0, +"slice_256/loop_mode": 0, +"slice_256/name": "", +"slice_256/save_to_file/enabled": false, +"slice_256/save_to_file/keep_custom_tracks": false, +"slice_256/save_to_file/path": "", +"slice_256/start_frame": 0, +"slice_26/end_frame": 0, +"slice_26/loop_mode": 0, +"slice_26/name": "", +"slice_26/save_to_file/enabled": false, +"slice_26/save_to_file/keep_custom_tracks": false, +"slice_26/save_to_file/path": "", +"slice_26/start_frame": 0, +"slice_27/end_frame": 0, +"slice_27/loop_mode": 0, +"slice_27/name": "", +"slice_27/save_to_file/enabled": false, +"slice_27/save_to_file/keep_custom_tracks": false, +"slice_27/save_to_file/path": "", +"slice_27/start_frame": 0, +"slice_28/end_frame": 0, +"slice_28/loop_mode": 0, +"slice_28/name": "", +"slice_28/save_to_file/enabled": false, +"slice_28/save_to_file/keep_custom_tracks": false, +"slice_28/save_to_file/path": "", +"slice_28/start_frame": 0, +"slice_29/end_frame": 0, +"slice_29/loop_mode": 0, +"slice_29/name": "", +"slice_29/save_to_file/enabled": false, +"slice_29/save_to_file/keep_custom_tracks": false, +"slice_29/save_to_file/path": "", +"slice_29/start_frame": 0, +"slice_3/end_frame": 0, +"slice_3/loop_mode": 0, +"slice_3/name": "", +"slice_3/save_to_file/enabled": false, +"slice_3/save_to_file/keep_custom_tracks": false, +"slice_3/save_to_file/path": "", +"slice_3/start_frame": 0, +"slice_30/end_frame": 0, +"slice_30/loop_mode": 0, +"slice_30/name": "", +"slice_30/save_to_file/enabled": false, +"slice_30/save_to_file/keep_custom_tracks": false, +"slice_30/save_to_file/path": "", +"slice_30/start_frame": 0, +"slice_31/end_frame": 0, +"slice_31/loop_mode": 0, +"slice_31/name": "", +"slice_31/save_to_file/enabled": false, +"slice_31/save_to_file/keep_custom_tracks": false, +"slice_31/save_to_file/path": "", +"slice_31/start_frame": 0, +"slice_32/end_frame": 0, +"slice_32/loop_mode": 0, +"slice_32/name": "", +"slice_32/save_to_file/enabled": false, +"slice_32/save_to_file/keep_custom_tracks": false, +"slice_32/save_to_file/path": "", +"slice_32/start_frame": 0, +"slice_33/end_frame": 0, +"slice_33/loop_mode": 0, +"slice_33/name": "", +"slice_33/save_to_file/enabled": false, +"slice_33/save_to_file/keep_custom_tracks": false, +"slice_33/save_to_file/path": "", +"slice_33/start_frame": 0, +"slice_34/end_frame": 0, +"slice_34/loop_mode": 0, +"slice_34/name": "", +"slice_34/save_to_file/enabled": false, +"slice_34/save_to_file/keep_custom_tracks": false, +"slice_34/save_to_file/path": "", +"slice_34/start_frame": 0, +"slice_35/end_frame": 0, +"slice_35/loop_mode": 0, +"slice_35/name": "", +"slice_35/save_to_file/enabled": false, +"slice_35/save_to_file/keep_custom_tracks": false, +"slice_35/save_to_file/path": "", +"slice_35/start_frame": 0, +"slice_36/end_frame": 0, +"slice_36/loop_mode": 0, +"slice_36/name": "", +"slice_36/save_to_file/enabled": false, +"slice_36/save_to_file/keep_custom_tracks": false, +"slice_36/save_to_file/path": "", +"slice_36/start_frame": 0, +"slice_37/end_frame": 0, +"slice_37/loop_mode": 0, +"slice_37/name": "", +"slice_37/save_to_file/enabled": false, +"slice_37/save_to_file/keep_custom_tracks": false, +"slice_37/save_to_file/path": "", +"slice_37/start_frame": 0, +"slice_38/end_frame": 0, +"slice_38/loop_mode": 0, +"slice_38/name": "", +"slice_38/save_to_file/enabled": false, +"slice_38/save_to_file/keep_custom_tracks": false, +"slice_38/save_to_file/path": "", +"slice_38/start_frame": 0, +"slice_39/end_frame": 0, +"slice_39/loop_mode": 0, +"slice_39/name": "", +"slice_39/save_to_file/enabled": false, +"slice_39/save_to_file/keep_custom_tracks": false, +"slice_39/save_to_file/path": "", +"slice_39/start_frame": 0, +"slice_4/end_frame": 0, +"slice_4/loop_mode": 0, +"slice_4/name": "", +"slice_4/save_to_file/enabled": false, +"slice_4/save_to_file/keep_custom_tracks": false, +"slice_4/save_to_file/path": "", +"slice_4/start_frame": 0, +"slice_40/end_frame": 0, +"slice_40/loop_mode": 0, +"slice_40/name": "", +"slice_40/save_to_file/enabled": false, +"slice_40/save_to_file/keep_custom_tracks": false, +"slice_40/save_to_file/path": "", +"slice_40/start_frame": 0, +"slice_41/end_frame": 0, +"slice_41/loop_mode": 0, +"slice_41/name": "", +"slice_41/save_to_file/enabled": false, +"slice_41/save_to_file/keep_custom_tracks": false, +"slice_41/save_to_file/path": "", +"slice_41/start_frame": 0, +"slice_42/end_frame": 0, +"slice_42/loop_mode": 0, +"slice_42/name": "", +"slice_42/save_to_file/enabled": false, +"slice_42/save_to_file/keep_custom_tracks": false, +"slice_42/save_to_file/path": "", +"slice_42/start_frame": 0, +"slice_43/end_frame": 0, +"slice_43/loop_mode": 0, +"slice_43/name": "", +"slice_43/save_to_file/enabled": false, +"slice_43/save_to_file/keep_custom_tracks": false, +"slice_43/save_to_file/path": "", +"slice_43/start_frame": 0, +"slice_44/end_frame": 0, +"slice_44/loop_mode": 0, +"slice_44/name": "", +"slice_44/save_to_file/enabled": false, +"slice_44/save_to_file/keep_custom_tracks": false, +"slice_44/save_to_file/path": "", +"slice_44/start_frame": 0, +"slice_45/end_frame": 0, +"slice_45/loop_mode": 0, +"slice_45/name": "", +"slice_45/save_to_file/enabled": false, +"slice_45/save_to_file/keep_custom_tracks": false, +"slice_45/save_to_file/path": "", +"slice_45/start_frame": 0, +"slice_46/end_frame": 0, +"slice_46/loop_mode": 0, +"slice_46/name": "", +"slice_46/save_to_file/enabled": false, +"slice_46/save_to_file/keep_custom_tracks": false, +"slice_46/save_to_file/path": "", +"slice_46/start_frame": 0, +"slice_47/end_frame": 0, +"slice_47/loop_mode": 0, +"slice_47/name": "", +"slice_47/save_to_file/enabled": false, +"slice_47/save_to_file/keep_custom_tracks": false, +"slice_47/save_to_file/path": "", +"slice_47/start_frame": 0, +"slice_48/end_frame": 0, +"slice_48/loop_mode": 0, +"slice_48/name": "", +"slice_48/save_to_file/enabled": false, +"slice_48/save_to_file/keep_custom_tracks": false, +"slice_48/save_to_file/path": "", +"slice_48/start_frame": 0, +"slice_49/end_frame": 0, +"slice_49/loop_mode": 0, +"slice_49/name": "", +"slice_49/save_to_file/enabled": false, +"slice_49/save_to_file/keep_custom_tracks": false, +"slice_49/save_to_file/path": "", +"slice_49/start_frame": 0, +"slice_5/end_frame": 0, +"slice_5/loop_mode": 0, +"slice_5/name": "", +"slice_5/save_to_file/enabled": false, +"slice_5/save_to_file/keep_custom_tracks": false, +"slice_5/save_to_file/path": "", +"slice_5/start_frame": 0, +"slice_50/end_frame": 0, +"slice_50/loop_mode": 0, +"slice_50/name": "", +"slice_50/save_to_file/enabled": false, +"slice_50/save_to_file/keep_custom_tracks": false, +"slice_50/save_to_file/path": "", +"slice_50/start_frame": 0, +"slice_51/end_frame": 0, +"slice_51/loop_mode": 0, +"slice_51/name": "", +"slice_51/save_to_file/enabled": false, +"slice_51/save_to_file/keep_custom_tracks": false, +"slice_51/save_to_file/path": "", +"slice_51/start_frame": 0, +"slice_52/end_frame": 0, +"slice_52/loop_mode": 0, +"slice_52/name": "", +"slice_52/save_to_file/enabled": false, +"slice_52/save_to_file/keep_custom_tracks": false, +"slice_52/save_to_file/path": "", +"slice_52/start_frame": 0, +"slice_53/end_frame": 0, +"slice_53/loop_mode": 0, +"slice_53/name": "", +"slice_53/save_to_file/enabled": false, +"slice_53/save_to_file/keep_custom_tracks": false, +"slice_53/save_to_file/path": "", +"slice_53/start_frame": 0, +"slice_54/end_frame": 0, +"slice_54/loop_mode": 0, +"slice_54/name": "", +"slice_54/save_to_file/enabled": false, +"slice_54/save_to_file/keep_custom_tracks": false, +"slice_54/save_to_file/path": "", +"slice_54/start_frame": 0, +"slice_55/end_frame": 0, +"slice_55/loop_mode": 0, +"slice_55/name": "", +"slice_55/save_to_file/enabled": false, +"slice_55/save_to_file/keep_custom_tracks": false, +"slice_55/save_to_file/path": "", +"slice_55/start_frame": 0, +"slice_56/end_frame": 0, +"slice_56/loop_mode": 0, +"slice_56/name": "", +"slice_56/save_to_file/enabled": false, +"slice_56/save_to_file/keep_custom_tracks": false, +"slice_56/save_to_file/path": "", +"slice_56/start_frame": 0, +"slice_57/end_frame": 0, +"slice_57/loop_mode": 0, +"slice_57/name": "", +"slice_57/save_to_file/enabled": false, +"slice_57/save_to_file/keep_custom_tracks": false, +"slice_57/save_to_file/path": "", +"slice_57/start_frame": 0, +"slice_58/end_frame": 0, +"slice_58/loop_mode": 0, +"slice_58/name": "", +"slice_58/save_to_file/enabled": false, +"slice_58/save_to_file/keep_custom_tracks": false, +"slice_58/save_to_file/path": "", +"slice_58/start_frame": 0, +"slice_59/end_frame": 0, +"slice_59/loop_mode": 0, +"slice_59/name": "", +"slice_59/save_to_file/enabled": false, +"slice_59/save_to_file/keep_custom_tracks": false, +"slice_59/save_to_file/path": "", +"slice_59/start_frame": 0, +"slice_6/end_frame": 0, +"slice_6/loop_mode": 0, +"slice_6/name": "", +"slice_6/save_to_file/enabled": false, +"slice_6/save_to_file/keep_custom_tracks": false, +"slice_6/save_to_file/path": "", +"slice_6/start_frame": 0, +"slice_60/end_frame": 0, +"slice_60/loop_mode": 0, +"slice_60/name": "", +"slice_60/save_to_file/enabled": false, +"slice_60/save_to_file/keep_custom_tracks": false, +"slice_60/save_to_file/path": "", +"slice_60/start_frame": 0, +"slice_61/end_frame": 0, +"slice_61/loop_mode": 0, +"slice_61/name": "", +"slice_61/save_to_file/enabled": false, +"slice_61/save_to_file/keep_custom_tracks": false, +"slice_61/save_to_file/path": "", +"slice_61/start_frame": 0, +"slice_62/end_frame": 0, +"slice_62/loop_mode": 0, +"slice_62/name": "", +"slice_62/save_to_file/enabled": false, +"slice_62/save_to_file/keep_custom_tracks": false, +"slice_62/save_to_file/path": "", +"slice_62/start_frame": 0, +"slice_63/end_frame": 0, +"slice_63/loop_mode": 0, +"slice_63/name": "", +"slice_63/save_to_file/enabled": false, +"slice_63/save_to_file/keep_custom_tracks": false, +"slice_63/save_to_file/path": "", +"slice_63/start_frame": 0, +"slice_64/end_frame": 0, +"slice_64/loop_mode": 0, +"slice_64/name": "", +"slice_64/save_to_file/enabled": false, +"slice_64/save_to_file/keep_custom_tracks": false, +"slice_64/save_to_file/path": "", +"slice_64/start_frame": 0, +"slice_65/end_frame": 0, +"slice_65/loop_mode": 0, +"slice_65/name": "", +"slice_65/save_to_file/enabled": false, +"slice_65/save_to_file/keep_custom_tracks": false, +"slice_65/save_to_file/path": "", +"slice_65/start_frame": 0, +"slice_66/end_frame": 0, +"slice_66/loop_mode": 0, +"slice_66/name": "", +"slice_66/save_to_file/enabled": false, +"slice_66/save_to_file/keep_custom_tracks": false, +"slice_66/save_to_file/path": "", +"slice_66/start_frame": 0, +"slice_67/end_frame": 0, +"slice_67/loop_mode": 0, +"slice_67/name": "", +"slice_67/save_to_file/enabled": false, +"slice_67/save_to_file/keep_custom_tracks": false, +"slice_67/save_to_file/path": "", +"slice_67/start_frame": 0, +"slice_68/end_frame": 0, +"slice_68/loop_mode": 0, +"slice_68/name": "", +"slice_68/save_to_file/enabled": false, +"slice_68/save_to_file/keep_custom_tracks": false, +"slice_68/save_to_file/path": "", +"slice_68/start_frame": 0, +"slice_69/end_frame": 0, +"slice_69/loop_mode": 0, +"slice_69/name": "", +"slice_69/save_to_file/enabled": false, +"slice_69/save_to_file/keep_custom_tracks": false, +"slice_69/save_to_file/path": "", +"slice_69/start_frame": 0, +"slice_7/end_frame": 0, +"slice_7/loop_mode": 0, +"slice_7/name": "", +"slice_7/save_to_file/enabled": false, +"slice_7/save_to_file/keep_custom_tracks": false, +"slice_7/save_to_file/path": "", +"slice_7/start_frame": 0, +"slice_70/end_frame": 0, +"slice_70/loop_mode": 0, +"slice_70/name": "", +"slice_70/save_to_file/enabled": false, +"slice_70/save_to_file/keep_custom_tracks": false, +"slice_70/save_to_file/path": "", +"slice_70/start_frame": 0, +"slice_71/end_frame": 0, +"slice_71/loop_mode": 0, +"slice_71/name": "", +"slice_71/save_to_file/enabled": false, +"slice_71/save_to_file/keep_custom_tracks": false, +"slice_71/save_to_file/path": "", +"slice_71/start_frame": 0, +"slice_72/end_frame": 0, +"slice_72/loop_mode": 0, +"slice_72/name": "", +"slice_72/save_to_file/enabled": false, +"slice_72/save_to_file/keep_custom_tracks": false, +"slice_72/save_to_file/path": "", +"slice_72/start_frame": 0, +"slice_73/end_frame": 0, +"slice_73/loop_mode": 0, +"slice_73/name": "", +"slice_73/save_to_file/enabled": false, +"slice_73/save_to_file/keep_custom_tracks": false, +"slice_73/save_to_file/path": "", +"slice_73/start_frame": 0, +"slice_74/end_frame": 0, +"slice_74/loop_mode": 0, +"slice_74/name": "", +"slice_74/save_to_file/enabled": false, +"slice_74/save_to_file/keep_custom_tracks": false, +"slice_74/save_to_file/path": "", +"slice_74/start_frame": 0, +"slice_75/end_frame": 0, +"slice_75/loop_mode": 0, +"slice_75/name": "", +"slice_75/save_to_file/enabled": false, +"slice_75/save_to_file/keep_custom_tracks": false, +"slice_75/save_to_file/path": "", +"slice_75/start_frame": 0, +"slice_76/end_frame": 0, +"slice_76/loop_mode": 0, +"slice_76/name": "", +"slice_76/save_to_file/enabled": false, +"slice_76/save_to_file/keep_custom_tracks": false, +"slice_76/save_to_file/path": "", +"slice_76/start_frame": 0, +"slice_77/end_frame": 0, +"slice_77/loop_mode": 0, +"slice_77/name": "", +"slice_77/save_to_file/enabled": false, +"slice_77/save_to_file/keep_custom_tracks": false, +"slice_77/save_to_file/path": "", +"slice_77/start_frame": 0, +"slice_78/end_frame": 0, +"slice_78/loop_mode": 0, +"slice_78/name": "", +"slice_78/save_to_file/enabled": false, +"slice_78/save_to_file/keep_custom_tracks": false, +"slice_78/save_to_file/path": "", +"slice_78/start_frame": 0, +"slice_79/end_frame": 0, +"slice_79/loop_mode": 0, +"slice_79/name": "", +"slice_79/save_to_file/enabled": false, +"slice_79/save_to_file/keep_custom_tracks": false, +"slice_79/save_to_file/path": "", +"slice_79/start_frame": 0, +"slice_8/end_frame": 0, +"slice_8/loop_mode": 0, +"slice_8/name": "", +"slice_8/save_to_file/enabled": false, +"slice_8/save_to_file/keep_custom_tracks": false, +"slice_8/save_to_file/path": "", +"slice_8/start_frame": 0, +"slice_80/end_frame": 0, +"slice_80/loop_mode": 0, +"slice_80/name": "", +"slice_80/save_to_file/enabled": false, +"slice_80/save_to_file/keep_custom_tracks": false, +"slice_80/save_to_file/path": "", +"slice_80/start_frame": 0, +"slice_81/end_frame": 0, +"slice_81/loop_mode": 0, +"slice_81/name": "", +"slice_81/save_to_file/enabled": false, +"slice_81/save_to_file/keep_custom_tracks": false, +"slice_81/save_to_file/path": "", +"slice_81/start_frame": 0, +"slice_82/end_frame": 0, +"slice_82/loop_mode": 0, +"slice_82/name": "", +"slice_82/save_to_file/enabled": false, +"slice_82/save_to_file/keep_custom_tracks": false, +"slice_82/save_to_file/path": "", +"slice_82/start_frame": 0, +"slice_83/end_frame": 0, +"slice_83/loop_mode": 0, +"slice_83/name": "", +"slice_83/save_to_file/enabled": false, +"slice_83/save_to_file/keep_custom_tracks": false, +"slice_83/save_to_file/path": "", +"slice_83/start_frame": 0, +"slice_84/end_frame": 0, +"slice_84/loop_mode": 0, +"slice_84/name": "", +"slice_84/save_to_file/enabled": false, +"slice_84/save_to_file/keep_custom_tracks": false, +"slice_84/save_to_file/path": "", +"slice_84/start_frame": 0, +"slice_85/end_frame": 0, +"slice_85/loop_mode": 0, +"slice_85/name": "", +"slice_85/save_to_file/enabled": false, +"slice_85/save_to_file/keep_custom_tracks": false, +"slice_85/save_to_file/path": "", +"slice_85/start_frame": 0, +"slice_86/end_frame": 0, +"slice_86/loop_mode": 0, +"slice_86/name": "", +"slice_86/save_to_file/enabled": false, +"slice_86/save_to_file/keep_custom_tracks": false, +"slice_86/save_to_file/path": "", +"slice_86/start_frame": 0, +"slice_87/end_frame": 0, +"slice_87/loop_mode": 0, +"slice_87/name": "", +"slice_87/save_to_file/enabled": false, +"slice_87/save_to_file/keep_custom_tracks": false, +"slice_87/save_to_file/path": "", +"slice_87/start_frame": 0, +"slice_88/end_frame": 0, +"slice_88/loop_mode": 0, +"slice_88/name": "", +"slice_88/save_to_file/enabled": false, +"slice_88/save_to_file/keep_custom_tracks": false, +"slice_88/save_to_file/path": "", +"slice_88/start_frame": 0, +"slice_89/end_frame": 0, +"slice_89/loop_mode": 0, +"slice_89/name": "", +"slice_89/save_to_file/enabled": false, +"slice_89/save_to_file/keep_custom_tracks": false, +"slice_89/save_to_file/path": "", +"slice_89/start_frame": 0, +"slice_9/end_frame": 0, +"slice_9/loop_mode": 0, +"slice_9/name": "", +"slice_9/save_to_file/enabled": false, +"slice_9/save_to_file/keep_custom_tracks": false, +"slice_9/save_to_file/path": "", +"slice_9/start_frame": 0, +"slice_90/end_frame": 0, +"slice_90/loop_mode": 0, +"slice_90/name": "", +"slice_90/save_to_file/enabled": false, +"slice_90/save_to_file/keep_custom_tracks": false, +"slice_90/save_to_file/path": "", +"slice_90/start_frame": 0, +"slice_91/end_frame": 0, +"slice_91/loop_mode": 0, +"slice_91/name": "", +"slice_91/save_to_file/enabled": false, +"slice_91/save_to_file/keep_custom_tracks": false, +"slice_91/save_to_file/path": "", +"slice_91/start_frame": 0, +"slice_92/end_frame": 0, +"slice_92/loop_mode": 0, +"slice_92/name": "", +"slice_92/save_to_file/enabled": false, +"slice_92/save_to_file/keep_custom_tracks": false, +"slice_92/save_to_file/path": "", +"slice_92/start_frame": 0, +"slice_93/end_frame": 0, +"slice_93/loop_mode": 0, +"slice_93/name": "", +"slice_93/save_to_file/enabled": false, +"slice_93/save_to_file/keep_custom_tracks": false, +"slice_93/save_to_file/path": "", +"slice_93/start_frame": 0, +"slice_94/end_frame": 0, +"slice_94/loop_mode": 0, +"slice_94/name": "", +"slice_94/save_to_file/enabled": false, +"slice_94/save_to_file/keep_custom_tracks": false, +"slice_94/save_to_file/path": "", +"slice_94/start_frame": 0, +"slice_95/end_frame": 0, +"slice_95/loop_mode": 0, +"slice_95/name": "", +"slice_95/save_to_file/enabled": false, +"slice_95/save_to_file/keep_custom_tracks": false, +"slice_95/save_to_file/path": "", +"slice_95/start_frame": 0, +"slice_96/end_frame": 0, +"slice_96/loop_mode": 0, +"slice_96/name": "", +"slice_96/save_to_file/enabled": false, +"slice_96/save_to_file/keep_custom_tracks": false, +"slice_96/save_to_file/path": "", +"slice_96/start_frame": 0, +"slice_97/end_frame": 0, +"slice_97/loop_mode": 0, +"slice_97/name": "", +"slice_97/save_to_file/enabled": false, +"slice_97/save_to_file/keep_custom_tracks": false, +"slice_97/save_to_file/path": "", +"slice_97/start_frame": 0, +"slice_98/end_frame": 0, +"slice_98/loop_mode": 0, +"slice_98/name": "", +"slice_98/save_to_file/enabled": false, +"slice_98/save_to_file/keep_custom_tracks": false, +"slice_98/save_to_file/path": "", +"slice_98/start_frame": 0, +"slice_99/end_frame": 0, +"slice_99/loop_mode": 0, +"slice_99/name": "", +"slice_99/save_to_file/enabled": false, +"slice_99/save_to_file/keep_custom_tracks": false, +"slice_99/save_to_file/path": "", +"slice_99/start_frame": 0, +"slices/amount": null +}, +"walk": { +"save_to_file/enabled": false, +"save_to_file/keep_custom_tracks": "", +"save_to_file/path": "", +"settings/loop_mode": 1, +"slice_1/end_frame": 0, +"slice_1/loop_mode": 0, +"slice_1/name": "", +"slice_1/save_to_file/enabled": false, +"slice_1/save_to_file/keep_custom_tracks": false, +"slice_1/save_to_file/path": "", +"slice_1/start_frame": 0, +"slice_10/end_frame": 0, +"slice_10/loop_mode": 0, +"slice_10/name": "", +"slice_10/save_to_file/enabled": false, +"slice_10/save_to_file/keep_custom_tracks": false, +"slice_10/save_to_file/path": "", +"slice_10/start_frame": 0, +"slice_100/end_frame": 0, +"slice_100/loop_mode": 0, +"slice_100/name": "", +"slice_100/save_to_file/enabled": false, +"slice_100/save_to_file/keep_custom_tracks": false, +"slice_100/save_to_file/path": "", +"slice_100/start_frame": 0, +"slice_101/end_frame": 0, +"slice_101/loop_mode": 0, +"slice_101/name": "", +"slice_101/save_to_file/enabled": false, +"slice_101/save_to_file/keep_custom_tracks": false, +"slice_101/save_to_file/path": "", +"slice_101/start_frame": 0, +"slice_102/end_frame": 0, +"slice_102/loop_mode": 0, +"slice_102/name": "", +"slice_102/save_to_file/enabled": false, +"slice_102/save_to_file/keep_custom_tracks": false, +"slice_102/save_to_file/path": "", +"slice_102/start_frame": 0, +"slice_103/end_frame": 0, +"slice_103/loop_mode": 0, +"slice_103/name": "", +"slice_103/save_to_file/enabled": false, +"slice_103/save_to_file/keep_custom_tracks": false, +"slice_103/save_to_file/path": "", +"slice_103/start_frame": 0, +"slice_104/end_frame": 0, +"slice_104/loop_mode": 0, +"slice_104/name": "", +"slice_104/save_to_file/enabled": false, +"slice_104/save_to_file/keep_custom_tracks": false, +"slice_104/save_to_file/path": "", +"slice_104/start_frame": 0, +"slice_105/end_frame": 0, +"slice_105/loop_mode": 0, +"slice_105/name": "", +"slice_105/save_to_file/enabled": false, +"slice_105/save_to_file/keep_custom_tracks": false, +"slice_105/save_to_file/path": "", +"slice_105/start_frame": 0, +"slice_106/end_frame": 0, +"slice_106/loop_mode": 0, +"slice_106/name": "", +"slice_106/save_to_file/enabled": false, +"slice_106/save_to_file/keep_custom_tracks": false, +"slice_106/save_to_file/path": "", +"slice_106/start_frame": 0, +"slice_107/end_frame": 0, +"slice_107/loop_mode": 0, +"slice_107/name": "", +"slice_107/save_to_file/enabled": false, +"slice_107/save_to_file/keep_custom_tracks": false, +"slice_107/save_to_file/path": "", +"slice_107/start_frame": 0, +"slice_108/end_frame": 0, +"slice_108/loop_mode": 0, +"slice_108/name": "", +"slice_108/save_to_file/enabled": false, +"slice_108/save_to_file/keep_custom_tracks": false, +"slice_108/save_to_file/path": "", +"slice_108/start_frame": 0, +"slice_109/end_frame": 0, +"slice_109/loop_mode": 0, +"slice_109/name": "", +"slice_109/save_to_file/enabled": false, +"slice_109/save_to_file/keep_custom_tracks": false, +"slice_109/save_to_file/path": "", +"slice_109/start_frame": 0, +"slice_11/end_frame": 0, +"slice_11/loop_mode": 0, +"slice_11/name": "", +"slice_11/save_to_file/enabled": false, +"slice_11/save_to_file/keep_custom_tracks": false, +"slice_11/save_to_file/path": "", +"slice_11/start_frame": 0, +"slice_110/end_frame": 0, +"slice_110/loop_mode": 0, +"slice_110/name": "", +"slice_110/save_to_file/enabled": false, +"slice_110/save_to_file/keep_custom_tracks": false, +"slice_110/save_to_file/path": "", +"slice_110/start_frame": 0, +"slice_111/end_frame": 0, +"slice_111/loop_mode": 0, +"slice_111/name": "", +"slice_111/save_to_file/enabled": false, +"slice_111/save_to_file/keep_custom_tracks": false, +"slice_111/save_to_file/path": "", +"slice_111/start_frame": 0, +"slice_112/end_frame": 0, +"slice_112/loop_mode": 0, +"slice_112/name": "", +"slice_112/save_to_file/enabled": false, +"slice_112/save_to_file/keep_custom_tracks": false, +"slice_112/save_to_file/path": "", +"slice_112/start_frame": 0, +"slice_113/end_frame": 0, +"slice_113/loop_mode": 0, +"slice_113/name": "", +"slice_113/save_to_file/enabled": false, +"slice_113/save_to_file/keep_custom_tracks": false, +"slice_113/save_to_file/path": "", +"slice_113/start_frame": 0, +"slice_114/end_frame": 0, +"slice_114/loop_mode": 0, +"slice_114/name": "", +"slice_114/save_to_file/enabled": false, +"slice_114/save_to_file/keep_custom_tracks": false, +"slice_114/save_to_file/path": "", +"slice_114/start_frame": 0, +"slice_115/end_frame": 0, +"slice_115/loop_mode": 0, +"slice_115/name": "", +"slice_115/save_to_file/enabled": false, +"slice_115/save_to_file/keep_custom_tracks": false, +"slice_115/save_to_file/path": "", +"slice_115/start_frame": 0, +"slice_116/end_frame": 0, +"slice_116/loop_mode": 0, +"slice_116/name": "", +"slice_116/save_to_file/enabled": false, +"slice_116/save_to_file/keep_custom_tracks": false, +"slice_116/save_to_file/path": "", +"slice_116/start_frame": 0, +"slice_117/end_frame": 0, +"slice_117/loop_mode": 0, +"slice_117/name": "", +"slice_117/save_to_file/enabled": false, +"slice_117/save_to_file/keep_custom_tracks": false, +"slice_117/save_to_file/path": "", +"slice_117/start_frame": 0, +"slice_118/end_frame": 0, +"slice_118/loop_mode": 0, +"slice_118/name": "", +"slice_118/save_to_file/enabled": false, +"slice_118/save_to_file/keep_custom_tracks": false, +"slice_118/save_to_file/path": "", +"slice_118/start_frame": 0, +"slice_119/end_frame": 0, +"slice_119/loop_mode": 0, +"slice_119/name": "", +"slice_119/save_to_file/enabled": false, +"slice_119/save_to_file/keep_custom_tracks": false, +"slice_119/save_to_file/path": "", +"slice_119/start_frame": 0, +"slice_12/end_frame": 0, +"slice_12/loop_mode": 0, +"slice_12/name": "", +"slice_12/save_to_file/enabled": false, +"slice_12/save_to_file/keep_custom_tracks": false, +"slice_12/save_to_file/path": "", +"slice_12/start_frame": 0, +"slice_120/end_frame": 0, +"slice_120/loop_mode": 0, +"slice_120/name": "", +"slice_120/save_to_file/enabled": false, +"slice_120/save_to_file/keep_custom_tracks": false, +"slice_120/save_to_file/path": "", +"slice_120/start_frame": 0, +"slice_121/end_frame": 0, +"slice_121/loop_mode": 0, +"slice_121/name": "", +"slice_121/save_to_file/enabled": false, +"slice_121/save_to_file/keep_custom_tracks": false, +"slice_121/save_to_file/path": "", +"slice_121/start_frame": 0, +"slice_122/end_frame": 0, +"slice_122/loop_mode": 0, +"slice_122/name": "", +"slice_122/save_to_file/enabled": false, +"slice_122/save_to_file/keep_custom_tracks": false, +"slice_122/save_to_file/path": "", +"slice_122/start_frame": 0, +"slice_123/end_frame": 0, +"slice_123/loop_mode": 0, +"slice_123/name": "", +"slice_123/save_to_file/enabled": false, +"slice_123/save_to_file/keep_custom_tracks": false, +"slice_123/save_to_file/path": "", +"slice_123/start_frame": 0, +"slice_124/end_frame": 0, +"slice_124/loop_mode": 0, +"slice_124/name": "", +"slice_124/save_to_file/enabled": false, +"slice_124/save_to_file/keep_custom_tracks": false, +"slice_124/save_to_file/path": "", +"slice_124/start_frame": 0, +"slice_125/end_frame": 0, +"slice_125/loop_mode": 0, +"slice_125/name": "", +"slice_125/save_to_file/enabled": false, +"slice_125/save_to_file/keep_custom_tracks": false, +"slice_125/save_to_file/path": "", +"slice_125/start_frame": 0, +"slice_126/end_frame": 0, +"slice_126/loop_mode": 0, +"slice_126/name": "", +"slice_126/save_to_file/enabled": false, +"slice_126/save_to_file/keep_custom_tracks": false, +"slice_126/save_to_file/path": "", +"slice_126/start_frame": 0, +"slice_127/end_frame": 0, +"slice_127/loop_mode": 0, +"slice_127/name": "", +"slice_127/save_to_file/enabled": false, +"slice_127/save_to_file/keep_custom_tracks": false, +"slice_127/save_to_file/path": "", +"slice_127/start_frame": 0, +"slice_128/end_frame": 0, +"slice_128/loop_mode": 0, +"slice_128/name": "", +"slice_128/save_to_file/enabled": false, +"slice_128/save_to_file/keep_custom_tracks": false, +"slice_128/save_to_file/path": "", +"slice_128/start_frame": 0, +"slice_129/end_frame": 0, +"slice_129/loop_mode": 0, +"slice_129/name": "", +"slice_129/save_to_file/enabled": false, +"slice_129/save_to_file/keep_custom_tracks": false, +"slice_129/save_to_file/path": "", +"slice_129/start_frame": 0, +"slice_13/end_frame": 0, +"slice_13/loop_mode": 0, +"slice_13/name": "", +"slice_13/save_to_file/enabled": false, +"slice_13/save_to_file/keep_custom_tracks": false, +"slice_13/save_to_file/path": "", +"slice_13/start_frame": 0, +"slice_130/end_frame": 0, +"slice_130/loop_mode": 0, +"slice_130/name": "", +"slice_130/save_to_file/enabled": false, +"slice_130/save_to_file/keep_custom_tracks": false, +"slice_130/save_to_file/path": "", +"slice_130/start_frame": 0, +"slice_131/end_frame": 0, +"slice_131/loop_mode": 0, +"slice_131/name": "", +"slice_131/save_to_file/enabled": false, +"slice_131/save_to_file/keep_custom_tracks": false, +"slice_131/save_to_file/path": "", +"slice_131/start_frame": 0, +"slice_132/end_frame": 0, +"slice_132/loop_mode": 0, +"slice_132/name": "", +"slice_132/save_to_file/enabled": false, +"slice_132/save_to_file/keep_custom_tracks": false, +"slice_132/save_to_file/path": "", +"slice_132/start_frame": 0, +"slice_133/end_frame": 0, +"slice_133/loop_mode": 0, +"slice_133/name": "", +"slice_133/save_to_file/enabled": false, +"slice_133/save_to_file/keep_custom_tracks": false, +"slice_133/save_to_file/path": "", +"slice_133/start_frame": 0, +"slice_134/end_frame": 0, +"slice_134/loop_mode": 0, +"slice_134/name": "", +"slice_134/save_to_file/enabled": false, +"slice_134/save_to_file/keep_custom_tracks": false, +"slice_134/save_to_file/path": "", +"slice_134/start_frame": 0, +"slice_135/end_frame": 0, +"slice_135/loop_mode": 0, +"slice_135/name": "", +"slice_135/save_to_file/enabled": false, +"slice_135/save_to_file/keep_custom_tracks": false, +"slice_135/save_to_file/path": "", +"slice_135/start_frame": 0, +"slice_136/end_frame": 0, +"slice_136/loop_mode": 0, +"slice_136/name": "", +"slice_136/save_to_file/enabled": false, +"slice_136/save_to_file/keep_custom_tracks": false, +"slice_136/save_to_file/path": "", +"slice_136/start_frame": 0, +"slice_137/end_frame": 0, +"slice_137/loop_mode": 0, +"slice_137/name": "", +"slice_137/save_to_file/enabled": false, +"slice_137/save_to_file/keep_custom_tracks": false, +"slice_137/save_to_file/path": "", +"slice_137/start_frame": 0, +"slice_138/end_frame": 0, +"slice_138/loop_mode": 0, +"slice_138/name": "", +"slice_138/save_to_file/enabled": false, +"slice_138/save_to_file/keep_custom_tracks": false, +"slice_138/save_to_file/path": "", +"slice_138/start_frame": 0, +"slice_139/end_frame": 0, +"slice_139/loop_mode": 0, +"slice_139/name": "", +"slice_139/save_to_file/enabled": false, +"slice_139/save_to_file/keep_custom_tracks": false, +"slice_139/save_to_file/path": "", +"slice_139/start_frame": 0, +"slice_14/end_frame": 0, +"slice_14/loop_mode": 0, +"slice_14/name": "", +"slice_14/save_to_file/enabled": false, +"slice_14/save_to_file/keep_custom_tracks": false, +"slice_14/save_to_file/path": "", +"slice_14/start_frame": 0, +"slice_140/end_frame": 0, +"slice_140/loop_mode": 0, +"slice_140/name": "", +"slice_140/save_to_file/enabled": false, +"slice_140/save_to_file/keep_custom_tracks": false, +"slice_140/save_to_file/path": "", +"slice_140/start_frame": 0, +"slice_141/end_frame": 0, +"slice_141/loop_mode": 0, +"slice_141/name": "", +"slice_141/save_to_file/enabled": false, +"slice_141/save_to_file/keep_custom_tracks": false, +"slice_141/save_to_file/path": "", +"slice_141/start_frame": 0, +"slice_142/end_frame": 0, +"slice_142/loop_mode": 0, +"slice_142/name": "", +"slice_142/save_to_file/enabled": false, +"slice_142/save_to_file/keep_custom_tracks": false, +"slice_142/save_to_file/path": "", +"slice_142/start_frame": 0, +"slice_143/end_frame": 0, +"slice_143/loop_mode": 0, +"slice_143/name": "", +"slice_143/save_to_file/enabled": false, +"slice_143/save_to_file/keep_custom_tracks": false, +"slice_143/save_to_file/path": "", +"slice_143/start_frame": 0, +"slice_144/end_frame": 0, +"slice_144/loop_mode": 0, +"slice_144/name": "", +"slice_144/save_to_file/enabled": false, +"slice_144/save_to_file/keep_custom_tracks": false, +"slice_144/save_to_file/path": "", +"slice_144/start_frame": 0, +"slice_145/end_frame": 0, +"slice_145/loop_mode": 0, +"slice_145/name": "", +"slice_145/save_to_file/enabled": false, +"slice_145/save_to_file/keep_custom_tracks": false, +"slice_145/save_to_file/path": "", +"slice_145/start_frame": 0, +"slice_146/end_frame": 0, +"slice_146/loop_mode": 0, +"slice_146/name": "", +"slice_146/save_to_file/enabled": false, +"slice_146/save_to_file/keep_custom_tracks": false, +"slice_146/save_to_file/path": "", +"slice_146/start_frame": 0, +"slice_147/end_frame": 0, +"slice_147/loop_mode": 0, +"slice_147/name": "", +"slice_147/save_to_file/enabled": false, +"slice_147/save_to_file/keep_custom_tracks": false, +"slice_147/save_to_file/path": "", +"slice_147/start_frame": 0, +"slice_148/end_frame": 0, +"slice_148/loop_mode": 0, +"slice_148/name": "", +"slice_148/save_to_file/enabled": false, +"slice_148/save_to_file/keep_custom_tracks": false, +"slice_148/save_to_file/path": "", +"slice_148/start_frame": 0, +"slice_149/end_frame": 0, +"slice_149/loop_mode": 0, +"slice_149/name": "", +"slice_149/save_to_file/enabled": false, +"slice_149/save_to_file/keep_custom_tracks": false, +"slice_149/save_to_file/path": "", +"slice_149/start_frame": 0, +"slice_15/end_frame": 0, +"slice_15/loop_mode": 0, +"slice_15/name": "", +"slice_15/save_to_file/enabled": false, +"slice_15/save_to_file/keep_custom_tracks": false, +"slice_15/save_to_file/path": "", +"slice_15/start_frame": 0, +"slice_150/end_frame": 0, +"slice_150/loop_mode": 0, +"slice_150/name": "", +"slice_150/save_to_file/enabled": false, +"slice_150/save_to_file/keep_custom_tracks": false, +"slice_150/save_to_file/path": "", +"slice_150/start_frame": 0, +"slice_151/end_frame": 0, +"slice_151/loop_mode": 0, +"slice_151/name": "", +"slice_151/save_to_file/enabled": false, +"slice_151/save_to_file/keep_custom_tracks": false, +"slice_151/save_to_file/path": "", +"slice_151/start_frame": 0, +"slice_152/end_frame": 0, +"slice_152/loop_mode": 0, +"slice_152/name": "", +"slice_152/save_to_file/enabled": false, +"slice_152/save_to_file/keep_custom_tracks": false, +"slice_152/save_to_file/path": "", +"slice_152/start_frame": 0, +"slice_153/end_frame": 0, +"slice_153/loop_mode": 0, +"slice_153/name": "", +"slice_153/save_to_file/enabled": false, +"slice_153/save_to_file/keep_custom_tracks": false, +"slice_153/save_to_file/path": "", +"slice_153/start_frame": 0, +"slice_154/end_frame": 0, +"slice_154/loop_mode": 0, +"slice_154/name": "", +"slice_154/save_to_file/enabled": false, +"slice_154/save_to_file/keep_custom_tracks": false, +"slice_154/save_to_file/path": "", +"slice_154/start_frame": 0, +"slice_155/end_frame": 0, +"slice_155/loop_mode": 0, +"slice_155/name": "", +"slice_155/save_to_file/enabled": false, +"slice_155/save_to_file/keep_custom_tracks": false, +"slice_155/save_to_file/path": "", +"slice_155/start_frame": 0, +"slice_156/end_frame": 0, +"slice_156/loop_mode": 0, +"slice_156/name": "", +"slice_156/save_to_file/enabled": false, +"slice_156/save_to_file/keep_custom_tracks": false, +"slice_156/save_to_file/path": "", +"slice_156/start_frame": 0, +"slice_157/end_frame": 0, +"slice_157/loop_mode": 0, +"slice_157/name": "", +"slice_157/save_to_file/enabled": false, +"slice_157/save_to_file/keep_custom_tracks": false, +"slice_157/save_to_file/path": "", +"slice_157/start_frame": 0, +"slice_158/end_frame": 0, +"slice_158/loop_mode": 0, +"slice_158/name": "", +"slice_158/save_to_file/enabled": false, +"slice_158/save_to_file/keep_custom_tracks": false, +"slice_158/save_to_file/path": "", +"slice_158/start_frame": 0, +"slice_159/end_frame": 0, +"slice_159/loop_mode": 0, +"slice_159/name": "", +"slice_159/save_to_file/enabled": false, +"slice_159/save_to_file/keep_custom_tracks": false, +"slice_159/save_to_file/path": "", +"slice_159/start_frame": 0, +"slice_16/end_frame": 0, +"slice_16/loop_mode": 0, +"slice_16/name": "", +"slice_16/save_to_file/enabled": false, +"slice_16/save_to_file/keep_custom_tracks": false, +"slice_16/save_to_file/path": "", +"slice_16/start_frame": 0, +"slice_160/end_frame": 0, +"slice_160/loop_mode": 0, +"slice_160/name": "", +"slice_160/save_to_file/enabled": false, +"slice_160/save_to_file/keep_custom_tracks": false, +"slice_160/save_to_file/path": "", +"slice_160/start_frame": 0, +"slice_161/end_frame": 0, +"slice_161/loop_mode": 0, +"slice_161/name": "", +"slice_161/save_to_file/enabled": false, +"slice_161/save_to_file/keep_custom_tracks": false, +"slice_161/save_to_file/path": "", +"slice_161/start_frame": 0, +"slice_162/end_frame": 0, +"slice_162/loop_mode": 0, +"slice_162/name": "", +"slice_162/save_to_file/enabled": false, +"slice_162/save_to_file/keep_custom_tracks": false, +"slice_162/save_to_file/path": "", +"slice_162/start_frame": 0, +"slice_163/end_frame": 0, +"slice_163/loop_mode": 0, +"slice_163/name": "", +"slice_163/save_to_file/enabled": false, +"slice_163/save_to_file/keep_custom_tracks": false, +"slice_163/save_to_file/path": "", +"slice_163/start_frame": 0, +"slice_164/end_frame": 0, +"slice_164/loop_mode": 0, +"slice_164/name": "", +"slice_164/save_to_file/enabled": false, +"slice_164/save_to_file/keep_custom_tracks": false, +"slice_164/save_to_file/path": "", +"slice_164/start_frame": 0, +"slice_165/end_frame": 0, +"slice_165/loop_mode": 0, +"slice_165/name": "", +"slice_165/save_to_file/enabled": false, +"slice_165/save_to_file/keep_custom_tracks": false, +"slice_165/save_to_file/path": "", +"slice_165/start_frame": 0, +"slice_166/end_frame": 0, +"slice_166/loop_mode": 0, +"slice_166/name": "", +"slice_166/save_to_file/enabled": false, +"slice_166/save_to_file/keep_custom_tracks": false, +"slice_166/save_to_file/path": "", +"slice_166/start_frame": 0, +"slice_167/end_frame": 0, +"slice_167/loop_mode": 0, +"slice_167/name": "", +"slice_167/save_to_file/enabled": false, +"slice_167/save_to_file/keep_custom_tracks": false, +"slice_167/save_to_file/path": "", +"slice_167/start_frame": 0, +"slice_168/end_frame": 0, +"slice_168/loop_mode": 0, +"slice_168/name": "", +"slice_168/save_to_file/enabled": false, +"slice_168/save_to_file/keep_custom_tracks": false, +"slice_168/save_to_file/path": "", +"slice_168/start_frame": 0, +"slice_169/end_frame": 0, +"slice_169/loop_mode": 0, +"slice_169/name": "", +"slice_169/save_to_file/enabled": false, +"slice_169/save_to_file/keep_custom_tracks": false, +"slice_169/save_to_file/path": "", +"slice_169/start_frame": 0, +"slice_17/end_frame": 0, +"slice_17/loop_mode": 0, +"slice_17/name": "", +"slice_17/save_to_file/enabled": false, +"slice_17/save_to_file/keep_custom_tracks": false, +"slice_17/save_to_file/path": "", +"slice_17/start_frame": 0, +"slice_170/end_frame": 0, +"slice_170/loop_mode": 0, +"slice_170/name": "", +"slice_170/save_to_file/enabled": false, +"slice_170/save_to_file/keep_custom_tracks": false, +"slice_170/save_to_file/path": "", +"slice_170/start_frame": 0, +"slice_171/end_frame": 0, +"slice_171/loop_mode": 0, +"slice_171/name": "", +"slice_171/save_to_file/enabled": false, +"slice_171/save_to_file/keep_custom_tracks": false, +"slice_171/save_to_file/path": "", +"slice_171/start_frame": 0, +"slice_172/end_frame": 0, +"slice_172/loop_mode": 0, +"slice_172/name": "", +"slice_172/save_to_file/enabled": false, +"slice_172/save_to_file/keep_custom_tracks": false, +"slice_172/save_to_file/path": "", +"slice_172/start_frame": 0, +"slice_173/end_frame": 0, +"slice_173/loop_mode": 0, +"slice_173/name": "", +"slice_173/save_to_file/enabled": false, +"slice_173/save_to_file/keep_custom_tracks": false, +"slice_173/save_to_file/path": "", +"slice_173/start_frame": 0, +"slice_174/end_frame": 0, +"slice_174/loop_mode": 0, +"slice_174/name": "", +"slice_174/save_to_file/enabled": false, +"slice_174/save_to_file/keep_custom_tracks": false, +"slice_174/save_to_file/path": "", +"slice_174/start_frame": 0, +"slice_175/end_frame": 0, +"slice_175/loop_mode": 0, +"slice_175/name": "", +"slice_175/save_to_file/enabled": false, +"slice_175/save_to_file/keep_custom_tracks": false, +"slice_175/save_to_file/path": "", +"slice_175/start_frame": 0, +"slice_176/end_frame": 0, +"slice_176/loop_mode": 0, +"slice_176/name": "", +"slice_176/save_to_file/enabled": false, +"slice_176/save_to_file/keep_custom_tracks": false, +"slice_176/save_to_file/path": "", +"slice_176/start_frame": 0, +"slice_177/end_frame": 0, +"slice_177/loop_mode": 0, +"slice_177/name": "", +"slice_177/save_to_file/enabled": false, +"slice_177/save_to_file/keep_custom_tracks": false, +"slice_177/save_to_file/path": "", +"slice_177/start_frame": 0, +"slice_178/end_frame": 0, +"slice_178/loop_mode": 0, +"slice_178/name": "", +"slice_178/save_to_file/enabled": false, +"slice_178/save_to_file/keep_custom_tracks": false, +"slice_178/save_to_file/path": "", +"slice_178/start_frame": 0, +"slice_179/end_frame": 0, +"slice_179/loop_mode": 0, +"slice_179/name": "", +"slice_179/save_to_file/enabled": false, +"slice_179/save_to_file/keep_custom_tracks": false, +"slice_179/save_to_file/path": "", +"slice_179/start_frame": 0, +"slice_18/end_frame": 0, +"slice_18/loop_mode": 0, +"slice_18/name": "", +"slice_18/save_to_file/enabled": false, +"slice_18/save_to_file/keep_custom_tracks": false, +"slice_18/save_to_file/path": "", +"slice_18/start_frame": 0, +"slice_180/end_frame": 0, +"slice_180/loop_mode": 0, +"slice_180/name": "", +"slice_180/save_to_file/enabled": false, +"slice_180/save_to_file/keep_custom_tracks": false, +"slice_180/save_to_file/path": "", +"slice_180/start_frame": 0, +"slice_181/end_frame": 0, +"slice_181/loop_mode": 0, +"slice_181/name": "", +"slice_181/save_to_file/enabled": false, +"slice_181/save_to_file/keep_custom_tracks": false, +"slice_181/save_to_file/path": "", +"slice_181/start_frame": 0, +"slice_182/end_frame": 0, +"slice_182/loop_mode": 0, +"slice_182/name": "", +"slice_182/save_to_file/enabled": false, +"slice_182/save_to_file/keep_custom_tracks": false, +"slice_182/save_to_file/path": "", +"slice_182/start_frame": 0, +"slice_183/end_frame": 0, +"slice_183/loop_mode": 0, +"slice_183/name": "", +"slice_183/save_to_file/enabled": false, +"slice_183/save_to_file/keep_custom_tracks": false, +"slice_183/save_to_file/path": "", +"slice_183/start_frame": 0, +"slice_184/end_frame": 0, +"slice_184/loop_mode": 0, +"slice_184/name": "", +"slice_184/save_to_file/enabled": false, +"slice_184/save_to_file/keep_custom_tracks": false, +"slice_184/save_to_file/path": "", +"slice_184/start_frame": 0, +"slice_185/end_frame": 0, +"slice_185/loop_mode": 0, +"slice_185/name": "", +"slice_185/save_to_file/enabled": false, +"slice_185/save_to_file/keep_custom_tracks": false, +"slice_185/save_to_file/path": "", +"slice_185/start_frame": 0, +"slice_186/end_frame": 0, +"slice_186/loop_mode": 0, +"slice_186/name": "", +"slice_186/save_to_file/enabled": false, +"slice_186/save_to_file/keep_custom_tracks": false, +"slice_186/save_to_file/path": "", +"slice_186/start_frame": 0, +"slice_187/end_frame": 0, +"slice_187/loop_mode": 0, +"slice_187/name": "", +"slice_187/save_to_file/enabled": false, +"slice_187/save_to_file/keep_custom_tracks": false, +"slice_187/save_to_file/path": "", +"slice_187/start_frame": 0, +"slice_188/end_frame": 0, +"slice_188/loop_mode": 0, +"slice_188/name": "", +"slice_188/save_to_file/enabled": false, +"slice_188/save_to_file/keep_custom_tracks": false, +"slice_188/save_to_file/path": "", +"slice_188/start_frame": 0, +"slice_189/end_frame": 0, +"slice_189/loop_mode": 0, +"slice_189/name": "", +"slice_189/save_to_file/enabled": false, +"slice_189/save_to_file/keep_custom_tracks": false, +"slice_189/save_to_file/path": "", +"slice_189/start_frame": 0, +"slice_19/end_frame": 0, +"slice_19/loop_mode": 0, +"slice_19/name": "", +"slice_19/save_to_file/enabled": false, +"slice_19/save_to_file/keep_custom_tracks": false, +"slice_19/save_to_file/path": "", +"slice_19/start_frame": 0, +"slice_190/end_frame": 0, +"slice_190/loop_mode": 0, +"slice_190/name": "", +"slice_190/save_to_file/enabled": false, +"slice_190/save_to_file/keep_custom_tracks": false, +"slice_190/save_to_file/path": "", +"slice_190/start_frame": 0, +"slice_191/end_frame": 0, +"slice_191/loop_mode": 0, +"slice_191/name": "", +"slice_191/save_to_file/enabled": false, +"slice_191/save_to_file/keep_custom_tracks": false, +"slice_191/save_to_file/path": "", +"slice_191/start_frame": 0, +"slice_192/end_frame": 0, +"slice_192/loop_mode": 0, +"slice_192/name": "", +"slice_192/save_to_file/enabled": false, +"slice_192/save_to_file/keep_custom_tracks": false, +"slice_192/save_to_file/path": "", +"slice_192/start_frame": 0, +"slice_193/end_frame": 0, +"slice_193/loop_mode": 0, +"slice_193/name": "", +"slice_193/save_to_file/enabled": false, +"slice_193/save_to_file/keep_custom_tracks": false, +"slice_193/save_to_file/path": "", +"slice_193/start_frame": 0, +"slice_194/end_frame": 0, +"slice_194/loop_mode": 0, +"slice_194/name": "", +"slice_194/save_to_file/enabled": false, +"slice_194/save_to_file/keep_custom_tracks": false, +"slice_194/save_to_file/path": "", +"slice_194/start_frame": 0, +"slice_195/end_frame": 0, +"slice_195/loop_mode": 0, +"slice_195/name": "", +"slice_195/save_to_file/enabled": false, +"slice_195/save_to_file/keep_custom_tracks": false, +"slice_195/save_to_file/path": "", +"slice_195/start_frame": 0, +"slice_196/end_frame": 0, +"slice_196/loop_mode": 0, +"slice_196/name": "", +"slice_196/save_to_file/enabled": false, +"slice_196/save_to_file/keep_custom_tracks": false, +"slice_196/save_to_file/path": "", +"slice_196/start_frame": 0, +"slice_197/end_frame": 0, +"slice_197/loop_mode": 0, +"slice_197/name": "", +"slice_197/save_to_file/enabled": false, +"slice_197/save_to_file/keep_custom_tracks": false, +"slice_197/save_to_file/path": "", +"slice_197/start_frame": 0, +"slice_198/end_frame": 0, +"slice_198/loop_mode": 0, +"slice_198/name": "", +"slice_198/save_to_file/enabled": false, +"slice_198/save_to_file/keep_custom_tracks": false, +"slice_198/save_to_file/path": "", +"slice_198/start_frame": 0, +"slice_199/end_frame": 0, +"slice_199/loop_mode": 0, +"slice_199/name": "", +"slice_199/save_to_file/enabled": false, +"slice_199/save_to_file/keep_custom_tracks": false, +"slice_199/save_to_file/path": "", +"slice_199/start_frame": 0, +"slice_2/end_frame": 0, +"slice_2/loop_mode": 0, +"slice_2/name": "", +"slice_2/save_to_file/enabled": false, +"slice_2/save_to_file/keep_custom_tracks": false, +"slice_2/save_to_file/path": "", +"slice_2/start_frame": 0, +"slice_20/end_frame": 0, +"slice_20/loop_mode": 0, +"slice_20/name": "", +"slice_20/save_to_file/enabled": false, +"slice_20/save_to_file/keep_custom_tracks": false, +"slice_20/save_to_file/path": "", +"slice_20/start_frame": 0, +"slice_200/end_frame": 0, +"slice_200/loop_mode": 0, +"slice_200/name": "", +"slice_200/save_to_file/enabled": false, +"slice_200/save_to_file/keep_custom_tracks": false, +"slice_200/save_to_file/path": "", +"slice_200/start_frame": 0, +"slice_201/end_frame": 0, +"slice_201/loop_mode": 0, +"slice_201/name": "", +"slice_201/save_to_file/enabled": false, +"slice_201/save_to_file/keep_custom_tracks": false, +"slice_201/save_to_file/path": "", +"slice_201/start_frame": 0, +"slice_202/end_frame": 0, +"slice_202/loop_mode": 0, +"slice_202/name": "", +"slice_202/save_to_file/enabled": false, +"slice_202/save_to_file/keep_custom_tracks": false, +"slice_202/save_to_file/path": "", +"slice_202/start_frame": 0, +"slice_203/end_frame": 0, +"slice_203/loop_mode": 0, +"slice_203/name": "", +"slice_203/save_to_file/enabled": false, +"slice_203/save_to_file/keep_custom_tracks": false, +"slice_203/save_to_file/path": "", +"slice_203/start_frame": 0, +"slice_204/end_frame": 0, +"slice_204/loop_mode": 0, +"slice_204/name": "", +"slice_204/save_to_file/enabled": false, +"slice_204/save_to_file/keep_custom_tracks": false, +"slice_204/save_to_file/path": "", +"slice_204/start_frame": 0, +"slice_205/end_frame": 0, +"slice_205/loop_mode": 0, +"slice_205/name": "", +"slice_205/save_to_file/enabled": false, +"slice_205/save_to_file/keep_custom_tracks": false, +"slice_205/save_to_file/path": "", +"slice_205/start_frame": 0, +"slice_206/end_frame": 0, +"slice_206/loop_mode": 0, +"slice_206/name": "", +"slice_206/save_to_file/enabled": false, +"slice_206/save_to_file/keep_custom_tracks": false, +"slice_206/save_to_file/path": "", +"slice_206/start_frame": 0, +"slice_207/end_frame": 0, +"slice_207/loop_mode": 0, +"slice_207/name": "", +"slice_207/save_to_file/enabled": false, +"slice_207/save_to_file/keep_custom_tracks": false, +"slice_207/save_to_file/path": "", +"slice_207/start_frame": 0, +"slice_208/end_frame": 0, +"slice_208/loop_mode": 0, +"slice_208/name": "", +"slice_208/save_to_file/enabled": false, +"slice_208/save_to_file/keep_custom_tracks": false, +"slice_208/save_to_file/path": "", +"slice_208/start_frame": 0, +"slice_209/end_frame": 0, +"slice_209/loop_mode": 0, +"slice_209/name": "", +"slice_209/save_to_file/enabled": false, +"slice_209/save_to_file/keep_custom_tracks": false, +"slice_209/save_to_file/path": "", +"slice_209/start_frame": 0, +"slice_21/end_frame": 0, +"slice_21/loop_mode": 0, +"slice_21/name": "", +"slice_21/save_to_file/enabled": false, +"slice_21/save_to_file/keep_custom_tracks": false, +"slice_21/save_to_file/path": "", +"slice_21/start_frame": 0, +"slice_210/end_frame": 0, +"slice_210/loop_mode": 0, +"slice_210/name": "", +"slice_210/save_to_file/enabled": false, +"slice_210/save_to_file/keep_custom_tracks": false, +"slice_210/save_to_file/path": "", +"slice_210/start_frame": 0, +"slice_211/end_frame": 0, +"slice_211/loop_mode": 0, +"slice_211/name": "", +"slice_211/save_to_file/enabled": false, +"slice_211/save_to_file/keep_custom_tracks": false, +"slice_211/save_to_file/path": "", +"slice_211/start_frame": 0, +"slice_212/end_frame": 0, +"slice_212/loop_mode": 0, +"slice_212/name": "", +"slice_212/save_to_file/enabled": false, +"slice_212/save_to_file/keep_custom_tracks": false, +"slice_212/save_to_file/path": "", +"slice_212/start_frame": 0, +"slice_213/end_frame": 0, +"slice_213/loop_mode": 0, +"slice_213/name": "", +"slice_213/save_to_file/enabled": false, +"slice_213/save_to_file/keep_custom_tracks": false, +"slice_213/save_to_file/path": "", +"slice_213/start_frame": 0, +"slice_214/end_frame": 0, +"slice_214/loop_mode": 0, +"slice_214/name": "", +"slice_214/save_to_file/enabled": false, +"slice_214/save_to_file/keep_custom_tracks": false, +"slice_214/save_to_file/path": "", +"slice_214/start_frame": 0, +"slice_215/end_frame": 0, +"slice_215/loop_mode": 0, +"slice_215/name": "", +"slice_215/save_to_file/enabled": false, +"slice_215/save_to_file/keep_custom_tracks": false, +"slice_215/save_to_file/path": "", +"slice_215/start_frame": 0, +"slice_216/end_frame": 0, +"slice_216/loop_mode": 0, +"slice_216/name": "", +"slice_216/save_to_file/enabled": false, +"slice_216/save_to_file/keep_custom_tracks": false, +"slice_216/save_to_file/path": "", +"slice_216/start_frame": 0, +"slice_217/end_frame": 0, +"slice_217/loop_mode": 0, +"slice_217/name": "", +"slice_217/save_to_file/enabled": false, +"slice_217/save_to_file/keep_custom_tracks": false, +"slice_217/save_to_file/path": "", +"slice_217/start_frame": 0, +"slice_218/end_frame": 0, +"slice_218/loop_mode": 0, +"slice_218/name": "", +"slice_218/save_to_file/enabled": false, +"slice_218/save_to_file/keep_custom_tracks": false, +"slice_218/save_to_file/path": "", +"slice_218/start_frame": 0, +"slice_219/end_frame": 0, +"slice_219/loop_mode": 0, +"slice_219/name": "", +"slice_219/save_to_file/enabled": false, +"slice_219/save_to_file/keep_custom_tracks": false, +"slice_219/save_to_file/path": "", +"slice_219/start_frame": 0, +"slice_22/end_frame": 0, +"slice_22/loop_mode": 0, +"slice_22/name": "", +"slice_22/save_to_file/enabled": false, +"slice_22/save_to_file/keep_custom_tracks": false, +"slice_22/save_to_file/path": "", +"slice_22/start_frame": 0, +"slice_220/end_frame": 0, +"slice_220/loop_mode": 0, +"slice_220/name": "", +"slice_220/save_to_file/enabled": false, +"slice_220/save_to_file/keep_custom_tracks": false, +"slice_220/save_to_file/path": "", +"slice_220/start_frame": 0, +"slice_221/end_frame": 0, +"slice_221/loop_mode": 0, +"slice_221/name": "", +"slice_221/save_to_file/enabled": false, +"slice_221/save_to_file/keep_custom_tracks": false, +"slice_221/save_to_file/path": "", +"slice_221/start_frame": 0, +"slice_222/end_frame": 0, +"slice_222/loop_mode": 0, +"slice_222/name": "", +"slice_222/save_to_file/enabled": false, +"slice_222/save_to_file/keep_custom_tracks": false, +"slice_222/save_to_file/path": "", +"slice_222/start_frame": 0, +"slice_223/end_frame": 0, +"slice_223/loop_mode": 0, +"slice_223/name": "", +"slice_223/save_to_file/enabled": false, +"slice_223/save_to_file/keep_custom_tracks": false, +"slice_223/save_to_file/path": "", +"slice_223/start_frame": 0, +"slice_224/end_frame": 0, +"slice_224/loop_mode": 0, +"slice_224/name": "", +"slice_224/save_to_file/enabled": false, +"slice_224/save_to_file/keep_custom_tracks": false, +"slice_224/save_to_file/path": "", +"slice_224/start_frame": 0, +"slice_225/end_frame": 0, +"slice_225/loop_mode": 0, +"slice_225/name": "", +"slice_225/save_to_file/enabled": false, +"slice_225/save_to_file/keep_custom_tracks": false, +"slice_225/save_to_file/path": "", +"slice_225/start_frame": 0, +"slice_226/end_frame": 0, +"slice_226/loop_mode": 0, +"slice_226/name": "", +"slice_226/save_to_file/enabled": false, +"slice_226/save_to_file/keep_custom_tracks": false, +"slice_226/save_to_file/path": "", +"slice_226/start_frame": 0, +"slice_227/end_frame": 0, +"slice_227/loop_mode": 0, +"slice_227/name": "", +"slice_227/save_to_file/enabled": false, +"slice_227/save_to_file/keep_custom_tracks": false, +"slice_227/save_to_file/path": "", +"slice_227/start_frame": 0, +"slice_228/end_frame": 0, +"slice_228/loop_mode": 0, +"slice_228/name": "", +"slice_228/save_to_file/enabled": false, +"slice_228/save_to_file/keep_custom_tracks": false, +"slice_228/save_to_file/path": "", +"slice_228/start_frame": 0, +"slice_229/end_frame": 0, +"slice_229/loop_mode": 0, +"slice_229/name": "", +"slice_229/save_to_file/enabled": false, +"slice_229/save_to_file/keep_custom_tracks": false, +"slice_229/save_to_file/path": "", +"slice_229/start_frame": 0, +"slice_23/end_frame": 0, +"slice_23/loop_mode": 0, +"slice_23/name": "", +"slice_23/save_to_file/enabled": false, +"slice_23/save_to_file/keep_custom_tracks": false, +"slice_23/save_to_file/path": "", +"slice_23/start_frame": 0, +"slice_230/end_frame": 0, +"slice_230/loop_mode": 0, +"slice_230/name": "", +"slice_230/save_to_file/enabled": false, +"slice_230/save_to_file/keep_custom_tracks": false, +"slice_230/save_to_file/path": "", +"slice_230/start_frame": 0, +"slice_231/end_frame": 0, +"slice_231/loop_mode": 0, +"slice_231/name": "", +"slice_231/save_to_file/enabled": false, +"slice_231/save_to_file/keep_custom_tracks": false, +"slice_231/save_to_file/path": "", +"slice_231/start_frame": 0, +"slice_232/end_frame": 0, +"slice_232/loop_mode": 0, +"slice_232/name": "", +"slice_232/save_to_file/enabled": false, +"slice_232/save_to_file/keep_custom_tracks": false, +"slice_232/save_to_file/path": "", +"slice_232/start_frame": 0, +"slice_233/end_frame": 0, +"slice_233/loop_mode": 0, +"slice_233/name": "", +"slice_233/save_to_file/enabled": false, +"slice_233/save_to_file/keep_custom_tracks": false, +"slice_233/save_to_file/path": "", +"slice_233/start_frame": 0, +"slice_234/end_frame": 0, +"slice_234/loop_mode": 0, +"slice_234/name": "", +"slice_234/save_to_file/enabled": false, +"slice_234/save_to_file/keep_custom_tracks": false, +"slice_234/save_to_file/path": "", +"slice_234/start_frame": 0, +"slice_235/end_frame": 0, +"slice_235/loop_mode": 0, +"slice_235/name": "", +"slice_235/save_to_file/enabled": false, +"slice_235/save_to_file/keep_custom_tracks": false, +"slice_235/save_to_file/path": "", +"slice_235/start_frame": 0, +"slice_236/end_frame": 0, +"slice_236/loop_mode": 0, +"slice_236/name": "", +"slice_236/save_to_file/enabled": false, +"slice_236/save_to_file/keep_custom_tracks": false, +"slice_236/save_to_file/path": "", +"slice_236/start_frame": 0, +"slice_237/end_frame": 0, +"slice_237/loop_mode": 0, +"slice_237/name": "", +"slice_237/save_to_file/enabled": false, +"slice_237/save_to_file/keep_custom_tracks": false, +"slice_237/save_to_file/path": "", +"slice_237/start_frame": 0, +"slice_238/end_frame": 0, +"slice_238/loop_mode": 0, +"slice_238/name": "", +"slice_238/save_to_file/enabled": false, +"slice_238/save_to_file/keep_custom_tracks": false, +"slice_238/save_to_file/path": "", +"slice_238/start_frame": 0, +"slice_239/end_frame": 0, +"slice_239/loop_mode": 0, +"slice_239/name": "", +"slice_239/save_to_file/enabled": false, +"slice_239/save_to_file/keep_custom_tracks": false, +"slice_239/save_to_file/path": "", +"slice_239/start_frame": 0, +"slice_24/end_frame": 0, +"slice_24/loop_mode": 0, +"slice_24/name": "", +"slice_24/save_to_file/enabled": false, +"slice_24/save_to_file/keep_custom_tracks": false, +"slice_24/save_to_file/path": "", +"slice_24/start_frame": 0, +"slice_240/end_frame": 0, +"slice_240/loop_mode": 0, +"slice_240/name": "", +"slice_240/save_to_file/enabled": false, +"slice_240/save_to_file/keep_custom_tracks": false, +"slice_240/save_to_file/path": "", +"slice_240/start_frame": 0, +"slice_241/end_frame": 0, +"slice_241/loop_mode": 0, +"slice_241/name": "", +"slice_241/save_to_file/enabled": false, +"slice_241/save_to_file/keep_custom_tracks": false, +"slice_241/save_to_file/path": "", +"slice_241/start_frame": 0, +"slice_242/end_frame": 0, +"slice_242/loop_mode": 0, +"slice_242/name": "", +"slice_242/save_to_file/enabled": false, +"slice_242/save_to_file/keep_custom_tracks": false, +"slice_242/save_to_file/path": "", +"slice_242/start_frame": 0, +"slice_243/end_frame": 0, +"slice_243/loop_mode": 0, +"slice_243/name": "", +"slice_243/save_to_file/enabled": false, +"slice_243/save_to_file/keep_custom_tracks": false, +"slice_243/save_to_file/path": "", +"slice_243/start_frame": 0, +"slice_244/end_frame": 0, +"slice_244/loop_mode": 0, +"slice_244/name": "", +"slice_244/save_to_file/enabled": false, +"slice_244/save_to_file/keep_custom_tracks": false, +"slice_244/save_to_file/path": "", +"slice_244/start_frame": 0, +"slice_245/end_frame": 0, +"slice_245/loop_mode": 0, +"slice_245/name": "", +"slice_245/save_to_file/enabled": false, +"slice_245/save_to_file/keep_custom_tracks": false, +"slice_245/save_to_file/path": "", +"slice_245/start_frame": 0, +"slice_246/end_frame": 0, +"slice_246/loop_mode": 0, +"slice_246/name": "", +"slice_246/save_to_file/enabled": false, +"slice_246/save_to_file/keep_custom_tracks": false, +"slice_246/save_to_file/path": "", +"slice_246/start_frame": 0, +"slice_247/end_frame": 0, +"slice_247/loop_mode": 0, +"slice_247/name": "", +"slice_247/save_to_file/enabled": false, +"slice_247/save_to_file/keep_custom_tracks": false, +"slice_247/save_to_file/path": "", +"slice_247/start_frame": 0, +"slice_248/end_frame": 0, +"slice_248/loop_mode": 0, +"slice_248/name": "", +"slice_248/save_to_file/enabled": false, +"slice_248/save_to_file/keep_custom_tracks": false, +"slice_248/save_to_file/path": "", +"slice_248/start_frame": 0, +"slice_249/end_frame": 0, +"slice_249/loop_mode": 0, +"slice_249/name": "", +"slice_249/save_to_file/enabled": false, +"slice_249/save_to_file/keep_custom_tracks": false, +"slice_249/save_to_file/path": "", +"slice_249/start_frame": 0, +"slice_25/end_frame": 0, +"slice_25/loop_mode": 0, +"slice_25/name": "", +"slice_25/save_to_file/enabled": false, +"slice_25/save_to_file/keep_custom_tracks": false, +"slice_25/save_to_file/path": "", +"slice_25/start_frame": 0, +"slice_250/end_frame": 0, +"slice_250/loop_mode": 0, +"slice_250/name": "", +"slice_250/save_to_file/enabled": false, +"slice_250/save_to_file/keep_custom_tracks": false, +"slice_250/save_to_file/path": "", +"slice_250/start_frame": 0, +"slice_251/end_frame": 0, +"slice_251/loop_mode": 0, +"slice_251/name": "", +"slice_251/save_to_file/enabled": false, +"slice_251/save_to_file/keep_custom_tracks": false, +"slice_251/save_to_file/path": "", +"slice_251/start_frame": 0, +"slice_252/end_frame": 0, +"slice_252/loop_mode": 0, +"slice_252/name": "", +"slice_252/save_to_file/enabled": false, +"slice_252/save_to_file/keep_custom_tracks": false, +"slice_252/save_to_file/path": "", +"slice_252/start_frame": 0, +"slice_253/end_frame": 0, +"slice_253/loop_mode": 0, +"slice_253/name": "", +"slice_253/save_to_file/enabled": false, +"slice_253/save_to_file/keep_custom_tracks": false, +"slice_253/save_to_file/path": "", +"slice_253/start_frame": 0, +"slice_254/end_frame": 0, +"slice_254/loop_mode": 0, +"slice_254/name": "", +"slice_254/save_to_file/enabled": false, +"slice_254/save_to_file/keep_custom_tracks": false, +"slice_254/save_to_file/path": "", +"slice_254/start_frame": 0, +"slice_255/end_frame": 0, +"slice_255/loop_mode": 0, +"slice_255/name": "", +"slice_255/save_to_file/enabled": false, +"slice_255/save_to_file/keep_custom_tracks": false, +"slice_255/save_to_file/path": "", +"slice_255/start_frame": 0, +"slice_256/end_frame": 0, +"slice_256/loop_mode": 0, +"slice_256/name": "", +"slice_256/save_to_file/enabled": false, +"slice_256/save_to_file/keep_custom_tracks": false, +"slice_256/save_to_file/path": "", +"slice_256/start_frame": 0, +"slice_26/end_frame": 0, +"slice_26/loop_mode": 0, +"slice_26/name": "", +"slice_26/save_to_file/enabled": false, +"slice_26/save_to_file/keep_custom_tracks": false, +"slice_26/save_to_file/path": "", +"slice_26/start_frame": 0, +"slice_27/end_frame": 0, +"slice_27/loop_mode": 0, +"slice_27/name": "", +"slice_27/save_to_file/enabled": false, +"slice_27/save_to_file/keep_custom_tracks": false, +"slice_27/save_to_file/path": "", +"slice_27/start_frame": 0, +"slice_28/end_frame": 0, +"slice_28/loop_mode": 0, +"slice_28/name": "", +"slice_28/save_to_file/enabled": false, +"slice_28/save_to_file/keep_custom_tracks": false, +"slice_28/save_to_file/path": "", +"slice_28/start_frame": 0, +"slice_29/end_frame": 0, +"slice_29/loop_mode": 0, +"slice_29/name": "", +"slice_29/save_to_file/enabled": false, +"slice_29/save_to_file/keep_custom_tracks": false, +"slice_29/save_to_file/path": "", +"slice_29/start_frame": 0, +"slice_3/end_frame": 0, +"slice_3/loop_mode": 0, +"slice_3/name": "", +"slice_3/save_to_file/enabled": false, +"slice_3/save_to_file/keep_custom_tracks": false, +"slice_3/save_to_file/path": "", +"slice_3/start_frame": 0, +"slice_30/end_frame": 0, +"slice_30/loop_mode": 0, +"slice_30/name": "", +"slice_30/save_to_file/enabled": false, +"slice_30/save_to_file/keep_custom_tracks": false, +"slice_30/save_to_file/path": "", +"slice_30/start_frame": 0, +"slice_31/end_frame": 0, +"slice_31/loop_mode": 0, +"slice_31/name": "", +"slice_31/save_to_file/enabled": false, +"slice_31/save_to_file/keep_custom_tracks": false, +"slice_31/save_to_file/path": "", +"slice_31/start_frame": 0, +"slice_32/end_frame": 0, +"slice_32/loop_mode": 0, +"slice_32/name": "", +"slice_32/save_to_file/enabled": false, +"slice_32/save_to_file/keep_custom_tracks": false, +"slice_32/save_to_file/path": "", +"slice_32/start_frame": 0, +"slice_33/end_frame": 0, +"slice_33/loop_mode": 0, +"slice_33/name": "", +"slice_33/save_to_file/enabled": false, +"slice_33/save_to_file/keep_custom_tracks": false, +"slice_33/save_to_file/path": "", +"slice_33/start_frame": 0, +"slice_34/end_frame": 0, +"slice_34/loop_mode": 0, +"slice_34/name": "", +"slice_34/save_to_file/enabled": false, +"slice_34/save_to_file/keep_custom_tracks": false, +"slice_34/save_to_file/path": "", +"slice_34/start_frame": 0, +"slice_35/end_frame": 0, +"slice_35/loop_mode": 0, +"slice_35/name": "", +"slice_35/save_to_file/enabled": false, +"slice_35/save_to_file/keep_custom_tracks": false, +"slice_35/save_to_file/path": "", +"slice_35/start_frame": 0, +"slice_36/end_frame": 0, +"slice_36/loop_mode": 0, +"slice_36/name": "", +"slice_36/save_to_file/enabled": false, +"slice_36/save_to_file/keep_custom_tracks": false, +"slice_36/save_to_file/path": "", +"slice_36/start_frame": 0, +"slice_37/end_frame": 0, +"slice_37/loop_mode": 0, +"slice_37/name": "", +"slice_37/save_to_file/enabled": false, +"slice_37/save_to_file/keep_custom_tracks": false, +"slice_37/save_to_file/path": "", +"slice_37/start_frame": 0, +"slice_38/end_frame": 0, +"slice_38/loop_mode": 0, +"slice_38/name": "", +"slice_38/save_to_file/enabled": false, +"slice_38/save_to_file/keep_custom_tracks": false, +"slice_38/save_to_file/path": "", +"slice_38/start_frame": 0, +"slice_39/end_frame": 0, +"slice_39/loop_mode": 0, +"slice_39/name": "", +"slice_39/save_to_file/enabled": false, +"slice_39/save_to_file/keep_custom_tracks": false, +"slice_39/save_to_file/path": "", +"slice_39/start_frame": 0, +"slice_4/end_frame": 0, +"slice_4/loop_mode": 0, +"slice_4/name": "", +"slice_4/save_to_file/enabled": false, +"slice_4/save_to_file/keep_custom_tracks": false, +"slice_4/save_to_file/path": "", +"slice_4/start_frame": 0, +"slice_40/end_frame": 0, +"slice_40/loop_mode": 0, +"slice_40/name": "", +"slice_40/save_to_file/enabled": false, +"slice_40/save_to_file/keep_custom_tracks": false, +"slice_40/save_to_file/path": "", +"slice_40/start_frame": 0, +"slice_41/end_frame": 0, +"slice_41/loop_mode": 0, +"slice_41/name": "", +"slice_41/save_to_file/enabled": false, +"slice_41/save_to_file/keep_custom_tracks": false, +"slice_41/save_to_file/path": "", +"slice_41/start_frame": 0, +"slice_42/end_frame": 0, +"slice_42/loop_mode": 0, +"slice_42/name": "", +"slice_42/save_to_file/enabled": false, +"slice_42/save_to_file/keep_custom_tracks": false, +"slice_42/save_to_file/path": "", +"slice_42/start_frame": 0, +"slice_43/end_frame": 0, +"slice_43/loop_mode": 0, +"slice_43/name": "", +"slice_43/save_to_file/enabled": false, +"slice_43/save_to_file/keep_custom_tracks": false, +"slice_43/save_to_file/path": "", +"slice_43/start_frame": 0, +"slice_44/end_frame": 0, +"slice_44/loop_mode": 0, +"slice_44/name": "", +"slice_44/save_to_file/enabled": false, +"slice_44/save_to_file/keep_custom_tracks": false, +"slice_44/save_to_file/path": "", +"slice_44/start_frame": 0, +"slice_45/end_frame": 0, +"slice_45/loop_mode": 0, +"slice_45/name": "", +"slice_45/save_to_file/enabled": false, +"slice_45/save_to_file/keep_custom_tracks": false, +"slice_45/save_to_file/path": "", +"slice_45/start_frame": 0, +"slice_46/end_frame": 0, +"slice_46/loop_mode": 0, +"slice_46/name": "", +"slice_46/save_to_file/enabled": false, +"slice_46/save_to_file/keep_custom_tracks": false, +"slice_46/save_to_file/path": "", +"slice_46/start_frame": 0, +"slice_47/end_frame": 0, +"slice_47/loop_mode": 0, +"slice_47/name": "", +"slice_47/save_to_file/enabled": false, +"slice_47/save_to_file/keep_custom_tracks": false, +"slice_47/save_to_file/path": "", +"slice_47/start_frame": 0, +"slice_48/end_frame": 0, +"slice_48/loop_mode": 0, +"slice_48/name": "", +"slice_48/save_to_file/enabled": false, +"slice_48/save_to_file/keep_custom_tracks": false, +"slice_48/save_to_file/path": "", +"slice_48/start_frame": 0, +"slice_49/end_frame": 0, +"slice_49/loop_mode": 0, +"slice_49/name": "", +"slice_49/save_to_file/enabled": false, +"slice_49/save_to_file/keep_custom_tracks": false, +"slice_49/save_to_file/path": "", +"slice_49/start_frame": 0, +"slice_5/end_frame": 0, +"slice_5/loop_mode": 0, +"slice_5/name": "", +"slice_5/save_to_file/enabled": false, +"slice_5/save_to_file/keep_custom_tracks": false, +"slice_5/save_to_file/path": "", +"slice_5/start_frame": 0, +"slice_50/end_frame": 0, +"slice_50/loop_mode": 0, +"slice_50/name": "", +"slice_50/save_to_file/enabled": false, +"slice_50/save_to_file/keep_custom_tracks": false, +"slice_50/save_to_file/path": "", +"slice_50/start_frame": 0, +"slice_51/end_frame": 0, +"slice_51/loop_mode": 0, +"slice_51/name": "", +"slice_51/save_to_file/enabled": false, +"slice_51/save_to_file/keep_custom_tracks": false, +"slice_51/save_to_file/path": "", +"slice_51/start_frame": 0, +"slice_52/end_frame": 0, +"slice_52/loop_mode": 0, +"slice_52/name": "", +"slice_52/save_to_file/enabled": false, +"slice_52/save_to_file/keep_custom_tracks": false, +"slice_52/save_to_file/path": "", +"slice_52/start_frame": 0, +"slice_53/end_frame": 0, +"slice_53/loop_mode": 0, +"slice_53/name": "", +"slice_53/save_to_file/enabled": false, +"slice_53/save_to_file/keep_custom_tracks": false, +"slice_53/save_to_file/path": "", +"slice_53/start_frame": 0, +"slice_54/end_frame": 0, +"slice_54/loop_mode": 0, +"slice_54/name": "", +"slice_54/save_to_file/enabled": false, +"slice_54/save_to_file/keep_custom_tracks": false, +"slice_54/save_to_file/path": "", +"slice_54/start_frame": 0, +"slice_55/end_frame": 0, +"slice_55/loop_mode": 0, +"slice_55/name": "", +"slice_55/save_to_file/enabled": false, +"slice_55/save_to_file/keep_custom_tracks": false, +"slice_55/save_to_file/path": "", +"slice_55/start_frame": 0, +"slice_56/end_frame": 0, +"slice_56/loop_mode": 0, +"slice_56/name": "", +"slice_56/save_to_file/enabled": false, +"slice_56/save_to_file/keep_custom_tracks": false, +"slice_56/save_to_file/path": "", +"slice_56/start_frame": 0, +"slice_57/end_frame": 0, +"slice_57/loop_mode": 0, +"slice_57/name": "", +"slice_57/save_to_file/enabled": false, +"slice_57/save_to_file/keep_custom_tracks": false, +"slice_57/save_to_file/path": "", +"slice_57/start_frame": 0, +"slice_58/end_frame": 0, +"slice_58/loop_mode": 0, +"slice_58/name": "", +"slice_58/save_to_file/enabled": false, +"slice_58/save_to_file/keep_custom_tracks": false, +"slice_58/save_to_file/path": "", +"slice_58/start_frame": 0, +"slice_59/end_frame": 0, +"slice_59/loop_mode": 0, +"slice_59/name": "", +"slice_59/save_to_file/enabled": false, +"slice_59/save_to_file/keep_custom_tracks": false, +"slice_59/save_to_file/path": "", +"slice_59/start_frame": 0, +"slice_6/end_frame": 0, +"slice_6/loop_mode": 0, +"slice_6/name": "", +"slice_6/save_to_file/enabled": false, +"slice_6/save_to_file/keep_custom_tracks": false, +"slice_6/save_to_file/path": "", +"slice_6/start_frame": 0, +"slice_60/end_frame": 0, +"slice_60/loop_mode": 0, +"slice_60/name": "", +"slice_60/save_to_file/enabled": false, +"slice_60/save_to_file/keep_custom_tracks": false, +"slice_60/save_to_file/path": "", +"slice_60/start_frame": 0, +"slice_61/end_frame": 0, +"slice_61/loop_mode": 0, +"slice_61/name": "", +"slice_61/save_to_file/enabled": false, +"slice_61/save_to_file/keep_custom_tracks": false, +"slice_61/save_to_file/path": "", +"slice_61/start_frame": 0, +"slice_62/end_frame": 0, +"slice_62/loop_mode": 0, +"slice_62/name": "", +"slice_62/save_to_file/enabled": false, +"slice_62/save_to_file/keep_custom_tracks": false, +"slice_62/save_to_file/path": "", +"slice_62/start_frame": 0, +"slice_63/end_frame": 0, +"slice_63/loop_mode": 0, +"slice_63/name": "", +"slice_63/save_to_file/enabled": false, +"slice_63/save_to_file/keep_custom_tracks": false, +"slice_63/save_to_file/path": "", +"slice_63/start_frame": 0, +"slice_64/end_frame": 0, +"slice_64/loop_mode": 0, +"slice_64/name": "", +"slice_64/save_to_file/enabled": false, +"slice_64/save_to_file/keep_custom_tracks": false, +"slice_64/save_to_file/path": "", +"slice_64/start_frame": 0, +"slice_65/end_frame": 0, +"slice_65/loop_mode": 0, +"slice_65/name": "", +"slice_65/save_to_file/enabled": false, +"slice_65/save_to_file/keep_custom_tracks": false, +"slice_65/save_to_file/path": "", +"slice_65/start_frame": 0, +"slice_66/end_frame": 0, +"slice_66/loop_mode": 0, +"slice_66/name": "", +"slice_66/save_to_file/enabled": false, +"slice_66/save_to_file/keep_custom_tracks": false, +"slice_66/save_to_file/path": "", +"slice_66/start_frame": 0, +"slice_67/end_frame": 0, +"slice_67/loop_mode": 0, +"slice_67/name": "", +"slice_67/save_to_file/enabled": false, +"slice_67/save_to_file/keep_custom_tracks": false, +"slice_67/save_to_file/path": "", +"slice_67/start_frame": 0, +"slice_68/end_frame": 0, +"slice_68/loop_mode": 0, +"slice_68/name": "", +"slice_68/save_to_file/enabled": false, +"slice_68/save_to_file/keep_custom_tracks": false, +"slice_68/save_to_file/path": "", +"slice_68/start_frame": 0, +"slice_69/end_frame": 0, +"slice_69/loop_mode": 0, +"slice_69/name": "", +"slice_69/save_to_file/enabled": false, +"slice_69/save_to_file/keep_custom_tracks": false, +"slice_69/save_to_file/path": "", +"slice_69/start_frame": 0, +"slice_7/end_frame": 0, +"slice_7/loop_mode": 0, +"slice_7/name": "", +"slice_7/save_to_file/enabled": false, +"slice_7/save_to_file/keep_custom_tracks": false, +"slice_7/save_to_file/path": "", +"slice_7/start_frame": 0, +"slice_70/end_frame": 0, +"slice_70/loop_mode": 0, +"slice_70/name": "", +"slice_70/save_to_file/enabled": false, +"slice_70/save_to_file/keep_custom_tracks": false, +"slice_70/save_to_file/path": "", +"slice_70/start_frame": 0, +"slice_71/end_frame": 0, +"slice_71/loop_mode": 0, +"slice_71/name": "", +"slice_71/save_to_file/enabled": false, +"slice_71/save_to_file/keep_custom_tracks": false, +"slice_71/save_to_file/path": "", +"slice_71/start_frame": 0, +"slice_72/end_frame": 0, +"slice_72/loop_mode": 0, +"slice_72/name": "", +"slice_72/save_to_file/enabled": false, +"slice_72/save_to_file/keep_custom_tracks": false, +"slice_72/save_to_file/path": "", +"slice_72/start_frame": 0, +"slice_73/end_frame": 0, +"slice_73/loop_mode": 0, +"slice_73/name": "", +"slice_73/save_to_file/enabled": false, +"slice_73/save_to_file/keep_custom_tracks": false, +"slice_73/save_to_file/path": "", +"slice_73/start_frame": 0, +"slice_74/end_frame": 0, +"slice_74/loop_mode": 0, +"slice_74/name": "", +"slice_74/save_to_file/enabled": false, +"slice_74/save_to_file/keep_custom_tracks": false, +"slice_74/save_to_file/path": "", +"slice_74/start_frame": 0, +"slice_75/end_frame": 0, +"slice_75/loop_mode": 0, +"slice_75/name": "", +"slice_75/save_to_file/enabled": false, +"slice_75/save_to_file/keep_custom_tracks": false, +"slice_75/save_to_file/path": "", +"slice_75/start_frame": 0, +"slice_76/end_frame": 0, +"slice_76/loop_mode": 0, +"slice_76/name": "", +"slice_76/save_to_file/enabled": false, +"slice_76/save_to_file/keep_custom_tracks": false, +"slice_76/save_to_file/path": "", +"slice_76/start_frame": 0, +"slice_77/end_frame": 0, +"slice_77/loop_mode": 0, +"slice_77/name": "", +"slice_77/save_to_file/enabled": false, +"slice_77/save_to_file/keep_custom_tracks": false, +"slice_77/save_to_file/path": "", +"slice_77/start_frame": 0, +"slice_78/end_frame": 0, +"slice_78/loop_mode": 0, +"slice_78/name": "", +"slice_78/save_to_file/enabled": false, +"slice_78/save_to_file/keep_custom_tracks": false, +"slice_78/save_to_file/path": "", +"slice_78/start_frame": 0, +"slice_79/end_frame": 0, +"slice_79/loop_mode": 0, +"slice_79/name": "", +"slice_79/save_to_file/enabled": false, +"slice_79/save_to_file/keep_custom_tracks": false, +"slice_79/save_to_file/path": "", +"slice_79/start_frame": 0, +"slice_8/end_frame": 0, +"slice_8/loop_mode": 0, +"slice_8/name": "", +"slice_8/save_to_file/enabled": false, +"slice_8/save_to_file/keep_custom_tracks": false, +"slice_8/save_to_file/path": "", +"slice_8/start_frame": 0, +"slice_80/end_frame": 0, +"slice_80/loop_mode": 0, +"slice_80/name": "", +"slice_80/save_to_file/enabled": false, +"slice_80/save_to_file/keep_custom_tracks": false, +"slice_80/save_to_file/path": "", +"slice_80/start_frame": 0, +"slice_81/end_frame": 0, +"slice_81/loop_mode": 0, +"slice_81/name": "", +"slice_81/save_to_file/enabled": false, +"slice_81/save_to_file/keep_custom_tracks": false, +"slice_81/save_to_file/path": "", +"slice_81/start_frame": 0, +"slice_82/end_frame": 0, +"slice_82/loop_mode": 0, +"slice_82/name": "", +"slice_82/save_to_file/enabled": false, +"slice_82/save_to_file/keep_custom_tracks": false, +"slice_82/save_to_file/path": "", +"slice_82/start_frame": 0, +"slice_83/end_frame": 0, +"slice_83/loop_mode": 0, +"slice_83/name": "", +"slice_83/save_to_file/enabled": false, +"slice_83/save_to_file/keep_custom_tracks": false, +"slice_83/save_to_file/path": "", +"slice_83/start_frame": 0, +"slice_84/end_frame": 0, +"slice_84/loop_mode": 0, +"slice_84/name": "", +"slice_84/save_to_file/enabled": false, +"slice_84/save_to_file/keep_custom_tracks": false, +"slice_84/save_to_file/path": "", +"slice_84/start_frame": 0, +"slice_85/end_frame": 0, +"slice_85/loop_mode": 0, +"slice_85/name": "", +"slice_85/save_to_file/enabled": false, +"slice_85/save_to_file/keep_custom_tracks": false, +"slice_85/save_to_file/path": "", +"slice_85/start_frame": 0, +"slice_86/end_frame": 0, +"slice_86/loop_mode": 0, +"slice_86/name": "", +"slice_86/save_to_file/enabled": false, +"slice_86/save_to_file/keep_custom_tracks": false, +"slice_86/save_to_file/path": "", +"slice_86/start_frame": 0, +"slice_87/end_frame": 0, +"slice_87/loop_mode": 0, +"slice_87/name": "", +"slice_87/save_to_file/enabled": false, +"slice_87/save_to_file/keep_custom_tracks": false, +"slice_87/save_to_file/path": "", +"slice_87/start_frame": 0, +"slice_88/end_frame": 0, +"slice_88/loop_mode": 0, +"slice_88/name": "", +"slice_88/save_to_file/enabled": false, +"slice_88/save_to_file/keep_custom_tracks": false, +"slice_88/save_to_file/path": "", +"slice_88/start_frame": 0, +"slice_89/end_frame": 0, +"slice_89/loop_mode": 0, +"slice_89/name": "", +"slice_89/save_to_file/enabled": false, +"slice_89/save_to_file/keep_custom_tracks": false, +"slice_89/save_to_file/path": "", +"slice_89/start_frame": 0, +"slice_9/end_frame": 0, +"slice_9/loop_mode": 0, +"slice_9/name": "", +"slice_9/save_to_file/enabled": false, +"slice_9/save_to_file/keep_custom_tracks": false, +"slice_9/save_to_file/path": "", +"slice_9/start_frame": 0, +"slice_90/end_frame": 0, +"slice_90/loop_mode": 0, +"slice_90/name": "", +"slice_90/save_to_file/enabled": false, +"slice_90/save_to_file/keep_custom_tracks": false, +"slice_90/save_to_file/path": "", +"slice_90/start_frame": 0, +"slice_91/end_frame": 0, +"slice_91/loop_mode": 0, +"slice_91/name": "", +"slice_91/save_to_file/enabled": false, +"slice_91/save_to_file/keep_custom_tracks": false, +"slice_91/save_to_file/path": "", +"slice_91/start_frame": 0, +"slice_92/end_frame": 0, +"slice_92/loop_mode": 0, +"slice_92/name": "", +"slice_92/save_to_file/enabled": false, +"slice_92/save_to_file/keep_custom_tracks": false, +"slice_92/save_to_file/path": "", +"slice_92/start_frame": 0, +"slice_93/end_frame": 0, +"slice_93/loop_mode": 0, +"slice_93/name": "", +"slice_93/save_to_file/enabled": false, +"slice_93/save_to_file/keep_custom_tracks": false, +"slice_93/save_to_file/path": "", +"slice_93/start_frame": 0, +"slice_94/end_frame": 0, +"slice_94/loop_mode": 0, +"slice_94/name": "", +"slice_94/save_to_file/enabled": false, +"slice_94/save_to_file/keep_custom_tracks": false, +"slice_94/save_to_file/path": "", +"slice_94/start_frame": 0, +"slice_95/end_frame": 0, +"slice_95/loop_mode": 0, +"slice_95/name": "", +"slice_95/save_to_file/enabled": false, +"slice_95/save_to_file/keep_custom_tracks": false, +"slice_95/save_to_file/path": "", +"slice_95/start_frame": 0, +"slice_96/end_frame": 0, +"slice_96/loop_mode": 0, +"slice_96/name": "", +"slice_96/save_to_file/enabled": false, +"slice_96/save_to_file/keep_custom_tracks": false, +"slice_96/save_to_file/path": "", +"slice_96/start_frame": 0, +"slice_97/end_frame": 0, +"slice_97/loop_mode": 0, +"slice_97/name": "", +"slice_97/save_to_file/enabled": false, +"slice_97/save_to_file/keep_custom_tracks": false, +"slice_97/save_to_file/path": "", +"slice_97/start_frame": 0, +"slice_98/end_frame": 0, +"slice_98/loop_mode": 0, +"slice_98/name": "", +"slice_98/save_to_file/enabled": false, +"slice_98/save_to_file/keep_custom_tracks": false, +"slice_98/save_to_file/path": "", +"slice_98/start_frame": 0, +"slice_99/end_frame": 0, +"slice_99/loop_mode": 0, +"slice_99/name": "", +"slice_99/save_to_file/enabled": false, +"slice_99/save_to_file/keep_custom_tracks": false, +"slice_99/save_to_file/path": "", +"slice_99/start_frame": 0, +"slices/amount": null +} +}, +"materials": { +"Material.002": { +"use_external/enabled": true, +"use_external/path": "res://materials/MainTexture.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/models/mum_general_texture-Recovered.png b/models/mum_general_texture-Recovered.png new file mode 100644 index 0000000..ddadfa2 --- /dev/null +++ b/models/mum_general_texture-Recovered.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2b571360a2744923ee3ff5eaa474ca6c610763d6efc209d454fd90b8fdec29c +size 1474 diff --git a/models/mum_general_texture-Recovered.png.import b/models/mum_general_texture-Recovered.png.import new file mode 100644 index 0000000..5679198 --- /dev/null +++ b/models/mum_general_texture-Recovered.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ymtfoe5g77ws" +path.s3tc="res://.godot/imported/mum_general_texture-Recovered.png-df2c666fa82c44971da818a8a469481b.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={} + +[deps] + +source_file="res://models/mum_general_texture-Recovered.png" +dest_files=["res://.godot/imported/mum_general_texture-Recovered.png-df2c666fa82c44971da818a8a469481b.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/models/paleta.png.import b/models/paleta.png.import new file mode 100644 index 0000000..4809235 --- /dev/null +++ b/models/paleta.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c860wch1wsuq4" +path="res://.godot/imported/paleta.png-bf6c8f465bbf16c99079ae53287f30dc.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://models/paleta.png" +dest_files=["res://.godot/imported/paleta.png-bf6c8f465bbf16c99079ae53287f30dc.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 diff --git a/models/palm.glb b/models/palm.glb new file mode 100644 index 0000000..74b7676 --- /dev/null +++ b/models/palm.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:10aef7c6fac9ed91a3e07386a7ea2876f89cf45acf01e8a45df5108688fc2ddd +size 29184 diff --git a/models/palm.glb.import b/models/palm.glb.import new file mode 100644 index 0000000..360d3c7 --- /dev/null +++ b/models/palm.glb.import @@ -0,0 +1,39 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cai1dwhomhd50" +path="res://.godot/imported/palm.glb-e9b4c3235cc00e71f297eff6f7ec3a78.scn" + +[deps] + +source_file="res://models/palm.glb" +dest_files=["res://.godot/imported/palm.glb-e9b4c3235cc00e71f297eff6f7ec3a78.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Material.001": { +"use_external/enabled": true, +"use_external/path": "res://materials/plants_opacity.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/models/palm2.glb b/models/palm2.glb new file mode 100644 index 0000000..820371b --- /dev/null +++ b/models/palm2.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:00bfcedc643b5e4878bca96e6681b24f6adf65d33ddea856d1115eab34f53638 +size 32032 diff --git a/models/palm2.glb.import b/models/palm2.glb.import new file mode 100644 index 0000000..5272dad --- /dev/null +++ b/models/palm2.glb.import @@ -0,0 +1,43 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bdeltnh2wp4ff" +path="res://.godot/imported/palm2.glb-7b97a218410a77f652f2a1333c6f7d6a.scn" + +[deps] + +source_file="res://models/palm2.glb" +dest_files=["res://.godot/imported/palm2.glb-7b97a218410a77f652f2a1333c6f7d6a.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Material.011": { +"use_external/enabled": true, +"use_external/path": "res://materials/plants_opacity.tres" +}, +"Material.012": { +"use_external/enabled": true, +"use_external/path": "res://materials/opaque_terrains.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/models/palm2_Myd_general_texture-Recovered.png b/models/palm2_Myd_general_texture-Recovered.png new file mode 100644 index 0000000..0552203 --- /dev/null +++ b/models/palm2_Myd_general_texture-Recovered.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cfa207305bac8f7ade51a110a98d50dde87a404eb5d3f91e39019fc9b0d53ae4 +size 2003 diff --git a/models/palm2_Myd_general_texture-Recovered.png.import b/models/palm2_Myd_general_texture-Recovered.png.import new file mode 100644 index 0000000..a6f2cb0 --- /dev/null +++ b/models/palm2_Myd_general_texture-Recovered.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://optjhmm2uhi4" +path="res://.godot/imported/palm2_Myd_general_texture-Recovered.png-52ed07923b3acacc89c7befda88af203.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={} + +[deps] + +source_file="res://models/palm2_Myd_general_texture-Recovered.png" +dest_files=["res://.godot/imported/palm2_Myd_general_texture-Recovered.png-52ed07923b3acacc89c7befda88af203.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=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=1 diff --git a/models/palm_Myd_general_texture-Recovered.png.import b/models/palm_Myd_general_texture-Recovered.png.import new file mode 100644 index 0000000..4d5305c --- /dev/null +++ b/models/palm_Myd_general_texture-Recovered.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ck1faoss12jv0" +path.s3tc="res://.godot/imported/palm_Myd_general_texture-Recovered.png-cc69552dd29bc3a47fcceebef27f628a.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={} + +[deps] + +source_file="res://models/palm_Myd_general_texture-Recovered.png" +dest_files=["res://.godot/imported/palm_Myd_general_texture-Recovered.png-cc69552dd29bc3a47fcceebef27f628a.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/models/palm_vegetation_terrains.png b/models/palm_vegetation_terrains.png new file mode 100644 index 0000000..187dff1 --- /dev/null +++ b/models/palm_vegetation_terrains.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:800029739505df93467b3463612aad78d90f19fe15b18b46d672f66ea83585b0 +size 4870 diff --git a/models/palm_vegetation_terrains.png.import b/models/palm_vegetation_terrains.png.import new file mode 100644 index 0000000..562e1e4 --- /dev/null +++ b/models/palm_vegetation_terrains.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bfxgvnlp5lg1v" +path="res://.godot/imported/palm_vegetation_terrains.png-8017f7b271008509705a1b79e598555d.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={} + +[deps] + +source_file="res://models/palm_vegetation_terrains.png" +dest_files=["res://.godot/imported/palm_vegetation_terrains.png-8017f7b271008509705a1b79e598555d.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=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=1 diff --git a/models/parasol.glb b/models/parasol.glb new file mode 100644 index 0000000..de6ee7e --- /dev/null +++ b/models/parasol.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:08912add72f5b44d60a3f4187e4f19d7ad222ba8da4ca7c88c39a9dc30da62d0 +size 9096 diff --git a/models/parasol.glb.import b/models/parasol.glb.import new file mode 100644 index 0000000..66c3322 --- /dev/null +++ b/models/parasol.glb.import @@ -0,0 +1,39 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://qdsmjbqnr0bf" +path="res://.godot/imported/parasol.glb-b7771023d64d7587479246fb69fc9dc8.scn" + +[deps] + +source_file="res://models/parasol.glb" +dest_files=["res://.godot/imported/parasol.glb-b7771023d64d7587479246fb69fc9dc8.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Material": { +"use_external/enabled": true, +"use_external/path": "res://materials/plants_opacity.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/models/parasol_vegetation_terrains.png b/models/parasol_vegetation_terrains.png new file mode 100644 index 0000000..770cac0 --- /dev/null +++ b/models/parasol_vegetation_terrains.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5cf2c3da4317195710af91e7c6eb69725e88751920b5443d0cf1a517f55505e2 +size 5491 diff --git a/models/parasol_vegetation_terrains.png.import b/models/parasol_vegetation_terrains.png.import new file mode 100644 index 0000000..0e6592b --- /dev/null +++ b/models/parasol_vegetation_terrains.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://gea8ugadaccq" +path.s3tc="res://.godot/imported/parasol_vegetation_terrains.png-0dbc601f5f812f8b30bd6166750fbfb9.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={} + +[deps] + +source_file="res://models/parasol_vegetation_terrains.png" +dest_files=["res://.godot/imported/parasol_vegetation_terrains.png-0dbc601f5f812f8b30bd6166750fbfb9.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/models/planta_cueva.glb b/models/planta_cueva.glb new file mode 100644 index 0000000..caefe30 --- /dev/null +++ b/models/planta_cueva.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:20d3b126531cb86aa45d691f90eba12b75a7ff8a2c05e07f73a04446f7004eb7 +size 6272 diff --git a/models/planta_cueva.glb.import b/models/planta_cueva.glb.import new file mode 100644 index 0000000..adbd29c --- /dev/null +++ b/models/planta_cueva.glb.import @@ -0,0 +1,39 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://fu2pv3on1bo6" +path="res://.godot/imported/planta_cueva.glb-294f4ea5dcd8790685b519258075669c.scn" + +[deps] + +source_file="res://models/planta_cueva.glb" +dest_files=["res://.godot/imported/planta_cueva.glb-294f4ea5dcd8790685b519258075669c.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Material": { +"use_external/enabled": true, +"use_external/path": "res://materials/plants_opacity.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/models/planta_cueva_vegetation_terrains.png b/models/planta_cueva_vegetation_terrains.png new file mode 100644 index 0000000..a8a1615 --- /dev/null +++ b/models/planta_cueva_vegetation_terrains.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3c6a71b88f9b27a10be50ecb8f904fb08eb185a7350e77bc30081e7a7ba4c4c +size 4698 diff --git a/models/planta_cueva_vegetation_terrains.png.import b/models/planta_cueva_vegetation_terrains.png.import new file mode 100644 index 0000000..014a4fa --- /dev/null +++ b/models/planta_cueva_vegetation_terrains.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c6r35lmkabjsx" +path="res://.godot/imported/planta_cueva_vegetation_terrains.png-1a02206cfc9ca03e6bc2ec29cbfc98a0.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={} + +[deps] + +source_file="res://models/planta_cueva_vegetation_terrains.png" +dest_files=["res://.godot/imported/planta_cueva_vegetation_terrains.png-1a02206cfc9ca03e6bc2ec29cbfc98a0.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=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=1 diff --git a/models/ship1.glb b/models/ship1.glb new file mode 100644 index 0000000..b84b9e7 --- /dev/null +++ b/models/ship1.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:312d747ee3a5d2f645ab0381b5a081c5f119acf27ea176079bbececfb2a18c85 +size 79832 diff --git a/models/ship1.glb.import b/models/ship1.glb.import new file mode 100644 index 0000000..6a10b22 --- /dev/null +++ b/models/ship1.glb.import @@ -0,0 +1,39 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://3dc6jnki5yq1" +path="res://.godot/imported/ship1.glb-841e7426fb93ca20f1302f04c2a625ca.scn" + +[deps] + +source_file="res://models/ship1.glb" +dest_files=["res://.godot/imported/ship1.glb-841e7426fb93ca20f1302f04c2a625ca.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Material.001": { +"use_external/enabled": true, +"use_external/path": "res://materials/opaque_terrains.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/models/ship1_vegetation_terrains.png b/models/ship1_vegetation_terrains.png new file mode 100644 index 0000000..e2a6c00 --- /dev/null +++ b/models/ship1_vegetation_terrains.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d916979fd12621a154208fa370488dec8a6b359cd62520e43763c4d932069bed +size 1155 diff --git a/models/ship1_vegetation_terrains.png.import b/models/ship1_vegetation_terrains.png.import new file mode 100644 index 0000000..da22362 --- /dev/null +++ b/models/ship1_vegetation_terrains.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bl4y78ld147ry" +path.s3tc="res://.godot/imported/ship1_vegetation_terrains.png-0557d26f0216b464e55df5f0f17dee83.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={} + +[deps] + +source_file="res://models/ship1_vegetation_terrains.png" +dest_files=["res://.godot/imported/ship1_vegetation_terrains.png-0557d26f0216b464e55df5f0f17dee83.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/models/ship2.glb b/models/ship2.glb new file mode 100644 index 0000000..e0acb79 --- /dev/null +++ b/models/ship2.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:864f0ad80d2f29cd2ee025a2aa49dd57106fcd1a8491b76f6e2ad7c6d857a6ee +size 36468 diff --git a/models/ship2.glb.import b/models/ship2.glb.import new file mode 100644 index 0000000..932df68 --- /dev/null +++ b/models/ship2.glb.import @@ -0,0 +1,39 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bk3dhr2y7l1ln" +path="res://.godot/imported/ship2.glb-fecc543b3d581f4c5d1a093972449774.scn" + +[deps] + +source_file="res://models/ship2.glb" +dest_files=["res://.godot/imported/ship2.glb-fecc543b3d581f4c5d1a093972449774.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Material.005": { +"use_external/enabled": true, +"use_external/path": "res://materials/opaque_terrains.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/models/ship2_vegetation_terrains.png b/models/ship2_vegetation_terrains.png new file mode 100644 index 0000000..187dff1 --- /dev/null +++ b/models/ship2_vegetation_terrains.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:800029739505df93467b3463612aad78d90f19fe15b18b46d672f66ea83585b0 +size 4870 diff --git a/models/ship2_vegetation_terrains.png.import b/models/ship2_vegetation_terrains.png.import new file mode 100644 index 0000000..657b1ce --- /dev/null +++ b/models/ship2_vegetation_terrains.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cfsiwhqwmja6b" +path="res://.godot/imported/ship2_vegetation_terrains.png-054d0d8640a1f7090283fb7519e8e50a.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={} + +[deps] + +source_file="res://models/ship2_vegetation_terrains.png" +dest_files=["res://.godot/imported/ship2_vegetation_terrains.png-054d0d8640a1f7090283fb7519e8e50a.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=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=1 diff --git a/models/sol.glb b/models/sol.glb new file mode 100644 index 0000000..0f89706 --- /dev/null +++ b/models/sol.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:edf927c2123c43d06788f04b8d66b0f58aa5487d973ebe686782df601eccf1be +size 6980 diff --git a/models/sol.glb.import b/models/sol.glb.import new file mode 100644 index 0000000..bbc220a --- /dev/null +++ b/models/sol.glb.import @@ -0,0 +1,39 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cafa88uraqsua" +path="res://.godot/imported/sol.glb-023100fab6281320ecfdfa732eafe55f.scn" + +[deps] + +source_file="res://models/sol.glb" +dest_files=["res://.godot/imported/sol.glb-023100fab6281320ecfdfa732eafe55f.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Material": { +"use_external/enabled": true, +"use_external/path": "res://materials/sun.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/models/sol_sol.png b/models/sol_sol.png new file mode 100644 index 0000000..8665b41 --- /dev/null +++ b/models/sol_sol.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c441af40d75d2666110a5f169140e871c4c596a001fde5c0129527067613a9ec +size 1388 diff --git a/models/sol_sol.png.import b/models/sol_sol.png.import new file mode 100644 index 0000000..d2bf4d3 --- /dev/null +++ b/models/sol_sol.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bl7g2fctete35" +path.s3tc="res://.godot/imported/sol_sol.png-1c63f7a128fd29cb98ab8f95315ca4f1.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={} + +[deps] + +source_file="res://models/sol_sol.png" +dest_files=["res://.godot/imported/sol_sol.png-1c63f7a128fd29cb98ab8f95315ca4f1.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/models/stalactita_vegetation_terrains.png b/models/stalactita_vegetation_terrains.png new file mode 100644 index 0000000..a8a1615 --- /dev/null +++ b/models/stalactita_vegetation_terrains.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3c6a71b88f9b27a10be50ecb8f904fb08eb185a7350e77bc30081e7a7ba4c4c +size 4698 diff --git a/models/stalactita_vegetation_terrains.png.import b/models/stalactita_vegetation_terrains.png.import new file mode 100644 index 0000000..bba1d33 --- /dev/null +++ b/models/stalactita_vegetation_terrains.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bom4hxukig7gc" +path.s3tc="res://.godot/imported/stalactita_vegetation_terrains.png-2f93d795461f2a9c058f08d6fbbcd797.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={} + +[deps] + +source_file="res://models/stalactita_vegetation_terrains.png" +dest_files=["res://.godot/imported/stalactita_vegetation_terrains.png-2f93d795461f2a9c058f08d6fbbcd797.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/models/stalactitaglb.glb b/models/stalactitaglb.glb new file mode 100644 index 0000000..658f21e --- /dev/null +++ b/models/stalactitaglb.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:78c7e633b062f8e3e19fd2188472f2fffd2f5937a6bb4b712ed8895d70146c6e +size 11580 diff --git a/models/stalactitaglb.glb.import b/models/stalactitaglb.glb.import new file mode 100644 index 0000000..924b3ea --- /dev/null +++ b/models/stalactitaglb.glb.import @@ -0,0 +1,39 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://b5wcostpjgaa2" +path="res://.godot/imported/stalactitaglb.glb-7d54bebe4b939c20567f6fd05bcd9fbf.scn" + +[deps] + +source_file="res://models/stalactitaglb.glb" +dest_files=["res://.godot/imported/stalactitaglb.glb-7d54bebe4b939c20567f6fd05bcd9fbf.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Material": { +"use_external/enabled": true, +"use_external/path": "res://materials/opaque_terrains.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/models/stalactitaglb_vegetation_terrains.png b/models/stalactitaglb_vegetation_terrains.png new file mode 100644 index 0000000..a8a1615 --- /dev/null +++ b/models/stalactitaglb_vegetation_terrains.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3c6a71b88f9b27a10be50ecb8f904fb08eb185a7350e77bc30081e7a7ba4c4c +size 4698 diff --git a/models/stalactitaglb_vegetation_terrains.png.import b/models/stalactitaglb_vegetation_terrains.png.import new file mode 100644 index 0000000..f40a858 --- /dev/null +++ b/models/stalactitaglb_vegetation_terrains.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://drwi3qrkuae6b" +path="res://.godot/imported/stalactitaglb_vegetation_terrains.png-144c841345a163c6affe7c57478a0f6a.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={} + +[deps] + +source_file="res://models/stalactitaglb_vegetation_terrains.png" +dest_files=["res://.godot/imported/stalactitaglb_vegetation_terrains.png-144c841345a163c6affe7c57478a0f6a.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=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=1 diff --git a/models/tleafs.glb b/models/tleafs.glb new file mode 100644 index 0000000..fc13bb3 --- /dev/null +++ b/models/tleafs.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:11e4e80a883b60dbeb0af17e78433fd90486a0dd09fefb4011fc2a81f0ea5d8f +size 12276 diff --git a/models/tleafs.glb.import b/models/tleafs.glb.import new file mode 100644 index 0000000..0fcb99c --- /dev/null +++ b/models/tleafs.glb.import @@ -0,0 +1,39 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dxg83g1bpb6o3" +path="res://.godot/imported/tleafs.glb-66d931d869ff5fae7e0c25b4b0b647ee.scn" + +[deps] + +source_file="res://models/tleafs.glb" +dest_files=["res://.godot/imported/tleafs.glb-66d931d869ff5fae7e0c25b4b0b647ee.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Material.007": { +"use_external/enabled": true, +"use_external/path": "res://materials/tree1.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/models/tleafs_hojas_2.png b/models/tleafs_hojas_2.png new file mode 100644 index 0000000..62b365c --- /dev/null +++ b/models/tleafs_hojas_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea3820f1a63a9fb48037385e804232ff3858d42084307650862498a7fb88d6ec +size 1071 diff --git a/models/tleafs_hojas_2.png.import b/models/tleafs_hojas_2.png.import new file mode 100644 index 0000000..a8663fa --- /dev/null +++ b/models/tleafs_hojas_2.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://yx8lywmlrntu" +path="res://.godot/imported/tleafs_hojas_2.png-684c33a0b69717bcb512eff1aab15c53.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={} + +[deps] + +source_file="res://models/tleafs_hojas_2.png" +dest_files=["res://.godot/imported/tleafs_hojas_2.png-684c33a0b69717bcb512eff1aab15c53.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=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=1 diff --git a/models/tobogan.glb b/models/tobogan.glb new file mode 100644 index 0000000..6844816 --- /dev/null +++ b/models/tobogan.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bb7a9233f8ee4d4cacc435b52029bb59e1de447509ef039c1fdb4cfecd91eaf8 +size 23248 diff --git a/models/tobogan.glb.import b/models/tobogan.glb.import new file mode 100644 index 0000000..abf14f2 --- /dev/null +++ b/models/tobogan.glb.import @@ -0,0 +1,39 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://cle7p13xj53cm" +path="res://.godot/imported/tobogan.glb-cfc6d7b511195b88192c8698b82cbdbd.scn" + +[deps] + +source_file="res://models/tobogan.glb" +dest_files=["res://.godot/imported/tobogan.glb-cfc6d7b511195b88192c8698b82cbdbd.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Material.001": { +"use_external/enabled": true, +"use_external/path": "res://materials/opaque_terrains.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/models/tobogan_vegetation_terrains.png b/models/tobogan_vegetation_terrains.png new file mode 100644 index 0000000..770cac0 --- /dev/null +++ b/models/tobogan_vegetation_terrains.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5cf2c3da4317195710af91e7c6eb69725e88751920b5443d0cf1a517f55505e2 +size 5491 diff --git a/models/tobogan_vegetation_terrains.png.import b/models/tobogan_vegetation_terrains.png.import new file mode 100644 index 0000000..899d5fb --- /dev/null +++ b/models/tobogan_vegetation_terrains.png.import @@ -0,0 +1,36 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c1ac20gfqe33v" +path.s3tc="res://.godot/imported/tobogan_vegetation_terrains.png-d41f3ad5a00b0d712c86fc8c25377ea9.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} +generator_parameters={} + +[deps] + +source_file="res://models/tobogan_vegetation_terrains.png" +dest_files=["res://.godot/imported/tobogan_vegetation_terrains.png-d41f3ad5a00b0d712c86fc8c25377ea9.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/models/tree.glb b/models/tree.glb new file mode 100644 index 0000000..b0ff31a --- /dev/null +++ b/models/tree.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1cd6f412e8a04e2d9ec8cbc1ff026ab99f10874bd3daae792d3e34416c1df7b9 +size 21860 diff --git a/models/tree.glb.import b/models/tree.glb.import new file mode 100644 index 0000000..4639e45 --- /dev/null +++ b/models/tree.glb.import @@ -0,0 +1,39 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://718g8md4n8rh" +path="res://.godot/imported/tree.glb-dbddb30e49b01232e92ba32e8f4d23dd.scn" + +[deps] + +source_file="res://models/tree.glb" +dest_files=["res://.godot/imported/tree.glb-dbddb30e49b01232e92ba32e8f4d23dd.scn"] + +[params] + +nodes/root_type="Node3D" +nodes/root_name="Scene Root" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +import_script/path="" +_subresources={ +"materials": { +"Material.002": { +"use_external/enabled": true, +"use_external/path": "res://materials/opaque_terrains.tres" +} +} +} +gltf/embedded_image_handling=1 diff --git a/models/tree_vegetation_terrains.png b/models/tree_vegetation_terrains.png new file mode 100644 index 0000000..a8a1615 --- /dev/null +++ b/models/tree_vegetation_terrains.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3c6a71b88f9b27a10be50ecb8f904fb08eb185a7350e77bc30081e7a7ba4c4c +size 4698 diff --git a/models/tree_vegetation_terrains.png.import b/models/tree_vegetation_terrains.png.import new file mode 100644 index 0000000..29ab075 --- /dev/null +++ b/models/tree_vegetation_terrains.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cxvt4ak3nvtyk" +path="res://.godot/imported/tree_vegetation_terrains.png-d5f198fdb8fa4aae824c4fd620cadda2.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={} + +[deps] + +source_file="res://models/tree_vegetation_terrains.png" +dest_files=["res://.godot/imported/tree_vegetation_terrains.png-d5f198fdb8fa4aae824c4fd620cadda2.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=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=1 diff --git a/prefabs/Palm.tscn b/prefabs/Palm.tscn new file mode 100644 index 0000000..3b05e3f --- /dev/null +++ b/prefabs/Palm.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=3 uid="uid://dw8kcgef7neu7"] + +[ext_resource type="PackedScene" uid="uid://cai1dwhomhd50" path="res://models/palm.glb" id="1_c6nhh"] + +[node name="Palm" type="Node3D"] + +[node name="palm" parent="." instance=ExtResource("1_c6nhh")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.242286, 0.16573, -0.106271) diff --git a/prefabs/audio_manager.tscn b/prefabs/audio_manager.tscn new file mode 100644 index 0000000..ea57a25 --- /dev/null +++ b/prefabs/audio_manager.tscn @@ -0,0 +1,27 @@ +[gd_scene load_steps=10 format=3 uid="uid://ct43117k3fiic"] + +[ext_resource type="Script" path="res://scripts/audio_manager.gd" id="1_4cccp"] +[ext_resource type="AudioStream" uid="uid://21sp8tcwcdkb" path="res://audio/gameplay01.ogg" id="2_j2bxb"] +[ext_resource type="AudioStream" uid="uid://brokebpvawfm4" path="res://audio/gameplay02L.ogg" id="3_lya6e"] +[ext_resource type="AudioStream" uid="uid://bpwbfgn50emy8" path="res://audio/gameplay03.ogg" id="4_8hqx2"] +[ext_resource type="AudioStream" uid="uid://8gprrjf2cy0n" path="res://audio/gameplay04L.ogg" id="5_rsvrw"] +[ext_resource type="AudioStream" uid="uid://douhpj8nvhj7k" path="res://audio/gameplay05.ogg" id="6_h331t"] +[ext_resource type="AudioStream" uid="uid://purp2re1tgco" path="res://audio/gameplay06.ogg" id="7_hp4gg"] +[ext_resource type="AudioStream" uid="uid://clik4nqt5iosa" path="res://audio/gameplay07L.ogg" id="8_ec5ld"] +[ext_resource type="AudioStream" uid="uid://c2nnwn0rdgy7q" path="res://audio/gameplay08.ogg" id="9_jdpgu"] + +[node name="AudioManager" type="Node" node_paths=PackedStringArray("audio_player")] +script = ExtResource("1_4cccp") +audio_player = NodePath("AudioStreamPlayer") +audio1 = ExtResource("2_j2bxb") +audio2l = ExtResource("3_lya6e") +audio3 = ExtResource("4_8hqx2") +audio4l = ExtResource("5_rsvrw") +audio5 = ExtResource("6_h331t") +audio6 = ExtResource("7_hp4gg") +audio7l = ExtResource("8_ec5ld") +audio8 = ExtResource("9_jdpgu") + +[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] + +[connection signal="finished" from="AudioStreamPlayer" to="." method="_on_audio_stream_player_finished"] diff --git a/prefabs/eyes.tscn b/prefabs/eyes.tscn new file mode 100644 index 0000000..55baab9 --- /dev/null +++ b/prefabs/eyes.tscn @@ -0,0 +1,23 @@ +[gd_scene load_steps=3 format=3 uid="uid://bl5o22hf57ou1"] + +[ext_resource type="Script" path="res://scripts/player/eyes.gd" id="1_apkcc"] +[ext_resource type="Texture2D" uid="uid://cb3kvxnr8lpwp" path="res://sprites/eye_half-export.png" id="2_550jk"] + +[node name="Eyes" type="Node2D" node_paths=PackedStringArray("eyeUp", "eyeDown")] +script = ExtResource("1_apkcc") +eyeUp = NodePath("EyeUp") +eyeDown = NodePath("EyeDown") +start_time = 100 + +[node name="EyeUp" type="Sprite2D" parent="."] +modulate = Color(0.109804, 0.054902, 0.196078, 1) +position = Vector2(960, -540) +scale = Vector2(4, 4) +texture = ExtResource("2_550jk") + +[node name="EyeDown" type="Sprite2D" parent="."] +modulate = Color(0.109804, 0.054902, 0.196078, 1) +position = Vector2(960, 1620) +scale = Vector2(4, 4) +texture = ExtResource("2_550jk") +flip_v = true diff --git a/prefabs/ink_template.tscn b/prefabs/ink_template.tscn new file mode 100644 index 0000000..7b8cebe --- /dev/null +++ b/prefabs/ink_template.tscn @@ -0,0 +1,73 @@ +[gd_scene load_steps=8 format=3 uid="uid://s24kwfl62hu2"] + +[ext_resource type="Script" path="res://scripts/dialogue/ink_handler.gd" id="1_w5arv"] +[ext_resource type="AudioStream" uid="uid://dhmmw4qlm4e8j" path="res://audio/Sounds/texto1.ogg" id="2_e832p"] +[ext_resource type="AudioStream" uid="uid://dhy0px04e6s0e" path="res://audio/Sounds/texto2.ogg" id="3_yn1mf"] +[ext_resource type="AudioStream" uid="uid://dw4dm5f6375ou" path="res://audio/Sounds/texto3.ogg" id="4_68h0e"] +[ext_resource type="AudioStream" uid="uid://6ghqfd2weeam" path="res://audio/Sounds/texto4.ogg" id="5_nid0e"] +[ext_resource type="AudioStream" uid="uid://cihform6l2xq4" path="res://audio/Sounds/texto5.ogg" id="6_gmiux"] +[ext_resource type="AudioStream" uid="uid://crw2wxeiwu2xo" path="res://audio/Sounds/texto6.ogg" id="7_r2cxv"] + +[node name="Ink Template" type="Control" node_paths=PackedStringArray("buttons")] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_w5arv") +buttons = [NodePath("Button"), NodePath("Button2"), NodePath("Button3"), NodePath("Button4")] +type_sounds = Array[AudioStream]([ExtResource("2_e832p"), ExtResource("3_yn1mf"), ExtResource("4_68h0e"), ExtResource("5_nid0e"), ExtResource("6_gmiux"), ExtResource("7_r2cxv")]) + +[node name="ColorRect" type="ColorRect" parent="."] +layout_mode = 0 +offset_left = 187.0 +offset_top = 767.465 +offset_right = 1740.0 +offset_bottom = 994.465 +color = Color(1, 1, 1, 0) + +[node name="Label" type="Label" parent="ColorRect"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_bottom = 6.10352e-05 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_font_sizes/font_size = 36 +autowrap_mode = 2 + +[node name="Button" type="Button" parent="."] +layout_mode = 0 +offset_left = 88.0 +offset_top = 1000.0 +offset_right = 488.0 +offset_bottom = 1050.0 + +[node name="Button2" type="Button" parent="."] +layout_mode = 0 +offset_left = 537.0 +offset_top = 1000.0 +offset_right = 937.0 +offset_bottom = 1050.0 + +[node name="Button3" type="Button" parent="."] +layout_mode = 0 +offset_left = 991.0 +offset_top = 1000.0 +offset_right = 1391.0 +offset_bottom = 1050.0 + +[node name="Button4" type="Button" parent="."] +layout_mode = 0 +offset_left = 1445.0 +offset_top = 1000.0 +offset_right = 1845.0 +offset_bottom = 1050.0 + +[node name="TextDisplayTimer" type="Timer" parent="."] + +[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] + +[connection signal="timeout" from="TextDisplayTimer" to="." method="_on_text_display_timer_timeout"] diff --git a/prefabs/npcs/npc_1.tscn b/prefabs/npcs/npc_1.tscn new file mode 100644 index 0000000..c7ba815 --- /dev/null +++ b/prefabs/npcs/npc_1.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=5 format=3 uid="uid://jas4bhpuc3id"] + +[ext_resource type="Script" path="res://scripts/npc/npc.gd" id="1_we1lh"] +[ext_resource type="Resource" uid="uid://6tqg6urrn6xk" path="res://dialogues/character1.json" id="2_1ur5c"] +[ext_resource type="PackedScene" uid="uid://duxlytjrhvg3d" path="res://models/Myd.glb" id="2_s3trv"] + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_3ol7j"] + +[node name="CharacterBody3D" type="CharacterBody3D"] +collision_layer = 3 +script = ExtResource("1_we1lh") +text = ExtResource("2_1ur5c") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +shape = SubResource("CapsuleShape3D_3ol7j") + +[node name="Model" parent="." instance=ExtResource("2_s3trv")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 0, 0) diff --git a/prefabs/npcs/npc_1_path.tscn b/prefabs/npcs/npc_1_path.tscn new file mode 100644 index 0000000..e44c8d8 --- /dev/null +++ b/prefabs/npcs/npc_1_path.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=4 format=3 uid="uid://hdhmwophhre7"] + +[ext_resource type="Script" path="res://scripts/npc/npc_path_follow.gd" id="1_t6tnb"] +[ext_resource type="PackedScene" uid="uid://jas4bhpuc3id" path="res://prefabs/npcs/npc_1.tscn" id="2_hocol"] + +[sub_resource type="Curve3D" id="Curve3D_khpsd"] +resource_local_to_scene = true + +[node name="NpcPath" type="Path3D"] +curve = SubResource("Curve3D_khpsd") +script = ExtResource("1_t6tnb") +character_id = "Character1" + +[node name="PathFollow3D" type="PathFollow3D" parent="."] +transform = Transform3D(-0.0148199, 0, 0.999865, 0, 1, 0, -0.999865, 0, -0.0148199, 0, 0, 0) +rotation_mode = 1 +use_model_front = true +loop = false +tilt_enabled = false + +[node name="CharacterBody3D" parent="PathFollow3D" instance=ExtResource("2_hocol")] +transform = Transform3D(-8.74228e-08, 0, -2, 0, 2, 0, 2, 0, -8.74228e-08, 0, 0, 0) diff --git a/prefabs/npcs/npc_2.tscn b/prefabs/npcs/npc_2.tscn new file mode 100644 index 0000000..88b0e32 --- /dev/null +++ b/prefabs/npcs/npc_2.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=5 format=3 uid="uid://buv6flumanvoe"] + +[ext_resource type="Script" path="res://scripts/npc/npc.gd" id="1_wo2y7"] +[ext_resource type="Resource" uid="uid://cwuph50ai780s" path="res://dialogues/character2.json" id="2_wpnkv"] +[ext_resource type="PackedScene" uid="uid://dystsbccdabog" path="res://models/mum.glb" id="3_jxwot"] + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_3ol7j"] + +[node name="CharacterBody3D" type="CharacterBody3D"] +collision_layer = 3 +script = ExtResource("1_wo2y7") +text = ExtResource("2_wpnkv") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +shape = SubResource("CapsuleShape3D_3ol7j") + +[node name="Model" parent="." instance=ExtResource("3_jxwot")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 0, 0) diff --git a/prefabs/npcs/npc_2_path.tscn b/prefabs/npcs/npc_2_path.tscn new file mode 100644 index 0000000..5b6982a --- /dev/null +++ b/prefabs/npcs/npc_2_path.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=4 format=3 uid="uid://cx8kuqv4n7tno"] + +[ext_resource type="Script" path="res://scripts/npc/npc_path_follow.gd" id="1_3b4ne"] +[ext_resource type="PackedScene" uid="uid://buv6flumanvoe" path="res://prefabs/npcs/npc_2.tscn" id="2_mrx4d"] + +[sub_resource type="Curve3D" id="Curve3D_khpsd"] +resource_local_to_scene = true + +[node name="NpcPath" type="Path3D"] +curve = SubResource("Curve3D_khpsd") +script = ExtResource("1_3b4ne") +character_id = "Character2" + +[node name="PathFollow3D" type="PathFollow3D" parent="."] +transform = Transform3D(-0.0148199, 0, 0.999865, 0, 1, 0, -0.999865, 0, -0.0148199, 0, 0, 0) +rotation_mode = 1 +use_model_front = true +loop = false +tilt_enabled = false + +[node name="CharacterBody3D" parent="PathFollow3D" instance=ExtResource("2_mrx4d")] +transform = Transform3D(-8.74228e-08, 0, -2, 0, 2, 0, 2, 0, -8.74228e-08, 0, 0, 0) diff --git a/prefabs/npcs/npc_3.tscn b/prefabs/npcs/npc_3.tscn new file mode 100644 index 0000000..95d2651 --- /dev/null +++ b/prefabs/npcs/npc_3.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=5 format=3 uid="uid://5ybtk21ub4s5"] + +[ext_resource type="Script" path="res://scripts/npc/npc.gd" id="1_ep0wn"] +[ext_resource type="Resource" uid="uid://cci0kxg58ci6a" path="res://dialogues/character3.json" id="2_vmc2w"] +[ext_resource type="PackedScene" uid="uid://c5j5kw70le1ng" path="res://models/dawg.glb" id="3_bmxdp"] + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_3ol7j"] + +[node name="CharacterBody3D" type="CharacterBody3D"] +collision_layer = 3 +script = ExtResource("1_ep0wn") +text = ExtResource("2_vmc2w") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +shape = SubResource("CapsuleShape3D_3ol7j") + +[node name="Model" parent="." instance=ExtResource("3_bmxdp")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 0, 0) diff --git a/prefabs/npcs/npc_3_path.tscn b/prefabs/npcs/npc_3_path.tscn new file mode 100644 index 0000000..28aa06b --- /dev/null +++ b/prefabs/npcs/npc_3_path.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=4 format=3 uid="uid://c4or0bgl5mx8p"] + +[ext_resource type="Script" path="res://scripts/npc/npc_path_follow.gd" id="1_oe08w"] +[ext_resource type="PackedScene" uid="uid://5ybtk21ub4s5" path="res://prefabs/npcs/npc_3.tscn" id="2_kjbpv"] + +[sub_resource type="Curve3D" id="Curve3D_khpsd"] +resource_local_to_scene = true + +[node name="NpcPath" type="Path3D"] +curve = SubResource("Curve3D_khpsd") +script = ExtResource("1_oe08w") +character_id = "Character3" + +[node name="PathFollow3D" type="PathFollow3D" parent="."] +transform = Transform3D(-0.0148199, 0, 0.999865, 0, 1, 0, -0.999865, 0, -0.0148199, 0, 0, 0) +rotation_mode = 1 +use_model_front = true +loop = false +tilt_enabled = false + +[node name="CharacterBody3D" parent="PathFollow3D" instance=ExtResource("2_kjbpv")] +transform = Transform3D(-8.74228e-08, 0, -2, 0, 2, 0, 2, 0, -8.74228e-08, 0, 0, 0) diff --git a/prefabs/npcs/npc_4.tscn b/prefabs/npcs/npc_4.tscn new file mode 100644 index 0000000..9d75384 --- /dev/null +++ b/prefabs/npcs/npc_4.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=5 format=3 uid="uid://w7b5g4cs535r"] + +[ext_resource type="Script" path="res://scripts/npc/npc.gd" id="1_vey74"] +[ext_resource type="Resource" uid="uid://cve0godte3dr3" path="res://dialogues/character4.json" id="2_y26dc"] +[ext_resource type="PackedScene" uid="uid://7lpmh02u4vah" path="res://models/Buc.glb" id="3_kut2o"] + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_3ol7j"] + +[node name="CharacterBody3D" type="CharacterBody3D"] +collision_layer = 3 +script = ExtResource("1_vey74") +text = ExtResource("2_y26dc") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +shape = SubResource("CapsuleShape3D_3ol7j") + +[node name="Model" parent="." instance=ExtResource("3_kut2o")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 0, 0) diff --git a/prefabs/npcs/npc_4_path.tscn b/prefabs/npcs/npc_4_path.tscn new file mode 100644 index 0000000..57c1ab5 --- /dev/null +++ b/prefabs/npcs/npc_4_path.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=4 format=3 uid="uid://csksipejvudcq"] + +[ext_resource type="Script" path="res://scripts/npc/npc_path_follow.gd" id="1_ewvyw"] +[ext_resource type="PackedScene" uid="uid://w7b5g4cs535r" path="res://prefabs/npcs/npc_4.tscn" id="2_8ioua"] + +[sub_resource type="Curve3D" id="Curve3D_khpsd"] +resource_local_to_scene = true + +[node name="NpcPath" type="Path3D"] +curve = SubResource("Curve3D_khpsd") +script = ExtResource("1_ewvyw") +character_id = "Character4" + +[node name="PathFollow3D" type="PathFollow3D" parent="."] +transform = Transform3D(-0.0148199, 0, 0.999865, 0, 1, 0, -0.999865, 0, -0.0148199, 0, 0, 0) +rotation_mode = 1 +use_model_front = true +loop = false +tilt_enabled = false + +[node name="CharacterBody3D" parent="PathFollow3D" instance=ExtResource("2_8ioua")] +transform = Transform3D(-1.31134e-07, 0, -3, 0, 3, 0, 3, 0, -1.31134e-07, 0, 0, 0) diff --git a/prefabs/npcs/npc_5.tscn b/prefabs/npcs/npc_5.tscn new file mode 100644 index 0000000..9f52ff5 --- /dev/null +++ b/prefabs/npcs/npc_5.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=5 format=3 uid="uid://bnc5ymdxydiax"] + +[ext_resource type="Script" path="res://scripts/npc/npc.gd" id="1_p8bw1"] +[ext_resource type="Resource" uid="uid://cu0t1i7ys0ye4" path="res://dialogues/character5.json" id="2_iw055"] +[ext_resource type="PackedScene" uid="uid://df3qcpluh0yxr" path="res://models/captain_D._Ed.glb" id="3_m4s6j"] + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_3ol7j"] + +[node name="CharacterBody3D" type="CharacterBody3D"] +collision_layer = 3 +script = ExtResource("1_p8bw1") +text = ExtResource("2_iw055") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +shape = SubResource("CapsuleShape3D_3ol7j") + +[node name="Model" parent="." instance=ExtResource("3_m4s6j")] +transform = Transform3D(-2.18557e-08, 0, -0.5, 0, 0.5, 0, 0.5, 0, -2.18557e-08, 0, 0, 0) diff --git a/prefabs/npcs/npc_5_path.tscn b/prefabs/npcs/npc_5_path.tscn new file mode 100644 index 0000000..4cd929e --- /dev/null +++ b/prefabs/npcs/npc_5_path.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=4 format=3 uid="uid://olm3djwv5v62"] + +[ext_resource type="Script" path="res://scripts/npc/npc_path_follow.gd" id="1_bf1wd"] +[ext_resource type="PackedScene" uid="uid://bnc5ymdxydiax" path="res://prefabs/npcs/npc_5.tscn" id="2_k7vlv"] + +[sub_resource type="Curve3D" id="Curve3D_khpsd"] +resource_local_to_scene = true + +[node name="NpcPath" type="Path3D"] +curve = SubResource("Curve3D_khpsd") +script = ExtResource("1_bf1wd") +character_id = "Character5" + +[node name="PathFollow3D" type="PathFollow3D" parent="."] +transform = Transform3D(-0.0148199, 0, 0.999865, 0, 1, 0, -0.999865, 0, -0.0148199, 0, 0, 0) +rotation_mode = 1 +use_model_front = true +loop = false +tilt_enabled = false + +[node name="CharacterBody3D" parent="PathFollow3D" instance=ExtResource("2_k7vlv")] +transform = Transform3D(-1.31134e-07, 0, -3, 0, 3, 0, 3, 0, -1.31134e-07, 0, 0, 0) diff --git a/prefabs/photo_preview.tscn b/prefabs/photo_preview.tscn new file mode 100644 index 0000000..0b12968 --- /dev/null +++ b/prefabs/photo_preview.tscn @@ -0,0 +1,146 @@ +[gd_scene load_steps=18 format=3 uid="uid://c3jm0jfxc3pgn"] + +[ext_resource type="Script" path="res://scripts/npc/photo.gd" id="1_4a0uu"] +[ext_resource type="Shader" path="res://scripts/shaders/dissolve.gdshader" id="1_m5phm"] +[ext_resource type="Texture2D" uid="uid://cfux36pq3rp1p" path="res://scripts/shaders/Perlin_noise_example.png" id="2_wrrl7"] +[ext_resource type="Texture2D" uid="uid://wmmrs8hn5rjq" path="res://sprites/foto2.png" id="3_jd82u"] +[ext_resource type="Texture2D" uid="uid://c2ek8j7na1dfu" path="res://sprites/foto3.png" id="4_3esw2"] +[ext_resource type="Texture2D" uid="uid://c5k7w4n0jpbd5" path="res://sprites/foto1.png" id="5_avqgf"] +[ext_resource type="Texture2D" uid="uid://k2vkbe0f7lvf" path="res://sprites/foto4.png" id="5_x5xke"] +[ext_resource type="Texture2D" uid="uid://vdmvd2gasn0g" path="res://sprites/foto5.png" id="6_keeju"] +[ext_resource type="AudioStream" uid="uid://bmklkfkvhbqj3" path="res://audio/Sounds/foto1.ogg" id="7_8o5j5"] +[ext_resource type="AudioStream" uid="uid://bpdxgs2rajtu3" path="res://audio/Sounds/foto2.ogg" id="8_pca8i"] +[ext_resource type="AudioStream" uid="uid://brxiyyvq1xmee" path="res://audio/Sounds/foto3.ogg" id="9_c08on"] +[ext_resource type="AudioStream" uid="uid://dhsmuwctlffx3" path="res://audio/Sounds/destruirFoto.ogg" id="10_w0p04"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_d82xq"] +shader = ExtResource("1_m5phm") +shader_parameter/dissolve_value = 0.0 +shader_parameter/dissolve_texture = ExtResource("2_wrrl7") + +[sub_resource type="Animation" id="Animation_0gacm"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("FotoTest:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(930, 1587)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("FotoTest:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("FotoTest:material:shader_parameter/dissolve_value") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} + +[sub_resource type="Animation" id="Animation_7pwyw"] +resource_name = "appear" +length = 0.3 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("FotoTest:position") +tracks/0/interp = 2 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.3), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(927, 1418), Vector2(930, 355)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("FotoTest:rotation") +tracks/1/interp = 4 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.3), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [-1.5708, -0.0523599] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("FotoTest:material:shader_parameter/dissolve_value") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [1.0] +} + +[sub_resource type="Animation" id="Animation_a15ni"] +resource_name = "disappear" +length = 1.5 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("FotoTest:material:shader_parameter/dissolve_value") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 1.5), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.9, 0.0] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_4pmtd"] +_data = { +"RESET": SubResource("Animation_0gacm"), +"appear": SubResource("Animation_7pwyw"), +"disappear": SubResource("Animation_a15ni") +} + +[node name="PhotoPreview" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_4a0uu") +photos = Array[Texture2D]([ExtResource("4_3esw2"), ExtResource("5_avqgf"), ExtResource("5_x5xke"), ExtResource("3_jd82u"), ExtResource("6_keeju")]) +photo_sound = Array[AudioStream]([ExtResource("7_8o5j5"), ExtResource("8_pca8i"), ExtResource("9_c08on")]) +destroy_sound = ExtResource("10_w0p04") + +[node name="FotoTest" type="Sprite2D" parent="."] +material = SubResource("ShaderMaterial_d82xq") +position = Vector2(930, 1587) +scale = Vector2(3.799, 3.598) +texture = ExtResource("5_avqgf") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_4pmtd") +} + +[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] diff --git a/prefabs/pickups/photo1.tscn b/prefabs/pickups/photo1.tscn new file mode 100644 index 0000000..c19d765 --- /dev/null +++ b/prefabs/pickups/photo1.tscn @@ -0,0 +1,117 @@ +[gd_scene load_steps=9 format=3 uid="uid://dr1vqy6g0leaa"] + +[ext_resource type="Script" path="res://scripts/npc/pickup.gd" id="1_v3y17"] +[ext_resource type="Resource" uid="uid://dadbbc2gurb4t" path="res://dialogues/foto1.json" id="2_kqtj8"] +[ext_resource type="Texture2D" uid="uid://c2ek8j7na1dfu" path="res://sprites/foto3.png" id="3_qppvj"] + +[sub_resource type="SphereShape3D" id="SphereShape3D_2go8t"] + +[sub_resource type="Animation" id="Animation_nyn5q"] +length = 0.001 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("SpritePivot:rotation:y") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("SpritePivot:position:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} + +[sub_resource type="Animation" id="Animation_y7xna"] +resource_name = "photo_hover" +length = 2.0 +loop_mode = 1 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("SpritePivot:rotation:y") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(0, 0, 0, 0, 0, 6.28319, 0, 0, 0, 0), +"times": PackedFloat32Array(0, 2) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("SpritePivot:position:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0, 0, 0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0, 0.2, -0.25, 0, 0.25, 0, 0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 1, 2) +} + +[sub_resource type="Animation" id="Animation_lefu0"] +resource_name = "photo_point" +loop_mode = 1 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("SpritePivot:position:y") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0.2, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("SpritePivot:rotation:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(1, 1), +"points": PackedFloat32Array(0, 0, 0, 0, 0, 18.8496, 0, 0, 0, 0), +"times": PackedFloat32Array(0, 1) +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_lofup"] +_data = { +"RESET": SubResource("Animation_nyn5q"), +"photo_hover": SubResource("Animation_y7xna"), +"photo_point": SubResource("Animation_lefu0") +} + +[node name="Pickup" type="Node3D"] +transform = Transform3D(2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0) + +[node name="CharacterBody3D" type="CharacterBody3D" parent="." node_paths=PackedStringArray("animation_payer")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +collision_layer = 3 +script = ExtResource("1_v3y17") +text = ExtResource("2_kqtj8") +animation_payer = NodePath("AnimationPlayer") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="CharacterBody3D"] +shape = SubResource("SphereShape3D_2go8t") + +[node name="SpritePivot" type="Node3D" parent="CharacterBody3D"] + +[node name="Sprite3D" type="Sprite3D" parent="CharacterBody3D/SpritePivot"] +transform = Transform3D(1.44889, 0.388228, 0, -0.388228, 1.44889, 0, 0, 0, 1.5, 0, 0, 0) +pixel_size = 0.0025 +texture = ExtResource("3_qppvj") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="CharacterBody3D"] +libraries = { +"": SubResource("AnimationLibrary_lofup") +} diff --git a/prefabs/pickups/photo2.tscn b/prefabs/pickups/photo2.tscn new file mode 100644 index 0000000..12d65c4 --- /dev/null +++ b/prefabs/pickups/photo2.tscn @@ -0,0 +1,118 @@ +[gd_scene load_steps=9 format=3 uid="uid://dns4jbkub4vjb"] + +[ext_resource type="Script" path="res://scripts/npc/pickup.gd" id="1_dcy1s"] +[ext_resource type="Resource" uid="uid://smyx6rnnkxfp" path="res://dialogues/foto2.json" id="2_5n2ji"] +[ext_resource type="Texture2D" uid="uid://c5k7w4n0jpbd5" path="res://sprites/foto1.png" id="3_nsx0u"] + +[sub_resource type="SphereShape3D" id="SphereShape3D_2go8t"] + +[sub_resource type="Animation" id="Animation_nyn5q"] +length = 0.001 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("SpritePivot:rotation:y") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("SpritePivot:position:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} + +[sub_resource type="Animation" id="Animation_y7xna"] +resource_name = "photo_hover" +length = 2.0 +loop_mode = 1 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("SpritePivot:rotation:y") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(0, 0, 0, 0, 0, 6.28319, 0, 0, 0, 0), +"times": PackedFloat32Array(0, 2) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("SpritePivot:position:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0, 0, 0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0, 0.2, -0.25, 0, 0.25, 0, 0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 1, 2) +} + +[sub_resource type="Animation" id="Animation_lefu0"] +resource_name = "photo_point" +loop_mode = 1 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("SpritePivot:position:y") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0.2, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("SpritePivot:rotation:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(1, 1), +"points": PackedFloat32Array(0, 0, 0, 0, 0, 18.8496, 0, 0, 0, 0), +"times": PackedFloat32Array(0, 1) +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_lofup"] +_data = { +"RESET": SubResource("Animation_nyn5q"), +"photo_hover": SubResource("Animation_y7xna"), +"photo_point": SubResource("Animation_lefu0") +} + +[node name="Pickup" type="Node3D"] +transform = Transform3D(2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0) + +[node name="CharacterBody3D" type="CharacterBody3D" parent="." node_paths=PackedStringArray("animation_payer")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +collision_layer = 3 +script = ExtResource("1_dcy1s") +text = ExtResource("2_5n2ji") +photo_index = 1 +animation_payer = NodePath("AnimationPlayer") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="CharacterBody3D"] +shape = SubResource("SphereShape3D_2go8t") + +[node name="SpritePivot" type="Node3D" parent="CharacterBody3D"] + +[node name="Sprite3D" type="Sprite3D" parent="CharacterBody3D/SpritePivot"] +transform = Transform3D(1.44889, 0.388228, 0, -0.388228, 1.44889, 0, 0, 0, 1.5, 0, 0, 0) +pixel_size = 0.0025 +texture = ExtResource("3_nsx0u") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="CharacterBody3D"] +libraries = { +"": SubResource("AnimationLibrary_lofup") +} diff --git a/prefabs/pickups/photo3.tscn b/prefabs/pickups/photo3.tscn new file mode 100644 index 0000000..443990d --- /dev/null +++ b/prefabs/pickups/photo3.tscn @@ -0,0 +1,118 @@ +[gd_scene load_steps=9 format=3 uid="uid://c3ppihxhym7uw"] + +[ext_resource type="Script" path="res://scripts/npc/pickup.gd" id="1_6r6n2"] +[ext_resource type="Resource" uid="uid://djaohlxw0xe11" path="res://dialogues/foto3.json" id="2_852fb"] +[ext_resource type="Texture2D" uid="uid://k2vkbe0f7lvf" path="res://sprites/foto4.png" id="3_46u8q"] + +[sub_resource type="SphereShape3D" id="SphereShape3D_2go8t"] + +[sub_resource type="Animation" id="Animation_nyn5q"] +length = 0.001 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("SpritePivot:rotation:y") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("SpritePivot:position:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} + +[sub_resource type="Animation" id="Animation_y7xna"] +resource_name = "photo_hover" +length = 2.0 +loop_mode = 1 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("SpritePivot:rotation:y") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(0, 0, 0, 0, 0, 6.28319, 0, 0, 0, 0), +"times": PackedFloat32Array(0, 2) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("SpritePivot:position:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0, 0, 0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0, 0.2, -0.25, 0, 0.25, 0, 0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 1, 2) +} + +[sub_resource type="Animation" id="Animation_lefu0"] +resource_name = "photo_point" +loop_mode = 1 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("SpritePivot:position:y") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0.2, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("SpritePivot:rotation:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(1, 1), +"points": PackedFloat32Array(0, 0, 0, 0, 0, 18.8496, 0, 0, 0, 0), +"times": PackedFloat32Array(0, 1) +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_lofup"] +_data = { +"RESET": SubResource("Animation_nyn5q"), +"photo_hover": SubResource("Animation_y7xna"), +"photo_point": SubResource("Animation_lefu0") +} + +[node name="Pickup" type="Node3D"] +transform = Transform3D(2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0) + +[node name="CharacterBody3D" type="CharacterBody3D" parent="." node_paths=PackedStringArray("animation_payer")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +collision_layer = 3 +script = ExtResource("1_6r6n2") +text = ExtResource("2_852fb") +photo_index = 2 +animation_payer = NodePath("AnimationPlayer") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="CharacterBody3D"] +shape = SubResource("SphereShape3D_2go8t") + +[node name="SpritePivot" type="Node3D" parent="CharacterBody3D"] + +[node name="Sprite3D" type="Sprite3D" parent="CharacterBody3D/SpritePivot"] +transform = Transform3D(1.44889, 0.388228, 0, -0.388228, 1.44889, 0, 0, 0, 1.5, 0, 0, 0) +pixel_size = 0.0025 +texture = ExtResource("3_46u8q") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="CharacterBody3D"] +libraries = { +"": SubResource("AnimationLibrary_lofup") +} diff --git a/prefabs/pickups/photo4.tscn b/prefabs/pickups/photo4.tscn new file mode 100644 index 0000000..fac6a21 --- /dev/null +++ b/prefabs/pickups/photo4.tscn @@ -0,0 +1,118 @@ +[gd_scene load_steps=9 format=3 uid="uid://6a7qvhgqxhqe"] + +[ext_resource type="Script" path="res://scripts/npc/pickup.gd" id="1_6dw86"] +[ext_resource type="Resource" uid="uid://cont4lcyee00o" path="res://dialogues/foto4.json" id="2_bhhgt"] +[ext_resource type="Texture2D" uid="uid://wmmrs8hn5rjq" path="res://sprites/foto2.png" id="3_yrf18"] + +[sub_resource type="SphereShape3D" id="SphereShape3D_2go8t"] + +[sub_resource type="Animation" id="Animation_nyn5q"] +length = 0.001 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("SpritePivot:rotation:y") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("SpritePivot:position:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} + +[sub_resource type="Animation" id="Animation_y7xna"] +resource_name = "photo_hover" +length = 2.0 +loop_mode = 1 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("SpritePivot:rotation:y") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(0, 0, 0, 0, 0, 6.28319, 0, 0, 0, 0), +"times": PackedFloat32Array(0, 2) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("SpritePivot:position:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0, 0, 0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0, 0.2, -0.25, 0, 0.25, 0, 0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 1, 2) +} + +[sub_resource type="Animation" id="Animation_lefu0"] +resource_name = "photo_point" +loop_mode = 1 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("SpritePivot:position:y") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0.2, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("SpritePivot:rotation:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(1, 1), +"points": PackedFloat32Array(0, 0, 0, 0, 0, 18.8496, 0, 0, 0, 0), +"times": PackedFloat32Array(0, 1) +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_lofup"] +_data = { +"RESET": SubResource("Animation_nyn5q"), +"photo_hover": SubResource("Animation_y7xna"), +"photo_point": SubResource("Animation_lefu0") +} + +[node name="Pickup" type="Node3D"] +transform = Transform3D(2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0) + +[node name="CharacterBody3D" type="CharacterBody3D" parent="." node_paths=PackedStringArray("animation_payer")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +collision_layer = 3 +script = ExtResource("1_6dw86") +text = ExtResource("2_bhhgt") +photo_index = 3 +animation_payer = NodePath("AnimationPlayer") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="CharacterBody3D"] +shape = SubResource("SphereShape3D_2go8t") + +[node name="SpritePivot" type="Node3D" parent="CharacterBody3D"] + +[node name="Sprite3D" type="Sprite3D" parent="CharacterBody3D/SpritePivot"] +transform = Transform3D(1.44889, 0.388228, 0, -0.388228, 1.44889, 0, 0, 0, 1.5, 0, 0, 0) +pixel_size = 0.0025 +texture = ExtResource("3_yrf18") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="CharacterBody3D"] +libraries = { +"": SubResource("AnimationLibrary_lofup") +} diff --git a/prefabs/pickups/photo5.tscn b/prefabs/pickups/photo5.tscn new file mode 100644 index 0000000..5826d34 --- /dev/null +++ b/prefabs/pickups/photo5.tscn @@ -0,0 +1,118 @@ +[gd_scene load_steps=9 format=3 uid="uid://bc5ihitqo0krd"] + +[ext_resource type="Script" path="res://scripts/npc/pickup.gd" id="1_2uato"] +[ext_resource type="Resource" uid="uid://dc8wcfl3q7j0u" path="res://dialogues/foto5.json" id="2_avw5u"] +[ext_resource type="Texture2D" uid="uid://vdmvd2gasn0g" path="res://sprites/foto5.png" id="3_jlxr3"] + +[sub_resource type="SphereShape3D" id="SphereShape3D_2go8t"] + +[sub_resource type="Animation" id="Animation_nyn5q"] +length = 0.001 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("SpritePivot:rotation:y") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("SpritePivot:position:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} + +[sub_resource type="Animation" id="Animation_y7xna"] +resource_name = "photo_hover" +length = 2.0 +loop_mode = 1 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("SpritePivot:rotation:y") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(0, 0, 0, 0, 0, 6.28319, 0, 0, 0, 0), +"times": PackedFloat32Array(0, 2) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("SpritePivot:position:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0, 0, 0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0, 0.2, -0.25, 0, 0.25, 0, 0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 1, 2) +} + +[sub_resource type="Animation" id="Animation_lefu0"] +resource_name = "photo_point" +loop_mode = 1 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("SpritePivot:position:y") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0.2, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("SpritePivot:rotation:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(1, 1), +"points": PackedFloat32Array(0, 0, 0, 0, 0, 18.8496, 0, 0, 0, 0), +"times": PackedFloat32Array(0, 1) +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_lofup"] +_data = { +"RESET": SubResource("Animation_nyn5q"), +"photo_hover": SubResource("Animation_y7xna"), +"photo_point": SubResource("Animation_lefu0") +} + +[node name="Pickup" type="Node3D"] +transform = Transform3D(2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0) + +[node name="CharacterBody3D" type="CharacterBody3D" parent="." node_paths=PackedStringArray("animation_payer")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +collision_layer = 3 +script = ExtResource("1_2uato") +text = ExtResource("2_avw5u") +photo_index = 4 +animation_payer = NodePath("AnimationPlayer") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="CharacterBody3D"] +shape = SubResource("SphereShape3D_2go8t") + +[node name="SpritePivot" type="Node3D" parent="CharacterBody3D"] + +[node name="Sprite3D" type="Sprite3D" parent="CharacterBody3D/SpritePivot"] +transform = Transform3D(1.44889, 0.388228, 0, -0.388228, 1.44889, 0, 0, 0, 1.5, 0, 0, 0) +pixel_size = 0.0025 +texture = ExtResource("3_jlxr3") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="CharacterBody3D"] +libraries = { +"": SubResource("AnimationLibrary_lofup") +} diff --git a/prefabs/player.tscn b/prefabs/player.tscn new file mode 100644 index 0000000..0b04c1a --- /dev/null +++ b/prefabs/player.tscn @@ -0,0 +1,28 @@ +[gd_scene load_steps=3 format=3 uid="uid://c2iiqawquye74"] + +[ext_resource type="Script" path="res://scripts/player/player.gd" id="1_l52uf"] + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_rrqu4"] + +[node name="Player" type="CharacterBody3D" node_paths=PackedStringArray("raycast")] +wall_min_slide_angle = 1.0472 +floor_constant_speed = true +floor_block_on_wall = false +floor_max_angle = 0.872665 +safe_margin = 0.01 +script = ExtResource("1_l52uf") +SPEED = 7.5 +raycast = NodePath("Camera3D/RayCast3D") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +shape = SubResource("CapsuleShape3D_rrqu4") + +[node name="Camera3D" type="Camera3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.5, 0) +current = true + +[node name="RayCast3D" type="RayCast3D" parent="Camera3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.125, 0) +target_position = Vector3(0, 0, -2.5) +collision_mask = 2 diff --git a/prefabs/postprocessing/crt.tscn b/prefabs/postprocessing/crt.tscn new file mode 100644 index 0000000..f23589a --- /dev/null +++ b/prefabs/postprocessing/crt.tscn @@ -0,0 +1,37 @@ +[gd_scene load_steps=3 format=3 uid="uid://bg08rb6d0pcbu"] + +[ext_resource type="Shader" path="res://scripts/shaders/crt.gdshader" id="1_ktxjh"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_doy38"] +shader = ExtResource("1_ktxjh") +shader_parameter/overlay = true +shader_parameter/scanlines_opacity = 0.2 +shader_parameter/scanlines_width = 0.5 +shader_parameter/grille_opacity = 0.0 +shader_parameter/resolution = Vector2(640, 480) +shader_parameter/pixelate = false +shader_parameter/roll = true +shader_parameter/roll_speed = 2.0 +shader_parameter/roll_size = 10.0 +shader_parameter/roll_variation = 0.1 +shader_parameter/distort_intensity = 0.01 +shader_parameter/noise_opacity = 0.1 +shader_parameter/noise_speed = 5.0 +shader_parameter/static_noise_intensity = 0.06 +shader_parameter/aberration = 0.00100005 +shader_parameter/brightness = 1.0 +shader_parameter/discolor = true +shader_parameter/warp_amount = 0.2 +shader_parameter/clip_warp = false +shader_parameter/vignette_intensity = 0.4 +shader_parameter/vignette_opacity = 0.5 + +[node name="CRT" type="BackBufferCopy"] +rect = Rect2(0, 0, 1920, 1080) + +[node name="CRT" type="Sprite2D" parent="."] + +[node name="ColorRect" type="ColorRect" parent="CRT"] +material = SubResource("ShaderMaterial_doy38") +offset_right = 1920.0 +offset_bottom = 756.0 diff --git a/prefabs/postprocessing/pixelation.tscn b/prefabs/postprocessing/pixelation.tscn new file mode 100644 index 0000000..c1afb19 --- /dev/null +++ b/prefabs/postprocessing/pixelation.tscn @@ -0,0 +1,27 @@ +[gd_scene load_steps=5 format=3 uid="uid://djdqsd2jvbu57"] + +[ext_resource type="Shader" path="res://scripts/shaders/pixelation.gdshader" id="1_1p5i1"] +[ext_resource type="Texture2D" uid="uid://cdhpjsxkjiypw" path="res://sprites/palette.png" id="2_oabbt"] +[ext_resource type="Texture2D" uid="uid://dnhsenb6116bl" path="res://sprites/palette1.png" id="3_m7d64"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_vv0lw"] +shader = ExtResource("1_1p5i1") +shader_parameter/num_colors = 19 +shader_parameter/u_dither_size = 4 +shader_parameter/PALETTE_TEXTURE = ExtResource("2_oabbt") +shader_parameter/PALETTE_TEXTURE_LOW = ExtResource("3_m7d64") + +[node name="Pixelation" type="BackBufferCopy"] +rect = Rect2(0, 0, 1920, 1080) + +[node name="Sprite2D" type="Sprite2D" parent="."] + +[node name="ColorRect" type="ColorRect" parent="Sprite2D"] +material = SubResource("ShaderMaterial_vv0lw") +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_right = 1919.0 +offset_bottom = 1079.0 +grow_horizontal = 2 +grow_vertical = 2 diff --git a/prefabs/tree.tscn b/prefabs/tree.tscn new file mode 100644 index 0000000..780ff06 --- /dev/null +++ b/prefabs/tree.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=3 format=3 uid="uid://byr3qptt5tims"] + +[ext_resource type="PackedScene" uid="uid://718g8md4n8rh" path="res://models/tree.glb" id="1_w75ul"] +[ext_resource type="PackedScene" uid="uid://dxg83g1bpb6o3" path="res://models/tleafs.glb" id="2_ujm58"] + +[node name="TREE" type="Node3D"] +transform = Transform3D(2.07188, 0, 0, 0, 2.07188, 0, 0, 0, 2.07188, 0.0229664, -0.103395, 0.216139) + +[node name="tleafs2" parent="." instance=ExtResource("2_ujm58")] +transform = Transform3D(-0.446087, 0, -0.380765, 0, 0.586495, 0, 0.380765, 0, -0.446087, -1.13587, -0.155778, -0.678516) + +[node name="tleafs" parent="." instance=ExtResource("2_ujm58")] +transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, -0.530581, 0, 0.595984) + +[node name="tleafs6" parent="." instance=ExtResource("2_ujm58")] +transform = Transform3D(0.378767, 0, 0.20566, 0, 0.52708, 0, -0.478966, 0, 0.162636, -0.36438, 0.0487318, 0.325059) + +[node name="tree2" parent="." instance=ExtResource("1_w75ul")] +transform = Transform3D(0.305666, 0, 0, 0, 0.305666, 0, 0, 0, 0.305666, -1.11348, 0.049904, -0.60421) diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..8b00abb --- /dev/null +++ b/project.godot @@ -0,0 +1,104 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="Figments of the Night" +run/main_scene="res://scenes/main.tscn" +config/features=PackedStringArray("4.1", "GL Compatibility") +boot_splash/bg_color=Color(0.368627, 0.12549, 0.321569, 1) +boot_splash/image="res://sprites/splashart-export.png" +config/icon="res://icon.png" +config/windows_native_icon="res://icon.ico" + +[autoload] + +DialogueManager="*res://scripts/singletons/dialogue_manager.gd" +__InkRuntime="*res://addons/inkgd/runtime/static/ink_runtime.gd" +SceneTransition="*res://scenes/scene_transition.tscn" + +[display] + +window/size/viewport_width=1920 +window/size/viewport_height=1080 +window/size/mode=3 +window/stretch/mode="canvas_items" + +[editor_plugins] + +enabled=PackedStringArray("res://addons/inkgd/plugin.cfg") + +[fmod] + +settings/banks_path="res://audio" +settings/fmod_output_type=0 +settings/fmod_debug_flags=0 +settings/fmod_debug_mode=1 +settings/banks_to_load_at_startup=Array[String](["res://audio/Master.bank", "res://audio/Master.strings.bank"]) +settings/banks_preload_samples=false +settings/banks_flags=0 +settings/sample_rate=48000 +settings/speaker_mode=3 +settings/dsp_buffer_length=512 +settings/dsp_buffer_count=4 +settings/real_channel_count=32 +settings/virtual_channel_count=128 +settings/enable_live_update=true +settings/live_update_port=9264 +settings/enable_memory_tracking=false +settings/encryption_key="" +settings/distance_scale_2d=1.0 +settings/init_with_3d_righthanded=true + +[inkgd] + +register_templates=true + +[input] + +move_left={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194319,"key_label":0,"unicode":0,"echo":false,"script":null) +] +} +move_right={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194321,"key_label":0,"unicode":0,"echo":false,"script":null) +] +} +move_forwards={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194320,"key_label":0,"unicode":0,"echo":false,"script":null) +] +} +move_backwards={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":83,"physical_keycode":83,"key_label":83,"unicode":115,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194322,"key_label":0,"unicode":0,"echo":false,"script":null) +] +} +advance_dialog={ +"deadzone": 0.5, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"canceled":false,"pressed":false,"double_click":false,"script":null) +] +} +interact={ +"deadzone": 0.5, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"canceled":false,"pressed":false,"double_click":false,"script":null) +] +} + +[rendering] + +renderer/rendering_method="gl_compatibility" +renderer/rendering_method.mobile="gl_compatibility" diff --git a/rcedit-x64.exe b/rcedit-x64.exe new file mode 100644 index 0000000000000000000000000000000000000000..36764c62d461e0d42ce694efef82b4446acdd063 GIT binary patch literal 1308672 zcmeFZ2UL{V)9%}#2qqc>=75Td88c=;&_+Qq=bSStm>mP6VvBjqI_5Fw95LrS=A6MC z5hLgKbSvY0^Z(8{>z=#Txp%F0E$iKTSJks?*Sllww+U)G$&kcgFeK%FLW04tou~eJ zTj>9S*clAYId?i6HYY!wYr9?G>0I?Ycj@aE(x+FaK5crqwQJL}XRlDVwjJF1g!Odm z($meac0IQqz1nvunmTm~_aD#=LUV6Q;~IGP=l`XVd+uf>zcg~+-Sw8|-n&jbGxfN0 zH@!tJ=x!&TRfpETm&x)BxL42eG~FxCbMVlBd+99CO?O>*rg6Ptc@7?0>z?v;yR_@9 zx_-7S*xz7iKRUT#*w78lewMv98;MBEQz7@h@VP7bSbrh{Cr6FM~RYDm)=lO3GeiV>5e>u(;2*Hs^G`J;Pi&) zt_H(`YH18!Kg)i34i8Ra@F0H|zQJPXPiFd`P5D{yk7v=)4g*3dsp?3ZWsusgPVvh> zH-n*d(LU|lgtjpl>YSk0xFK_jXDXh*{PV{8qE<1()kZL0r!^P~^SsLQmw(;{Lv+y) ztKi(_Fleh`CC{WhfBEMvye?L`T(sR_z{eSQto;viq22pRBDp%X+mCl~=wEWtMLj*+ zb?js?WR;IRk<)8D_Afc_qJ8@IX$Q;lE_f#fCo(7glU#@Hy%3DZ3!isn$j9@-zvO%= z{r}XzQ~DRXHbZJdY>#P_v?PYud?wW1xF$EmhE@b>OjShE&Pi#AtrSO@ z=Nv@t)Ig+G1-Napf#Uv@>_G!^Yfq3(?Sd_vyOZrd0^!F4AidX-JtX+DIf2Su0bAzv zMR?{(DzEvPvZCWj**ya^^a~YLeGjR83aHby(KRhWc-?(On%aZ1G!t^A>=4;?0Fex5 zU_{*mG(L^9A@+$eDK=*Sbm&(Y(;^^_HPP5u38+WUF*k4`ehK#=+p-Oe)K`G=_zIMH zD)66$(j*ryIkp-`#*>u2tc?Yc_K3txLO01#Ky!Sej)4m)>--*)bs!=|Un6|aA2p{r zlr2t49p(E`R{RD=l;It6 zbJ_vl?|D(k<=f+d!L$YyX>fam)Ba<2Wqz$Z~sa%L>kJ1E`Px2 zu0|i#AnB?R@SzzbcqC<;vf$Xqab(NAA$86~MRQcg#sySf+?TTEM&uHF(4DdaycW&C zdmW2aH?Bc0+u@fzy#RQ>A2U)8LZe`E0QOG>Dzpv4Ms*!w|p z=>-gVMcKhFxTI)d%FfS5E@>QPHG2a;atu(tYr-A%o{CzvLF2aEd3+#TzZaO1?g6Q; zyt@8-Ucup_6B846H@&$W8|mLK-Et|v(ANG***mbxk zS0a~1jB9lO?R)~c{Pt8{EeC#XAo%uKVKf^pxsOynVmPUau87p!Nj9!N-0U+bYrh!b zR?7hx^p))XiI8(~Sd~+aspW_nZE|4gL(P+m_1+$v0l4)El72M0{aex0+l~Ni$V=N! z^(0&S5-3^Hq3arn+E_XJ$v4V;Ph($;^$2^bqHQlgsr(Soyp>7KeT_!VbCAc~5ZO`! z;nsagOF!UEEUn;@t-xwC;C zb*$e**{X_?8w#U|AEfh5ggdTNEo>^ONFKa<*dls{xD** zK$1#sQ+CQO?~|@Sa$X&=WpPqcza6G*gn^VxERD(2liFGeuSX*oHy0t7aD&uNb)-l2 z@!wx#$?m&~@NZM$maYx_^ZRO>JKVHpQU%<=J5>?6gl3dYhz0Laa~L6CY2d_Y7?m|o z7SKd?s3>JmCc>?@ld{z6${wpoW%VIdZ4>|wJE`NnM&q3wFq&#faP2}Jp_)8~eMas~ zetJZjcgVHYL|bJ!_Bp?!|4pt8iB5*vv)9xydJidwz8Exq4=6Xzll^>%?5CD!G`@<+ zJ~sd+s6Usk3HO|)@ISj^#-MV*UmH)>ptd!u1;9$Z^TS6_iysZSQUT(u;j-eMY<`E_ zzTD_eVOtZMdJvXwZU^b_NVa8VQf>UvD0K;xW`hvkD7h|GVVqM%Wn0rg=ZuiaJ7BC2 zpzOh8n);hw&!@>SN?j#eMQ^&O=C$AdqAaO|yY;|6dneklBMiLVEnyfxP+QzEgx6dI zAk%JAWnaK&RE-5{`f9Ry7XVeUA$6Rb3G&Np zpal4U>~sh2RLw|78q?@K4-j$EZlvS^xJ^%k_eL{th;}#oWTfvIYV)}UBa<_X3VQ%Z zHXp_o&2`x_O1C$gNdkl&qMgxIY4(N1@G1uDxbCj#1j(q#UZEQ8+F2 z?%M}<j3CGe1MBqEU&NVOO8D=ibr zoT+?XJ}jMC9^JkXWaHv#)}?}E2Q$jEg0^@N7S}rH)Xq*pgYDNQuhf^1vClXEsI*p7YOeR$BZUgoyVU>I8S=y zcFHelmcw}dh_WyH;Ep?hM!9Ze3&#MkE}F8QA!LUJq2Z)G^`=s^?XrYZdm-}I8&W9~ zu%&z~_O;1~$f-E2nyQ)qvomUM)bB$YQI>KwWf$@w_b4-|q*{s=N5XK<0{OHNLOvjdE zUDaMcQY-J0iW);Ix;Pp$)L%LlMYu-@y2EvvSS1ptaelfmA~PGn=$nr!Q#_;P1H%Eh zy9iR~DrM6vAo5`X+2-0Jekp?5NNsyYXnL*Roz%oeq^fz*wl#87_c9p1DFcqUo*ZOX z!Y8rO5j3I7UdocCN90W~P@(V8UG)WWc>@f)x{%jq*IGz5SE_U6DtFEW<Y@uym*f zU8;j*`!0u(Mef{l0!F54q=ub@8>bV&c{@bLYvwvCfUVkg2WaD(>IxQQT?BWnwjVFP zp>a-*=r##kW`|%wlZOD**ADrW-e5sz$ilodt8*pfN@|n!_&RF)Yr`n~!ob|AQ=6|3 zWZ(j9*?t_dPJ7I8-$3b*1~Oy|*&C-2xv#EQdIWgxXDF*)2mAU>#i~llklX%-lx2Uq zRp)>xEjyVA*2FgILt_?=f<)Fs!#e|(?kj=t{3q0Qco$Y>lJJ!~z{eeg>{vnBu_TZi znudK-VDq;}sEsX7<=u2>$fqgIt~F}ur@^h)1LVDF0o^Y*#g9a|Z*RCqWb?I4ly!~; zDqKD|PzA>ELS&m)guCe&W#v^-B~9ER+B@E9jo~ZR)Jk*UF4qe7;0@%n4;pRcze(C< z9DPm7UOV45Hy|@l&~u7S1)$?ojEvIjE<6u1@hS#wR3|)aS%2%1ni>Pt)?t8dxkcrp zdZDrSG5|eGz)dp)yd?*Lul)s)m)cl=`a)AP$$|>csC;8_NM7M3)dbZp9X=@kJ7u$; zQkzo{sgl}(R(piTVRh>E3Jo39xu>9}=JUDXo-?DntsLBzY0$9Ci7heHX>{2Nlnv5e zw79&nU?r(49zf*_B^4{K$5>FRUP5^OYf{(dgEwk11`R8OE!FgXuW1HZJqPZ|2DGSa z7E-yijbD-i;YKImPLbjB_K^y_2g8^Yxs8>nDBv$rE@hBAs}oQOz3xjU7{}z2KNM=p z(FyBQKSkG6h_X)QNL7B0xoy-5=f;xiwvYC{Y>!+4#ai6UQClzd$rQ%{m^TdTy|fBt z)WOsF0m7BKL$YZC2p7qa2{Ve+ghzBUwi7fU6j=s1*n^1MvH5}&7reZ@^_eV^FC@<Wp) zfU2xrcpaU~2Hb~Ka0DvfGZ+n0Qn_I_a&vUN9=#FWdwLb#gJ^lW`IH^eb}N@3q_8H6 zRZ*m>DR}0(6z<&%l4v^-xr8s#ff3xA9P9 z1Il6!Qsy{=Y>K_0-0BXQtDQ%FHMN#j#23?ns;GgTM7t{A7m(tSaEHrv-J)Ske}ZXI z7f3zVGB!t($L!XmI_Oon`Qf@k3&|e1kCAq2N8zymGe* zn)LT?!yE6jldV?^;huh|xeiBef#PNrhLg>$^FnfMFxo3JHf#fxzio=)k=kTU+k!XV zRffDA1j?*yROIrWY&Rpiea@nGUV(t%3>bc=Jpd~$af^zeoYKr?yhTMVjffn7i164I zFiL9cva%bDM+s;YR)lX@IY2jR-9Mg*1}-Tmd7v#bXh)h|FaB)RRN(p)0AS!x#7jkPfWpj1LHb-E=fo#;V zMhkfSE7YcH#onsDPrwz_ny1E$#afu_) zn)Mx&^je~a=>(Zu9i+Ir)N`FHlIRU)DMhNBH@ai@V)&~eWOG~gr)vOMy$azc8c|tp zzzte~xrN(d%R4RLSuRnQT`%-~BS<3;ga@gPNQE&x9! zyMS6)hE|@MLbmKJELb*_Y&k_uQ)zCmt{JoZI7nsom? zmQ*?!G(`qg(*EUC5|9h&ZRKu++Q6FNIh6#ZtWZ+;AvdBC*+4~D5tPzU5ddzf=`&HpPc_6^BfDgRaj#YzcXQa5wFDZ(l^N z_j2Th4?*{6LCWqw2YFr@3@Y^*ZZpLm@@ePxXgQ?5PJH#U;j3jDm!%I-b~PVWe#s5M zlnH1w(KOdMKcJSj#c9bu?E!a*-qG3gw4;oA(<5#2JIj-Q7Q?iDB_RtHSGhYKyl!t0 zNu~+PRksu_ePJZ%fLi`0+0+X3cvUBxM1#GuCjB}Jevhw0s_arKzpfXxp&gaGje${U zCpJIUvJN%%1fv#47sa^_1sy&1omIBc3I{t6U09mVZzkn7emHq}vck&$^KF zx|zxslqo zsyB7fJ@F)2|Ku8tS#}$Zr8hun+=YrV{sm*SZl(Q;f^y7_djEJ$wx#;`hShNW+DI-J zBufOK*|kwW_XUQz2*P`vfI6>WYbqIDRU`EN5)AL)j>vYo>A^DOnkvNlZ9I&tTHi9> zq_(=@=svoLZb%ZWs;;Si8J`ivMi!=`##i9h8wlC^0B&A8-qC{5kf}O5w~U5-yGe^C z$;EwpQPJg$WP?gm(JAdv`d_D_wi?(2%VWXnNkGlWA)5!nJ+1XJa15k^LQ?iOLH7Sf z_L$yB-^yfjJ3*2kg1Gkq<mKRO1`Kv$K2VT_iTX|9g z^^&6%T*;`pE{6_I3l);z{t;U$XsBI(3Do)aH2R$Odd0N!7*`kF7Fx1WY3ca$CiQ;) z2=~)b$b!PS>4vynpMsoR*>krs{Ny80ru0U*+@FwmwYT~-U))P4xmtfAVy6YN^#x4Jd4p6w9cc^fMr46E^_IO2YLRb6q5&49@PRgZWpN)LJ7T$@Tx$#Z~sJhsjgCX>ndeia{#*Pi08V9>;M5D3p89OzntV`S3v;)7X!JRPNRam9@rssxS%vN*y}S{_Xx4Zg8DFi1Owk7I{8)TY zI4Pv2>UgXx_AnE|UOJXet%b%)t;xl!PwiWyL@Y@~c7}g>>|&agMBm;&p*CsL%w+?e?fmUW!!@b*LGf3SsBj z;Mw(n%uEARU!Blye}_9zGhDQqTKgWU-{ki5kE!T&Ev&i`O}1xe$bKEPla>Phj=DgG z5r8)MMjdz819kEOjQNU;mGcDU&;f-1Y)jeO&mb323~F;Yauuq;U8&IX4&C{mT8P{e zEisn)uTC_tB2;my3JW3mbeEc04vQaw#$p*+!ijD=>`I zAL?*5Mj;Y)6!;UmZX$%N|HMtqY+F7%Wy3x@xD;I}(Pc2FVz?*jZ=T zdpaB3)SURSH)SKwk#fC=k?AktV#kkI(DFPCf7$2mjPR}#RJ1G?q)s8m%z~Yig=^?u zSD>-Z7_we1$QmE>Qu--A?k`YxMW~u7BG**mr(B0AJ2jGulAHlKLs9U)wI*BfK4eoy zpt_Dl?uB;Of9XK9Z7p(dhhfmC4wTK*DYdMQEh`@)95D{OCAw)?tm!b>GlV1a;g^T4 zN##`ZEt&Sat`%vPX$y?Aa(ho*{1=%3%JR_wR8N8MAbsBO;suOp4>7k`X^8I{YCA8h zQYj31E z_Vd{CEgQBMsqQ$CoAjdW`9;bc6*cWS50oGs0j_E~9GnEk8QoX3 z=mRONs9)^}wc{Mw;~MALP9fJ#my=w_&E0E(NXpKJwT6ZcN4DzemWgs^4%o+C>?UowR@;@9FpP@j4jJ}@t)_=Sgb(f z1z*Z~USVQV~ID6jonz>h)2OXn|g1cwV?8v%o!{7BfoeXw+A` z*AhLjd9to$cWZT7bsJJpfs_%asWMs@6suNZRX-0vE2&G}Y=`cjX&`B}-OoG}xp<9* zsUt!5wFfV=<-W`rwZSF9YpZV!4mU$&QbxFcoj(_fZrSM{nha@Q3R?yXs`eH}=GcB&cr0d@W*7PzcO?VSM>XNBOp zsG>~a;O*K++1}T5+ogM`X!Uu@UabQlhi)D-ORm&eQqAPpuAQi;oDRVzFG!US7@l?> z$Qu;x8KMtQdJUv3hi31g+UD(UNagu&p?hQ>j7wT|J@g4^5{2&?E(K-FdANr%fs%0w zC}(0}^bQ89y|%x7W%!9Z$fdaf=v{3LH_4W!dC3+J#nSa@Wy?jHRi+VY=k?;xy@#<% z7mQD3UlEQ84-8c*K?Snw=c!d*BX?(292>g5xL{2LnQD2*)n!W&JQEd3d3;>pU zL28dAyLC07FOEQ(Yh&FjH@Y3yps~fDvWE)7bWuPmlO-;CM8v+AHr>O zpc{D*AO`4z@?#0q;Iz_t)G=CmIE32QTQ4DWDYw+6bM7V1UggZ=y5jp^kXL`Ta z2LKhRfc*lU?W<@`tThPX)Mr6yt?97JWw>qiJ#~-enDI3UWhu8)QP-TH1dM_4dn}fd4M1*%I^laQkX7qZ+gdUFwH)uR z26@*L(AkA4b5P4u%|$rnXUJ{cH?Gl?k#rl`RXVQ6X|Z{sC`nQ`TvFQ(&2DMjUvyP)eZ8*)?kWzQT)mDdnj>W$i{a*%`zlP0g|V)CL^HVYNy(SxK@BW;kg_$pd!MFJ+w3vI*LC>u z&x}UMWB_WAPv$CWkmRoma%IIa>pTVCOS4`Q?U4%3K+aW_x7Pt{#&~S$^CvDIp|#df6SZQB zKz7xU`}igpp4v4JJ_$fqogf=@g^^xom)cDLIMEN{`Vf(^rztD@3d7IzK)9SY6}?UZ zd~L;tz88i2MtyR;B6s<<4qniJ{XHid@3omtQWcGcwGqBn5xl@&FxtJN?4^3_8{GgN zdIo8<19Cxczd%Yv*2iE_cm>o3c~cg4i+QcP?l4l81vKtYpz554xNFYIQ;4!!dNZkY z+`PI8#=9D*6>Wn-1?FJdkmsbv=##!d`X>6gPV{caNqw0KxuBIU`7BcJ+ap)~BmlF2 z18R?MOPxj{+)9zu?;8PFQ=Hn|yfH2RAyU`XK?2&68v7l`p42HOg-$GwT7%~q41hTR zkqn(F^C^a0Dm8VnI>^f@ki+}%-vT@8UEChIo|_@AA5rsoj+~>e- z&39T-)^Rtfp^9a^??W9kbWS;ArsVNtHd(ud)~bty6$TFHlFn;)vYS%%obhg*#*^awiKwRvxAalZ`Mc>PRtBhnhuy zf#;xw$}2lnmYhlh7s-qwTd>(fUGJ4v$oMN=D+D3T|L9KRe zs%)z1y7yt~9hHw%f9*WJAEn;?brI>ln`|M4^tSFJdwd8`>vi7RHk;Jj3N-)LDJnmv zHR_%2Vtn^tMo@lI^>rdRsr4v@&Mr+3!dM@R+^hURt$l)hbyC0xm2j&L$Su=Hc59l0 zH&dJ5nwv1UpEHcZV-T^-&#RgN+VTKaZ3&_5u2!aZ`j)9^C4}GTD$2ASMon$ua9q;u^XVe-vKptwX zEo=EEMi(-rCAUE5iiwR8_B{_k>CHgh><;{}*JS5Ur1D!&kbA!$fIlB1_fnhp?7EG7 zubzFUK4fEWgxh?F+;jl>&IVFjHy|9b9NlA1Smjs&$6nXB*m*S#e@z9zF1?=1lM$J$ zGemP8ksWmc%90DKn*0vH*DVOIl5m_Z+rPa9xw(GsW4?w@YiOh-KZFlP~3IrVjPUHNoFN6L2V0=b*k(57--F73>hC}?s} z(aRd?5bhB}D?Qc2EbGw)^`YLsquW`By=SWs9;D6Z-kP>68AF6zir2sP*Oki+U>E)uRVo>V^kU@_hOTcW@Oq?1c;TT7G72t_#u zOhUJjZn`c{1EBN{oISo07QEAi>V*fWJm4t50ov_EORM{iL>OZ&q3Hmjc_V?X@;V&Ga=v zQ>`;CGz&DpLfK+%yejJ}xZic~Y@HX8nwwBNqlnif&Cly~0Boeq*f?#cFXoK-Jk+X| zQH{who6~4C22aMwlInjgH5ac~N2-*zE>+TCMwWdDFa07s?f)ifYdT-|V0H%qU9Mr! zH$4?KEe~UdzB(Q5NLlSWkSY4w;ZYx)ct{IIp#uQ)xesWavRJjbB^rHoYAd6mc0Lax zPI9bKAHUYM+=uGcV{>}4`!wtQ7KBxic96N+Jms8^1>!%UbYc1LP53ps8tanpL{$M{+%Z_12mo3;At=&!EoQOOvC_FjBberr^O(TN_BG*Gr z@Q~aC9oP;iTTF(UTr7*o<4$mcW>VYL4z#zgcC^*P$gbExYIhuE85Jr%&K<(xh+(9kpN6PkU((iE>wFPQ) zJ&oVE&7_K3_TxJCJyUpb?={FLUEbHQJVQZ1Iibs7N4qfZKo4nkzh2T&ergKN}bK823l4HVc~ zpe@ry?HOw9N92V*A~%g8J5_<11G>z~+mW)>3aDk&;B?l?S?MU9;V+$W5;SIN+(!39 z9a3I;Gf6bbwc1EY`$;;R|S;Tl!CH3VRtwz@eKVCo$L@g57x*{N`MPJ>+gi0)=>5~?T) zQB=W|S&E?f>7MwDPJDgFz^J1Mpp>ld^ngw{ZW&P5W&;o{k!~wcyWgC8uWh829^=uN zkq?pS8i-p~P^I@R+>}#u=kz=X2h=3>P$!#Csc1)^x*&&%j8}X-oi>o;&XG;7cNw?~ zyqpn~Ez{b)R7d#t+R3ET>F%Yz_}!out=8u5j-0bK1i2s`6k{}IIw`>USkv{utl;@+ zOy|)x!h|cR-AW1BUXyG}eW`dr_Qn2z^#jJzwoY+mkLWA77Fi&7wOh~mfz*8$G#=?= zo^xkNr5l0V{5e3)QqW|`L2PNJWBq4EO_vUU>)sEm5~MarR~5I^$4i|+2wJ^kz!M;e#(v5iVGRvcvDta5;%^67`{En!WGsf#JP~)D!L8eDfoGzCVU9e@$xF zUzql}6?OdHjwYC7i*Y*|j};G#(xqPE13-0p0&+nO*f(u~f2|R9b{%E;d@0LS2B?aW z)X}LkYPk!cR={!>lY+7ex?UM4_zl|53|G|8tlQzXlMo&n1S#B{W_{Ex?c4nbzi@@? zw;bJr2FL_mqt4Skgp(HQZC?QBs2jEpDIr5jQkMTKC^_WpH3iAWYkOpt@b_kjgef58 zuFqEY)rXN!hwAg|sc7tI>b4KUr5jW4=DVbB97g0wZL+aNNZpMmW!?qAcfG+& zieQ9vqeYhAv|iRtTxoqn&|cRy&x(+3xf0}i_o=u3K7{kfLq@;Gll~f3+w~TTb)u|{ zZlP|;AUB1h9rHkHbj5-+8a?B+bgUbSNck&h9NqyV(?e2KJt6(1HcKCgZB{s@QAhl@ zD4ND>S&Bwy%`Y?j;Pxv9>F|=;ny+h5LsQN;7Y8$BgnNs=~s_$~t%6td; z-gTP)buJM`z*6=ABMJ52>S)sLVt4Nj63G#)GzN4y;%BTyn zy%`W5su+NuKO)^$1K|9a2CiuXo=a{jy0H$M`zV^SP#*|{G(@hQD%!dd#tKE`N}Yym z(sHtK9&!UOpgW)G5oxNs#WtE_1NFn(@K=E5(}4JNy%l>Sv@Tm7^W6G9Z%S61Cmajd9_*kg`1?Qw~G24+if*nR4tqm%P9A(1jcSLnFX#`D=jJ1uQ}L1uc_Fd7`rWMg>QAM5DsVpU z3IG+gl(&ncj+d%qpe9=P?1=2zjL7tlYVT289IPL7&v*y7+B7sCO+4kpKRf^kJjGWN`fD&imHc3I}iq~GW z?@pqUi3Lb4lBFvqg6zG5Y&z}r+MWR5xGVNO7q@>PWVC+K_d*}6 zxhY6lNJs9tQ0gdGh-_n>3_tE5JG&h1y`=3?MUArj`hqEk9AUXX8m`^uw)u#pcuy*I zDdaYnAZ7WD#Dvbs75GT@^&3DdYy=>K_8WCVKnc{buaP=UWmQ!CJ*iUqjJ?reGBtqTK1p7rQvnu57!J0REeGo<(mZ25W%;hdWQt+p6neVc~H>JE@@9VnZvgLa)YnBmqE zykf5)J+*DjydK?(o8h*r187ligbS#*-%X(Gj%J$jg(c^=spcgUtsPTOj0xMb1D>!EXZ#WiGisgACfNnLx5 zM#aLI_DtUc_uGd^xyhs+>R7dD6)0_A!hKN>vP5TyJM!caZFVAGkX@~lNMB7_ar&g7 zw*zv`b*_pgb6tx-Jg8jAtl2-%At2Y3PCsBC{t-9ZIhHzO0_oPnrp9{i>)a8bYPAt_G zGE1xT`JN3>9kn$2mfhzpnv8ofj0y3QJz^MSlM8uG_b7-e1{=c=2t zQy=hT|3joMI6@XWqFXo%YMrVfcfmw9`&Uvkx01@ZhT6)XqP8Xj5b^5-%2}<+E9+x! z58XFz*9Q@uwD(Tik9zk6Ku)!RQBQknd(A$V6bBAo202>^Ziyz4s3HI)m1B?UyOzrl zAV1QnclUfMdZzeupAIm3>qDj8n&w*Rr%aUEp&04Ih0XK1g|axkq7n}^2SJb<=3 z4&(Y>pbF?aD9?207Sg-?z7>%)x7j=u9tvp5a|mC51lPY3S&v9Ws?Q|bR-f{}_!Dyv zDe9M`F9xMGkiBF;Blsc!bMyg!TMdW}A%F%hg*!*#)VEI&c{2w9@8&R`T&Aq@ZG`P~ zY_S$Ln*94GEjh?4d`9lr5sS1V7-iV05=E?Cw$=?LBayckN z*TIcX2h>OHs+={tJ1CTRRpaA^wn7CrVc&+u;05dEvBFcJoOKA^5JTDXf@nO^>lwL= z<_GCqwp`yIw9-$qQar|Md+aFtOQ+tG4FD+UOLplgbPErof$KEow$yafqblU87Un{q7}j`)SFu8COh#XjJ-oC%c}u)OmX0Sns{apL1fKmP~7{H zYL|dqPu;(*_<-6?MV)J!X~#}&Yd>iodVimG~0A#+_7ln6Oawy$ng%WIrp zDhTp={YGbMe$;&R6QBs~S~B@jmhczkv7+Zu_LO-kroYPr(zOqGT`H2gS{O6(Z%22p zTDe~n-YIRPHq|G!Q(px5D9pS-KQ+jy+x29c>V4K?T6@hPh4kXz>azvQH=3Ij{m7_6 zy!H)vE3_VM|A3{#bRDv@2HX|$X`psDC7+<1`wZE$O6n`FK1X0AcZ6hWL6s>B0gyvK$v>@F{qo%)H_~vI*)o{TahYtNV1({@%+CxqZ!G^wcSNkm8j?v`V#~M$7^Sti&Q-9w zioRTS)}hcfgvvb^qPy-ejQME*9jecXZfc`BaVDvLt&m%&v+4R>0DN>q?uZVphZT|^ zQiD`V#k1}8BcyA+&~Q)XpgI*FudL0NPhB!5%tol+RQp_gIA zE1217EoHt6t;Oohp6WK-vf5i5*#e4BEGUOG`_$H(o^X;>n}uk2zd+;cO+;QUz=DPP zXm6TcK(SdE*-)R5mDB84Si#$~Ng+p)L5AKy%|mljRz=XxWJIl;I$X#Bkj;v<)Cd7@ z#SWn2)fw_1BKuU{7}^i+O|@f{5t89GBC|dN`Y;aNgaUy2>hp`d1F@icC>nWYkQyiZ z-h4(kz6!#Qza!$TyTumTBHqk`+NM7+_k`lR0oh@+?~8D+Po$>kDl}{hsruS7Rh>+g zFLU9c4Z244$U`bmeNt()_s*+}bx(aRk+U4aDT=~qFpb(q-2r~^0Ln6GAkJ$EX{?_3 zPN9v;`Z>eEv%JgQIk4qRd7yUoM7O|x{O9zNY=Q!{Ta!aRO$M+1ZPa?{?=zHGMwOPi zIH|_R#U5ne>W?bS^1-yRsx6(CyCVxJ+uszZ!fPn2@E28XJqy{dZCOY(WsWH!aR(u> zQxVRj4>k&E()z4RsXgj&NwWdfEGtGX^M~Zs8s+zfijK;~m34=4TBjX1U6W7L*Fae` zEp^!rBc>UQvr#ZU>u<}gND9|Ud(kJ_(0`V5PM=l18a)?x1A0I)nH4F>HgAS-!YZJi zrhpL?N2;-A)(5BYS_UojU7FJJyWbJcYJ}9#hla-oQ(G!sy;V^Y8ZH6;{CeEv_Zk4l z9WYX)f_!p>;dvU7vhsM#Q;ZlpwtL|ub9^v6eQoX*xZCL*=WI~Q%gB4$ z*o1zh?A07H&D0rGZ-fp>4|VYsuF2Q(JIEK>>qVELwuC&S zDr;(9s)Kgx9soR3m~`ZL>d34MBd>yFODb%AS!e7|ni)c>Qg)*VP)obSNa9 z$cc%lwa_N|xlYGP7Gizd(_||x1tnTjX`!R&R!&Bh{#rWRF2KF0^K=Tm{WouER;Yf1 zRcr|&6BbdnK?k<>`YqH&%_Wx=6?(CSQL$O=J$L}ao9bOAPmRWsSy(k#k)8Q3sr=eA zL?(43n{hAM*^2QLQ18st0H})wbaxgZb^15VjaF*0K3ZNDOKn}W)pc`}pUVJ0vM0n} z_c-tM#bAZ*AUAAES@D@@jK7RQNwi7m69r?17M3A`uP*X*4>p(U3SPxbw0E6;n~_$h zu@@gOciJVmwI`slHyYC-^w*M?>wP2~MEJ3E{jVdONddKk>YZzKVL3wI-7JrSaiu<_ zU>~e+@szRwinv}0K`o2+m}?GD7NR51m%}u_y!vVOI*?TAKE1l2dq5YeQDfi++mlMN z2n!mTU^K{%T6`FCt2CRfR3NX*Fho4MldYoo{o6N?OZu|#`D`@u>wK9*e(8}GymQ&8 zsN`_6_w$j8tbj-=?R{3ImS5JBeWT-2w$6}OC($VJ9H3IZ$el)zWSV!+N5Or6 z4sx(R1`Se-B0wJ|EU1R=GaZ6cECg?%I$?Lco_ZeWR+|IVt+r&hYhKHE57)K5irk8f zcry4c!hsHE+1f#L%IAyQFSWx7}LIeZCNpVz&^UuF89B(1jeKj=lfklO7HS*7se%b8ekUW0S4 zE(L1dhm@}e=%unSI**01xH@V_oFQA%fSgKodo67n2MrvY9N|UDNfns{ zK#0Pw;RlebW}vpyrKqh`CsOT(QTF{6+2e{7wO9Blr?Q{5F!zX{j`})@Y#WW?_WEe0 zi^4#6SCR_P0=J>|=mm6Tu)HT0yebUIeT&+PXu9q!*Y%YrFWXZ#?;<2dGw{daaFbO; zZG;z9I_cufmUa6Blj!Oj$Z z$RpO!4dkfQ!4w~L=qN;k!C>J$?)newe`&~nlk~1f3*AaaA9eWc2TsWw7(JAXrI|xi z8kM?-9+3|HtdIWI#{kPC`v~h}r1jB_M}q5z5|$?ANpO8&N&TZqsgF2(3#2WP*`1{m zmAX0&!F;!7vHAXY?bmyeT{t|ZQEiJmI(S)7JYw&4`P&J|w4glp^pCQi`8|K0u@OZn>22gur#CrZ7LV&rxyOVL7ea8w8H}X3h!m=2*`6_cxnbc&G zk~vH!)Gfe#CNL^>E)QqJB;&TEHB1TnJNi`c3-}(^%@qF0G3?n63^c?nalktBF;kT5 z40mTkOydFx2|i}(j{B8b4O?Abydx%aP_U`wshCxn6A}WW=DMq)0p@0&0p`Bm0p`J` z0P_Q%Rz59#TKF_?ad59H@iV{lt8m0PAta^2;2$*rE!PVLoecr)z6F@GeKj53kB1VB z+x%+UW5#fd?^waFhJ9EzQ}}*+Y;_Iwp#e2%OndQsDkKdEJx}X8b~NT31-!u^Htj>Z z&kybIq#M%ouvP##gx&TDPe@`Mf638c@JTov(C%=6IsGA0KH*2dlM6B@J!Ea;*T95? zQPIYT21xF(2RbG^sl`EoQ4S5k2DWxS{N(A8kPv&BSNp5=SXkF;pazR5i2** z2duo4HLM-R-Qj14scZl9H7vDAx#rNoO32G=SoJj_0pDso*0l8Fu*}w1p@C^1mg>j5 z$Pjk>nY;BJ>;$5tMPB3gKl{HlW~nd#%m2X^pPMYy+d{qM&EQ1;n-cx+EeFAMU6{w} z{|8Ne@&A92oApC(mqqS}{}WNB{@~8DaDVt;@Z)|kM!}H(i{Uo8JNR$^n=JnKmjBU^ z|JPTv`aeIyR{z&b^nc9&tN)iI`RV@)hM)fTxB7p6Zu~#Y9sd{l^3MUQ36Y7$^@rb6 zh8Fz!W@?1qw!Q!#F#h5Hu=@1i5r>xp_fJ$GWL2*!b$2!5+^0m> z@|p+3?)dBc%-sIZ`6lDP=bL^~`VaHXkH#ha*|^O()!Mj@1%GYaweLS0H{NR9VK=NB zo%=sFZi18b4RvQSvo>yaqIzDddPk{OM?LmkyyXqiu#vLSI)0fc!!lWiuca6LJ$mo{ zd{Lv2*2Mnn%L;2|c~R;=tVoS$i>AuP8h?$cpaTOWz#RD1DW*+B>ku&_;uC(@KFI9% z)rI9BDGiEVIV}wsb&|K^6aLCRb`gER+CQRH?T^Vk%=C+i6%!|zyNT<^=ft-=>)U_v zUx%DHpjs{*@b=?R2ebkEpX0$vYeDF`XHWgSLft)$5nZs?dn`$l`J&a-iRG=P7Ewzq z6P0Ce<6j}hIQ})rR>e_uU|SV(l(N2@Q82A9=No;|+HsFz0Dd~21KU=*VO#S=p{t2P zgRvZ;B@&8|P$5eL>VI{zR`4~g=7_5%{y8LrjBW{D8h=r;)E7le}_HYW;|NffGM6|$Gm172n9#6+Pqi9)BW z#@xz|&|V33O%!_m<)=fgSdq3%XqJTh6NQc@3O%(7O_flngxnH^79|R`unP5*P;Ci) z`S7!KLlcF(81l3(Ktcs2bU9I|aiY*FtB|{d93-?MQK)31&;({ckP@;XbTl#>XaxH`}wB}x?6>|NNBo*d=rHZB?>uOg(gX;w}i4I#EwP7ufB#~ zed<|;3mATfoMP_R)$j|=Ykj*z6JeHHVFCnGP%xL@(?RM>Tf@?+>_2;!U!vj|tD=h( z-(*K|o)pi-ANGHWNtqH$G2SE4d@|r@bOQer{BUDW!g1~j zjWLBEw~JZk_`lU46JB!C-*EJ_fP5F4`5J$*GSbcz=|d#N$A$kyQ+(X`?-Aq6ggME? z>_=Pvlcy|r@_F#zc#+NBJDVcAyNAf^0Vea?|5*+G#%;%e98RMtF ztjWnYj7_$sF=kn4mW5_n7=9?Y)xnrh_VaMBCb+f&!F(=IbAF(^M@;Q_-X-U^{e+e* z1tU55pNjEA-XiY#PjNS^c%MY^dKPilpW=4^6o2#4f?hRI+}$GnxbP433wQou%mJ%- z`b6;$`F>qx6fbMo=}*!%v1>pg4jsLXT&hiJxO1E539bjl#nBT zw^SJwAz&2rh*^e*OlC{k$LLbs)0oDNXKim|ngACS1RK-%xcQi?w~qAj1lJQCj5Z13 zXhblNpGJFGIgNSzFj^ruV2d1b>>Bd@iS*aqN4V(?v-1?q?DPx6pG-48uAEty2pm-+vA9gIT zBrSF*I0-YF$5H1U!|>2XO9YskJ)ZiS7&3!5LIx3cxZ^Johd1^YrE0d8|jydq4A?Is?O`k`l-4r z-};A8#~(ti6APp2+(oE)V%`)vB-Jn6$(@;KECLLm0WlFATd1p%6~>*mhu!sy42wyu z)9jaeY~BP8zQ&y~DI>}3bfO^|ecmxA8DD`K+lfXik>pr_IoQc3!6mVLyC*6HKT;nf z$l1WK|2}w()iNb;!AT-Ox%9^uv{jy|Moz$ zA&9BPmGn%L*(I=o|J^{NFQm|cXC86;lZKUmvtCnj#PQI4q?u1J$p2ViJ3~;CXv6}O z><>5}Pe)cAG4qpiL?fsh{%{}lx$$lW#CW~^o?vv@BEB(A*Z`x;9$9Eiv&YhD5?{jq z)V~dx6aIb`Q4U*2SzqceZ{+Xy_4Cbl`5_dN=)wQ+=KV(g8!5*6VjWyYi04o1=wcU3 z(ZvGHEu4bPVYpz=c3wt6h1*C~y3JyG$4Ey~ z7bxf$S>3*5oGG$Di)Vi~ql?8NW18wtMwckH%$TM&oGt%q-CrKx3(hC$B{EJ6W^X9*a|G@}aJyYGAWG1VQiKN9*k=27WH(MpPSc<}r zHa10C-p{j~c*Wu$_7zc4>!~Eh+=2S7uaDM6MM*Pe`Xv=wJfogo&1C-FVqBr~Ci8yN zh|dNWgP~7mQ}}`WCUZc%snC8?cyzoeJU*v!%qkY5n1Ncv{@scnFRIKd?VS#KtGh&; zXZ>OfsPh|L!q`nPzf#=*wX59k!+97-%@A{&e@Mqjdmeo{M*7;bY#Gz^aWbYE#K!PH z&bN4ECVHkwU%7dKH7PeQw**bp#6%{2TV%(Fc?=kwzzxLFU;S8bey(!==ga7i zO7dAMiLxxCv$+M*>R*D!1ehDS1r%zO$+Z777gp(i$0SzGh{o2o>k+duC);iFnE-Qj zB&#DCZ_f@ev`UcqNPzh=Gfs6Phk^F?`|r6BsIyObjJG63-^f(MeRPpkH|ejsLGAVj zR*3E+sn)8ckVUv-q-9HeAEQU# z*O0+?f4O69)w0FGm;`3cNim|(f|1vWs36g{FU=x^F|kYHfx?n zml`hY-n@-2zHa1$&Ay(IKCORM{86K~&Kj-%an@i?_+&EIaWa)lV~iM2k1=j@@IRDB zOTT*v=}JG+eHck0oJ~A_I>}SV9(-jgSH~sPEiwz^n)l($yYS6q@gmc)*x^1-ZqHIG zj^z=vf}IOPFVNjHW>YzhStfN$-9RJ<0@&7;{a3f~l*}lRSf9Ah@;osyx#C?}W@^k#|Po1GrCjrm2s{O(Vjp)ZNvVA;P(@ed8VQQ#RX@E|ha$#IU*Yniw7T_rDP>S@i?#eA)E z0M~@b@M4s}uV{s)9bM*E>7@=8zRw5_v7Pu%XZ4*ttgiL4qT)MgMB)vc^Np2r{XO{O z84Pto8t{2YB$&b(-bHM^y?^jI8(bBqu;b}5c*k^t*LnBDyfFrIi&(y1<6~{fd(P@i z+T`tJ!`^eAmNqVO3Z@x`DW)0LuKBiQv|a)AU*QT2K|L%8BRa?7jmL;H_lkovGzR(| zpy*c~*-6aLS$n)8qqJI(R9V=#q^{EIEPb{zbCa{SJ`)X22z(qghz2q@0m}LGzL!kzk#jWK&BKSK;yz0ahFmJYC_GPvU@!Tcq zf@WBxE_Qt^UqWPATxca7bl?~AOLk)`*9piCWe+OnNce&LG#OMQJ6sn_EjiJLPa{0} z`~3ZC*o)!mOZAA>%N}esz#~ra2GKD4W2sGaz!Gt4T-%D&U#BaksrN_DNrMmae1*+= z#PcOo=X<=XT=MeBzU48CT#8p@UejKZxq3>k(eWRw~o`(hXF=IcXHJH*!2h;0XB^XHr&l_2E@RTTs)!4{fyEhvWuF!r>+lHW zm*FPcW?pcflHLA&=JRig&jm;}b5KJ!dwGpUq{bSH9kwsoDD3d}N^fS9vvyNy=6SEM70<(=FLyK02#kk})>cG2zmsKz^=tl-t|m)K~=;(xAoB4n>v051B+@7_F1|&Jf3iCYf1! zW}}idr{rjn;mDg;=8Zz$XwZpF^~Flyl;&Toh-Ltiuvo;*Smt9T`-+7G1{cOe%qw$A zrV-T|gMul3eO}kORK$eLmG-2g;^#8gcx-^XnQsK(&{~;p5Lqs*ut^V3bc_>WVASj3 zK1s--{kZ=$$sY^K$^~T=C^lkIp09;(&ea;cd6rdtGx)r@nBN}zcLBdE_&wA9t?_$- z*05L*Y@eE?g@3QCorc8^#n1j;84HmgSO(8DQACDmXsF^U-7g_~RMg0WtGHiAG5PAZ zNW!qLHm10GyEs5ay~WusT>--t;y+G>VWrP??7OD)xjv%(9v2;a-==}sI!gMGp>mJB z&u^p)y?eBX`f2uNP;1tB1QP28^Q0CLO~yR}d(z$V)4Y##p_(}pyf)=CCxvA zSy%%Ht#XTG=dZCRnd;;jf*rzudEQkHPMK%nF7>X;l1WL<;_oo0oD_}PH z+ZsHX?9ud7X-l1N$6A&1GFL?hhvVm)?epR+#XlcE-)Nu5*x>w?@$s`FmX zuOtYt-0C@k_2D*wggi*W#NzdWqRuqrnM}yX7Ni}g?|YO$HL`cCicj0Rv0s!_V^3vx z@>1lfFMRE)U%f7FL4mdPtNrTVWu7z$DPnXZg z@fo_y@7^3N_lr*ND{QjzeVE(QD$7P>Wdtu0y;Kjiqz7A3bMv%FS*_-7bXGT7K-FrY z+qX%xlWToOS%aAg%q_o>YoU4%Fa?(Y`S;bN`3S}%-I-j=uYKkZ)h_{j#H8GS)@8E3 zHd#Nob|=^OIdib`3jDp9&6%{XO`f!`-N*Fg^0XeOChf?0hj}NyOy0(uzJT*w0Weq& zLhJH$_Y6nN(`rf%J}zj|jLF-y&_|BB!_aLeLoN`kzc$GymC|&+#%vKaK+rn(d>#y1 z4>rUcS@uJB;>cDP_dF*gYv}2Qv9{&K9MLrv3(;6-@ESO4%kx^+av|1|XOb9vSHz6s z0-NYxrWsArps_3!$?vWtn3IQoD2@S-*w30x^`sNUbv93$$b&H>hR5h#%z*tkq!|Fi zqF!1thrS@>o2wbKpx6MCO(s&G`(?{)(u_sog{^`N%Ei>z#^x(Vx$ecVq zbcglag`J0SU8iB3$}oyOXbt06WwLwcb)0UZ&-s|GkUNF%3Vp4g>Af1WVJhl+ok!qb z!oG1h=hoqzdpWS8h3u`U*^ID^jfH%p)+NTnv(i@TaQx0fP-l;MGBGT%kq`DBR@WlA za+*C8i%P>lYk8Ft(e8Q3YV7eEjeJrzn{SUAEJjH>7T!fiVgt1(U-K!AM+T~1kSeMV z9&(2-Hb6g#4^V9U?D2^@bZ1Gb@%ejjri{%gjE&Nd;^U)tKR!{%+(oe2?ZReaPTKzB znc~*+8&li$r180v$3Ao}DOEpcN;tN2Q;K6dH+8NKMxso=$wTdVM;u|( zh@+`I``Jo~W!Tr5y-=06m}&Bv^iSBxrS?G77T3o(LVOCl%~N&?vYQq!P_CMQV<>7M zdlat2!+?9Ib~7HyevR^DW_X-O(xEHVnU(3`ai!LsN$-grihh7O5YwMyL?bWcuiaVu zey|TduF1d8NozgMmKKV9Jb5;Nq8k@k-hkWw-T}gaKnOvg7{^s$XYE$?OLyU6Z2Xd$qwDAf<-%Y^JV_LmvWjG!o}OtqT1JYV#ZHm~t~{X1FV$&6gC z(lEw5s%||gEqJ!Ae~g%zH?J2#7guX9AE6kdk6aD3_=t@4^193O=AkRB?sr^F;oy2^-g2edG1oSm_o1qgWuY6ix=S-O`*p@->`?p(N$(@eBmO?k zy(^IIo|HGwjh-Q^aY&5zduUmf!|XjU0KVU9E`wow5iL(12uKHmD&!p8#GvlBi% zf{*X3^y%pydACtgq!pGFXrbn2ZB!Z(G;oS{)oFawPSqd@-3+Mb%d9#cTYYjJk!7cD zAQ%`LuLbGpBT|E?xpyaqtTTuuHi&a^`x{fNpCNfgcd`f`2A`AcG%=T=`zP^v><|H12TQQ<$N$0pJLk?`A_;b2`yemi5g zU@`^2)g3aw$>1gP+ua{q^py+Ib{agzZx`W?WAHlioAwVmnVR3u@`bO1->&P1-)`B? zqeseb6KsCFLhvB`R`DP68{zE^{C3Mn7Cs!$b-{t-cwa5|N-ZXNW$|OSSs0vmz<$dE- zjl|~{=`N?8a3kmPrmI!Zi-ds&vZzB#MIYv?B?7jJm8Ht`0x^@cw3hVRj=-BuoL z<(W@oEb0ah-m0q=58~$sHxxCKrhni2QY`dS$<<1px>V541Gtz&bWK~+wgDj zM1jfg7|o)#^j?)=M3Vgjr*L_O_3Nq2(=(Qpe-i(ZzO4LXZ$wY83=_6d_j5`lR(WdETZdYU37*`j=;P7j zj!SFJu}=NeI`tJ!`3?Ndjpk+WqGu@RWekg+8kpvBK82U`0TnTWZx0%;5`7o#Cy?)& zBK~wqbT;-Rm`yi!nU`-xW}w#Kd@|7HJq#_=C2E#3{?PS{MVp?{va2B>7UC?f^lA8; z#xcuRH_6Zvf4~VD>@R2tFS zqHgqNSWEKe>0)HglvSpkr#L zh9y;uiO+Zqr5s;+u=miqmfm=5qk}z93`FMb^@oS&>mc1>I}y2W*pBGnO?-ua4K#`g`yjR@R=hHX;lD&ZoB=cpKUif!0*OOIrzi|sL z0*O&77Y-`Af@-UIhDME%n1+L142$=-9f&fje;Xh(!mAd9e&aMfbfDkdS^mfsdoPU) znuOOxi<~;LpS9jnN3AB_zr8&$wlXwgWT3B=GGV5-{!;=rL+v~=<2j$P(O0+`e_aOt zx~!bwKqNixXA^&&UbtD?zMm3p;CWEVd5pO^Lh_Noeb2O%& zLZIKc1ml63ZI$`8S8#O+G0hTIm=kwrR(Mxk$XFmi9_%X$8jcq80=d_i+?WYT5s%l6 zSDbe@bCawSx!}pR0Z=?k0?_A03Lz#I<5W`mdCpNC!=(o+wSfyG1qq2u-hyksgm;PExsq5-v)#D5P<)CbOi;AE+j~QYK(FNu$oY zmQb%C(XfA2qFv`*-;irvQ~aDu@93MB)-pz2JuD2~!gFS})y)(bd<}R0kz(+4Y5GwV zPzL8S!r=3LXmW~bvU?29O&;hZ>~)iMe7CfjNt?D1uU;&I8%m$0g>I9;fo2R;Lggh= zxnT?##<-ooAj5S)_yb*PdLyjZZ|*mJk*NsAQ?4RLUz6E^g?jyLYkjKwM_41VR{6gyJsKrx?2@p?ER?TS6mG?lmTx$wKi(098Wq@m5?{vi1lCC&UM#t-N{Bp*YviEv@arn_ zZ^=V9qj4~KSoeb@d8kC;EsrLN!qDN1!p#_&=E%nGL}4xt)gxu(TcqjNFbO_8Mm}4b z{ElieB_p?WmaqO@2{G6WBfkjWnitci^wXB5Bd9>ooh;3jYpG;uF%7kR#8Q2LIGovN zrU0-SgCg~8^gSG;M>+)kr0J`zravQD`ZNh`W}AHSr*HTeeSlokMk;L?VeJ!(;~ln-@J?C4Jz75(cs#jTX2efM}s^h z&cd|08{(!WhNK+@8dTGbt;sqlWSeDc4oS|>Ro;>g_NE#W=aPr*LD$Tak#=H46TL^J zZuvSFu*>biYaQbKWBRZi3Zr>ID$AE2dKidbbbfDLS@nCtLCOMA*VDKj9efv8oloH& zid4}JNp~12x>kgoX+;N98Nw9h=FGiBr)tbLKDU_fsLwam=PT;G4;M_0xkDXqQJ)*s zXPx?7qduQhpTAR|r>OgXrj8#_pZ}*mYt-kr)n~Q(yhD9TY^=td%jXvJ2KluACE~v- z2_{c7GDyz$lWA#eBzsmfYTD?PmRZweeXX>dLBOFBF*m`-}U(C+o(wGVNjn-eytysx97N<$)iN=&bXukJW+%=s{wg80hh23-8sbJc{@aiE&_1W9MIh z5*r;n^r3-ima!jNU)<%9SpH+YK;~<>2Srq2G5nRsksR4g_t+l6vfktssC2OXJ_(OD zMF;=+K`Ycja-#_4CF&;?GC01OV;@Nf2DKKl)%kYYS3`BQs*#Sg;6Ck|?ONoN49SN4 zV4Rf=xpP=uWw;C%y}!Y1`n|+4p7N7Xh`bR4rNO+OKo6SsbiCd{G8lue;%yQG>lF;H zomwcGJ$H^TGUXG?^MrkK>g$BU68=St({7=eZbDMae#MFu>c;A$LuHB1$!!}li{Wz)Hop=3^anuUiZEH+- zw_|vz{t4t5UKDg3YpNetRpi{q0D<{ki<`D%#k37}Hf_)Mu66)`Zv2gfW&Xmy+5WzPF@GQFrtkU- z*J0bX4p4^e?`%A3k%^}X-TVn>q-4?VQ*;ByKXTr69unABSkL{hYK0%gF%#HTV7@hW$(n`Qu%!9?S(%^&K5_)wd67Z~U6hnVZ(g zTkcV86@j+hje!%fyh#SV{Z*AR3n7>7G@FR_sQBTwA6aJJtLlYAlWY^HKJJoAnTz^m zb2=}xoqPV?GCltoRgJV#d3z#5LJ~{Af%~?`Z27HxzQN}f^D@rFW=8AVXS|fC29gLI zctkYl;i(Q?twzoMtznCZ>ilIOpGb~~Amiux&HU0Ax2tems1C(le036=3q2t}LLX(a z{MtI|<*ZhT+M$n*b5;)&ropmuE-|=DG1`1|cvhZQ=gahpbHg8gViqv)C24)?ip;+# zXS`X00xCpyCYX%XcnQdBB&a2M?LXwaL<_#7P9mYMkuye{I{B-lJD=dZ+}OZ5RS|~8 zOUo4y=DGMc<3Fxk4H|VWJtF*sXDH7c|2Wst+aeawLSL5%edRtS=k1e{k5rwX3+Pr( zQgwcwb?i#+urK_ibw08%SK2F(d))1TQpqBIPUapOQ71{(=TNC4;jx77s`HCgdt(V2 zY}LZc)m^cs<+fICvd*JXT_Vha=tk{jbl z{v~sSl^sA)Qu9WI3YQ876p>i!to8{Z5jedb4^4~Ij_^i2Q86i`8I`f1#_C3ufYc}h zS75&U0)R<^0i|mWm_Porptn&`#(BU^R4`i3C{*N%@>qmYT~PmamNygL9iDGA)SFqh zxoFX%G86IOM+dK1VG~^h=+V_AyMQRlXp+D!$_vbQ))uSc&xPaLjgk)w8=SQ}`_oYhm*!55v?6VyRD zC4xC{FZ|GX&t)8h7q-Ew!xx4Ywx{1Q(3sR_z2;n%$4K8~bl_c-foion&2}L^nQwA3 zHle8%de#aMN@svoxoBpJfv=NpppTgB3JiC;s?~W}hv!bCM%%Uh+r4!uU5=AvL0H z&ic_Vf-QIU(Tu*t?V{xlUD6Gru6ZZ6WFq4_(%Qu^v@KefD>*0P^{XI0$@(e6`oRK< z7uu#U)YLcRonl#y`M;!EOqzM&?}T;-FPo3>WPCOAn=DK)&*64;cW(0C)GxH|zRJFP zj_H=W50HDV?tbTc@wS(%bO3WFGM(nnRu92>YvBTg%)iR zV~a{VPoY#U1uRVjDq4(3HgFogzxqo5m`&0Gt z*tugEIEH~^7&wN3V;DGwfnyjrhJj-kIEH~^7&wN3V;DGwfnyjrhJj-kIEDcW1L9K8 zvzI0jY9{GroWq>H7DuK;GjPyVORZ#|k^QF!@ldi!K(Slk8D#To}h)VCe7?+YW7sQ(}L6md6}gv>E>}wa%oHf5rY6_kV**L zvzn;U{1IUV*)@O|KE8jcnLt2a6My3j!rOAldG+hFqXw%!m|Z7M)yXPQQGL+N0ur{k zP&j^HibT~B70F}M1{bBka+Rk)oGwcoahtPh;5HX!Qivg)pl6C z`BDa(NK}BOWAWnIL;SMlUvdG=X>wjVEpMggGwEiL1S3;aIOw_WD!0Mv6s};^p}bg! z%Bc=#&LC?+f^KxCqO!r0D**zhvo?p-e0ju)3Mj4?PTHyhuRA{@x3VUV`X*B9N=41K znIAkxI}%J&LsKpQ9}2Jsh3~7R(RUBu0+P~zLx7A!vh1xRg2ck34G%>}dP3SyYI*`n z11Rv+33ExCd`y2p1vm~5Qyt)A6`2GA65}Zg5znuejwg*{KO;v*vB6USNs7xq<(48H z2q-ZgUE3c@EF?wy!`SOZx~vuPSA3ASsI6lZYOOkARvt~qp49nd0pxDlT_dE*zdL_oE}yY5SF#Gv(MeO3+7yyLA;}fQLNY5yhlkJM!#5{Gk3J*8 zuqv?7`lM#8Rm<7h)17y{&lyU7rfZ>Xy-9_*C7T7Ft*4W{r)_WHK2kw^?sn^Jzj2YQ z5yX%+=je7VG6f;E*}UyXA`YA5Zx1ib9UmEaAxR0c&P)KgOf!bT?B+H?gw9$P(Ew1^ zS>#@f4ws&lG0rZf6I+mzYo$(4Ks4^rB4gT#+?_UmimW&#?)l^o4n&7-Y#l5$jk> z2ENUwmJ6ZFBtHS^-{0^TvW#-4`5>o>)H-Fz&ZjV_8nV#qpTq#nl_8U%OCGkNGHh@E zpA6e+@YEABgXod0Q}~8|dxMLWT?n>?*=37)GCIT-^JO{yZ~f~|et9HQzDUHCCA^4$ z%0^6udk|3$U*UeeKANqq5n0B+-afLf)M9<2=aSYeDQETV2p=--T7>M~YlSkRLK!2| zb$1lX09}8!maSU}4BtoEQ!GUUa)B0ls~LjnrAL%XqCPA#60s)pe+%Q|ruYsI+v{hARcXCWgW<*_2YylhI&UsDJK5G4&Ph(d!TN zijPL7j{-y0_rR;9n^Ww_9u0J{j-#ZR?1MctD(?C|ESY5 zpFwr=fp;#zZ*M{X*c2GE>a`wG5+0Ib8KY4+4|iEaNtb z%W&{%QpM>ipK+Z-cfZ7*E|Kwh=4plu>1Ojp`BvM5ycB#(ZdH6P)tu@&@HvFcytRv4 z5zil=HveK#+j#yHlwV)?621PdUjEE|zA&Z%hkE8dc25z87i@K=nf<>KPQT}sqewZ2 zMv~ppSFy0V-)NK4D>5HY4|J2iaFhP0hmG^rm_IYllQoL_&>>#X>OamBt+?L2M9Tyr zI+MjFNi*eY{YP9{Yh7y6SE&crm>IgeiOGXx9n1(Ok4u?6Qa*t!M_#DOq+WA3iO6VB zlSvLmqao4;p~yUKb|a>X4=G`6PcfD3Pjj)l0!`A|>Mm(2$^1D3FH^||cteZKVJdlx zsbow$S_qTL#z23w`C*}vHcp^%?a^Z5Vs>i-AK_~!R$jqh^4%el|PpT-}*?@#6)p9n#x&;5Gf zRAyfDx1;Gfy%PRX+=I?O1rfN#ypJm}#<@|%3cKe726JY!S$s1Oh1OMYM(UrzFqa}z zHfyV5w9#egwb?r=dgLXy%}Xoq0pH<^^w|v+B5IZGCGuY#cgIY>VH~%ZLz~mmwwMpe z@#pwocl@ZPUZtPGk7P#Kv#+caicPNZ*_YYXSxr_g?6m;)I^^k>@Ry-P>bWy5KkGuN8=hOg9k=K@qV&`{mcY@e#eNh z!;JiTfbG(sHxGPY1Zj*IHz!27Ov+o#SGnAAQvQh;gsCUxtxZRV4h}LtZJp+0rrU1D zM{0igA~PAE*o53gJ^C;Z>O1Qhu45fD`eWRIW!Z2iLd!Q6^^hbAfSa z54n2bPFe4FWbLst8-*o7u1x(h-vf1kLK=FpUih+J_$nElyL^%H&4?-L$a)g{8^qt2 z)z1dMpKKHa_=EcD4Ox9`=m((+3Gi7gjIRrlQ>zq+i7`1iNW|c)cR_uWrAvrGu@6LV zpwOnZWtp-MG-Et^!)`5t`XFW6xs700G43#h&&%xyS`P3Pc>uRA*itAzfx(toh){LKO{$DDl%W6*tM}bq0PLtw3?#v(G&DZbcf7UVn_#E)ZpON+d`}}dEENzMmI6+F6jwN7rbcp#V zw3>=PHr#wl1OL;H@yF+YKSnS9Jn+Y;D#agr2f!a^VYM6uNU$( ztLVA0S)PsFXFa=IZX%R^fe-&R5BKI-Z=N$GQSGh|Q@PxH#(wfL?vM?KE6d!o^5$J* zITlp@*hCdma!{rEn|brb`3#9>$!^>RRfo5V@!GZF0ISpM%+A!`;@p2 zXmB>5trWyaz`sBDdESyigKdiu^=lSO;z0`KBa(sQp`l zxe0%sv5_UQ%wtx4Vz!i24{GiPs%e+G>BS|?9tY_F081Z!DOq5I`!5vee_;POJGsY< z^fvC4RrLfdwwlv%XK4lw26hzL5ZeP3*G9+vKU43tdvxgaa9ce}^u3lm#3QBeyX|KW zpT2$elikzzEaqkg?C|M(5AJH|P!fH=VxRil(D%6(z!rVy**|)u?=$Bgqi-ueqm%sp z=vzll-%s1m9zK0n+fQ~+-%~J<|7#?;fM? zl=S_mg}oNpctkUlelpZ+km(}YNjRl~VbA(=>?b2~6WYlzrJWePE!|{7%134LEw-PV z%pGOM*-A6{dXi@H#5HQD4qGv4zCjU1%clv&m&|LW=0ypM0R0RRua{5cXQfV{QzRm@9q~oPs-`eu?b8ZqHc{Sa5zo&&cxJS~-GEk$9*Bj23_&RCfZ9#5dWg!hAucou3BS%wNe1 zbtrGf9tWhrrYtvlxaQMA@BiN(-yz@Yguef^@x4v?NsMB&F&-8-h41SJ z8|KL|HYWMsW@GXzH&)j4$jGM&BcGhavawyI68xK~nD zpPdogA_dx$h4z%#Xb+E%HcJXNTI+jy5ZnhHZzEGgb*j<6vNKSv1v1)_$HS_ZZ1YEp z8TBH2)UW@>|IDa=4#wNb5`ms4>Horb-}Xo+plt3=$EmQ!V~_J)BA5OLgm|30rJkac z2fjkeGWv|0UD}`QVA!45fPUjOS(r$Q9tp~Ki6Soxwk!0=Ib_$#B4Fd@T=rVkLK}Pg zxG+mO?KSu2`S1;ka453mqcY@7+}4=0^C4rNZ;!c0GrpNC!&~l; zj66Y>qlPxJq(_Z3OXK4sZK{#}a`H&CdY?nFQD!Ih=gg0O zC__3qeay1_i$-rKy(nE(tCsh2YuAA-u?M#GY6g}}#J`)XX&~w0@Kh9Cm!mDFMx;c{OX_nja`cyxw$y71_Mn`MC82m!(8qVo|FiLZOnj>{zRz|)zDt$=RgG_{^XY>R z@J(3Se&ZQ0tHl}M!0qt?{>q^Z@D#GXtpPr>LrY(#B?g#Q4rzeBkmVM01_C~L5RT%p z(x0W2#1%?NCkkR%3ypj#z~2WK7ps0_ONm%rd3T+les!GL-P@f@TjdmfCDEcbu_!^x zK762-7-eYg50J|rh*U?(K-b!4{$+{?G_}5H!MI3&b|%`zt}E=KF>HtV?}c)0tb@h$ zES{GExy7GYD1WZCfHqOvAk`xI>vR^$ua$R%FF`kx1@bU9OQGyi4pPQ}g*CUFp=Ivo zy?%Kw(%!s{SIhm$_XSvSk(I;K9nPAqcgk4Z1EKxb#)l!Hl8iwn@jhQ+8>_N$BI+*L zaHf7gJJ)Y_-aQPij8|1~%Cf7avxQMRmr-C^Q7d2jvhsRd-j6P{C>B7B>cW((qZ%ax91Bv91_2;MVs7WJ_z9+#Q}_u&*kxy zwnX58B1Pmx`=lPj&8z^!CjGl!*rcz1>{0da%Vbw+``%$myiDg#eYMO@x_c`NM%mm&iYG*} zbYJA0XW%Z_>lvMrER?LDutJ7A~m{+WGVor&Yjve);c#&ipPnVY^FOQG5=5it6 zL`yfHmb+LXA8pMV7B#4OU{%yWN&W_fR4}Vpn9s^8y>Pvhi;#8Zfr8}yDZ?YQuvFW^ z_6XHuS6KJRj_1KQ;B5q|XZ@HS&SF8>ZJfT1sqJF*%E)E8tZigsPEy)TSM>@SwNb4ZfNbyo_fTiR)IQ~ z{vK5LWM9EXb4@uLJ%uj^zfw)3dfwMTk~OuY9oI4hqsKzr4bl1EUNsCh)R)k z=*C)TL#`hBXL_(z;f+~*tNA{5q%IXHIu)P@oGdS6cdk0sWA5E-Zcz6sR_pLe^WKTV zSYsFkbX)oS|It73Ux2+u`H<7J`~pAoF6A!VFU&8~3!n43*Ulg1U-Dw`IJL>0+=<5T zVi&nnCNe-?+0QI8KEvKX?s#Gl11m?k0!(nSTQ^&k?TJ;LpzYYRFis0wqUpvCS`M6n z1Dm=U@%Wvy*4|%k2(x5{E^P3wxCmH94rTIkb_HLjwwYUUM57=bac^=~-=(Op(HHR+ z`wBO*Ufg+F6{pfJ4PTzVOFo)eIPPimM?4-qqBUAIU9=Ta(#0PxUjYOjy}|R4S}t7{ zE?*{(tdfs9dG3)CXHIGQBOGe0IP|5j;-OVMP#1gP5uga(8(#)|$bDf~I0b(*u=paCN#ITpFI1ULzkX1kx%6X_Y`)qadyE zhbwA;bcGFRMU~w9kbFEMA1igk^U(NkY5GGPJR%2=aIjJiR`TdW{5`_oO1T$=OiQnm z4}`mCmE5xmIZ!t~>`SlXpivHRbZAXH0g5U}ajs~T{w)~}q`I;8@DbDrlYWZ)P?8KG zwjEsM`UjyK;!{Aun5x$|-) z10a6aI)Q)5UW^apm6oUYvD(9j`8#|_649e*Q8T|~p1hvAEYvEk3*u-VeEPNlX>1f} zlv56L2aB#FZ2B5u-(_MWp#_VF*y6Wl~|8Ii*ooH8nCg`OZpt_|O*#^v}7Z(m3MK5FN zoH1&ikWGSKLNAxd0raA7j`##GqY63K4ZTR6j3j#b z%cVTfm0lG5F?xB9&a9rvhj|B{C!1d6bxPq1aUq#z-rJIrW)_&|5XJ9AGmkx+L^C&` zrgx$lp$yIZ2W}7RLXk~Oo;Wd;D`KkXNK6aNCsE#om=u%{Q|%%FJV8vCjj@pC5DZsf z1KPyYtUB{QK};4sO`2>=pc){HQW(_9p(IJ2$2O&;paS!q8v6M(Lzaf(UdLBl`V9EN z4xyxeY`BY$xJfj`%URu0W6{M1TgVic4~Te#F63dk>A~9slmuOT*+zq`>M=bKqUiYu9MV_w28!tJGG-eBn%F zq8Yw?#3w#+S4CzppQy7qR%Brep@$nP6y;fGBiY7Q8HL2t-z^7HX+SjBB0=~v58TU;alUIZEs6_d{+$HsLLuG zE`*`2k_z<+D&$A8^;OP~uu(-X*#!DAFVr0_325Q*vqI0Nml+M>d*5QdHd02oNy)Ld zxD|NP6+8lqf@3^zj0cYKz%d>;#skOrI2>TXAMPc9_`wE+nm@#*b7cTgSTB zB{R0uXQZjk1hH_vQ5S-MEtaR{&tX!e(b*nWC}|z`bWDums$O(@O@<&TbgP!;EL+>p z>k2iWNc|FH;-E8{0#EE+n-xG4IMpjWIe70{c1b;TGRKVJx8%!Ny32aE0=6CY@)<%I zBDp>0pD@5sBTBPGxX6jJ*`H^N%p;-4B(F9^4Fv`yLQ2J?Y`-8RoW9xxKFvv&%eb{u zOP3)U@cVT08Byinqt;B#I6xqACd3ShmSE41hm*(W@f%|6p6E5H?;|7+BSG@=3CYVB zBrjj(@`)2dpdyf`iR184%6@k%p@eGz?S}kZRUcSb{v)fl&2GMOwa{(3F3q^!B^918 z7DNpnVPLMz)uhyHB9Q($e3>6^@dT?V;D$_TOpz)o@Sh_hb{&ju=-&hrR-$LkJD z3>$<{t=>EvuWh$|KAa1JABOM-K~exD*>R7&VNt0oN1CXvRilm zeSQI=njOd$>ToK36N~;CoWfq`(>u))d>azwY1u6;JdFsIe|Ku`e>#`GE~gAhI{}Yd z=ab2WJ7j|uy!J`538p^DCPYakc-=hvCho4=FkP`qZ}m1dKj>q@fp6O?{i?lIa0 zG7Cn9Uyy75hzu5iQ}u&DNM3bL_+qSC|di`?I-KjJCMlWZ3ijib)qo3YIi zeBrM_mbL9{T70@xMwTQA$(;Dx{BtCjBZ&-f6j3UYqL^<6;FrLm^AS!uG8lL$e{Rb! zg<}31@49=RbE&GBXKa=1io;2)SUXCvp^_;izasuZ9WiOWuq>Q^ivkJ(NUggrNfNgz zLemPj#R+Yg1Xx_m?j$v&AT)ea6)|e_PFrU>(G|CtIZ*nMp#6}avHbD46O`J^w$!3m zDrL^tEmglF*%@_e3K6{?f4I4488bcaVn^n)?BUPK{{!;@LL8L;Sy!y%jgBY#ZHr?7A`PvFyLC7vLZa zQHiAs|EV^t@X>WnMa2q8t`T&}#vbAnm(p@lQw_oI)?#Jd5r|FmFR^sEu)W~~1PY))b~H!OxkDX51+TKlLhq_TitP?U*|HXF zbcEKp3Ph5cgho?DKLp@0lv8}8mzMbj0)D_wWJdOExkN@1 zoj{GesEFO=2z56C&l_`M+GM{Vx&kt2+s$dVmILt^8HkZ77e&3s#27P0Z8GIMjbmMNnN8hQ)f z&Pa}zP{fdJQIxk6WhYcevQle$@NLnnQVnjwRfpA2)gKIQ=7BE5D+=DCb&5Mt=GsdI z=#t!F?;*$02uq4(w)ZTXoyYHTepgs9&h}J>XV2pN^%1|vyhQA3;Zjj*`orYRhW>NO z^?;|I;lY_SNhq$46j7J3UV+(k4o^^5-WbnD3YsHOfK-lNrY7g(I;#Eb@B@yyO>G2U zqZt?v5)mR}pPk{=6I~32@a#GE1gvNS`}VUnZ^JktlYOjldg+MW3dKCTVbpZ!Qpvj# z$1>_TfZ$~%V6>#5GOP^2V!om75^Wi_Aa>xgl9@OpHSo6XfqP+2O4$afE06GaBU zvf7e=1?K4CU^6oK+gyX^MhMN!uD1pdbxx*efj0ivr7@|&x>mzv>;dMe*iOyvEw{dQ)*TXNZSC{BlP-7 z&0^|7Qnpx$?+tDthRY$JNcK;;O=NNCBNut440gE|T?@8j8Z{e}==Q8w51(*IG1rUC zPr(2X(LmE0s{vNK=3qzA!W?bb7V}(D&Ws20ACVp|UN0R*W8Me2J;;GWy`=OLWlBgw zP$c{3wE_c9iHQzTyY_2g%**khVzk5DeX)#H_Sp)|-Y~b*C14`hoH=828C*2^gT2=y z+vdoKNQ_!=92s!FdSxd7H3Lhs4F(WM_*>{4OI8NjgC^`sc6#R4In`1c7R_WQwfwVEE7+;q3_#{8LZB~<8P z)kw^bIS1CpykOG;ri_8wHKWNr^A&3{f%UOwG}#O1nyWayHnhl1WNC>qK#XbbatVV~ zi$+TY0=5p310z!tcP0oAEjmd{3*2sdqzcUUzYHZ-Ey^!S3k;9n<~vDKFPRl;j|NY* zPaCBt;R-uG)R-0K$hiC@{9(Zg^P6WKh*sAHF^y$@zMW(UMc7Qt8P+>}ISOp}QRZDP z;vDs4g%%Y9^!;_q(Dbb8LE@jw#W$CSZ*IoAn4fJoA|U2xdr!ncB)gZ0rDQ)_u~{Q# zrGdy)em2dVgd>EB?WHzrV$;l*r~JpvkPuVd9(9&q&;MSiHnsffbAcl4D;1%L{JM#w z!<1jt2awrgrj*?h+R?*PRaq{k;+7~~w`CYR>B&Yj5EC3FLM-s74nj7dQ);hmm1?Cd;s`X4W^4Ook0Lm!aa(;X9rX?BFd%8@FZHUoYee zbJ_yUcrw3AC^xizCiCsm(Vxlip)4w8TMNCD+vcnv?IJ_t&c2$#|8y-n)6sbXO&(84 z1w9FlLb(##;=z1@bhG(=`4$s{Y9DW@>9~ifI7vSB5mwGNx5>)DhD>@YUF|G`y59fb z!S6@=W~^*08Z=+0q%xbxtrmo)1^nEh24t_S|lzA%d+?rVY;&5HLsQx18M3;5(RiQp{ z=E@J8x$*@ZT0CgbS`dq0OcLeqO+`seJX2ABUkqG`dEgNIvL?WiIVqw7Yg|B0FFMw9EDGMiA&&RJwtm^)g)T3QVD<$~IlHvsQM6!LB{4xg-wx|I; z#htLD8Qx|e^$x6VT&=oM+P7Iw%em6X=;qRJY2TMP(PrP2W8c(fos)=K+vxD+ecoj; zE)S`g+k3orT)4DPbL<>Fk$Yb1^!hG+piR?$Ž>~j%22Qa1p^JY>bNpRh&NT{^0 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

FDDOM*j17RR|BOwYcu8WUUfJ=!?4bJ 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� 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∈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 z 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 void: + if transitioning: + return + transitioning = true + $AnimationPlayer.play("dissolve") + await $AnimationPlayer.animation_finished + get_tree().change_scene_to_packed(target) + $AnimationPlayer.play_backwards("dissolve") + await $AnimationPlayer.animation_finished + transitioning = false + +func change_volume(value: float): + var volume = log(value) / log(10) * 20 + AudioServer.set_bus_volume_db(AudioServer.get_bus_index("Master"), volume) diff --git a/scenes/scene_transition.tscn b/scenes/scene_transition.tscn new file mode 100644 index 0000000..f13b05a --- /dev/null +++ b/scenes/scene_transition.tscn @@ -0,0 +1,207 @@ +[gd_scene load_steps=5 format=3 uid="uid://jikocpnvcc4c"] + +[ext_resource type="Script" path="res://scenes/scene_transition.gd" id="1_jtbjb"] + +[sub_resource type="Animation" id="Animation_sptsb"] +resource_name = "RESET" +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("dissolve_rect:modulate") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(1, 1, 1, 0)] +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("dissolve_rect:modulate:r") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(1, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/2/type = "bezier" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("dissolve_rect:modulate:g") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(1, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/3/type = "bezier" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("dissolve_rect:modulate:b") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(1, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/4/type = "bezier" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("dissolve_rect:modulate:a") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(1, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} + +[sub_resource type="Animation" id="Animation_htxpg"] +resource_name = "dissolve" +length = 2.0 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("dissolve_rect:modulate:r") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(1, -0.25, 0, 0.25, 0, 1, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 2) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("dissolve_rect:modulate:g") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(1, -0.25, 0, 0.25, 0, 1, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 2) +} +tracks/2/type = "bezier" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("dissolve_rect:modulate:b") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(1, -0.25, 0, 0.25, 0, 1, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 2) +} +tracks/3/type = "bezier" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("dissolve_rect:modulate:a") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0, 1, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 2) +} +tracks/4/type = "method" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath(".") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"values": [{ +"args": [1.0], +"method": &"change_volume" +}, { +"args": [0.95], +"method": &"change_volume" +}, { +"args": [0.9], +"method": &"change_volume" +}, { +"args": [0.85], +"method": &"change_volume" +}, { +"args": [0.8], +"method": &"change_volume" +}, { +"args": [0.75], +"method": &"change_volume" +}, { +"args": [0.7], +"method": &"change_volume" +}, { +"args": [0.65], +"method": &"change_volume" +}, { +"args": [0.6], +"method": &"change_volume" +}, { +"args": [0.55], +"method": &"change_volume" +}, { +"args": [0.5], +"method": &"change_volume" +}, { +"args": [0.45], +"method": &"change_volume" +}, { +"args": [0.4], +"method": &"change_volume" +}, { +"args": [0.35], +"method": &"change_volume" +}, { +"args": [0.3], +"method": &"change_volume" +}, { +"args": [0.25], +"method": &"change_volume" +}, { +"args": [0.2], +"method": &"change_volume" +}, { +"args": [0.15], +"method": &"change_volume" +}, { +"args": [0.1], +"method": &"change_volume" +}, { +"args": [0.05], +"method": &"change_volume" +}, { +"args": [1.0], +"method": &"change_volume" +}] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_0pgiy"] +_data = { +"RESET": SubResource("Animation_sptsb"), +"dissolve": SubResource("Animation_htxpg") +} + +[node name="scene_transition" type="CanvasLayer"] +script = ExtResource("1_jtbjb") + +[node name="dissolve_rect" type="ColorRect" parent="."] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +color = Color(0, 0, 0, 1) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_0pgiy") +} diff --git a/script_templates/.gdignore b/script_templates/.gdignore new file mode 100644 index 0000000..e69de29 diff --git a/script_templates/ink_template.gd b/script_templates/ink_template.gd new file mode 100644 index 0000000..c2976d8 --- /dev/null +++ b/script_templates/ink_template.gd @@ -0,0 +1,101 @@ +# warning-ignore-all:return_value_discarded + +extends %BASE% + +# ############################################################################ # +# Imports +# ############################################################################ # + +var InkPlayer = load("res://addons/inkgd/ink_player.gd") + +# ############################################################################ # +# Public Nodes +# ############################################################################ # + +# Alternatively, it could also be retrieved from the tree. +# onready var _ink_player = $InkPlayer +@onready var _ink_player = InkPlayer.new() + +# ############################################################################ # +# Lifecycle +# ############################################################################ # + +func _ready(): +%TS%# Adds the player to the tree. +%TS%add_child(_ink_player) + +%TS%# Replace the example path with the path to your story. +%TS%# Remove this line if you set 'ink_file' in the inspector. +%TS%_ink_player.ink_file = load("res://path/to/file.ink.json") + +%TS%# It's recommended to load the story in the background. On platforms that +%TS%# don't support threads, the value of this variable is ignored. +%TS%_ink_player.loads_in_background = true + +%TS%_ink_player.connect("loaded", Callable(self, "_story_loaded")) + +%TS%# Creates the story. 'loaded' will be emitted once Ink is ready +%TS%# continue the story. +%TS%_ink_player.create_story() + + +# ############################################################################ # +# Signal Receivers +# ############################################################################ # + +func _story_loaded(successfully: bool): +%TS%if !successfully: +%TS%%TS%return + +%TS%# _observe_variables() +%TS%# _bind_externals() + +%TS%_continue_story() + + +# ############################################################################ # +# Private Methods +# ############################################################################ # + +func _continue_story(): +%TS%while _ink_player.can_continue: +%TS%%TS%var text = _ink_player.continue_story() +%TS%%TS%# This text is a line of text from the ink story. +%TS%%TS%# Set the text of a Label to this value to display it in your game. +%TS%%TS%print(text) +%TS%if _ink_player.has_choices: +%TS%%TS%# 'current_choices' contains a list of the choices, as strings. +%TS%%TS%for choice in _ink_player.current_choices: +%TS%%TS%%TS%print(choice.text) +%TS%%TS%%TS%print(choice.tags) +%TS%%TS%# '_select_choice' is a function that will take the index of +%TS%%TS%# your selection and continue the story. +%TS%%TS%_select_choice(0) +%TS%else: +%TS%%TS%# This code runs when the story reaches it's end. +%TS%%TS%print("The End") + + +func _select_choice(index): +%TS%_ink_player.choose_choice_index(index) +%TS%_continue_story() + + +# Uncomment to bind an external function. +# +# func _bind_externals(): +# %TS%_ink_player.bind_external_function("", self, "_external_function") +# +# +# func _external_function(arg1, arg2): +# %TS%pass + + +# Uncomment to observe the variables from your ink story. +# You can observe multiple variables by putting adding them in the array. +# func _observe_variables(): +# %TS%_ink_player.observe_variables(["var1", "var2"], self, "_variable_changed") +# +# +# func _variable_changed(variable_name, new_value): +# %TS%print("Variable '%s' changed to: %s" %[variable_name, new_value]) diff --git a/script_templates/ink_template_signals.gd b/script_templates/ink_template_signals.gd new file mode 100644 index 0000000..3777489 --- /dev/null +++ b/script_templates/ink_template_signals.gd @@ -0,0 +1,107 @@ +# warning-ignore-all:return_value_discarded + +extends %BASE% + +# ############################################################################ # +# Imports +# ############################################################################ # + +var InkPlayer = load("res://addons/inkgd/ink_player.gd") + + +# ############################################################################ # +# Public Nodes +# ############################################################################ # + +# Alternatively, it could also be retrieved from the tree. +# onready var _ink_player = $InkPlayer +@onready var _ink_player = InkPlayer.new() + +# ############################################################################ # +# Lifecycle +# ############################################################################ # + +func _ready(): +%TS%# Adds the player to the tree. +%TS%add_child(_ink_player) + +%TS%# Replace the example path with the path to your story. +%TS%# Remove this line if you set 'ink_file' in the inspector. +%TS%_ink_player.ink_file = load("res://path/to/file.ink.json") + +%TS%# It's recommended to load the story in the background. On platforms that +%TS%# don't support threads, the value of this variable is ignored. +%TS%_ink_player.loads_in_background = true + +%TS%_ink_player.connect("loaded", Callable(self, "_story_loaded")) +%TS%_ink_player.connect("continued", Callable(self, "_continued")) +%TS%_ink_player.connect("prompt_choices", Callable(self, "_prompt_choices")) +%TS%_ink_player.connect("ended", Callable(self, "_ended")) + +%TS%# Creates the story. 'loaded' will be emitted once Ink is ready +%TS%# continue the story. +%TS%_ink_player.create_story() + +# ############################################################################ # +# Signal Receivers +# ############################################################################ # + +func _story_loaded(successfully: bool): +%TS%if !successfully: +%TS%%TS%return + +%TS%# _observe_variables() +%TS%# _bind_externals() + +%TS%# Here, the story is started immediately, but it could be started +%TS%# at a later time. +%TS%_ink_player.continue_story() + + +func _continued(text, tags): +%TS%print(text) +%TS%# Here you could yield for an hypothetical signal, before continuing. +%TS%# await self.event +%TS%_ink_player.continue_story() + + +# ############################################################################ # +# Private Methods +# ############################################################################ # + +func _prompt_choices(choices): +%TS%if !choices.is_empty(): +%TS%%TS%print(choices) + +%TS%%TS%# In a real world scenario, _select_choice' could be +%TS%%TS%# connected to a signal, like 'Button.pressed'. +%TS%%TS%_select_choice(0) + + +func _ended(): +%TS%print("The End") + + +func _select_choice(index): +%TS%_ink_player.choose_choice_index(index) +%TS%_ink_player.continue_story() + + +# Uncomment to bind an external function. +# +# func _bind_externals(): +# %TS%_ink_player.bind_external_function("", self, "_external_function") +# +# +# func _external_function(arg1, arg2): +# %TS%pass + + +# Uncomment to observe the variables from your ink story. +# You can observe multiple variables by putting adding them in the array. +# func _observe_variables(): +# %TS%_ink_player.observe_variables(["var1", "var2"], self, "_variable_changed") +# +# +# func _variable_changed(variable_name, new_value): +# %TS%print("Variable '%s' changed to: %s" %[variable_name, new_value]) diff --git a/scripts/audio_manager.gd b/scripts/audio_manager.gd new file mode 100644 index 0000000..fb4737d --- /dev/null +++ b/scripts/audio_manager.gd @@ -0,0 +1,65 @@ +extends Node + +@export var audio_player: AudioStreamPlayer + +@export var audio1: AudioStream +@export var audio2l: AudioStream +@export var audio3: AudioStream +@export var audio4l: AudioStream +@export var audio5: AudioStream +@export var audio6: AudioStream +@export var audio7l: AudioStream +@export var audio8: AudioStream + +var characters_talked_to: int = 0 +var ending: bool = false + +# Called when the node enters the scene tree for the first time. +func _ready(): + _play(audio1) + DialogueManager.dialogue_finished.connect(_quit_dialogue) + +func _play(audio_source: AudioStream): + audio_player.stream = audio_source + audio_player.play() + + +func _on_audio_stream_player_finished(): + match audio_player.stream: + audio1: + if characters_talked_to > 0: + _play(audio3) + else: + _play(audio2l) + audio2l: + if characters_talked_to > 0: + _play(audio3) + else: + _play(audio2l) + audio3: + if characters_talked_to > 1: + _play(audio3) + else: + _play(audio4l) + audio4l: + if characters_talked_to > 3: + _play(audio5) + else: + _play(audio4l) + audio5: + _play(audio6) + audio6: + _play(audio7l) + audio7l: + if ending: + _play(audio8) + else: + _play(audio7l) + +func _quit_dialogue(_time_to_add: int): + characters_talked_to = ( + int(DialogueManager.global_variables["Character1"]) + + int(DialogueManager.global_variables["Character2"]) + + int(DialogueManager.global_variables["Character3"]) + + int(DialogueManager.global_variables["Character4"]) + ) diff --git a/scripts/counter.gd b/scripts/counter.gd new file mode 100644 index 0000000..563c1ba --- /dev/null +++ b/scripts/counter.gd @@ -0,0 +1,20 @@ +extends Control + +const MAX_TIME = 99 + +@export var start_time = 50 +@export var decrease_speed = 0.5 + +# Called when the node enters the scene tree for the first time. +func _ready(): + current_time = start_time; + $Label.text = str(int(current_time)) + +var current_time: float +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta): + current_time -= decrease_speed * delta + $Label.text = str(int(current_time)) + +func get_percentage() -> float: + return inverse_lerp(MAX_TIME, 0, int(current_time)) diff --git a/scripts/dialogue/ink_handler.gd b/scripts/dialogue/ink_handler.gd new file mode 100644 index 0000000..a912edd --- /dev/null +++ b/scripts/dialogue/ink_handler.gd @@ -0,0 +1,133 @@ +extends Control + +var inkPlayer = load("res://addons/inkgd/ink_player.gd") + +@onready var _ink_player = InkPlayer.new() + +@onready var text_box = $ColorRect/Label + +@export var buttons: Array[Button] +@export var type_sounds: Array[AudioStream] + +var displaying_choices = false +var active = false + +@onready var timer = $TextDisplayTimer + +var text = "" +var character_index = 0 + +var character_time = 0.03 + +var finished_displaying = true + +var variables: Dictionary + +# Called when the node enters the scene tree for the first time. +func _ready(): + _ink_player._add_runtime(get_tree().root) + _ink_player.loads_in_background = true + _ink_player.connect("loaded", _story_loaded) + + for button in buttons: + button.hide() + +func _setup_story(story: Resource): + _ink_player.ink_file = story + _ink_player.create_story() + active = true + +func _process(delta): + if displaying_choices: + var i = 0 + for button in buttons: + if button.button_pressed: + _select_choice(i) + i += 1 + else: + if Input.is_action_just_pressed("advance_dialog"): + _continue_story() + +func _story_loaded(successfully: bool): + if !successfully: + return + + for key in variables: + var value = variables[key] + _ink_player.set_variable(key, value) + _continue_story() + +func _continue_story(): + if !finished_displaying: + return + if !_ink_player.can_continue and !_ink_player.has_choices: + text_box.text = "" + #TODO: Hardcodear las variables aquí + variables["time_to_add"] = _ink_player.get_variable("time_to_add") + variables["Foto1"] = _ink_player.get_variable("Foto1") + variables["Foto2"] = _ink_player.get_variable("Foto2") + variables["Foto3"] = _ink_player.get_variable("Foto3") + variables["Foto4"] = _ink_player.get_variable("Foto4") + variables["Foto5"] = _ink_player.get_variable("Foto5") + variables["Character1"] = _ink_player.get_variable("Character1") + variables["Character2"] = _ink_player.get_variable("Character2") + variables["Character3"] = _ink_player.get_variable("Character3") + variables["Character4"] = _ink_player.get_variable("Character4") + variables["Character5"] = _ink_player.get_variable("Character5") + + #DIALOGUE END + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) + active = false + return + + if _ink_player.has_choices: + Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) + var i = 0 + for choice in _ink_player.current_choices: + buttons[i].show() + buttons[i].text = choice.text + i += 1 + for j in range(4 - i): + buttons[j + i].hide() + displaying_choices = true + return + + text_box.text = "" + display_text(_ink_player.continue_story()) + + +func _select_choice(index): + for button in buttons: + button.hide() + + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) + + _ink_player.choose_choice_index(index) + _continue_story() + +################## ANIMATIONS ################### + +func display_text(text_to_display: String): + text = text_to_display + character_index = 0 + finished_displaying = false + + _display_letter() + +func _display_letter(): + if character_index >= text.length(): + finished_displaying = true + return + text_box.text += text[character_index] + + character_index += 1 + $AudioStreamPlayer.stream = type_sounds.pick_random() + $AudioStreamPlayer.play() + if character_index >= text.length(): + finished_displaying = true + return + + timer.start(character_time) + +func _on_text_display_timer_timeout(): + _display_letter() diff --git a/scripts/main_menu.gd b/scripts/main_menu.gd new file mode 100644 index 0000000..8e1374e --- /dev/null +++ b/scripts/main_menu.gd @@ -0,0 +1,9 @@ +extends Control + +@export var player: CharacterBody3D +@export var eyes: Node2D + +func _on_button_button_down(): + player.enable() + eyes.enable() + queue_free() diff --git a/scripts/npc/npc.gd b/scripts/npc/npc.gd new file mode 100644 index 0000000..f0fad90 --- /dev/null +++ b/scripts/npc/npc.gd @@ -0,0 +1,23 @@ +extends CharacterBody3D + +@export var text: Resource +var moving: bool + +func animate_move(): + $Model/AnimationPlayer.play("walk") + +func animate_idle(): + $Model/AnimationPlayer.play("idle") + +# Dummy function to avoid having to distinct npc from pickup +func pointing(point: bool): pass +func destroy(): pass + +func get_text() -> Resource: + if moving: + return null + else: + return text + +func is_photo() -> bool: + return false diff --git a/scripts/npc/npc_path_follow.gd b/scripts/npc/npc_path_follow.gd new file mode 100644 index 0000000..deba609 --- /dev/null +++ b/scripts/npc/npc_path_follow.gd @@ -0,0 +1,29 @@ +extends Path3D + +var can_move: bool +@export var maxSpeed = 0.01 + +var pos = 0.0; +@onready var character_body_3d = $PathFollow3D/CharacterBody3D + +@export var character_id: String + +func _ready(): + DialogueManager.dialogue_finished.connect(_quit_dialogue) + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta): + var previous_pos = pos; + character_body_3d.moving = can_move + if can_move and pos < 1: + pos += maxSpeed * delta + + if previous_pos != pos: + character_body_3d.animate_move() + else: + character_body_3d.animate_idle() + + $PathFollow3D.progress_ratio = clamp(pos, 0, 1) + +func _quit_dialogue(_time_to_add: int): + can_move = !character_id.is_empty() && DialogueManager.global_variables[character_id]; diff --git a/scripts/npc/photo.gd b/scripts/npc/photo.gd new file mode 100644 index 0000000..3f2a20d --- /dev/null +++ b/scripts/npc/photo.gd @@ -0,0 +1,21 @@ +extends Control + +@export var photos: Array[Texture2D] +@export var photo_sound: Array[AudioStream] +@export var destroy_sound: AudioStream + +var is_visible = false + +func show_picture(index: int): + is_visible = true + $FotoTest.texture = photos[index] + $AnimationPlayer.play("appear") + $AudioStreamPlayer.stream = photo_sound.pick_random() + $AudioStreamPlayer.play() + +func hide_picture(): + if !is_visible: return + $AnimationPlayer.play("disappear") + is_visible = false + $AudioStreamPlayer.stream = destroy_sound + $AudioStreamPlayer.play() diff --git a/scripts/npc/pickup.gd b/scripts/npc/pickup.gd new file mode 100644 index 0000000..ae7343e --- /dev/null +++ b/scripts/npc/pickup.gd @@ -0,0 +1,27 @@ +extends CharacterBody3D + +@export var text: Resource +@export var photo_index: int = 0 + +@export var animation_payer: AnimationPlayer + +func _ready(): + animation_payer.play("photo_hover") + +func pointing(point: bool): + if point: + animation_payer.play("photo_point", 1) + else: + animation_payer.play("photo_hover", 1) + +func get_text() -> Resource: + return text; + +func destroy(): + queue_free() + +func is_photo(): + return true + +func get_photo_index(): + return photo_index diff --git a/scripts/player/eyes.gd b/scripts/player/eyes.gd new file mode 100644 index 0000000..cdcf8cd --- /dev/null +++ b/scripts/player/eyes.gd @@ -0,0 +1,93 @@ +extends Node2D + +const UP_MAX_POS = -200 +const UP_MIN_POS = 100 +const DOWN_MAX_POS = 900 +const DOWN_MIN_POS = 600 + +const MAX_BLINK_VARIATION = 50 + +@export var eyeUp: Sprite2D +var eyeUpPos = UP_MAX_POS + +@export var eyeDown: Sprite2D +var eyeDownPos = DOWN_MIN_POS + +var progress: float + +@export var counter_text: Label +const MAX_TIME = 99 + +@export var start_time = 50 +@export var decrease_speed = 0.5 +var current_time: float + +var timer_going = true + +var enabled = false + +@onready var cutscene = load("res://scenes/ending.tscn") + +func _get_percentage() -> float: + return inverse_lerp(MAX_TIME, 0, int(current_time)) + +func _quit_dialogue(time_to_add: int): + current_time += (time_to_add * 2) + current_time = clamp(current_time, 0, MAX_TIME) + +# Called when the node enters the scene tree for the first time. +func _ready(): + DialogueManager.dialogue_finished.connect(_quit_dialogue) + + current_time = start_time; + counter_text.text = "" + + progress = _get_percentage() + + eyeUpPos = lerp(UP_MAX_POS, UP_MIN_POS, progress) + eyeDownPos = lerp(DOWN_MAX_POS, DOWN_MIN_POS, progress) + +func enable(): + counter_text.text = str(int(current_time)) + enabled = true + +var time = 0.0 + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta): + time += delta + + var pos_offset = _sine_operation(time) + + _eye_pos_up(pos_offset) + _eye_pos_down(pos_offset) + + if !enabled: + return + current_time -= decrease_speed * delta * int(timer_going) + counter_text.text = str(int(current_time)) + progress = _get_percentage() + + eyeUpPos = lerp(UP_MAX_POS, UP_MIN_POS, progress) + eyeDownPos = lerp(DOWN_MAX_POS, DOWN_MIN_POS, progress) + + if current_time <= 0.5: + SceneTransition.change_scene(cutscene) + +#t: time g: gap o: offset +func _sine_function(t: float, g: float, o: float) -> float: + return sin(t*g+o) + +func _sine_operation(t: float) -> float: + return .25 * ( + _sine_function(t, 1, 4) + + _sine_function(t, 2, 3) + + _sine_function(t, 3, 2) + + _sine_function(t, 4, 1) + ) + +func _eye_pos_up(t: float): + eyeUp.position.y = int(lerp(eyeUpPos - MAX_BLINK_VARIATION/2, eyeUpPos + MAX_BLINK_VARIATION/2, t) / 4.0) * 4 + +func _eye_pos_down(t: float): + eyeDown.position.y = int(lerp(eyeDownPos + MAX_BLINK_VARIATION/2, eyeDownPos - MAX_BLINK_VARIATION/2, t) / 4.0) * 4 diff --git a/scripts/player/player.gd b/scripts/player/player.gd new file mode 100644 index 0000000..f8fe70e --- /dev/null +++ b/scripts/player/player.gd @@ -0,0 +1,84 @@ +extends CharacterBody3D + + +@export var SPEED = 5.0 +const MOUSE_SENSITIVITY_X = 0.3 +const MOUSE_SENSITIVITY_Y = 0.15 + +const MAX_ROTATION = 85.0 +var rotation_x = 0.0 + +var in_dialogue = false + +@export var raycast: RayCast3D + +@export var eyes: Node2D + +@export var photo_preview: Control + +# Get the gravity from the project settings to be synced with RigidBody nodes. +var gravity = ProjectSettings.get_setting("physics/3d/default_gravity") + +var enabled = false + +func enable(): + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) + enabled = true + +func _input(event): + if !enabled || DialogueManager.is_dialog_active: + return + + if in_dialogue: + photo_preview.hide_picture() + eyes.timer_going = true + in_dialogue = false + + if event is InputEventMouseMotion: + rotation_degrees.y -= MOUSE_SENSITIVITY_X * event.relative.x + rotation_x -= MOUSE_SENSITIVITY_Y * event.relative.y + rotation_x = clamp(rotation_x, -MAX_ROTATION, MAX_ROTATION) + $Camera3D.rotation_degrees.x = rotation_x + +var npc: CharacterBody3D +func _process(delta): + if !enabled: + return + if raycast.is_colliding(): + npc = raycast.get_collider() + npc.pointing(true) + if Input.is_action_just_pressed("interact"): + DialogueManager.start_dialog(raycast.get_collider().get_text()) + + if raycast.get_collider().is_photo(): + photo_preview.show_picture(raycast.get_collider().get_photo_index()) + + raycast.get_collider().destroy() + in_dialogue = true + eyes.timer_going = false + elif npc != null: + npc.pointing(false) + npc = null + +func _physics_process(delta): + if !enabled: + return + # Add the gravity. + if not is_on_floor(): + velocity.y -= gravity * delta + + # Get the input direction and handle the movement/deceleration. + # As good practice, you should replace UI actions with custom gameplay actions. + var input_dir = Input.get_vector("move_left", "move_right", "move_forwards", "move_backwards") + var direction = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized() + if direction: + velocity.x = direction.x * SPEED + velocity.z = direction.z * SPEED + else: + velocity.x = move_toward(velocity.x, 0, SPEED) + velocity.z = move_toward(velocity.z, 0, SPEED) + + if DialogueManager.is_dialog_active: + velocity = Vector3(0, velocity.y, 0) + + move_and_slide() diff --git a/scripts/shaders/Perlin_noise_example.png b/scripts/shaders/Perlin_noise_example.png new file mode 100644 index 0000000..fa87fae --- /dev/null +++ b/scripts/shaders/Perlin_noise_example.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:91a84d01d109d5a857761c0047d56d9728f90dea7bf150a60919730aa7e2e795 +size 163690 diff --git a/scripts/shaders/Perlin_noise_example.png.import b/scripts/shaders/Perlin_noise_example.png.import new file mode 100644 index 0000000..818a327 --- /dev/null +++ b/scripts/shaders/Perlin_noise_example.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cfux36pq3rp1p" +path.s3tc="res://.godot/imported/Perlin_noise_example.png-1d87d1cb590d7ea007c419d3f3ff388b.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://scripts/shaders/Perlin_noise_example.png" +dest_files=["res://.godot/imported/Perlin_noise_example.png-1d87d1cb590d7ea007c419d3f3ff388b.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/scripts/shaders/cloud.gdshader b/scripts/shaders/cloud.gdshader new file mode 100644 index 0000000..c4cf0e0 --- /dev/null +++ b/scripts/shaders/cloud.gdshader @@ -0,0 +1,46 @@ +shader_type spatial; +render_mode unshaded; + +uniform sampler2D dissolve_texture : hint_default_transparent; +uniform float threshold : hint_range(0,1); +uniform vec3 color : source_color; +uniform float alpha_add = 1; +uniform float speed : hint_range(0, 0.01) = 0.005; + +float fresnel(vec3 Normal, vec3 ViewDir, float Power){ + return pow((1.0 - clamp(dot(normalize(Normal), normalize(ViewDir)), 0, 1)), Power); +} + +float _fresnel(vec2 uv, float Power){ + return pow((clamp(sin(PI * uv.x) * sin(PI * uv.y), 0, 1)), Power); +} + +vec2 loop(vec2 vec){ + vec2 res = vec; + vec2 floors = floor(res); + res.x -= floor(res.x); + res.y -= floor(res.y); + if(int(floors.x) % 2 == 0){ + res.x = 1.0 - res.x; + } + if(int(floors.y) % 2 == 0){ + res.y = 1.0 - res.y; + } + return res; +} + +void fragment(){ + vec4 noise_texture = texture(dissolve_texture, loop(UV + vec2(TIME, TIME) * speed)); + noise_texture *= texture(dissolve_texture, loop(UV + vec2(-TIME, -TIME) * speed)) / 0.5; + noise_texture *= texture(dissolve_texture, loop(UV + vec2(TIME, -TIME) * speed)) / 0.5; + noise_texture *= texture(dissolve_texture, loop(UV + vec2(-TIME, TIME) * speed)) / 0.5; + noise_texture *= texture(dissolve_texture, loop(UV * 2.0 + vec2(-TIME, TIME) * speed * 0.3)) / 0.5; + noise_texture *= texture(dissolve_texture, loop(UV * 2.0 + vec2(TIME, -TIME) * speed * 0.5)) / 0.5; + noise_texture *= texture(dissolve_texture, loop(UV * 2.0 + vec2(TIME, TIME) * speed * 0.8)) / 0.5; + noise_texture *= texture(dissolve_texture, loop(UV * 2.0 + vec2(-TIME, -TIME) * speed)) / 0.5; + + ALPHA = clamp(noise_texture.x - threshold, 0, 1); + ALPHA *= _fresnel(UV, 3) * alpha_add; + ALPHA = clamp(ALPHA, 0, 1); + ALBEDO = color; +} diff --git a/scripts/shaders/crt.gdshader b/scripts/shaders/crt.gdshader new file mode 100644 index 0000000..bbf36f3 --- /dev/null +++ b/scripts/shaders/crt.gdshader @@ -0,0 +1,231 @@ +/* +Shader from Godot Shaders - the free shader library. +godotshaders.com/shader/VHS-and-CRT-monitor-effect + +This shader is under CC0 license. Feel free to use, improve and +change this shader according to your needs and consider sharing +the modified result to godotshaders.com. +*/ + +shader_type canvas_item; + +//*** IMPORTANT! ***/ +// - If you are using this shader to affect the node it is applied to set 'overlay' to false (unchecked in the instepctor). +// - If you are using this shader as an overlay, and want the shader to affect the nodes below in the Scene hierarchy, +// set 'overlay' to true (checked in the inspector). +// On Mac there is potentially a bug causing this to not work properly. If that is the case and you want to use the shader as an overlay +// change all "overlay ? SCREEN_TEXTURE : TEXTURE" to only "SCREEN_TEXTURE" on lines 129-140, and "vec2 uv = overlay ? warp(SCREEN_UV) : warp(UV);" +// to "vec2 uv = warp(SCREEN_UV);" on line 98. +uniform bool overlay = false; + +uniform float scanlines_opacity : hint_range(0.0, 1.0) = 0.4; +uniform float scanlines_width : hint_range(0.0, 0.5) = 0.25; +uniform float grille_opacity : hint_range(0.0, 1.0) = 0.3; +uniform vec2 resolution = vec2(640.0, 480.0); // Set the number of rows and columns the texture will be divided in. Scanlines and grille will make a square based on these values + +uniform bool pixelate = true; // Fill each square ("pixel") with a sampled color, creating a pixel look and a more accurate representation of how a CRT monitor would work. + +uniform bool roll = true; +uniform float roll_speed = 8.0; // Positive values are down, negative are up +uniform float roll_size : hint_range(0.0, 100.0) = 15.0; +uniform float roll_variation : hint_range(0.1, 5.0) = 1.8; // This valie is not an exact science. You have to play around with the value to find a look you like. How this works is explained in the code below. +uniform float distort_intensity : hint_range(0.0, 0.2) = 0.05; // The distortion created by the rolling effect. + +uniform float noise_opacity : hint_range(0.0, 1.0) = 0.4; +uniform float noise_speed = 5.0; // There is a movement in the noise pattern that can be hard to see first. This sets the speed of that movement. + +uniform float static_noise_intensity : hint_range(0.0, 1.0) = 0.06; + +uniform float aberration : hint_range(-1.0, 1.0) = 0.03; // Chromatic aberration, a distortion on each color channel. +uniform float brightness = 1.4; // When adding scanline gaps and grille the image can get very dark. Brightness tries to compensate for that. +uniform bool discolor = true; // Add a discolor effect simulating a VHS + +uniform float warp_amount :hint_range(0.0, 5.0) = 1.0; // Warp the texture edges simulating the curved glass of a CRT monitor or old TV. +uniform bool clip_warp = false; + +uniform float vignette_intensity = 0.4; // Size of the vignette, how far towards the middle it should go. +uniform float vignette_opacity : hint_range(0.0, 1.0) = 0.5; + +uniform sampler2D SCREEN_TEXTURE : hint_screen_texture, filter_linear_mipmap; + +// Used by the noise functin to generate a pseudo random value between 0.0 and 1.0 +vec2 random(vec2 uv){ + uv = vec2( dot(uv, vec2(127.1,311.7) ), + dot(uv, vec2(269.5,183.3) ) ); + return -1.0 + 2.0 * fract(sin(uv) * 43758.5453123); +} + +// Generate a Perlin noise used by the distortion effects +float noise(vec2 uv) { + vec2 uv_index = floor(uv); + vec2 uv_fract = fract(uv); + + vec2 blur = smoothstep(0.0, 1.0, uv_fract); + + return mix( mix( dot( random(uv_index + vec2(0.0,0.0) ), uv_fract - vec2(0.0,0.0) ), + dot( random(uv_index + vec2(1.0,0.0) ), uv_fract - vec2(1.0,0.0) ), blur.x), + mix( dot( random(uv_index + vec2(0.0,1.0) ), uv_fract - vec2(0.0,1.0) ), + dot( random(uv_index + vec2(1.0,1.0) ), uv_fract - vec2(1.0,1.0) ), blur.x), blur.y) * 0.5 + 0.5; +} + +// Takes in the UV and warps the edges, creating the spherized effect +vec2 warp(vec2 uv){ + vec2 delta = uv - 0.5; + float delta2 = dot(delta.xy, delta.xy); + float delta4 = delta2 * delta2; + float delta_offset = delta4 * warp_amount; + + return uv + delta * delta_offset; +} + +// Adds a black border to hide stretched pixel created by the warp effect +float border (vec2 uv){ + float radius = min(warp_amount, 0.08); + radius = max(min(min(abs(radius * 2.0), abs(1.0)), abs(1.0)), 1e-5); + vec2 abs_uv = abs(uv * 2.0 - 1.0) - vec2(1.0, 1.0) + radius; + float dist = length(max(vec2(0.0), abs_uv)) / radius; + float square = smoothstep(0.96, 1.0, dist); + return clamp(1.0 - square, 0.0, 1.0); +} + +// Adds a vignette shadow to the edges of the image +float vignette(vec2 uv){ + uv *= 1.0 - uv.xy; + float vignette = uv.x * uv.y * 15.0; + return pow(vignette, vignette_intensity * vignette_opacity); +} + +void fragment() +{ + vec2 uv = overlay ? warp(SCREEN_UV) : warp(UV); // Warp the uv. uv will be used in most cases instead of UV to keep the warping + vec2 text_uv = uv; + vec2 roll_uv = vec2(0.0); + float time = roll ? TIME : 0.0; + + + // Pixelate the texture based on the given resolution. + if (pixelate) + { + text_uv = ceil(uv * resolution) / resolution; + } + + // Create the rolling effect. We need roll_line a bit later to make the noise effect. + // That is why this runs if roll is true OR noise_opacity is over 0. + float roll_line = 0.0; + if (roll || noise_opacity > 0.0) + { + // Create the areas/lines where the texture will be distorted. + roll_line = smoothstep(0.3, 0.9, sin(uv.y * roll_size - (time * roll_speed) ) ); + // Create more lines of a different size and apply to the first set of lines. This creates a bit of variation. + roll_line *= roll_line * smoothstep(0.3, 0.9, sin(uv.y * roll_size * roll_variation - (time * roll_speed * roll_variation) ) ); + // Distort the UV where where the lines are + roll_uv = vec2(( roll_line * distort_intensity * (1.-UV.x)), 0.0); + } + + vec4 text; + if (roll) + { + // If roll is true distort the texture with roll_uv. The texture is split up into RGB to + // make some chromatic aberration. We apply the aberration to the red and green channels accorging to the aberration parameter + // and intensify it a bit in the roll distortion. + text.r = texture(SCREEN_TEXTURE, text_uv + roll_uv * 0.8 + vec2(aberration, 0.0) * .1).r; + text.g = texture(SCREEN_TEXTURE, text_uv + roll_uv * 1.2 - vec2(aberration, 0.0) * .1 ).g; + text.b = texture(SCREEN_TEXTURE, text_uv + roll_uv).b; + text.a = 1.0; + } + else + { + // If roll is false only apply the aberration without any distorion. The aberration values are very small so the .1 is only + // to make the slider in the Inspector less sensitive. + text.r = texture(SCREEN_TEXTURE, text_uv + vec2(aberration, 0.0) * .1).r; + text.g = texture(SCREEN_TEXTURE, text_uv - vec2(aberration, 0.0) * .1).g; + text.b = texture(SCREEN_TEXTURE, text_uv).b; + text.a = 1.0; + } + + float r = text.r; + float g = text.g; + float b = text.b; + + uv = warp(UV); + + // CRT monitors don't have pixels but groups of red, green and blue dots or lines, called grille. We isolate the texture's color channels + // and divide it up in 3 offsetted lines to show the red, green and blue colors next to each other, with a small black gap between. + if (grille_opacity > 0.0){ + + float g_r = smoothstep(0.85, 0.95, abs(sin(uv.x * (resolution.x * 3.14159265)))); + r = mix(r, r * g_r, grille_opacity); + + float g_g = smoothstep(0.85, 0.95, abs(sin(1.05 + uv.x * (resolution.x * 3.14159265)))); + g = mix(g, g * g_g, grille_opacity); + + float b_b = smoothstep(0.85, 0.95, abs(sin(2.1 + uv.x * (resolution.x * 3.14159265)))); + b = mix(b, b * b_b, grille_opacity); + + } + + // Apply the grille to the texture's color channels and apply Brightness. Since the grille and the scanlines (below) make the image very dark you + // can compensate by increasing the brightness. + text.r = clamp(r * brightness, 0.0, 1.0); + text.g = clamp(g * brightness, 0.0, 1.0); + text.b = clamp(b * brightness, 0.0, 1.0); + + // Scanlines are the horizontal lines that make up the image on a CRT monitor. + // Here we are actual setting the black gap between each line, which I guess is not the right definition of the word, but you get the idea + float scanlines = 0.5; + if (scanlines_opacity > 0.0) + { + // Same technique as above, create lines with sine and applying it to the texture. Smoothstep to allow setting the line size. + scanlines = smoothstep(scanlines_width, scanlines_width + 0.5, abs(sin(uv.y * (resolution.y * 3.14159265)))); + text.rgb = mix(text.rgb, text.rgb * vec3(scanlines), scanlines_opacity); + } + + // Apply the banded noise. + if (noise_opacity > 0.0) + { + // Generate a noise pattern that is very stretched horizontally, and animate it with noise_speed + float noise = smoothstep(0.4, 0.5, noise(uv * vec2(2.0, 200.0) + vec2(10.0, (TIME * (noise_speed))) ) ); + + // We use roll_line (set above) to define how big the noise should be vertically (multiplying cuts off all black parts). + // We also add in some basic noise with random() to break up the noise pattern above. The noise is sized according to + // the resolution value set in the inspector. If you don't like this look you can + // change "ceil(uv * resolution) / resolution" to only "uv" to make it less pixelated. Or multiply resolution with som value + // greater than 1.0 to make them smaller. + roll_line *= noise * scanlines * clamp(random((ceil(uv * resolution) / resolution) + vec2(TIME * 0.8, 0.0)).x + 0.8, 0.0, 1.0); + // Add it to the texture based on noise_opacity + text.rgb = clamp(mix(text.rgb, text.rgb + roll_line, noise_opacity), vec3(0.0), vec3(1.0)); + } + + // Apply static noise by generating it over the whole screen in the same way as above + if (static_noise_intensity > 0.0) + { + text.rgb += clamp(random((ceil(uv * resolution) / resolution) + fract(TIME)).x, 0.0, 1.0) * static_noise_intensity; + } + + // Apply a black border to hide imperfections caused by the warping. + // Also apply the vignette + text.rgb *= border(uv); + text.rgb *= vignette(uv); + // Hides the black border and make that area transparent. Good if you want to add the the texture on top an image of a TV or monitor. + if (clip_warp) + { + text.a = border(uv); + } + + // Apply discoloration to get a VHS look (lower saturation and higher contrast) + // You can play with the values below or expose them in the Inspector. + float saturation = 0.5; + float contrast = 1.2; + if (discolor) + { + // Saturation + vec3 greyscale = vec3(text.r + text.g + text.b) / 3.; + text.rgb = mix(text.rgb, greyscale, saturation); + + // Contrast + float midpoint = pow(0.5, 2.2); + text.rgb = (text.rgb - vec3(midpoint)) * contrast + midpoint; + } + + COLOR = text; +} \ No newline at end of file diff --git a/scripts/shaders/dissolve.gdshader b/scripts/shaders/dissolve.gdshader new file mode 100644 index 0000000..17ff24f --- /dev/null +++ b/scripts/shaders/dissolve.gdshader @@ -0,0 +1,11 @@ +shader_type canvas_item; + +uniform sampler2D dissolve_texture : hint_default_transparent; +uniform float dissolve_value : hint_range(0,1); + +void fragment(){ + vec4 main_texture = texture(TEXTURE, UV); + vec4 noise_texture = texture(dissolve_texture, UV); + main_texture.a *= floor(dissolve_value + min(1, noise_texture.x)); + COLOR = main_texture; +} \ No newline at end of file diff --git a/scripts/shaders/pixelation.gdshader b/scripts/shaders/pixelation.gdshader new file mode 100644 index 0000000..f2beac9 --- /dev/null +++ b/scripts/shaders/pixelation.gdshader @@ -0,0 +1,45 @@ +shader_type canvas_item; +uniform int num_colors: hint_range(2,32) = 8; +uniform sampler2D PALETTE_TEXTURE: hint_default_black; +uniform sampler2D PALETTE_TEXTURE_LOW: hint_default_black; + +uniform sampler2D SCREEN_TEXTURE : hint_screen_texture, filter_linear_mipmap; + +uniform int u_dither_size = 4; + +vec3 palette_limiter (in vec3 albedo, in vec2 uv){ + float estimation_cutoff = 0.001; + vec3 closest_color; + float min_dist = 2.0; + float n = float(num_colors); + + bool palette_low = (int(uv.y)) % 2 == 0; + + for (int i=0; i