From 37fca82cd22f59a3c0806b59d2d3161471c01b5d Mon Sep 17 00:00:00 2001 From: Relintai Date: Sat, 22 May 2021 21:19:19 +0200 Subject: [PATCH] Added everything from broken seals 2d. Removed the world generator module. --- HEADS | 1 + SConstruct | 534 ++++ build.config.example | 44 + build_ios.sh | 19 + build_ios_release.sh | 21 + build_osx.sh | 15 + build_uwp.bat | 14 + editor.bat | 6 + editor.sh | 6 + export_all.sh | 22 + game/.gitignore | 16 + game/addons/Godoxel/BrushPrefabs.gd | 106 + game/addons/Godoxel/Canvas.gd | 461 ++++ game/addons/Godoxel/CanvasOutline.gd | 31 + game/addons/Godoxel/Colors.gd | 34 + game/addons/Godoxel/DebugTextDisplay.gd | 9 + game/addons/Godoxel/Editor.gd | 832 ++++++ game/addons/Godoxel/Editor.tscn | 1279 +++++++++ game/addons/Godoxel/Layer.gd | 98 + game/addons/Godoxel/LayerButton.tscn | 110 + game/addons/Godoxel/MenuButtonExtended.gd | 13 + game/addons/Godoxel/Navbar.gd | 106 + game/addons/Godoxel/PaintCanvas.gd | 489 ++++ game/addons/Godoxel/PaintCanvas.tscn | 30 + game/addons/Godoxel/PaintCanvasChunk.gd | 27 + game/addons/Godoxel/PaintCanvasChunk.tscn | 13 + game/addons/Godoxel/PaintCanvasContainer.gd | 2 + game/addons/Godoxel/SaveFileDialog.gd | 70 + game/addons/Godoxel/SelectionBox.gd | 24 + game/addons/Godoxel/Settings.gd | 24 + game/addons/Godoxel/Settings.tscn | 64 + game/addons/Godoxel/TextInfo.gd | 39 + game/addons/Godoxel/Util.gd | 94 + game/addons/Godoxel/ViewportContainer.gd | 6 + game/addons/Godoxel/VisualGrid.gd | 41 + game/addons/Godoxel/VisualGrid.tscn | 9 + game/addons/Godoxel/actions/Action.gd | 123 + game/addons/Godoxel/actions/Brighten.gd | 53 + game/addons/Godoxel/actions/Brush.gd | 47 + game/addons/Godoxel/actions/Bucket.gd | 49 + game/addons/Godoxel/actions/Cut.gd | 82 + game/addons/Godoxel/actions/Darken.gd | 55 + game/addons/Godoxel/actions/Line.gd | 59 + game/addons/Godoxel/actions/MultiLine.gd | 44 + game/addons/Godoxel/actions/PasteCut.gd | 59 + game/addons/Godoxel/actions/Pencil.gd | 43 + game/addons/Godoxel/actions/Rainbow.gd | 58 + game/addons/Godoxel/actions/Rect.gd | 69 + game/addons/Godoxel/assets/BrushCircle.png | Bin 0 -> 195 bytes .../Godoxel/assets/BrushCircle.png.import | 34 + .../Godoxel/assets/BrushCircle_Hovered.png | Bin 0 -> 3413 bytes .../assets/BrushCircle_Hovered.png.import | 34 + game/addons/Godoxel/assets/BrushHLine.png | Bin 0 -> 127 bytes .../Godoxel/assets/BrushHLine.png.import | 34 + .../Godoxel/assets/BrushHLine_Hovered.png | Bin 0 -> 1930 bytes .../assets/BrushHLine_Hovered.png.import | 34 + game/addons/Godoxel/assets/BrushRect.png | Bin 0 -> 128 bytes .../Godoxel/assets/BrushRect.png.import | 34 + .../Godoxel/assets/BrushRect_Hovered.png | Bin 0 -> 1819 bytes .../assets/BrushRect_Hovered.png.import | 34 + game/addons/Godoxel/assets/BrushVLine.png | Bin 0 -> 129 bytes .../Godoxel/assets/BrushVLine.png.import | 34 + .../Godoxel/assets/BrushVLine_Hovered.png | Bin 0 -> 1998 bytes .../assets/BrushVLine_Hovered.png.import | 34 + .../addons/Godoxel/assets/Godoxel_Preview.png | Bin 0 -> 46436 bytes .../Godoxel/assets/Godoxel_Preview.png.import | 34 + game/addons/Godoxel/assets/arrow_down.png | Bin 0 -> 562 bytes .../Godoxel/assets/arrow_down.png.import | 34 + game/addons/Godoxel/assets/arrow_up.png | Bin 0 -> 565 bytes .../addons/Godoxel/assets/arrow_up.png.import | 34 + .../COPYRIGHT.TXT | 124 + .../bitstream_vera_sans_font_6016/README.TXT | 11 + .../RELEASENOTES.TXT | 162 ++ .../bitstream_vera_sans_font_6016/Vera.ttf | Bin 0 -> 65932 bytes .../bitstream_vera_sans_font_6016/VeraBI.ttf | Bin 0 -> 63208 bytes .../bitstream_vera_sans_font_6016/VeraBd.ttf | Bin 0 -> 58716 bytes .../bitstream_vera_sans_font_6016/VeraIt.ttf | Bin 0 -> 63684 bytes .../all-free-download.com.url | 8 + game/addons/Godoxel/assets/grid.png | Bin 0 -> 148 bytes game/addons/Godoxel/assets/grid.png.import | 34 + game/addons/Godoxel/assets/lock_layer.png | Bin 0 -> 251 bytes .../Godoxel/assets/lock_layer.png.import | 34 + game/addons/Godoxel/assets/lock_layer_1.png | Bin 0 -> 242 bytes .../Godoxel/assets/lock_layer_1.png.import | 34 + game/addons/Godoxel/assets/minidotta.png | Bin 0 -> 2330 bytes .../Godoxel/assets/minidotta.png.import | 34 + .../addons/Godoxel/assets/minidotta_invis.png | Bin 0 -> 1746 bytes .../Godoxel/assets/minidotta_invis.png.import | 34 + game/addons/Godoxel/assets/unlock_layer.png | Bin 0 -> 240 bytes .../Godoxel/assets/unlock_layer.png.import | 34 + .../Godoxel/dialogs/ChangeGridSizeDialog.gd | 28 + .../Godoxel/dialogs/ConfirmationDialog.gd | 20 + game/addons/Godoxel/dialogs/LoadFileDialog.gd | 70 + .../Godoxel/dialogs/LoadFileDialog.tscn | 22 + game/addons/Godoxel/plugin.cfg | 7 + game/addons/Godoxel/plugin.gd | 37 + game/addons/module_manager/LICENSE | 21 + game/addons/module_manager/README.md | 7 + game/addons/module_manager/icons/empty.png | Bin 0 -> 939 bytes .../module_manager/icons/empty.png.import | 34 + game/addons/module_manager/icons/gom.png | Bin 0 -> 1746 bytes .../module_manager/icons/gom.png.import | 34 + game/addons/module_manager/icons/icon_add.png | Bin 0 -> 111 bytes .../module_manager/icons/icon_add.png.import | 34 + .../addons/module_manager/icons/icon_copy.png | Bin 0 -> 248 bytes .../module_manager/icons/icon_copy.png.import | 34 + .../icons/icon_display-name.png | Bin 0 -> 200 bytes .../icons/icon_display-name.png.import | 34 + .../module_manager/icons/icon_duplicate.png | Bin 0 -> 167 bytes .../icons/icon_duplicate.png.import | 34 + .../addons/module_manager/icons/icon_edit.png | Bin 0 -> 346 bytes .../module_manager/icons/icon_edit.png.import | 34 + .../module_manager/icons/icon_empty.png | Bin 0 -> 267 bytes .../icons/icon_empty.png.import | 34 + .../addons/module_manager/icons/icon_load.png | Bin 0 -> 170 bytes .../module_manager/icons/icon_load.png.import | 34 + .../module_manager/icons/icon_move_down.png | Bin 0 -> 268 bytes .../icons/icon_move_down.png.import | 34 + .../module_manager/icons/icon_move_up.png | Bin 0 -> 269 bytes .../icons/icon_move_up.png.import | 34 + .../module_manager/icons/icon_multi_line.png | Bin 0 -> 140 bytes .../icons/icon_multi_line.png.import | 34 + .../module_manager/icons/icon_options.png | Bin 0 -> 392 bytes .../icons/icon_options.png.import | 34 + .../icons/icon_reload_small.png | Bin 0 -> 409 bytes .../icons/icon_reload_small.png.import | 34 + .../module_manager/icons/icon_remove.png | Bin 0 -> 166 bytes .../icons/icon_remove.png.import | 34 + .../module_manager/icons/icon_rename.png | Bin 0 -> 160 bytes .../icons/icon_rename.png.import | 34 + .../addons/module_manager/icons/icon_save.png | Bin 0 -> 252 bytes .../module_manager/icons/icon_save.png.import | 34 + .../module_manager/icons/icon_script.png | Bin 0 -> 262 bytes .../icons/icon_script.png.import | 34 + .../module_manager/panels/CreateNamePopup.gd | 64 + .../panels/CreateNamePopup.tscn | 58 + .../module_manager/panels/EntryButton.gd | 93 + .../panels/FolderEntryButton.gd | 12 + .../panels/FolderEntryButton.tscn | 10 + .../module_manager/panels/HistoryEntry.gd | 39 + .../module_manager/panels/HistoryEntry.tscn | 12 + .../addons/module_manager/panels/MainPanel.gd | 89 + .../module_manager/panels/MainPanel.tscn | 45 + .../module_manager/panels/ResourcePanel.gd | 291 ++ .../module_manager/panels/ResourcePanel.tscn | 118 + .../module_manager/panels/ResourceRow.tscn | 47 + .../panels/ResourceRowMainButton.gd | 18 + game/addons/module_manager/plugin.cfg | 7 + game/addons/module_manager/plugin.gd | 36 + .../module_manager/previews/ControlPreview.gd | 14 + .../previews/ControlPreview.tscn | 22 + .../module_manager/previews/Node2DPreview.gd | 14 + .../previews/Node2DPreview.tscn | 25 + .../module_manager/previews/SpatialPreview.gd | 14 + .../previews/SpatialPreview.tscn | 29 + .../module_manager/previews/TexturePreview.gd | 12 + .../previews/TexturePreview.tscn | 13 + game/autoload/Logger.gd | 637 +++++ game/autoload/Logger.tscn | 6 + game/autoload/Server.gd | 220 ++ game/autoload/Server.tscn | 6 + game/characters/Character.tscn | 74 + game/characters/CharacterFrontModel.tscn | 2387 +++++++++++++++++ game/characters/CharacterSideModel.tscn | 2146 +++++++++++++++ game/characters/CharacterTest1Scene.tscn | 109 + .../char_t1_outline_split - Copy.png | Bin 0 -> 1228 bytes .../char_t1_outline_split - Copy.png.import | 34 + game/characters/char_t1_outline_split.png | Bin 0 -> 2103 bytes .../char_t1_outline_split.png.import | 34 + game/cursors/arrow.png | Bin 0 -> 173 bytes game/cursors/arrow.png.import | 34 + game/cursors/arrow16.png | Bin 0 -> 379 bytes game/cursors/arrow16.png.import | 34 + game/cursors/arrow32.png | Bin 0 -> 418 bytes game/cursors/arrow32.png.import | 34 + game/cursors/arrow8.png | Bin 0 -> 173 bytes game/cursors/arrow8.png.import | 34 + game/cursors/attack16.png | Bin 0 -> 414 bytes game/cursors/attack16.png.import | 34 + game/cursors/autoload/CursorManager.gd | 44 + game/cursors/autoload/CursorManager.tscn | 24 + game/cursors/drag_drop.png | Bin 0 -> 371 bytes game/cursors/drag_drop.png.import | 34 + game/cursors/forbidden.png | Bin 0 -> 436 bytes game/cursors/forbidden.png.import | 34 + game/cursors/ibeam.png | Bin 0 -> 256 bytes game/cursors/ibeam.png.import | 34 + game/cursors/loot16.png | Bin 0 -> 377 bytes game/cursors/loot16.png.import | 34 + game/cursors/speak.png | Bin 0 -> 426 bytes game/cursors/speak.png.import | 34 + game/debug/FreeLookCam.tscn | 11 + game/debug/FreeLookCamera.gd | 98 + game/default_bus_layout.tres | 3 + game/ess_data.json | 3 + game/fonts/OFL.txt | 93 + game/fonts/VT323-Regular.ttf | Bin 0 -> 86576 bytes game/icon.png | Bin 0 -> 7569 bytes game/icon.png.flags | 1 + game/icon.png.import | 37 + game/modules/core/crafting/1_test_craft.tres | 36 + .../2_chest_of_the_infinite_wisdom.tres | 21 + .../entity_resources/1_mana_resource.tres | 7 + game/modules/core/entity_skills/1_test.tres | 4 + game/modules/core/game_module.tres | 9 + game/modules/core/item_templates/1_gold.tres | 11 + game/modules/core/item_templates/2_test.tres | 14 + .../3_chest_of_the_infinite_wisdom.tres | 17 + game/modules/core/resource_db.tres | 15 + .../elementalist/2_elementalist.tres | 27 + .../character_specs/2_elementalist_fire.tres | 6 + .../character_specs/3_elementalist_water.tres | 6 + .../character_specs/4_elementalist_ice.tres | 6 + .../elementalist/spells/31_overload.tres | 40 + .../elementalist/spells/32_heat.tres | 7 + .../elementalist/spells/33_normal.tres | 7 + .../elementalist/spells/34_cold.tres | 7 + .../naturalist/1_naturalist.tres | 43 + .../aura_groups/1_aspect_of_scorpions.tres | 3 + .../aura_groups/2_aspect_of_wasps.tres | 3 + .../aura_groups/3_aspect_of_wolves.tres | 3 + .../aura_groups/4_aspect_of_bees.tres | 3 + .../auras/10_aspect_of_scorpions_rank_1.tres | 22 + .../auras/11_aspect_of_wasps_rank1.tres | 23 + .../auras/12_aspect_of_wolves_rank_1.tres | 23 + .../auras/13_aspect_of_bees_rank_1.tres | 23 + .../auras/14_rejuvenation_rank_1.tres | 19 + .../auras/15_close_wounds_rank_1.tres | 18 + .../naturalist/auras/16_ironbark_rank_1.tres | 14 + .../auras/17_natures_swiftness_rank_1.tres | 16 + .../naturalist/auras/20_root_rank_1.tres | 13 + .../auras/21_aspect_of_scorpions.tres | 28 + .../naturalist/auras/22_aspect_of_wasps.tres | 23 + .../naturalist/auras/23_aspect_of_wolves.tres | 32 + .../naturalist/auras/24_aspect_of_bees.tres | 23 + .../effect_data/aspect_of_scorpions.tres | 15 + .../effect_data/natures_swiftness.tres | 12 + .../naturalist/entities/1_naturalist.tres | 15 + .../naturalist/entities/2_naturalist_mob.tres | 38 + .../naturalist/game_module.tres | 8 + .../naturalist/icons/amplify_pain.tres | 8 + .../naturalist/icons/aspect_of_bees.tres | 8 + .../naturalist/icons/aspect_of_scorpions.tres | 8 + .../naturalist/icons/aspect_of_wasps.tres | 8 + .../naturalist/icons/aspect_of_wolves.tres | 8 + .../naturalist/icons/attunement.tres | 8 + .../entity_classes/naturalist/icons/calm.tres | 8 + .../naturalist/icons/close_wounds.tres | 8 + .../naturalist/icons/first_aid.tres | 8 + .../naturalist/icons/inner_will.tres | 8 + .../naturalist/icons/ironbark.tres | 8 + .../naturalist/icons/natures_swiftness.tres | 8 + .../naturalist/icons/regenerate.tres | 9 + .../naturalist/icons/rejuvenation.tres | 8 + .../entity_classes/naturalist/icons/root.tres | 8 + .../naturalist/icons/shield_of_barbs.tres | 8 + .../naturalist/icons/strength_of_nature.tres | 8 + .../entity_classes/naturalist/icons/test.tres | 9 + .../naturalist/icons/uproot.tres | 8 + .../naturalist/resource_db.tres | 45 + .../spell_effects/nature/AOSCastFinish.tscn | 3 + .../spell_effects/nature/AmplifyPain.tscn | 3 + .../spell_effects/nature/NatureCast.tscn | 3 + .../spell_effects/nature/NautreSwiftness.tscn | 3 + .../spell_effects/textures/arrows.png | Bin 0 -> 482 bytes .../spell_effects/textures/arrows.png.import | 34 + .../spell_effects/textures/big_glow.png | Bin 0 -> 259 bytes .../textures/big_glow.png.import | 34 + .../spell_effects/textures/main_texture.png | Bin 0 -> 194 bytes .../textures/main_texture.png.import | 34 + .../spell_effects/textures/small_star.png | Bin 0 -> 225 bytes .../textures/small_star.png.import | 34 + .../spell_effects/textures/star.png | Bin 0 -> 283 bytes .../spell_effects/textures/star.png.import | 34 + .../spells/10_aspect_of_scorpions_rank_1.tres | 32 + .../spells/11_aspect_of_wasps_rank_1.tres | 20 + .../spells/12_aspect_of_wolves_rank_1.tres | 21 + .../spells/13_aspect_of_bees_rank_1.tres | 24 + .../spells/14_amplify_pain_rank_1.tres | 39 + .../spells/15_rejuvenation_rank_1.tres | 21 + .../spells/16_close_wounds_rank_1.tres | 21 + .../naturalist/spells/17_ironbark_rank_1.tres | 23 + .../spells/18_natures_swiftness_rank_1.tres | 23 + .../naturalist/spells/19_uproot_rank_1.tres | 22 + .../naturalist/spells/20_root_rank_1.tres | 22 + .../spells/21_strength_of_nature_rank_1.tres | 24 + .../spells/22_shield_of_barbs_rank_1.tres | 21 + .../naturalist/spells/23_calm_rank_1.tres | 20 + .../spells/24_attunement_rank_1.tres | 21 + .../naturalist/spells/25_inner_will.tres | 19 + .../naturalist/spells/26_rest.tres | 17 + .../spells/27_aspect_of_scorpions.tres | 24 + .../naturalist/spells/28_aspectofwasps.tres | 21 + .../spells/29_aspect_of_wolves.tres | 21 + .../naturalist/spells/30_aspect_of_bees.tres | 25 + .../naturalist/spells/35_strike.tres | 42 + .../naturalist/spells/36_regrow.tres | 30 + .../naturalist/stats/mob_statdata.tres | 19 + .../naturalist/stats/player_statdata.tres | 19 + game/modules/icons/ parts/circles.svg | 81 + game/modules/icons/ parts/circles.svg.import | 34 + game/modules/icons/3_iron_bar.tres | 9 + .../icons/4_chest_of_the_infinite_wisdom.tres | 9 + .../icons/Naturalist/AspectOfScorpions.png | Bin 0 -> 349 bytes .../Naturalist/AspectOfScorpions.png.import | 34 + .../icons/Naturalist/AspectOfScorpions.tscn | 104 + game/modules/icons/icons-1/11.png | Bin 0 -> 2827 bytes game/modules/icons/icons-1/11.png.import | 34 + game/modules/icons/icons-1/43.png | Bin 0 -> 8244 bytes game/modules/icons/icons-1/43.png.import | 34 + game/modules/icons/icons-1/5.png | Bin 0 -> 3297 bytes game/modules/icons/icons-1/5.png.import | 34 + game/modules/icons/icons-1/61.png | Bin 0 -> 3024 bytes game/modules/icons/icons-1/61.png.import | 34 + game/modules/icons/icons-1/Readme.txt | 16 + game/modules/icons/icons-2/README.txt | 12 + game/modules/icons/icons-2/enchant-acid-2.png | Bin 0 -> 3032 bytes .../icons/icons-2/enchant-acid-2.png.import | 34 + game/modules/icons/icons-2/enchant-blue-2.png | Bin 0 -> 3111 bytes .../icons/icons-2/enchant-blue-2.png.import | 34 + game/modules/icons/icons-2/heal-jade-2.png | Bin 0 -> 3314 bytes .../icons/icons-2/heal-jade-2.png.import | 34 + game/modules/icons/icons-2/protect-acid-3.png | Bin 0 -> 3506 bytes .../icons/icons-2/protect-acid-3.png.import | 34 + .../modules/icons/icons-2/protect-eerie-2.png | Bin 0 -> 3357 bytes .../icons/icons-2/protect-eerie-2.png.import | 34 + game/modules/icons/icons-3/README.txt | 11 + game/modules/icons/icons-3/beam-jade-2.png | Bin 0 -> 3220 bytes .../icons/icons-3/beam-jade-2.png.import | 34 + game/modules/icons/icons-3/haste-royal-2.png | Bin 0 -> 3277 bytes .../icons/icons-3/haste-royal-2.png.import | 34 + .../modules/icons/icons-3/lighting-acid-2.png | Bin 0 -> 3404 bytes .../icons/icons-3/lighting-acid-2.png.import | 34 + game/modules/icons/icons-3/vines-plain-1.png | Bin 0 -> 2525 bytes .../icons/icons-3/vines-plain-1.png.import | 34 + game/modules/icons/icons-3/vines-plain-2.png | Bin 0 -> 2739 bytes .../icons/icons-3/vines-plain-2.png.import | 34 + game/modules/icons/icons-4/README.txt | 24 + .../icons/icons-4/explosion-royal-2.png | Bin 0 -> 3086 bytes .../icons-4/explosion-royal-2.png.import | 34 + game/modules/icons/icons-4/horror-acid-3.png | Bin 0 -> 3133 bytes .../icons/icons-4/horror-acid-3.png.import | 34 + game/modules/icons/icons-4/leaf-acid-1.png | Bin 0 -> 2695 bytes .../icons/icons-4/leaf-acid-1.png.import | 34 + game/modules/icons/icons-4/wild-orange-2.png | Bin 0 -> 3019 bytes .../icons/icons-4/wild-orange-2.png.import | 34 + game/modules/icons/icons-4/wind-blue-1.png | Bin 0 -> 2631 bytes .../icons/icons-4/wind-blue-1.png.import | 34 + game/modules/icons/icons-5/README.txt | 23 + .../icons/icons-5/wind-grasp-acid-2.png | Bin 0 -> 2917 bytes .../icons-5/wind-grasp-acid-2.png.import | 34 + .../icons/icons-5/wind-grasp-eerie-2.png | Bin 0 -> 2966 bytes .../icons-5/wind-grasp-eerie-2.png.import | 34 + game/modules/icons/icons.png | Bin 0 -> 1438 bytes game/modules/icons/icons.png.import | 34 + game/modules/icons/items/gold.tres | 9 + game/modules/species/Human/Body.tscn | 59 + game/modules/species/species_human.tres | 14 + .../spell_effects/enchanter/Arrow.tscn | 3 + game/player/Body.gd | 511 ++++ game/player/CharacterSkeleton2DGD.gd | 144 + game/player/CharacterSkeletonAttachPoint.gd | 75 + game/player/CharacterSkeletonGD.gd | 26 + game/player/DisplayPlayer.gd | 53 + game/player/DisplayPlayer.tscn | 26 + game/player/GUI.gd | 38 + game/player/HumanoidCharacterBones2D.gd | 76 + game/player/Mob.gd | 172 ++ game/player/Mob.tscn | 24 + game/player/MobTest.gd | 46 + game/player/NamePlate.gd | 150 ++ game/player/NetworkedPlayer.gd | 120 + game/player/NetworkedPlayer.tscn | 27 + game/player/Player.gd | 32 + game/player/Player.tscn | 13 + game/player/PlayerGDBase.gd | 109 + game/player/Unitframes.gd | 51 + game/player/bs_entity_spawner.gd | 338 +++ game/player/bs_entity_spawner.tscn | 8 + game/project.godot | 644 +++++ game/scenes/BrokenSeals.tscn | 3 + game/scenes/CharacterCreationMenu.gd | 86 + game/scenes/CharacterSelector.gd | 52 + game/scenes/CharacterSelectorMenu.gd | 220 ++ game/scenes/ConnectButton.gd | 35 + game/scenes/ConnectServerButton.gd | 73 + game/scenes/DisconnectButton.gd | 35 + game/scenes/GameScene.gd | 25 + game/scenes/HostButton.gd | 30 + game/scenes/HostGameButton.gd | 71 + game/scenes/Main.tscn | 96 + game/scenes/MainScene.gd | 110 + game/scenes/Menu.gd | 51 + game/scenes/Menu.tscn | 538 ++++ game/scenes/Shared.tscn | 11 + game/scenes/World.gd | 100 + game/scenes/World.tscn | 13 + game/scenes/World3d.tscn | 63 + game/scripts/ai/EntityAIGD.gd | 142 + game/scripts/auras/CastTimeReductionAura.gd | 9 + game/scripts/auras/SpeedModAura.gd | 26 + game/scripts/auras/SpellDamageModAura.gd | 14 + game/scripts/auras/aura_script.gd | 101 + game/scripts/entities/EntityClassDataGD.gd | 117 + game/scripts/entities/EntityDataGD.gd | 65 + game/scripts/game_modules/DataManager.gd | 78 + game/scripts/game_modules/DataManager.tscn | 8 + game/scripts/game_modules/GameModule.gd | 25 + .../game_modules/ui_gui_child_module.gd | 15 + game/scripts/game_modules/ui_window_module.gd | 22 + game/scripts/item_visuals/CharacterAtlas2D.gd | 27 + .../item_visuals/CharacterAtlasEntry2D.gd | 39 + game/scripts/item_visuals/ItemVisual2D.gd | 24 + .../scripts/item_visuals/ItemVisualEntry2D.gd | 28 + game/scripts/items/ItemTemplateGD.gd | 29 + game/scripts/networking/PlayerMaster.gd | 40 + game/scripts/networking/SpawnPoint.gd | 135 + game/scripts/resources/HealthResource.gd | 47 + game/scripts/resources/ManaResource.gd | 71 + game/scripts/resources/SpeedResource.gd | 44 + .../resources/spell_effect_visual_basic.gd | 37 + .../settings/DirectionalLightSettings.gd | 25 + game/scripts/spells/amplify_pain.gd | 37 + game/scripts/spells/gd_spell_script.gd | 263 ++ game/scripts/ui/AdaptiveTheme.gd | 50 + .../world_generators/MainPlanetGenerator.gd | 110 + .../Agents/GSAIKinematicBody2DAgent.gd | 120 + .../Agents/GSAIKinematicBody3DAgent.gd | 120 + .../Agents/GSAIRigidBody2DAgent.gd | 58 + .../Agents/GSAIRigidBody3DAgent.gd | 60 + .../Agents/GSAISpecializedAgent.gd | 39 + .../Behaviors/GSAIArrive.gd | 42 + .../Behaviors/GSAIAvoidCollisions.gd | 74 + .../Behaviors/GSAIBlend.gd | 47 + .../Behaviors/GSAICohesion.gd | 30 + .../Behaviors/GSAIEvade.gd | 14 + .../Behaviors/GSAIFace.gd | 29 + .../Behaviors/GSAIFlee.gd | 15 + .../Behaviors/GSAIFollowPath.gd | 53 + .../Behaviors/GSAILookWhereYouGo.gd | 20 + .../Behaviors/GSAIMatchOrientation.gd | 51 + .../Behaviors/GSAIPriority.gd | 49 + .../Behaviors/GSAIPursue.gd | 37 + .../Behaviors/GSAISeek.gd | 19 + .../Behaviors/GSAISeparation.gd | 42 + game/steering_ai_framework/CHANGELOG.md | 80 + .../GSAIAgentLocation.gd | 7 + .../GSAIGroupBehavior.gd | 19 + game/steering_ai_framework/GSAIPath.gd | 132 + .../GSAISteeringAgent.gd | 27 + .../GSAISteeringBehavior.gd | 29 + .../GSAITargetAcceleration.gd | 32 + game/steering_ai_framework/GSAIUtils.gd | 36 + game/steering_ai_framework/LICENSE | 21 + .../Proximities/GSAIInfiniteProximity.gd | 26 + .../Proximities/GSAIProximity.gd | 22 + .../Proximities/GSAIRadiusProximity.gd | 56 + game/steering_ai_framework/README.md | 69 + game/test_iso_tileset/TileMap32x16.tscn | 11 + game/test_iso_tileset/TileMap44x24.tscn | 11 + game/test_iso_tileset/TileMap52x28.tscn | 11 + game/test_iso_tileset/new_tileset.tres | 47 + game/test_iso_tileset/test_tiles.png | Bin 0 -> 1963 bytes game/test_iso_tileset/test_tiles.png.import | 34 + game/texture_tools/LayeredTextureMaker.gd | 133 + game/texture_tools/test/ToolTest.tscn | 21 + .../test/new_packerimageresource.tres | 13 + game/tilesets/Terrarin.tscn | 10 + game/tilesets/tiles.png | Bin 0 -> 2561 bytes game/tilesets/tiles.png.import | 34 + game/tilesets/tileset.tres | 62 + game/ui/about/About.tscn | 263 ++ game/ui/about/Authors.gd | 38 + game/ui/about/GodotAuthors.gd | 31 + game/ui/about/GodotDonors.gd | 31 + game/ui/about/GodotLicense.gd | 18 + game/ui/about/GodotThirdPartyLicenses.gd | 51 + game/ui/about/Third-Party Licenses.gd | 147 + game/ui/actionbars/ActionBar.gd | 46 + game/ui/actionbars/ActionBar.tscn | 33 + game/ui/actionbars/ActionBarEntry.gd | 388 +++ game/ui/actionbars/ActionBarEntry.tscn | 91 + game/ui/actionbars/Actionbars.gd | 70 + game/ui/actionbars/Actionbars.tscn | 18 + game/ui/actionbars/EditorKeybindSetup.gd | 53 + game/ui/actionbars/game_module.tres | 10 + game/ui/auraframe/AuraEntry.gd | 95 + game/ui/auraframe/AuraEntry.tscn | 94 + game/ui/auraframe/AuraFrame.gd | 74 + game/ui/auraframe/AuraFrame.tscn | 44 + game/ui/auraframe/game_module.tres | 10 + game/ui/autoload/SettingsManager.gd | 227 ++ game/ui/autoload/SettingsManager.tscn | 6 + game/ui/autoload/ThemeAtlas.gd | 30 + game/ui/autoload/ThemeAtlas.tscn | 25 + game/ui/autoload/WorldNumbers.gd | 54 + game/ui/autoload/WorldNumbers.tscn | 8 + game/ui/bags/Bag.tscn | 265 ++ game/ui/bags/BagEntry.gd | 256 ++ game/ui/bags/BagEntry.tscn | 104 + game/ui/bags/BagFrame.gd | 29 + game/ui/bags/BagFrame.tscn | 51 + game/ui/bags/BaseWindow.tscn | 79 + game/ui/bags/EquipmentSlot.gd | 118 + game/ui/bags/EquipmentSlot.tscn | 37 + game/ui/bags/InventoryGUI.gd | 149 + game/ui/bags/InventoryWindow.tscn | 127 + game/ui/bags/ItemEntry.tscn | 54 + game/ui/bags/ItemPupop.gd | 52 + game/ui/bags/ItemTooltip.tscn | 76 + game/ui/bags/game_module.tres | 13 + game/ui/bags/weapon_set_button_group.tres | 3 + game/ui/buttons/Buttons.gd | 75 + game/ui/buttons/ImageButton.tscn | 26 + game/ui/castbar/Castbar.gd | 80 + game/ui/castbar/Castbar.tscn | 52 + game/ui/castbar/game_module.tres | 10 + game/ui/character/CharacterWindow.gd | 33 + game/ui/character/CharacterWindow.tscn | 385 +++ game/ui/character/SingleStatRow.gd | 38 + game/ui/character/SingleStatRow.tscn | 27 + game/ui/character/game_module.tres | 13 + game/ui/crafting/CraftItemDescription.gd | 42 + game/ui/crafting/CraftingWindow.gd | 162 ++ game/ui/crafting/CraftingWindow.tscn | 319 +++ game/ui/crafting/ItemEntry.gd | 47 + game/ui/crafting/ItemEntry.tscn | 45 + game/ui/crafting/RecipeSelector.gd | 33 + game/ui/crafting/RecipeSelector.tscn | 12 + game/ui/crafting/game_module.tres | 13 + game/ui/debug/DebugInfo.gd | 77 + game/ui/debug/DebugInfo.tscn | 18 + game/ui/debug/SpawnPointSimpleUI.tscn | 102 + game/ui/debug/debuginfo_font.tres | 7 + game/ui/errorframe/ErrorFrame.tscn | 5 + game/ui/icons/icon_add.png | Bin 0 -> 564 bytes game/ui/icons/icon_add.png.import | 34 + game/ui/icons/icon_edit.png | Bin 0 -> 627 bytes game/ui/icons/icon_edit.png.import | 34 + game/ui/icons/icon_joy_axis.png | Bin 0 -> 689 bytes game/ui/icons/icon_joy_axis.png.import | 34 + game/ui/icons/icon_joy_button.png | Bin 0 -> 703 bytes game/ui/icons/icon_joy_button.png.import | 34 + game/ui/icons/icon_keyboard.png | Bin 0 -> 739 bytes game/ui/icons/icon_keyboard.png.import | 34 + game/ui/icons/icon_mouse.png | Bin 0 -> 689 bytes game/ui/icons/icon_mouse.png.import | 34 + game/ui/icons/icon_remove.png | Bin 0 -> 615 bytes game/ui/icons/icon_remove.png.import | 34 + game/ui/ingame_menu/ExitButton.gd | 28 + game/ui/ingame_menu/IngameMenu.tscn | 106 + game/ui/interface/InterfaceOptions.gd | 6 + game/ui/interface/InterfaceOptions.tscn | 52 + game/ui/interface/SetActionbarAsDefault.gd | 16 + game/ui/keybinds/KeybindCategory.gd | 25 + game/ui/keybinds/KeybindCategory.tscn | 29 + game/ui/keybinds/KeybindEntry.gd | 39 + game/ui/keybinds/KeybindEntry.tscn | 34 + game/ui/keybinds/Keybinds.gd | 156 ++ game/ui/keybinds/Keybinds.tscn | 84 + game/ui/login/Login.tscn | 88 + game/ui/loot_window/LootEntry.gd | 49 + game/ui/loot_window/LootEntry.tscn | 61 + game/ui/loot_window/LootWindow.gd | 98 + game/ui/loot_window/LootWindow.tscn | 56 + game/ui/loot_window/game_module.tres | 11 + game/ui/map/Map.tscn | 47 + game/ui/menu/CharacterEntry.gd | 59 + game/ui/menu/CharacterEntry.tscn | 91 + .../menu/character_creation_button_group.tres | 3 + game/ui/menu/menu_character_button_group.tres | 3 + game/ui/minimap/MiniMap.tscn | 11 + game/ui/nameplates/NamePlate.tscn | 68 + .../ui/nameplates/name_plate_dynamicfont.tres | 8 + game/ui/nameplates/name_plate_theme.tres | 36 + game/ui/nameplates/texture_progress_bg.tres | 7 + game/ui/nameplates/texture_progress_fg.tres | 7 + game/ui/numbers/Number.gd | 87 + game/ui/numbers/Number.tscn | 92 + game/ui/numbers/number_font.tres | 8 + game/ui/options/OptionButtonRow.gd | 35 + game/ui/options/OptionButtonRow.tscn | 25 + game/ui/options/OptionCheckBox.gd | 33 + game/ui/options/OptionCheckboxRow.tscn | 27 + game/ui/options/OptionEnumRow.gd | 47 + game/ui/options/OptionEnumRow.tscn | 27 + game/ui/options/OptionToggleRow.gd | 44 + game/ui/options/Options.tscn | 196 ++ game/ui/options/OptionsSliderRow.gd | 44 + game/ui/options/OptionsSliderRow.tscn | 29 + game/ui/options/OptionsSpinboxRow.gd | 66 + game/ui/options/OptionsSpinboxRow.tscn | 38 + game/ui/options/OptionsViewportLabel.gd | 37 + game/ui/options/OptionsViewportLabel.tscn | 27 + game/ui/options/Threads.gd | 35 + game/ui/player_ui/RemoveProfile.gd | 37 + game/ui/player_ui/player_ui.gd | 58 + game/ui/player_ui/player_ui.tscn | 102 + game/ui/register/Register.tscn | 114 + game/ui/spellbook/SpellBookWindow.gd | 217 ++ game/ui/spellbook/SpellBookWindow.tscn | 178 ++ game/ui/spellbook/SpellContainer.gd | 150 ++ game/ui/spellbook/SpellContainer.tscn | 150 ++ .../ui/spellbook/SpellDragAndDropSpellBook.gd | 45 + game/ui/spellbook/SpellEntryPopup.gd | 43 + game/ui/spellbook/game_module.tres | 13 + game/ui/starmap/StarMap.tscn | 72 + game/ui/talents/Spec.gd | 51 + game/ui/talents/Spec.tscn | 22 + game/ui/talents/TalentEntry.gd | 128 + game/ui/talents/TalentEntry.tscn | 110 + game/ui/talents/TalentRow.gd | 29 + game/ui/talents/TalentRow.tscn | 17 + game/ui/talents/TalentWindow.gd | 118 + game/ui/talents/TalentWindow.tscn | 117 + game/ui/talents/game_module.tres | 13 + game/ui/talents/talent_switcher_button.gd | 32 + game/ui/talents/talent_switcher_button.tscn | 14 + game/ui/theme/GameUI.png | Bin 0 -> 3405 bytes game/ui/theme/GameUI.png.import | 34 + game/ui/theme/actionbar_dynamicfont.tres | 7 + game/ui/theme/bag_icon.tres | 7 + game/ui/theme/button_bg_atlas.tres | 7 + game/ui/theme/button_bg_stylebox.tres | 14 + .../ui/theme/button_bg_stylebox_disabled.tres | 14 + game/ui/theme/button_bg_stylebox_focus.tres | 14 + game/ui/theme/button_bg_stylebox_hover.tres | 13 + game/ui/theme/button_bg_stylebox_pressed.tres | 14 + game/ui/theme/character_icon.tres | 7 + game/ui/theme/checkbox_checked_texture.tres | 7 + game/ui/theme/checkbox_texture.tres | 7 + game/ui/theme/cooldown_progress.png | Bin 0 -> 120 bytes game/ui/theme/cooldown_progress.png.import | 34 + game/ui/theme/crafting_icon.tres | 7 + game/ui/theme/dropdown_icon.tres | 7 + game/ui/theme/h_scroll_bar_texture.tres | 7 + game/ui/theme/indicator.png | Bin 0 -> 417 bytes game/ui/theme/indicator.png.import | 34 + game/ui/theme/lineedit_normal_style.tres | 15 + game/ui/theme/locked_icon.tres | 7 + game/ui/theme/menu_icon.tres | 7 + game/ui/theme/panel_bg.tres | 13 + game/ui/theme/panel_bg_atlas.tres | 7 + game/ui/theme/radio_checked_texture.tres | 7 + game/ui/theme/radio_texture.tres | 7 + game/ui/theme/scrollbar_bg.tres | 14 + game/ui/theme/scrollbar_bg_atlas.tres | 7 + game/ui/theme/scrollbar_bg_focus.tres | 13 + game/ui/theme/scrollbar_grabber.tres | 13 + game/ui/theme/scrollbar_grabber_atlas.tres | 7 + game/ui/theme/scrollbar_grabber_blue.tres | 14 + game/ui/theme/scrollbar_grabber_blue_xp.tres | 14 + .../ui/theme/scrollbar_grabber_highlight.tres | 13 + game/ui/theme/scrollbar_grabber_pressed.tres | 14 + game/ui/theme/scrollbar_grabber_red.tres | 14 + game/ui/theme/separator_stylebox.tres | 7 + game/ui/theme/separator_texture.tres | 7 + game/ui/theme/spellbook_icon.tres | 7 + game/ui/theme/tab_button_bg_stylebox.tres | 14 + .../theme/tab_button_bg_stylebox_focus.tres | 14 + .../theme/tab_button_bg_stylebox_hover.tres | 13 + game/ui/theme/talent_icon.tres | 7 + game/ui/theme/ui_dynamicfont.tres | 7 + game/ui/theme/ui_dynamicfont_small.tres | 7 + game/ui/theme/ui_theme.tres | 380 +++ game/ui/theme/unlocked_icon.tres | 7 + game/ui/theme/window_bg_atlas.tres | 7 + game/ui/theme/window_bg_bg.tres | 7 + .../TouchMovementControls.tscn | 92 + .../touch_movement_controls/game_module.tres | 10 + game/ui/touch_pad/TurnPanel.gd | 115 + game/ui/touch_pad/analog.gd | 156 ++ game/ui/touch_pad/analog.tscn | 94 + game/ui/touch_pad/analog.xml | 313 +++ game/ui/touch_pad/big_circle.png | Bin 0 -> 3779 bytes game/ui/touch_pad/big_circle.png.import | 34 + game/ui/touch_pad/small_circle.png | Bin 0 -> 834 bytes game/ui/touch_pad/small_circle.png.import | 34 + .../TouchTargetControls.tscn | 55 + .../ui/touch_target_controls/game_module.tres | 10 + game/ui/trainer/TrainerWindow.gd | 227 ++ game/ui/trainer/TrainerWindow.tscn | 157 ++ game/ui/trainer/game_module.tres | 11 + game/ui/unitframes/TargetUnitframe.gd | 151 ++ game/ui/unitframes/TargetUnitframe.tscn | 98 + game/ui/unitframes/UnitframeBase.gd | 150 ++ game/ui/unitframes/UnitframeBase.tscn | 97 + game/ui/unitframes/Unitframes.tscn | 24 + game/ui/unitframes/game_module.tres | 10 + game/ui/vendor_window/ItemContainer.gd | 89 + game/ui/vendor_window/ItemContainer.tscn | 165 ++ .../ui/vendor_window/ItemDragAndDropVendor.gd | 45 + game/ui/vendor_window/VendorEntryPopup.gd | 54 + game/ui/vendor_window/VendorWindow.gd | 161 ++ game/ui/vendor_window/VendorWindow.tscn | 175 ++ game/ui/vendor_window/game_module.tres | 11 + game/ui/world_numbers_2d/Number.gd | 65 + game/ui/world_numbers_2d/Number.tscn | 94 + game/ui/world_numbers_2d/WorldNumbers.gd | 53 + game/ui/world_numbers_2d/WorldNumbers.tscn | 8 + game/ui/world_numbers_2d/number_font.tres | 7 + game/world/WorldLayer.gd | 31 + game/world/WorldLayer.tscn | 14 + ged.sh | 6 + make_release.sh | 34 + pictures/screen.jpg | Bin 0 -> 253182 bytes play.sh | 6 + podman_build_all.sh | 34 + tools/build-containers/.gitignore | 12 + tools/build-containers/Dockerfile.android | 16 + tools/build-containers/Dockerfile.base | 9 + tools/build-containers/Dockerfile.ios | 30 + tools/build-containers/Dockerfile.javascript | 13 + tools/build-containers/Dockerfile.linux | 8 + tools/build-containers/Dockerfile.msvc | 29 + tools/build-containers/Dockerfile.osx | 15 + tools/build-containers/Dockerfile.windows | 7 + tools/build-containers/Dockerfile.xcode | 43 + tools/build-containers/README.md | 10 + tools/build-containers/build_containers.sh | 53 + tools/build-containers/files/msvc-fixup.sh | 24 + .../files/patches/fix-fuse-check.diff | 27 + tools/build-containers/upload.sh | 27 + tools/copy_repos.py | 100 + tools/export_presets.cfg.example | 482 ++++ tools/vscode-setup/launch.json | 67 + tools/vscode-setup/settings.json | 6 + tools/vscode-setup/tasks.json | 26 + 728 files changed, 39183 insertions(+) create mode 100644 HEADS create mode 100644 SConstruct create mode 100644 build.config.example create mode 100755 build_ios.sh create mode 100755 build_ios_release.sh create mode 100755 build_osx.sh create mode 100644 build_uwp.bat create mode 100644 editor.bat create mode 100755 editor.sh create mode 100755 export_all.sh create mode 100644 game/.gitignore create mode 100644 game/addons/Godoxel/BrushPrefabs.gd create mode 100644 game/addons/Godoxel/Canvas.gd create mode 100644 game/addons/Godoxel/CanvasOutline.gd create mode 100644 game/addons/Godoxel/Colors.gd create mode 100644 game/addons/Godoxel/DebugTextDisplay.gd create mode 100644 game/addons/Godoxel/Editor.gd create mode 100644 game/addons/Godoxel/Editor.tscn create mode 100644 game/addons/Godoxel/Layer.gd create mode 100644 game/addons/Godoxel/LayerButton.tscn create mode 100644 game/addons/Godoxel/MenuButtonExtended.gd create mode 100644 game/addons/Godoxel/Navbar.gd create mode 100644 game/addons/Godoxel/PaintCanvas.gd create mode 100644 game/addons/Godoxel/PaintCanvas.tscn create mode 100644 game/addons/Godoxel/PaintCanvasChunk.gd create mode 100644 game/addons/Godoxel/PaintCanvasChunk.tscn create mode 100644 game/addons/Godoxel/PaintCanvasContainer.gd create mode 100644 game/addons/Godoxel/SaveFileDialog.gd create mode 100644 game/addons/Godoxel/SelectionBox.gd create mode 100644 game/addons/Godoxel/Settings.gd create mode 100644 game/addons/Godoxel/Settings.tscn create mode 100644 game/addons/Godoxel/TextInfo.gd create mode 100644 game/addons/Godoxel/Util.gd create mode 100644 game/addons/Godoxel/ViewportContainer.gd create mode 100644 game/addons/Godoxel/VisualGrid.gd create mode 100644 game/addons/Godoxel/VisualGrid.tscn create mode 100644 game/addons/Godoxel/actions/Action.gd create mode 100644 game/addons/Godoxel/actions/Brighten.gd create mode 100644 game/addons/Godoxel/actions/Brush.gd create mode 100644 game/addons/Godoxel/actions/Bucket.gd create mode 100644 game/addons/Godoxel/actions/Cut.gd create mode 100644 game/addons/Godoxel/actions/Darken.gd create mode 100644 game/addons/Godoxel/actions/Line.gd create mode 100644 game/addons/Godoxel/actions/MultiLine.gd create mode 100644 game/addons/Godoxel/actions/PasteCut.gd create mode 100644 game/addons/Godoxel/actions/Pencil.gd create mode 100644 game/addons/Godoxel/actions/Rainbow.gd create mode 100644 game/addons/Godoxel/actions/Rect.gd create mode 100644 game/addons/Godoxel/assets/BrushCircle.png create mode 100644 game/addons/Godoxel/assets/BrushCircle.png.import create mode 100644 game/addons/Godoxel/assets/BrushCircle_Hovered.png create mode 100644 game/addons/Godoxel/assets/BrushCircle_Hovered.png.import create mode 100644 game/addons/Godoxel/assets/BrushHLine.png create mode 100644 game/addons/Godoxel/assets/BrushHLine.png.import create mode 100644 game/addons/Godoxel/assets/BrushHLine_Hovered.png create mode 100644 game/addons/Godoxel/assets/BrushHLine_Hovered.png.import create mode 100644 game/addons/Godoxel/assets/BrushRect.png create mode 100644 game/addons/Godoxel/assets/BrushRect.png.import create mode 100644 game/addons/Godoxel/assets/BrushRect_Hovered.png create mode 100644 game/addons/Godoxel/assets/BrushRect_Hovered.png.import create mode 100644 game/addons/Godoxel/assets/BrushVLine.png create mode 100644 game/addons/Godoxel/assets/BrushVLine.png.import create mode 100644 game/addons/Godoxel/assets/BrushVLine_Hovered.png create mode 100644 game/addons/Godoxel/assets/BrushVLine_Hovered.png.import create mode 100644 game/addons/Godoxel/assets/Godoxel_Preview.png create mode 100644 game/addons/Godoxel/assets/Godoxel_Preview.png.import create mode 100644 game/addons/Godoxel/assets/arrow_down.png create mode 100644 game/addons/Godoxel/assets/arrow_down.png.import create mode 100644 game/addons/Godoxel/assets/arrow_up.png create mode 100644 game/addons/Godoxel/assets/arrow_up.png.import create mode 100644 game/addons/Godoxel/assets/bitstream_vera_sans_font_6016/COPYRIGHT.TXT create mode 100644 game/addons/Godoxel/assets/bitstream_vera_sans_font_6016/README.TXT create mode 100644 game/addons/Godoxel/assets/bitstream_vera_sans_font_6016/RELEASENOTES.TXT create mode 100644 game/addons/Godoxel/assets/bitstream_vera_sans_font_6016/Vera.ttf create mode 100644 game/addons/Godoxel/assets/bitstream_vera_sans_font_6016/VeraBI.ttf create mode 100644 game/addons/Godoxel/assets/bitstream_vera_sans_font_6016/VeraBd.ttf create mode 100644 game/addons/Godoxel/assets/bitstream_vera_sans_font_6016/VeraIt.ttf create mode 100644 game/addons/Godoxel/assets/bitstream_vera_sans_font_6016/all-free-download.com.url create mode 100644 game/addons/Godoxel/assets/grid.png create mode 100644 game/addons/Godoxel/assets/grid.png.import create mode 100644 game/addons/Godoxel/assets/lock_layer.png create mode 100644 game/addons/Godoxel/assets/lock_layer.png.import create mode 100644 game/addons/Godoxel/assets/lock_layer_1.png create mode 100644 game/addons/Godoxel/assets/lock_layer_1.png.import create mode 100644 game/addons/Godoxel/assets/minidotta.png create mode 100644 game/addons/Godoxel/assets/minidotta.png.import create mode 100644 game/addons/Godoxel/assets/minidotta_invis.png create mode 100644 game/addons/Godoxel/assets/minidotta_invis.png.import create mode 100644 game/addons/Godoxel/assets/unlock_layer.png create mode 100644 game/addons/Godoxel/assets/unlock_layer.png.import create mode 100644 game/addons/Godoxel/dialogs/ChangeGridSizeDialog.gd create mode 100644 game/addons/Godoxel/dialogs/ConfirmationDialog.gd create mode 100644 game/addons/Godoxel/dialogs/LoadFileDialog.gd create mode 100644 game/addons/Godoxel/dialogs/LoadFileDialog.tscn create mode 100644 game/addons/Godoxel/plugin.cfg create mode 100644 game/addons/Godoxel/plugin.gd create mode 100644 game/addons/module_manager/LICENSE create mode 100644 game/addons/module_manager/README.md create mode 100644 game/addons/module_manager/icons/empty.png create mode 100644 game/addons/module_manager/icons/empty.png.import create mode 100644 game/addons/module_manager/icons/gom.png create mode 100644 game/addons/module_manager/icons/gom.png.import create mode 100644 game/addons/module_manager/icons/icon_add.png create mode 100644 game/addons/module_manager/icons/icon_add.png.import create mode 100644 game/addons/module_manager/icons/icon_copy.png create mode 100644 game/addons/module_manager/icons/icon_copy.png.import create mode 100644 game/addons/module_manager/icons/icon_display-name.png create mode 100644 game/addons/module_manager/icons/icon_display-name.png.import create mode 100644 game/addons/module_manager/icons/icon_duplicate.png create mode 100644 game/addons/module_manager/icons/icon_duplicate.png.import create mode 100644 game/addons/module_manager/icons/icon_edit.png create mode 100644 game/addons/module_manager/icons/icon_edit.png.import create mode 100644 game/addons/module_manager/icons/icon_empty.png create mode 100644 game/addons/module_manager/icons/icon_empty.png.import create mode 100644 game/addons/module_manager/icons/icon_load.png create mode 100644 game/addons/module_manager/icons/icon_load.png.import create mode 100644 game/addons/module_manager/icons/icon_move_down.png create mode 100644 game/addons/module_manager/icons/icon_move_down.png.import create mode 100644 game/addons/module_manager/icons/icon_move_up.png create mode 100644 game/addons/module_manager/icons/icon_move_up.png.import create mode 100644 game/addons/module_manager/icons/icon_multi_line.png create mode 100644 game/addons/module_manager/icons/icon_multi_line.png.import create mode 100644 game/addons/module_manager/icons/icon_options.png create mode 100644 game/addons/module_manager/icons/icon_options.png.import create mode 100644 game/addons/module_manager/icons/icon_reload_small.png create mode 100644 game/addons/module_manager/icons/icon_reload_small.png.import create mode 100644 game/addons/module_manager/icons/icon_remove.png create mode 100644 game/addons/module_manager/icons/icon_remove.png.import create mode 100644 game/addons/module_manager/icons/icon_rename.png create mode 100644 game/addons/module_manager/icons/icon_rename.png.import create mode 100644 game/addons/module_manager/icons/icon_save.png create mode 100644 game/addons/module_manager/icons/icon_save.png.import create mode 100644 game/addons/module_manager/icons/icon_script.png create mode 100644 game/addons/module_manager/icons/icon_script.png.import create mode 100644 game/addons/module_manager/panels/CreateNamePopup.gd create mode 100644 game/addons/module_manager/panels/CreateNamePopup.tscn create mode 100644 game/addons/module_manager/panels/EntryButton.gd create mode 100644 game/addons/module_manager/panels/FolderEntryButton.gd create mode 100644 game/addons/module_manager/panels/FolderEntryButton.tscn create mode 100644 game/addons/module_manager/panels/HistoryEntry.gd create mode 100644 game/addons/module_manager/panels/HistoryEntry.tscn create mode 100644 game/addons/module_manager/panels/MainPanel.gd create mode 100644 game/addons/module_manager/panels/MainPanel.tscn create mode 100644 game/addons/module_manager/panels/ResourcePanel.gd create mode 100644 game/addons/module_manager/panels/ResourcePanel.tscn create mode 100644 game/addons/module_manager/panels/ResourceRow.tscn create mode 100644 game/addons/module_manager/panels/ResourceRowMainButton.gd create mode 100644 game/addons/module_manager/plugin.cfg create mode 100644 game/addons/module_manager/plugin.gd create mode 100644 game/addons/module_manager/previews/ControlPreview.gd create mode 100644 game/addons/module_manager/previews/ControlPreview.tscn create mode 100644 game/addons/module_manager/previews/Node2DPreview.gd create mode 100644 game/addons/module_manager/previews/Node2DPreview.tscn create mode 100644 game/addons/module_manager/previews/SpatialPreview.gd create mode 100644 game/addons/module_manager/previews/SpatialPreview.tscn create mode 100644 game/addons/module_manager/previews/TexturePreview.gd create mode 100644 game/addons/module_manager/previews/TexturePreview.tscn create mode 100644 game/autoload/Logger.gd create mode 100644 game/autoload/Logger.tscn create mode 100644 game/autoload/Server.gd create mode 100644 game/autoload/Server.tscn create mode 100644 game/characters/Character.tscn create mode 100644 game/characters/CharacterFrontModel.tscn create mode 100644 game/characters/CharacterSideModel.tscn create mode 100644 game/characters/CharacterTest1Scene.tscn create mode 100644 game/characters/char_t1_outline_split - Copy.png create mode 100644 game/characters/char_t1_outline_split - Copy.png.import create mode 100644 game/characters/char_t1_outline_split.png create mode 100644 game/characters/char_t1_outline_split.png.import create mode 100644 game/cursors/arrow.png create mode 100644 game/cursors/arrow.png.import create mode 100644 game/cursors/arrow16.png create mode 100644 game/cursors/arrow16.png.import create mode 100644 game/cursors/arrow32.png create mode 100644 game/cursors/arrow32.png.import create mode 100644 game/cursors/arrow8.png create mode 100644 game/cursors/arrow8.png.import create mode 100644 game/cursors/attack16.png create mode 100644 game/cursors/attack16.png.import create mode 100644 game/cursors/autoload/CursorManager.gd create mode 100644 game/cursors/autoload/CursorManager.tscn create mode 100644 game/cursors/drag_drop.png create mode 100644 game/cursors/drag_drop.png.import create mode 100644 game/cursors/forbidden.png create mode 100644 game/cursors/forbidden.png.import create mode 100644 game/cursors/ibeam.png create mode 100644 game/cursors/ibeam.png.import create mode 100644 game/cursors/loot16.png create mode 100644 game/cursors/loot16.png.import create mode 100644 game/cursors/speak.png create mode 100644 game/cursors/speak.png.import create mode 100644 game/debug/FreeLookCam.tscn create mode 100644 game/debug/FreeLookCamera.gd create mode 100644 game/default_bus_layout.tres create mode 100644 game/ess_data.json create mode 100644 game/fonts/OFL.txt create mode 100644 game/fonts/VT323-Regular.ttf create mode 100644 game/icon.png create mode 100644 game/icon.png.flags create mode 100644 game/icon.png.import create mode 100644 game/modules/core/crafting/1_test_craft.tres create mode 100644 game/modules/core/crafting/2_chest_of_the_infinite_wisdom.tres create mode 100644 game/modules/core/entity_resources/1_mana_resource.tres create mode 100644 game/modules/core/entity_skills/1_test.tres create mode 100644 game/modules/core/game_module.tres create mode 100644 game/modules/core/item_templates/1_gold.tres create mode 100644 game/modules/core/item_templates/2_test.tres create mode 100644 game/modules/core/item_templates/3_chest_of_the_infinite_wisdom.tres create mode 100644 game/modules/core/resource_db.tres create mode 100644 game/modules/entity_classes/elementalist/2_elementalist.tres create mode 100644 game/modules/entity_classes/elementalist/character_specs/2_elementalist_fire.tres create mode 100644 game/modules/entity_classes/elementalist/character_specs/3_elementalist_water.tres create mode 100644 game/modules/entity_classes/elementalist/character_specs/4_elementalist_ice.tres create mode 100644 game/modules/entity_classes/elementalist/spells/31_overload.tres create mode 100644 game/modules/entity_classes/elementalist/spells/32_heat.tres create mode 100644 game/modules/entity_classes/elementalist/spells/33_normal.tres create mode 100644 game/modules/entity_classes/elementalist/spells/34_cold.tres create mode 100644 game/modules/entity_classes/naturalist/1_naturalist.tres create mode 100644 game/modules/entity_classes/naturalist/aura_groups/1_aspect_of_scorpions.tres create mode 100644 game/modules/entity_classes/naturalist/aura_groups/2_aspect_of_wasps.tres create mode 100644 game/modules/entity_classes/naturalist/aura_groups/3_aspect_of_wolves.tres create mode 100644 game/modules/entity_classes/naturalist/aura_groups/4_aspect_of_bees.tres create mode 100644 game/modules/entity_classes/naturalist/auras/10_aspect_of_scorpions_rank_1.tres create mode 100644 game/modules/entity_classes/naturalist/auras/11_aspect_of_wasps_rank1.tres create mode 100644 game/modules/entity_classes/naturalist/auras/12_aspect_of_wolves_rank_1.tres create mode 100644 game/modules/entity_classes/naturalist/auras/13_aspect_of_bees_rank_1.tres create mode 100644 game/modules/entity_classes/naturalist/auras/14_rejuvenation_rank_1.tres create mode 100644 game/modules/entity_classes/naturalist/auras/15_close_wounds_rank_1.tres create mode 100644 game/modules/entity_classes/naturalist/auras/16_ironbark_rank_1.tres create mode 100644 game/modules/entity_classes/naturalist/auras/17_natures_swiftness_rank_1.tres create mode 100644 game/modules/entity_classes/naturalist/auras/20_root_rank_1.tres create mode 100644 game/modules/entity_classes/naturalist/auras/21_aspect_of_scorpions.tres create mode 100644 game/modules/entity_classes/naturalist/auras/22_aspect_of_wasps.tres create mode 100644 game/modules/entity_classes/naturalist/auras/23_aspect_of_wolves.tres create mode 100644 game/modules/entity_classes/naturalist/auras/24_aspect_of_bees.tres create mode 100644 game/modules/entity_classes/naturalist/effect_data/aspect_of_scorpions.tres create mode 100644 game/modules/entity_classes/naturalist/effect_data/natures_swiftness.tres create mode 100644 game/modules/entity_classes/naturalist/entities/1_naturalist.tres create mode 100644 game/modules/entity_classes/naturalist/entities/2_naturalist_mob.tres create mode 100644 game/modules/entity_classes/naturalist/game_module.tres create mode 100644 game/modules/entity_classes/naturalist/icons/amplify_pain.tres create mode 100644 game/modules/entity_classes/naturalist/icons/aspect_of_bees.tres create mode 100644 game/modules/entity_classes/naturalist/icons/aspect_of_scorpions.tres create mode 100644 game/modules/entity_classes/naturalist/icons/aspect_of_wasps.tres create mode 100644 game/modules/entity_classes/naturalist/icons/aspect_of_wolves.tres create mode 100644 game/modules/entity_classes/naturalist/icons/attunement.tres create mode 100644 game/modules/entity_classes/naturalist/icons/calm.tres create mode 100644 game/modules/entity_classes/naturalist/icons/close_wounds.tres create mode 100644 game/modules/entity_classes/naturalist/icons/first_aid.tres create mode 100644 game/modules/entity_classes/naturalist/icons/inner_will.tres create mode 100644 game/modules/entity_classes/naturalist/icons/ironbark.tres create mode 100644 game/modules/entity_classes/naturalist/icons/natures_swiftness.tres create mode 100644 game/modules/entity_classes/naturalist/icons/regenerate.tres create mode 100644 game/modules/entity_classes/naturalist/icons/rejuvenation.tres create mode 100644 game/modules/entity_classes/naturalist/icons/root.tres create mode 100644 game/modules/entity_classes/naturalist/icons/shield_of_barbs.tres create mode 100644 game/modules/entity_classes/naturalist/icons/strength_of_nature.tres create mode 100644 game/modules/entity_classes/naturalist/icons/test.tres create mode 100644 game/modules/entity_classes/naturalist/icons/uproot.tres create mode 100644 game/modules/entity_classes/naturalist/resource_db.tres create mode 100644 game/modules/entity_classes/naturalist/spell_effects/nature/AOSCastFinish.tscn create mode 100644 game/modules/entity_classes/naturalist/spell_effects/nature/AmplifyPain.tscn create mode 100644 game/modules/entity_classes/naturalist/spell_effects/nature/NatureCast.tscn create mode 100644 game/modules/entity_classes/naturalist/spell_effects/nature/NautreSwiftness.tscn create mode 100644 game/modules/entity_classes/naturalist/spell_effects/textures/arrows.png create mode 100644 game/modules/entity_classes/naturalist/spell_effects/textures/arrows.png.import create mode 100644 game/modules/entity_classes/naturalist/spell_effects/textures/big_glow.png create mode 100644 game/modules/entity_classes/naturalist/spell_effects/textures/big_glow.png.import create mode 100644 game/modules/entity_classes/naturalist/spell_effects/textures/main_texture.png create mode 100644 game/modules/entity_classes/naturalist/spell_effects/textures/main_texture.png.import create mode 100644 game/modules/entity_classes/naturalist/spell_effects/textures/small_star.png create mode 100644 game/modules/entity_classes/naturalist/spell_effects/textures/small_star.png.import create mode 100644 game/modules/entity_classes/naturalist/spell_effects/textures/star.png create mode 100644 game/modules/entity_classes/naturalist/spell_effects/textures/star.png.import create mode 100644 game/modules/entity_classes/naturalist/spells/10_aspect_of_scorpions_rank_1.tres create mode 100644 game/modules/entity_classes/naturalist/spells/11_aspect_of_wasps_rank_1.tres create mode 100644 game/modules/entity_classes/naturalist/spells/12_aspect_of_wolves_rank_1.tres create mode 100644 game/modules/entity_classes/naturalist/spells/13_aspect_of_bees_rank_1.tres create mode 100644 game/modules/entity_classes/naturalist/spells/14_amplify_pain_rank_1.tres create mode 100644 game/modules/entity_classes/naturalist/spells/15_rejuvenation_rank_1.tres create mode 100644 game/modules/entity_classes/naturalist/spells/16_close_wounds_rank_1.tres create mode 100644 game/modules/entity_classes/naturalist/spells/17_ironbark_rank_1.tres create mode 100644 game/modules/entity_classes/naturalist/spells/18_natures_swiftness_rank_1.tres create mode 100644 game/modules/entity_classes/naturalist/spells/19_uproot_rank_1.tres create mode 100644 game/modules/entity_classes/naturalist/spells/20_root_rank_1.tres create mode 100644 game/modules/entity_classes/naturalist/spells/21_strength_of_nature_rank_1.tres create mode 100644 game/modules/entity_classes/naturalist/spells/22_shield_of_barbs_rank_1.tres create mode 100644 game/modules/entity_classes/naturalist/spells/23_calm_rank_1.tres create mode 100644 game/modules/entity_classes/naturalist/spells/24_attunement_rank_1.tres create mode 100644 game/modules/entity_classes/naturalist/spells/25_inner_will.tres create mode 100644 game/modules/entity_classes/naturalist/spells/26_rest.tres create mode 100644 game/modules/entity_classes/naturalist/spells/27_aspect_of_scorpions.tres create mode 100644 game/modules/entity_classes/naturalist/spells/28_aspectofwasps.tres create mode 100644 game/modules/entity_classes/naturalist/spells/29_aspect_of_wolves.tres create mode 100644 game/modules/entity_classes/naturalist/spells/30_aspect_of_bees.tres create mode 100644 game/modules/entity_classes/naturalist/spells/35_strike.tres create mode 100644 game/modules/entity_classes/naturalist/spells/36_regrow.tres create mode 100644 game/modules/entity_classes/naturalist/stats/mob_statdata.tres create mode 100644 game/modules/entity_classes/naturalist/stats/player_statdata.tres create mode 100644 game/modules/icons/ parts/circles.svg create mode 100644 game/modules/icons/ parts/circles.svg.import create mode 100644 game/modules/icons/3_iron_bar.tres create mode 100644 game/modules/icons/4_chest_of_the_infinite_wisdom.tres create mode 100644 game/modules/icons/Naturalist/AspectOfScorpions.png create mode 100644 game/modules/icons/Naturalist/AspectOfScorpions.png.import create mode 100644 game/modules/icons/Naturalist/AspectOfScorpions.tscn create mode 100644 game/modules/icons/icons-1/11.png create mode 100644 game/modules/icons/icons-1/11.png.import create mode 100644 game/modules/icons/icons-1/43.png create mode 100644 game/modules/icons/icons-1/43.png.import create mode 100644 game/modules/icons/icons-1/5.png create mode 100644 game/modules/icons/icons-1/5.png.import create mode 100644 game/modules/icons/icons-1/61.png create mode 100644 game/modules/icons/icons-1/61.png.import create mode 100644 game/modules/icons/icons-1/Readme.txt create mode 100644 game/modules/icons/icons-2/README.txt create mode 100644 game/modules/icons/icons-2/enchant-acid-2.png create mode 100644 game/modules/icons/icons-2/enchant-acid-2.png.import create mode 100644 game/modules/icons/icons-2/enchant-blue-2.png create mode 100644 game/modules/icons/icons-2/enchant-blue-2.png.import create mode 100644 game/modules/icons/icons-2/heal-jade-2.png create mode 100644 game/modules/icons/icons-2/heal-jade-2.png.import create mode 100644 game/modules/icons/icons-2/protect-acid-3.png create mode 100644 game/modules/icons/icons-2/protect-acid-3.png.import create mode 100644 game/modules/icons/icons-2/protect-eerie-2.png create mode 100644 game/modules/icons/icons-2/protect-eerie-2.png.import create mode 100644 game/modules/icons/icons-3/README.txt create mode 100644 game/modules/icons/icons-3/beam-jade-2.png create mode 100644 game/modules/icons/icons-3/beam-jade-2.png.import create mode 100644 game/modules/icons/icons-3/haste-royal-2.png create mode 100644 game/modules/icons/icons-3/haste-royal-2.png.import create mode 100644 game/modules/icons/icons-3/lighting-acid-2.png create mode 100644 game/modules/icons/icons-3/lighting-acid-2.png.import create mode 100644 game/modules/icons/icons-3/vines-plain-1.png create mode 100644 game/modules/icons/icons-3/vines-plain-1.png.import create mode 100644 game/modules/icons/icons-3/vines-plain-2.png create mode 100644 game/modules/icons/icons-3/vines-plain-2.png.import create mode 100644 game/modules/icons/icons-4/README.txt create mode 100644 game/modules/icons/icons-4/explosion-royal-2.png create mode 100644 game/modules/icons/icons-4/explosion-royal-2.png.import create mode 100644 game/modules/icons/icons-4/horror-acid-3.png create mode 100644 game/modules/icons/icons-4/horror-acid-3.png.import create mode 100644 game/modules/icons/icons-4/leaf-acid-1.png create mode 100644 game/modules/icons/icons-4/leaf-acid-1.png.import create mode 100644 game/modules/icons/icons-4/wild-orange-2.png create mode 100644 game/modules/icons/icons-4/wild-orange-2.png.import create mode 100644 game/modules/icons/icons-4/wind-blue-1.png create mode 100644 game/modules/icons/icons-4/wind-blue-1.png.import create mode 100644 game/modules/icons/icons-5/README.txt create mode 100644 game/modules/icons/icons-5/wind-grasp-acid-2.png create mode 100644 game/modules/icons/icons-5/wind-grasp-acid-2.png.import create mode 100644 game/modules/icons/icons-5/wind-grasp-eerie-2.png create mode 100644 game/modules/icons/icons-5/wind-grasp-eerie-2.png.import create mode 100644 game/modules/icons/icons.png create mode 100644 game/modules/icons/icons.png.import create mode 100644 game/modules/icons/items/gold.tres create mode 100644 game/modules/species/Human/Body.tscn create mode 100644 game/modules/species/species_human.tres create mode 100644 game/modules/spell_effects/enchanter/Arrow.tscn create mode 100644 game/player/Body.gd create mode 100644 game/player/CharacterSkeleton2DGD.gd create mode 100644 game/player/CharacterSkeletonAttachPoint.gd create mode 100644 game/player/CharacterSkeletonGD.gd create mode 100644 game/player/DisplayPlayer.gd create mode 100644 game/player/DisplayPlayer.tscn create mode 100644 game/player/GUI.gd create mode 100644 game/player/HumanoidCharacterBones2D.gd create mode 100644 game/player/Mob.gd create mode 100644 game/player/Mob.tscn create mode 100644 game/player/MobTest.gd create mode 100644 game/player/NamePlate.gd create mode 100644 game/player/NetworkedPlayer.gd create mode 100644 game/player/NetworkedPlayer.tscn create mode 100644 game/player/Player.gd create mode 100644 game/player/Player.tscn create mode 100644 game/player/PlayerGDBase.gd create mode 100644 game/player/Unitframes.gd create mode 100644 game/player/bs_entity_spawner.gd create mode 100644 game/player/bs_entity_spawner.tscn create mode 100644 game/project.godot create mode 100644 game/scenes/BrokenSeals.tscn create mode 100644 game/scenes/CharacterCreationMenu.gd create mode 100644 game/scenes/CharacterSelector.gd create mode 100644 game/scenes/CharacterSelectorMenu.gd create mode 100644 game/scenes/ConnectButton.gd create mode 100644 game/scenes/ConnectServerButton.gd create mode 100644 game/scenes/DisconnectButton.gd create mode 100644 game/scenes/GameScene.gd create mode 100644 game/scenes/HostButton.gd create mode 100644 game/scenes/HostGameButton.gd create mode 100644 game/scenes/Main.tscn create mode 100644 game/scenes/MainScene.gd create mode 100644 game/scenes/Menu.gd create mode 100644 game/scenes/Menu.tscn create mode 100644 game/scenes/Shared.tscn create mode 100644 game/scenes/World.gd create mode 100644 game/scenes/World.tscn create mode 100644 game/scenes/World3d.tscn create mode 100644 game/scripts/ai/EntityAIGD.gd create mode 100644 game/scripts/auras/CastTimeReductionAura.gd create mode 100644 game/scripts/auras/SpeedModAura.gd create mode 100644 game/scripts/auras/SpellDamageModAura.gd create mode 100644 game/scripts/auras/aura_script.gd create mode 100644 game/scripts/entities/EntityClassDataGD.gd create mode 100644 game/scripts/entities/EntityDataGD.gd create mode 100644 game/scripts/game_modules/DataManager.gd create mode 100644 game/scripts/game_modules/DataManager.tscn create mode 100644 game/scripts/game_modules/GameModule.gd create mode 100644 game/scripts/game_modules/ui_gui_child_module.gd create mode 100644 game/scripts/game_modules/ui_window_module.gd create mode 100644 game/scripts/item_visuals/CharacterAtlas2D.gd create mode 100644 game/scripts/item_visuals/CharacterAtlasEntry2D.gd create mode 100644 game/scripts/item_visuals/ItemVisual2D.gd create mode 100644 game/scripts/item_visuals/ItemVisualEntry2D.gd create mode 100644 game/scripts/items/ItemTemplateGD.gd create mode 100644 game/scripts/networking/PlayerMaster.gd create mode 100644 game/scripts/networking/SpawnPoint.gd create mode 100644 game/scripts/resources/HealthResource.gd create mode 100644 game/scripts/resources/ManaResource.gd create mode 100644 game/scripts/resources/SpeedResource.gd create mode 100644 game/scripts/resources/spell_effect_visual_basic.gd create mode 100644 game/scripts/settings/DirectionalLightSettings.gd create mode 100644 game/scripts/spells/amplify_pain.gd create mode 100644 game/scripts/spells/gd_spell_script.gd create mode 100644 game/scripts/ui/AdaptiveTheme.gd create mode 100644 game/scripts/world_generators/MainPlanetGenerator.gd create mode 100644 game/steering_ai_framework/Agents/GSAIKinematicBody2DAgent.gd create mode 100644 game/steering_ai_framework/Agents/GSAIKinematicBody3DAgent.gd create mode 100644 game/steering_ai_framework/Agents/GSAIRigidBody2DAgent.gd create mode 100644 game/steering_ai_framework/Agents/GSAIRigidBody3DAgent.gd create mode 100644 game/steering_ai_framework/Agents/GSAISpecializedAgent.gd create mode 100644 game/steering_ai_framework/Behaviors/GSAIArrive.gd create mode 100644 game/steering_ai_framework/Behaviors/GSAIAvoidCollisions.gd create mode 100644 game/steering_ai_framework/Behaviors/GSAIBlend.gd create mode 100644 game/steering_ai_framework/Behaviors/GSAICohesion.gd create mode 100644 game/steering_ai_framework/Behaviors/GSAIEvade.gd create mode 100644 game/steering_ai_framework/Behaviors/GSAIFace.gd create mode 100644 game/steering_ai_framework/Behaviors/GSAIFlee.gd create mode 100644 game/steering_ai_framework/Behaviors/GSAIFollowPath.gd create mode 100644 game/steering_ai_framework/Behaviors/GSAILookWhereYouGo.gd create mode 100644 game/steering_ai_framework/Behaviors/GSAIMatchOrientation.gd create mode 100644 game/steering_ai_framework/Behaviors/GSAIPriority.gd create mode 100644 game/steering_ai_framework/Behaviors/GSAIPursue.gd create mode 100644 game/steering_ai_framework/Behaviors/GSAISeek.gd create mode 100644 game/steering_ai_framework/Behaviors/GSAISeparation.gd create mode 100644 game/steering_ai_framework/CHANGELOG.md create mode 100644 game/steering_ai_framework/GSAIAgentLocation.gd create mode 100644 game/steering_ai_framework/GSAIGroupBehavior.gd create mode 100644 game/steering_ai_framework/GSAIPath.gd create mode 100644 game/steering_ai_framework/GSAISteeringAgent.gd create mode 100644 game/steering_ai_framework/GSAISteeringBehavior.gd create mode 100644 game/steering_ai_framework/GSAITargetAcceleration.gd create mode 100644 game/steering_ai_framework/GSAIUtils.gd create mode 100644 game/steering_ai_framework/LICENSE create mode 100644 game/steering_ai_framework/Proximities/GSAIInfiniteProximity.gd create mode 100644 game/steering_ai_framework/Proximities/GSAIProximity.gd create mode 100644 game/steering_ai_framework/Proximities/GSAIRadiusProximity.gd create mode 100644 game/steering_ai_framework/README.md create mode 100644 game/test_iso_tileset/TileMap32x16.tscn create mode 100644 game/test_iso_tileset/TileMap44x24.tscn create mode 100644 game/test_iso_tileset/TileMap52x28.tscn create mode 100644 game/test_iso_tileset/new_tileset.tres create mode 100644 game/test_iso_tileset/test_tiles.png create mode 100644 game/test_iso_tileset/test_tiles.png.import create mode 100644 game/texture_tools/LayeredTextureMaker.gd create mode 100644 game/texture_tools/test/ToolTest.tscn create mode 100644 game/texture_tools/test/new_packerimageresource.tres create mode 100644 game/tilesets/Terrarin.tscn create mode 100644 game/tilesets/tiles.png create mode 100644 game/tilesets/tiles.png.import create mode 100644 game/tilesets/tileset.tres create mode 100644 game/ui/about/About.tscn create mode 100644 game/ui/about/Authors.gd create mode 100644 game/ui/about/GodotAuthors.gd create mode 100644 game/ui/about/GodotDonors.gd create mode 100644 game/ui/about/GodotLicense.gd create mode 100644 game/ui/about/GodotThirdPartyLicenses.gd create mode 100644 game/ui/about/Third-Party Licenses.gd create mode 100644 game/ui/actionbars/ActionBar.gd create mode 100644 game/ui/actionbars/ActionBar.tscn create mode 100644 game/ui/actionbars/ActionBarEntry.gd create mode 100644 game/ui/actionbars/ActionBarEntry.tscn create mode 100644 game/ui/actionbars/Actionbars.gd create mode 100644 game/ui/actionbars/Actionbars.tscn create mode 100644 game/ui/actionbars/EditorKeybindSetup.gd create mode 100644 game/ui/actionbars/game_module.tres create mode 100644 game/ui/auraframe/AuraEntry.gd create mode 100644 game/ui/auraframe/AuraEntry.tscn create mode 100644 game/ui/auraframe/AuraFrame.gd create mode 100644 game/ui/auraframe/AuraFrame.tscn create mode 100644 game/ui/auraframe/game_module.tres create mode 100644 game/ui/autoload/SettingsManager.gd create mode 100644 game/ui/autoload/SettingsManager.tscn create mode 100644 game/ui/autoload/ThemeAtlas.gd create mode 100644 game/ui/autoload/ThemeAtlas.tscn create mode 100644 game/ui/autoload/WorldNumbers.gd create mode 100644 game/ui/autoload/WorldNumbers.tscn create mode 100644 game/ui/bags/Bag.tscn create mode 100644 game/ui/bags/BagEntry.gd create mode 100644 game/ui/bags/BagEntry.tscn create mode 100644 game/ui/bags/BagFrame.gd create mode 100644 game/ui/bags/BagFrame.tscn create mode 100644 game/ui/bags/BaseWindow.tscn create mode 100644 game/ui/bags/EquipmentSlot.gd create mode 100644 game/ui/bags/EquipmentSlot.tscn create mode 100644 game/ui/bags/InventoryGUI.gd create mode 100644 game/ui/bags/InventoryWindow.tscn create mode 100644 game/ui/bags/ItemEntry.tscn create mode 100644 game/ui/bags/ItemPupop.gd create mode 100644 game/ui/bags/ItemTooltip.tscn create mode 100644 game/ui/bags/game_module.tres create mode 100644 game/ui/bags/weapon_set_button_group.tres create mode 100644 game/ui/buttons/Buttons.gd create mode 100644 game/ui/buttons/ImageButton.tscn create mode 100644 game/ui/castbar/Castbar.gd create mode 100644 game/ui/castbar/Castbar.tscn create mode 100644 game/ui/castbar/game_module.tres create mode 100644 game/ui/character/CharacterWindow.gd create mode 100644 game/ui/character/CharacterWindow.tscn create mode 100644 game/ui/character/SingleStatRow.gd create mode 100644 game/ui/character/SingleStatRow.tscn create mode 100644 game/ui/character/game_module.tres create mode 100644 game/ui/crafting/CraftItemDescription.gd create mode 100644 game/ui/crafting/CraftingWindow.gd create mode 100644 game/ui/crafting/CraftingWindow.tscn create mode 100644 game/ui/crafting/ItemEntry.gd create mode 100644 game/ui/crafting/ItemEntry.tscn create mode 100644 game/ui/crafting/RecipeSelector.gd create mode 100644 game/ui/crafting/RecipeSelector.tscn create mode 100644 game/ui/crafting/game_module.tres create mode 100644 game/ui/debug/DebugInfo.gd create mode 100644 game/ui/debug/DebugInfo.tscn create mode 100644 game/ui/debug/SpawnPointSimpleUI.tscn create mode 100644 game/ui/debug/debuginfo_font.tres create mode 100644 game/ui/errorframe/ErrorFrame.tscn create mode 100644 game/ui/icons/icon_add.png create mode 100644 game/ui/icons/icon_add.png.import create mode 100644 game/ui/icons/icon_edit.png create mode 100644 game/ui/icons/icon_edit.png.import create mode 100644 game/ui/icons/icon_joy_axis.png create mode 100644 game/ui/icons/icon_joy_axis.png.import create mode 100644 game/ui/icons/icon_joy_button.png create mode 100644 game/ui/icons/icon_joy_button.png.import create mode 100644 game/ui/icons/icon_keyboard.png create mode 100644 game/ui/icons/icon_keyboard.png.import create mode 100644 game/ui/icons/icon_mouse.png create mode 100644 game/ui/icons/icon_mouse.png.import create mode 100644 game/ui/icons/icon_remove.png create mode 100644 game/ui/icons/icon_remove.png.import create mode 100644 game/ui/ingame_menu/ExitButton.gd create mode 100644 game/ui/ingame_menu/IngameMenu.tscn create mode 100644 game/ui/interface/InterfaceOptions.gd create mode 100644 game/ui/interface/InterfaceOptions.tscn create mode 100644 game/ui/interface/SetActionbarAsDefault.gd create mode 100644 game/ui/keybinds/KeybindCategory.gd create mode 100644 game/ui/keybinds/KeybindCategory.tscn create mode 100644 game/ui/keybinds/KeybindEntry.gd create mode 100644 game/ui/keybinds/KeybindEntry.tscn create mode 100644 game/ui/keybinds/Keybinds.gd create mode 100644 game/ui/keybinds/Keybinds.tscn create mode 100644 game/ui/login/Login.tscn create mode 100644 game/ui/loot_window/LootEntry.gd create mode 100644 game/ui/loot_window/LootEntry.tscn create mode 100644 game/ui/loot_window/LootWindow.gd create mode 100644 game/ui/loot_window/LootWindow.tscn create mode 100644 game/ui/loot_window/game_module.tres create mode 100644 game/ui/map/Map.tscn create mode 100644 game/ui/menu/CharacterEntry.gd create mode 100644 game/ui/menu/CharacterEntry.tscn create mode 100644 game/ui/menu/character_creation_button_group.tres create mode 100644 game/ui/menu/menu_character_button_group.tres create mode 100644 game/ui/minimap/MiniMap.tscn create mode 100644 game/ui/nameplates/NamePlate.tscn create mode 100644 game/ui/nameplates/name_plate_dynamicfont.tres create mode 100644 game/ui/nameplates/name_plate_theme.tres create mode 100644 game/ui/nameplates/texture_progress_bg.tres create mode 100644 game/ui/nameplates/texture_progress_fg.tres create mode 100644 game/ui/numbers/Number.gd create mode 100644 game/ui/numbers/Number.tscn create mode 100644 game/ui/numbers/number_font.tres create mode 100644 game/ui/options/OptionButtonRow.gd create mode 100644 game/ui/options/OptionButtonRow.tscn create mode 100644 game/ui/options/OptionCheckBox.gd create mode 100644 game/ui/options/OptionCheckboxRow.tscn create mode 100644 game/ui/options/OptionEnumRow.gd create mode 100644 game/ui/options/OptionEnumRow.tscn create mode 100644 game/ui/options/OptionToggleRow.gd create mode 100644 game/ui/options/Options.tscn create mode 100644 game/ui/options/OptionsSliderRow.gd create mode 100644 game/ui/options/OptionsSliderRow.tscn create mode 100644 game/ui/options/OptionsSpinboxRow.gd create mode 100644 game/ui/options/OptionsSpinboxRow.tscn create mode 100644 game/ui/options/OptionsViewportLabel.gd create mode 100644 game/ui/options/OptionsViewportLabel.tscn create mode 100644 game/ui/options/Threads.gd create mode 100644 game/ui/player_ui/RemoveProfile.gd create mode 100644 game/ui/player_ui/player_ui.gd create mode 100644 game/ui/player_ui/player_ui.tscn create mode 100644 game/ui/register/Register.tscn create mode 100644 game/ui/spellbook/SpellBookWindow.gd create mode 100644 game/ui/spellbook/SpellBookWindow.tscn create mode 100644 game/ui/spellbook/SpellContainer.gd create mode 100644 game/ui/spellbook/SpellContainer.tscn create mode 100644 game/ui/spellbook/SpellDragAndDropSpellBook.gd create mode 100644 game/ui/spellbook/SpellEntryPopup.gd create mode 100644 game/ui/spellbook/game_module.tres create mode 100644 game/ui/starmap/StarMap.tscn create mode 100644 game/ui/talents/Spec.gd create mode 100644 game/ui/talents/Spec.tscn create mode 100644 game/ui/talents/TalentEntry.gd create mode 100644 game/ui/talents/TalentEntry.tscn create mode 100644 game/ui/talents/TalentRow.gd create mode 100644 game/ui/talents/TalentRow.tscn create mode 100644 game/ui/talents/TalentWindow.gd create mode 100644 game/ui/talents/TalentWindow.tscn create mode 100644 game/ui/talents/game_module.tres create mode 100644 game/ui/talents/talent_switcher_button.gd create mode 100644 game/ui/talents/talent_switcher_button.tscn create mode 100644 game/ui/theme/GameUI.png create mode 100644 game/ui/theme/GameUI.png.import create mode 100644 game/ui/theme/actionbar_dynamicfont.tres create mode 100644 game/ui/theme/bag_icon.tres create mode 100644 game/ui/theme/button_bg_atlas.tres create mode 100644 game/ui/theme/button_bg_stylebox.tres create mode 100644 game/ui/theme/button_bg_stylebox_disabled.tres create mode 100644 game/ui/theme/button_bg_stylebox_focus.tres create mode 100644 game/ui/theme/button_bg_stylebox_hover.tres create mode 100644 game/ui/theme/button_bg_stylebox_pressed.tres create mode 100644 game/ui/theme/character_icon.tres create mode 100644 game/ui/theme/checkbox_checked_texture.tres create mode 100644 game/ui/theme/checkbox_texture.tres create mode 100644 game/ui/theme/cooldown_progress.png create mode 100644 game/ui/theme/cooldown_progress.png.import create mode 100644 game/ui/theme/crafting_icon.tres create mode 100644 game/ui/theme/dropdown_icon.tres create mode 100644 game/ui/theme/h_scroll_bar_texture.tres create mode 100644 game/ui/theme/indicator.png create mode 100644 game/ui/theme/indicator.png.import create mode 100644 game/ui/theme/lineedit_normal_style.tres create mode 100644 game/ui/theme/locked_icon.tres create mode 100644 game/ui/theme/menu_icon.tres create mode 100644 game/ui/theme/panel_bg.tres create mode 100644 game/ui/theme/panel_bg_atlas.tres create mode 100644 game/ui/theme/radio_checked_texture.tres create mode 100644 game/ui/theme/radio_texture.tres create mode 100644 game/ui/theme/scrollbar_bg.tres create mode 100644 game/ui/theme/scrollbar_bg_atlas.tres create mode 100644 game/ui/theme/scrollbar_bg_focus.tres create mode 100644 game/ui/theme/scrollbar_grabber.tres create mode 100644 game/ui/theme/scrollbar_grabber_atlas.tres create mode 100644 game/ui/theme/scrollbar_grabber_blue.tres create mode 100644 game/ui/theme/scrollbar_grabber_blue_xp.tres create mode 100644 game/ui/theme/scrollbar_grabber_highlight.tres create mode 100644 game/ui/theme/scrollbar_grabber_pressed.tres create mode 100644 game/ui/theme/scrollbar_grabber_red.tres create mode 100644 game/ui/theme/separator_stylebox.tres create mode 100644 game/ui/theme/separator_texture.tres create mode 100644 game/ui/theme/spellbook_icon.tres create mode 100644 game/ui/theme/tab_button_bg_stylebox.tres create mode 100644 game/ui/theme/tab_button_bg_stylebox_focus.tres create mode 100644 game/ui/theme/tab_button_bg_stylebox_hover.tres create mode 100644 game/ui/theme/talent_icon.tres create mode 100644 game/ui/theme/ui_dynamicfont.tres create mode 100644 game/ui/theme/ui_dynamicfont_small.tres create mode 100644 game/ui/theme/ui_theme.tres create mode 100644 game/ui/theme/unlocked_icon.tres create mode 100644 game/ui/theme/window_bg_atlas.tres create mode 100644 game/ui/theme/window_bg_bg.tres create mode 100644 game/ui/touch_movement_controls/TouchMovementControls.tscn create mode 100644 game/ui/touch_movement_controls/game_module.tres create mode 100644 game/ui/touch_pad/TurnPanel.gd create mode 100644 game/ui/touch_pad/analog.gd create mode 100644 game/ui/touch_pad/analog.tscn create mode 100644 game/ui/touch_pad/analog.xml create mode 100644 game/ui/touch_pad/big_circle.png create mode 100644 game/ui/touch_pad/big_circle.png.import create mode 100644 game/ui/touch_pad/small_circle.png create mode 100644 game/ui/touch_pad/small_circle.png.import create mode 100644 game/ui/touch_target_controls/TouchTargetControls.tscn create mode 100644 game/ui/touch_target_controls/game_module.tres create mode 100644 game/ui/trainer/TrainerWindow.gd create mode 100644 game/ui/trainer/TrainerWindow.tscn create mode 100644 game/ui/trainer/game_module.tres create mode 100644 game/ui/unitframes/TargetUnitframe.gd create mode 100644 game/ui/unitframes/TargetUnitframe.tscn create mode 100644 game/ui/unitframes/UnitframeBase.gd create mode 100644 game/ui/unitframes/UnitframeBase.tscn create mode 100644 game/ui/unitframes/Unitframes.tscn create mode 100644 game/ui/unitframes/game_module.tres create mode 100644 game/ui/vendor_window/ItemContainer.gd create mode 100644 game/ui/vendor_window/ItemContainer.tscn create mode 100644 game/ui/vendor_window/ItemDragAndDropVendor.gd create mode 100644 game/ui/vendor_window/VendorEntryPopup.gd create mode 100644 game/ui/vendor_window/VendorWindow.gd create mode 100644 game/ui/vendor_window/VendorWindow.tscn create mode 100644 game/ui/vendor_window/game_module.tres create mode 100644 game/ui/world_numbers_2d/Number.gd create mode 100644 game/ui/world_numbers_2d/Number.tscn create mode 100644 game/ui/world_numbers_2d/WorldNumbers.gd create mode 100644 game/ui/world_numbers_2d/WorldNumbers.tscn create mode 100644 game/ui/world_numbers_2d/number_font.tres create mode 100644 game/world/WorldLayer.gd create mode 100644 game/world/WorldLayer.tscn create mode 100755 ged.sh create mode 100755 make_release.sh create mode 100644 pictures/screen.jpg create mode 100755 play.sh create mode 100755 podman_build_all.sh create mode 100644 tools/build-containers/.gitignore create mode 100644 tools/build-containers/Dockerfile.android create mode 100644 tools/build-containers/Dockerfile.base create mode 100644 tools/build-containers/Dockerfile.ios create mode 100644 tools/build-containers/Dockerfile.javascript create mode 100644 tools/build-containers/Dockerfile.linux create mode 100644 tools/build-containers/Dockerfile.msvc create mode 100644 tools/build-containers/Dockerfile.osx create mode 100644 tools/build-containers/Dockerfile.windows create mode 100644 tools/build-containers/Dockerfile.xcode create mode 100644 tools/build-containers/README.md create mode 100755 tools/build-containers/build_containers.sh create mode 100644 tools/build-containers/files/msvc-fixup.sh create mode 100644 tools/build-containers/files/patches/fix-fuse-check.diff create mode 100644 tools/build-containers/upload.sh create mode 100644 tools/copy_repos.py create mode 100644 tools/export_presets.cfg.example create mode 100644 tools/vscode-setup/launch.json create mode 100644 tools/vscode-setup/settings.json create mode 100644 tools/vscode-setup/tasks.json diff --git a/HEADS b/HEADS new file mode 100644 index 0000000..a5cb678 --- /dev/null +++ b/HEADS @@ -0,0 +1 @@ +{"engine": {"3.2": "64a9e86c5c20bd4bd5833f0563457d0126617489", "3.x": "2d57df60f7567990b63099978289a15e8df01c94"}, "world_generator": {"master": "260c430f11b0b591eaf4714516419aa327d2842c"}, "entity_spell_system": {"master": "378ebcff23e5ab0a04c0e92119d26391de4be139"}, "ui_extensions": {"master": "f82273f54cb1ab87d458c91af9554acec5c10831"}, "texture_packer": {"master": "dbf3c59a9c52f155f0d98b567d571708e8b3f253"}, "fastnoise": {"master": "d447fd5364e9ab5a6b14184483eab23cd3fe820b"}, "thread_pool": {"master": "b2e8c815392052947e7386f722913a12eea543a4"}} \ No newline at end of file diff --git a/SConstruct b/SConstruct new file mode 100644 index 0000000..be7f4da --- /dev/null +++ b/SConstruct @@ -0,0 +1,534 @@ +#!/usr/bin/env python + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +EnsureSConsVersion(0, 98, 1) + +import sys +import os +import subprocess +import json +import shutil +import traceback + +repository_index = 0 +module_clone_path = '/modules/' +clone_command = 'git clone {0} {1}' + +visual_studio_call_vcvarsall = False +visual_studio_vcvarsall_path = 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Auxiliary\\Build\\vcvarsall.bat' +visual_studio_arch = 'amd64' + +exports = { + 'global': [], + 'linux': [], + 'windows': [], + 'android': [], + 'javascript': [], +} + +engine_repository = [ ['https://github.com/godotengine/godot.git', 'git@github.com:godotengine/godot.git'], 'engine', '' ] + +module_repositories = [ + [ ['https://github.com/Relintai/entity_spell_system.git', 'git@github.com:Relintai/entity_spell_system.git'], 'entity_spell_system', '' ], + [ ['https://github.com/Relintai/ui_extensions.git', 'git@github.com:Relintai/ui_extensions.git'], 'ui_extensions', '' ], + [ ['https://github.com/Relintai/texture_packer.git', 'git@github.com:Relintai/texture_packer.git'], 'texture_packer', '' ], + [ ['https://github.com/Relintai/godot_fastnoise.git', 'git@github.com:Relintai/godot_fastnoise.git'], 'fastnoise', '' ], + [ ['https://github.com/Relintai/thread_pool.git', 'git@github.com:Relintai/thread_pool.git'], 'thread_pool', '' ], +] + +addon_repositories = [ +] + +third_party_addon_repositories = [ +] + +target_commits = {} + +godot_branch = '3.x' + +def onerror(func, path, exc_info): + """ + https://stackoverflow.com/questions/2656322/shutil-rmtree-fails-on-windows-with-access-is-denied + + Because Windows. + + Error handler for ``shutil.rmtree``. + + If the error is due to an access error (read only file) + it attempts to add write permission and then retries. + + If the error is for another reason it re-raises the error. + + Usage : ``shutil.rmtree(path, onerror=onerror)`` + """ + import stat + if not os.access(path, os.W_OK): + # Is the error an access error ? + os.chmod(path, stat.S_IWUSR) + func(path) + else: + raise + +def load_target_commits_array(): + global target_commits + + if os.path.isfile('./HEADS'): + with open('./HEADS', 'r') as infile: + target_commits = json.load(infile) + else: + target_commits = {} + +def save_target_commits_array(): + with open('./HEADS', 'w') as outfile: + json.dump(target_commits, outfile) + +def update_repository(data, clone_path, branch = 'master'): + cwd = os.getcwd() + + full_path = cwd + clone_path + data[1] + '/' + + if not os.path.isdir(full_path): + os.chdir(cwd + clone_path) + + subprocess.call(clone_command.format(data[0][repository_index], data[1]), shell=True) + + os.chdir(full_path) + + subprocess.call('git reset', shell=True) + subprocess.call('git reset --hard', shell=True) + subprocess.call('git clean -f -d', shell=True) + subprocess.call('git checkout -B ' + branch + ' origin/' + branch, shell=True) + subprocess.call('git reset', shell=True) + subprocess.call('git reset --hard', shell=True) + subprocess.call('git clean -f -d', shell=True) + subprocess.call('git pull origin ' + branch, shell=True) + + process = subprocess.Popen('git rev-parse HEAD', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + output = process.communicate()[0].decode().strip() + + if data[1] not in target_commits: + target_commits[data[1]] = {} + + target_commits[data[1]][branch] = output + + os.chdir(cwd) + +def setup_repository(data, clone_path, branch = 'master'): + cwd = os.getcwd() + + full_path = cwd + clone_path + data[1] + '/' + + if not os.path.isdir(full_path): + os.chdir(cwd + clone_path) + + subprocess.call(clone_command.format(data[0][repository_index], data[1]), shell=True) + + os.chdir(full_path) + + subprocess.call('git reset', shell=True) + subprocess.call('git reset --hard', shell=True) + subprocess.call('git clean -f -d', shell=True) + subprocess.call('git checkout -B ' + branch + ' origin/' + branch, shell=True) + subprocess.call('git pull origin ' + branch, shell=True) + subprocess.call('git reset', shell=True) + subprocess.call('git reset --hard', shell=True) + + if data[1] in target_commits: + target = target_commits[data[1]][branch] + + subprocess.call('git checkout -B ' + branch + ' ' + target, shell=True) + subprocess.call('git clean -f -d', shell=True) + subprocess.call('git reset', shell=True) + subprocess.call('git reset --hard', shell=True) + + os.chdir(cwd) + +def copy_repository(data, target_folder, clone_path): + copytree(os.path.abspath(clone_path + data[1] + '/' + data[2]), os.path.abspath(target_folder + data[1])) + +def copytree(src, dst): + for item in os.listdir(src): + sp = os.path.join(src, item) + dp = os.path.join(dst, item) + + if os.path.isdir(sp): + if os.path.isdir(dp): + shutil.rmtree(dp, onerror=onerror) + + shutil.copytree(sp, dp) + else: + if not os.path.isdir(dst): + os.makedirs(dst) + + shutil.copy2(sp, dp) + +def update_engine(): + update_repository(engine_repository, '/', godot_branch) + +def update_modules(): + for rep in module_repositories: + update_repository(rep, module_clone_path) + copy_repository(rep, './engine/modules/', '.' + module_clone_path) + +def update_addons(): + for rep in addon_repositories: + update_repository(rep, module_clone_path) + copy_repository(rep, './game/addons/', '.' + module_clone_path) + +def update_addons_third_party_addons(): + for rep in third_party_addon_repositories: + update_repository(rep, module_clone_path) + copy_repository(rep, './game/addons/', '.' + module_clone_path) + +def update_all(): + update_engine() + update_modules() + update_addons() + update_addons_third_party_addons() + + save_target_commits_array() + + +def setup_engine(): + setup_repository(engine_repository, '/', godot_branch) + +def setup_modules(): + for rep in module_repositories: + setup_repository(rep, module_clone_path) + copy_repository(rep, './engine/modules/', '.' + module_clone_path) + +def setup_addons(): + for rep in addon_repositories: + setup_repository(rep, module_clone_path) + copy_repository(rep, './game/addons/', '.' + module_clone_path) + +def setup_addons_third_party_addons(): + for rep in third_party_addon_repositories: + setup_repository(rep, module_clone_path) + copy_repository(rep, './game/addons/', '.' + module_clone_path) + +def setup_all(): + setup_engine() + setup_modules() + setup_addons() + setup_addons_third_party_addons() + +def format_path(path): + if 'win' in sys.platform: + path = path.replace('/', '\\') + path = path.replace('~', '%userprofile%') + + return path + +def get_exports_for(platform): + export_command = 'export ' + command_separator = ';' + + if 'win' in sys.platform: + command_separator = '&' + export_command = 'set ' + + command = '' + + for p in exports[platform]: + command += export_command + p + command_separator + + return command + + +def parse_config(): + global visual_studio_vcvarsall_path + global visual_studio_arch + global visual_studio_call_vcvarsall + global exports + + if not os.path.isfile('build.config'): + return + + with open('build.config', 'r') as f: + + for line in f: + ls = line.strip() + if ls == '' or ls.startswith('#'): + continue + + words = line.split() + + if (len(words) < 2): + print('This build.config line is malformed, and got ignored: ' + ls) + continue + + if words[0] == 'visual_studio_vcvarsall_path': + visual_studio_vcvarsall_path = format_path(ls[29:]) + elif words[0] == 'visual_studio_arch': + visual_studio_arch = format_path(ls[19:]) + elif words[0] == 'visual_studio_call_vcvarsall': + visual_studio_call_vcvarsall = words[1].lower() in [ 'true', '1', 't', 'y', 'yes' ] + elif words[0] == 'export': + if (len(words) < 3) or not words[1] in exports: + print('This build.config line is malformed, and got ignored: ' + ls) + continue + + export_path = format_path(ls[8 + len(words[1]):]) + + exports[words[1]].append(export_path) + +parse_config() + +env = Environment() + +if len(sys.argv) > 1: + + arg = sys.argv[1] + + arg_split = arg.split('_') + arg = arg_split[0] + arg_split = arg_split[1:] + + if arg[0] == 'b': + build_string = get_exports_for('global') + 'scons ' + + build_string += 'tools=' + if 'e' in arg: + build_string += 'yes' + else: + build_string += 'no' + build_string += ' ' + + build_string += 'target=' + if 'r' in arg: + build_string += 'release' + elif 'd' in arg: + build_string += 'debug' + else: + build_string += 'release_debug' + build_string += ' ' + + build_string += 'custom_modules_shared=' + if 's' in arg: + build_string += 'yes' + else: + build_string += 'no' + build_string += ' ' + + if 'm' in arg: + build_string += 'use_mingw=yes' + else: + if 'win' in sys.platform and visual_studio_call_vcvarsall: + build_string = 'call "{0}" {1}&'.format(visual_studio_vcvarsall_path, visual_studio_arch) + build_string + + if 'o' in arg: + build_string += 'use_llvm=yes' + + if 'v' in arg: + build_string += 'vsproj=yes' + + for i in range(2, len(sys.argv)): + build_string += ' ' + sys.argv[i] + ' ' + + if 'slim' in arg_split: + build_string += 'module_webm_enabled=no module_webp_enabled=no module_arkit_enabled=no module_visual_script_enabled=no module_gdnative_enabled=no module_mobile_vr_enabled=no module_theora_enabled=no module_xatlas_unwrap_enabled=no no_editor_splash=yes module_bullet_enabled=no module_camera_enabled=no module_csg_enabled=no module_denoise_enabled=no module_fbx_enabled=no module_gridmap_enabled=no module_hdr_enabled=no module_lightmapper_cpu_enabled=no module_raycast_enabled=no module_recast_enabled=no module_vhacd_enabled=no module_webxr_enabled=no' + build_string += ' ' + + if 'latomic' in arg_split: + build_string += 'LINKFLAGS="-latomic"' + build_string += ' ' + + target = ' ' + + if 'E' in arg: + target += 'bin/libess.x11.opt.tools.64.so' + elif 'T' in arg: + target += 'bin/libtexture_packer.x11.opt.tools.64.so' + elif 'V' in arg: + target += 'bin/libvoxelman.x11.opt.tools.64.so' + elif 'W' in arg: + target += 'bin/libworld_generator.x11.opt.tools.64.so' + elif 'P' in arg: + target += 'bin/libprocedural_animations.x11.opt.tools.64.so' + + cwd = os.getcwd() + full_path = cwd + '/engine/' + + if not os.path.isdir(full_path): + print('engine directory doesnt exists.') + exit() + + os.chdir(full_path) + + if 'l' in arg: + build_string += 'platform=x11' + + build_string = get_exports_for('linux') + build_string + target + + print('Running command: ' + build_string) + + subprocess.call(build_string, shell=True) + elif 'w' in arg: + build_string += 'platform=windows' + + build_string = get_exports_for('windows') + build_string + + print('Running command: ' + build_string) + + subprocess.call(build_string, shell=True) + elif 'a' in arg: + build_string += 'platform=android' + + build_string = get_exports_for('android') + build_string + + print('Running command: ' + build_string + ' android_arch=armv7') + subprocess.call(build_string + ' android_arch=armv7', shell=True) + print('Running command: ' + build_string + ' android_arch=arm64v8') + subprocess.call(build_string + ' android_arch=arm64v8', shell=True) + print('Running command: ' + build_string + ' android_arch=x86') + subprocess.call(build_string + ' android_arch=x86', shell=True) + + os.chdir(full_path + 'platform/android/java/') + + print('Running command: ' + get_exports_for('global') + get_exports_for('android') + './gradlew generateGodotTemplates') + subprocess.call(get_exports_for('global') + get_exports_for('android') + './gradlew generateGodotTemplates', shell=True) + elif 'j' in arg: + build_string += 'platform=javascript' + + build_string = get_exports_for('javascript') + build_string + + print('Running command: ' + build_string) + subprocess.call(build_string, shell=True) + elif 'i' in arg: + build_string += 'platform=iphone' + + subprocess.call(build_string + ' arch=arm', shell=True) + subprocess.call(build_string + ' arch=arm64', shell=True) + + #subprocess.call('lipo -create bin/libgodot.iphone.{0}.arm.a bin/libgodot.iphone.{0}.arm64.a -output bin/libgodot.iphone.{1}.fat.a'.fomat(), shell=True) + + #lipo -create bin/libgodot.iphone.opt.debug.arm.a bin/libgodot.iphone.opt.debug.arm64.a -output bin/libgodot.iphone.debug.fat.a + #rm bin/ios_xcode/libgodot.iphone.debug.fat.a + #cp bin/libgodot.iphone.debug.fat.a bin/ios_xcode/libgodot.iphone.debug.fat.a + + #lipo -create bin/libgodot.iphone.opt.arm.a bin/libgodot.iphone.opt.arm64.a -output bin/libgodot.iphone.release.fat.a + #rm bin/ios_xcode/libgodot.iphone.release.fat.a + #cp bin/libgodot.iphone.release.fat.a bin/ios_xcode/libgodot.iphone.release.fat.a + + subprocess.call('rm bin/iphone.zip', shell=True) + #cd bin/ios_xcode + subprocess.call(build_string + ' arch=arm64', shell=True) + subprocess.call('zip -r -X ../iphone.zip .', shell=True) + + else: + print('No platform specified') + exit() + + exit() + elif arg[0] == 'p': + if arg == 'p': + #print("Applies a patch. Append c for the compilation database patch. For example: pc") + print("Applies a patch. No Patches right now.") + exit() + + cwd = os.getcwd() + full_path = cwd + '/engine/' + + if not os.path.isdir(full_path): + print('engine directory doesnt exists.') + exit() + + os.chdir(full_path) + + #apply the patch to just the working directory, without creating a commit + + #if 'c' in arg: + # subprocess.call('git apply --index ../patches/compilation_db.patch', shell=True) + + #unstage all files + subprocess.call('git reset', shell=True) + + exit() + +opts = Variables(args=ARGUMENTS) + +opts.Add('a', 'What to do', '') +opts.Add(EnumVariable('action', 'What to do', 'setup', ('setup', 'update'))) +opts.Add('t', 'Action target', '') +opts.Add(EnumVariable('target', 'Action target', 'all', ('all', 'engine', 'modules', 'all_addons', 'addons', 'third_party_addons'))) +opts.Add(EnumVariable('repository_type', 'Type of repositories to clone from first', 'http', ('http', 'ssh'))) + +opts.Update(env) +Help(opts.GenerateHelpText(env)) + +load_target_commits_array() + +rt = env['repository_type'] + +if rt == 'ssh': + repository_index = 1 + +action = env['action'] +target = env['target'] + +if env['a']: + action = env['a'] + +if env['t']: + target = env['t'] + +if not os.path.isdir('./modules'): + os.mkdir('./modules') + +if 'm' in action: + godot_branch = 'master' + +if 'setup' in action or action[0] == 's': + if target == 'all': + setup_all() + elif target == 'engine': + setup_engine() + elif target == 'modules': + setup_modules() + elif target == 'all_addons': + setup_addons() + setup_addons_third_party_addons() + elif target == 'addons': + setup_addons() + elif target == 'third_party_addons': + setup_addons_third_party_addons() +elif 'update' in action or action[0] == 'u': + if target == 'all': + update_all() + elif target == 'engine': + update_engine() + save_target_commits_array() + elif target == 'modules': + update_modules() + save_target_commits_array() + elif target == 'all_addons': + update_addons() + update_addons_third_party_addons() + save_target_commits_array() + elif target == 'addons': + update_addons() + save_target_commits_array() + elif target == 'third_party_addons': + update_addons_third_party_addons() + save_target_commits_array() + diff --git a/build.config.example b/build.config.example new file mode 100644 index 0000000..317567f --- /dev/null +++ b/build.config.example @@ -0,0 +1,44 @@ +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +# Rename this file to build.config to use it + +# Lines starting with # are comments. (Only works at the start of the line!) + +# Note: +# ~ will be converted to %userprofile% on windows +# / will be converted to \ on windows +# so you don't have to worry about it + +# Visual studio related setup: +visual_studio_call_vcvarsall True +visual_studio_vcvarsall_path C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Auxiliary/Build/vcvarsall.bat +visual_studio_arch amd64 + +# export related setup +# available export targets: global, linux, windows, android, javascript + +export global SCONS_CACHE=~/.scons_cache +export global SCONS_CACHE_LIMIT=5000 + +export android ANDROID_NDK_ROOT=~/SDKs/Android/NDK/android-ndk-r20b +export android ANDROID_NDK_HOME=~/SDKs/Android/NDK/android-ndk-r20b +export android ANDROID_HOME=~/SDKs/Android/SDK + diff --git a/build_ios.sh b/build_ios.sh new file mode 100755 index 0000000..6d287a4 --- /dev/null +++ b/build_ios.sh @@ -0,0 +1,19 @@ + +export SCONS_CACHE=~/.scons_cache +export SCONS_CACHE_LIMIT=5000 + +cd ./engine + +scons -j6 p=iphone tools=no target=release_debug arch=arm module_arkit_enabled=no game_center=no +scons -j6 p=iphone tools=no target=release_debug arch=arm64 module_arkit_enabled=no game_center=no +lipo -create bin/libgodot.iphone.opt.debug.arm.a bin/libgodot.iphone.opt.debug.arm64.a -output bin/libgodot.iphone.debug.fat.a +rm bin/ios_xcode/libgodot.iphone.debug.fat.a +cp bin/libgodot.iphone.debug.fat.a bin/ios_xcode/libgodot.iphone.debug.fat.a + +rm bin/iphone.zip +cd bin/ios_xcode +zip -r -X ../iphone.zip . + +cd .. +cd .. +cd .. diff --git a/build_ios_release.sh b/build_ios_release.sh new file mode 100755 index 0000000..f5d8303 --- /dev/null +++ b/build_ios_release.sh @@ -0,0 +1,21 @@ + +export SCONS_CACHE=~/.scons_cache +export SCONS_CACHE_LIMIT=5000 + +cd ./engine + +scons -j6 p=iphone tools=no target=release arch=arm module_arkit_enabled=no game_center=no +scons -j6 p=iphone tools=no target=release arch=arm64 module_arkit_enabled=no game_center=no +lipo -create bin/libgodot.iphone.opt.arm.a bin/libgodot.iphone.opt.arm64.a -output bin/libgodot.iphone.release.fat.a +rm bin/ios_xcode/libgodot.iphone.release.fat.a +cp bin/libgodot.iphone.release.fat.a bin/ios_xcode/libgodot.iphone.release.fat.a + +rm bin/iphone.zip +cd bin/ios_xcode +zip -r -X ../iphone.zip . + +cd .. +cd .. + + +cd .. diff --git a/build_osx.sh b/build_osx.sh new file mode 100755 index 0000000..fab5d0d --- /dev/null +++ b/build_osx.sh @@ -0,0 +1,15 @@ + +export SCONS_CACHE=~/.scons_cache +export SCONS_CACHE_LIMIT=5000 + +cd ./engine + +scons -j6 platform=osx target=release_debug + +rm -Rf bin/Godot.app +cp -r misc/dist/osx_tools.app ./bin/Godot.app +mkdir -p ./bin/Godot.app/Contents/MacOS +cp bin/godot.osx.opt.tools.64 bin/Godot.app/Contents/MacOS/Godot +chmod +x bin/Godot.app/Contents/MacOS/Godot + +cd .. diff --git a/build_uwp.bat b/build_uwp.bat new file mode 100644 index 0000000..fde9658 --- /dev/null +++ b/build_uwp.bat @@ -0,0 +1,14 @@ + +cd ./engine + +if not defined DevEnvDir ( + rem call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" x86 + call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64 +) + +call scons -j6 platform=uwp target=release +rem call scons -j6 platform=uwp target=release_debug +rem call scons -j6 platform=uwp target=release + +cd .. + diff --git a/editor.bat b/editor.bat new file mode 100644 index 0000000..0170b95 --- /dev/null +++ b/editor.bat @@ -0,0 +1,6 @@ + +copy "engine\bin\godot.windows.opt.tools.64.exe" "engine\bin\run_godot.windows.opt.tools.64.exe" /y +copy "engine\bin\godot.windows.opt.tools.64.pdb" "engine\bin\run_godot.windows.opt.tools.64.pdb" /y +copy "engine\bin\godot.windows.opt.tools.64.exp" "engine\bin\run_godot.windows.opt.tools.64.exp" /y + +cmd /c engine\bin\run_godot.windows.opt.tools.64.exe \ No newline at end of file diff --git a/editor.sh b/editor.sh new file mode 100755 index 0000000..ce9ff0c --- /dev/null +++ b/editor.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +cp -u ./engine/bin/godot.x11.opt.tools.64 ./engine/bin/run.godot.x11.opt.tools.64 + +export LD_LIBRARY_PATH=`pwd`/engine/bin/ +./engine/bin/run.godot.x11.opt.tools.64 -v diff --git a/export_all.sh b/export_all.sh new file mode 100755 index 0000000..4c49be8 --- /dev/null +++ b/export_all.sh @@ -0,0 +1,22 @@ +#!/bin/bash +set -e + +project_root=$(pwd) + +rm -Rf ./export + +mkdir export +mkdir export/broken_seals_android_release +mkdir export/broken_seals_android_debug +mkdir export/broken_seals_linux +mkdir export/broken_seals_windows +mkdir export/broken_seals_javascript + +./engine/bin/godot.x11.opt.tools.64 --path ./game/ --export-debug Android-Release ${project_root}/export/broken_seals_android_release/broken_seals.apk +./engine/bin/godot.x11.opt.tools.64 --path ./game/ --export-debug Android ${project_root}/export/broken_seals_android_debug/broken_seals_debug.apk +./engine/bin/godot.x11.opt.tools.64 --path ./game/ --export Linux/X11 ${project_root}/export/broken_seals_linux/broken_seals_x11 +./engine/bin/godot.x11.opt.tools.64 --path ./game/ --export "Windows Desktop" ${project_root}/export/broken_seals_windows/broken_seals.exe +./engine/bin/godot.x11.opt.tools.64 --path ./game/ --export HTML5 ${project_root}/export/broken_seals_javascript/broken_seals.html + +cp ./engine/bin/godot.windows.opt.tools.64.exe ${project_root}/export/godot.bs.windows.opt.tools.64.exe +cp ./engine/bin/godot.x11.opt.tools.64 ${project_root}/export/godot.bs.x11.opt.tools.64 \ No newline at end of file diff --git a/game/.gitignore b/game/.gitignore new file mode 100644 index 0000000..e9f4f1f --- /dev/null +++ b/game/.gitignore @@ -0,0 +1,16 @@ +\exports/ +\.import/ + +addons/scene_notes/ + +addons/todo/ + +scene-notes\.ini + +todo\.cache\.ini + +todo\.config\.ini + +export_presets\.cfg + +export.cfg \ No newline at end of file diff --git a/game/addons/Godoxel/BrushPrefabs.gd b/game/addons/Godoxel/BrushPrefabs.gd new file mode 100644 index 0000000..02884d3 --- /dev/null +++ b/game/addons/Godoxel/BrushPrefabs.gd @@ -0,0 +1,106 @@ +class_name BrushPrefabs + + +const list = [ + [ Vector2(0, -1), + Vector2(-1, 0), Vector2(0, 0), Vector2(1, 0), + Vector2(0, 1) + ], + [Vector2(-1, -1), Vector2(0, -1), Vector2(1, -1), + Vector2(-1, 0), Vector2(0, 0), Vector2(1, 0), + Vector2(-1, 1), Vector2(0, 1), Vector2(1, 1), + ], + [ + Vector2(-1, 0), Vector2(0, 0), Vector2(1, 0), + ], + [ Vector2(0, -1), + Vector2(0, 0), + Vector2(0, 1) + ] +] + + +enum Type { + V_LINE, + H_LINE, + RECT, + CIRCLE, +} + +static func get_brush(type, size: int): + var pixels = [] + if size < 1: + size = 1 + + match type: + Type.CIRCLE: + size += 1 + var center = Vector2.ZERO + var last = center + var radius = size / 2.0 + for x in range(size): + for y in range(size): + if Vector2(x - radius, y - radius).length() < size / 3.0: + pixels.append(Vector2(x, y)) + + var avg = Vector2(size / 2, size / 2) + avg = Vector2(floor(avg.x), floor(avg.y)) + + for i in range(pixels.size()): + pixels[i] -= avg + + Type.RECT: + var center = Vector2.ZERO + var last = center + for x in range(size): + for y in range(size): + pixels.append(Vector2(x, y)) + + var avg = Vector2.ZERO + for cell in pixels: + avg += cell + + avg.x /= pixels.size() + avg.y /= pixels.size() + + avg = Vector2(floor(avg.x), floor(avg.y)) + + for i in range(pixels.size()): + pixels[i] -= avg + + Type.V_LINE: + var center = Vector2.ZERO + var last = center + pixels.append(Vector2.ZERO) + + for i in range(size - 1): + var sig = sign(last.y) + if sig == 0: + sig = 1 + + if last.y < 0: + center.y = abs(last.y) * -sig + else: + center.y = abs(last.y+1) * -sig + last = center + pixels.append(center) + Type.H_LINE: + var center = Vector2.ZERO + var last = center + pixels.append(Vector2.ZERO) + + for i in range(size - 1): + var sig = sign(last.x) + if sig == 0: + sig = 1 + + if last.x < 0: + center.x = abs(last.x) * -sig + else: + center.x = abs(last.x+1) * -sig + last = center + pixels.append(center) + + return pixels + + diff --git a/game/addons/Godoxel/Canvas.gd b/game/addons/Godoxel/Canvas.gd new file mode 100644 index 0000000..77afa4e --- /dev/null +++ b/game/addons/Godoxel/Canvas.gd @@ -0,0 +1,461 @@ +extends Control +class_name GECanvas +tool + +export var pixel_size: int = 16 setget set_pixel_size +export(int, 1, 2500) var canvas_width = 48 setget set_canvas_width # == pixels +export(int, 1, 2500) var canvas_height = 28 setget set_canvas_height # == pixels +export var grid_size = 16 setget set_grid_size +export var big_grid_size = 10 setget set_big_grid_size +export var can_draw = true + +var mouse_in_region +var mouse_on_top + +var layers : Array = [] # Key: layer_name, val: GELayer +var active_layer: GELayer +var preview_layer: GELayer +var tool_layer: GELayer +var canvas_layers: Control + +var canvas +var grid +var big_grid +var selected_pixels = [] + +var symmetry_x = false +var symmetry_y = false + + +func _enter_tree(): + #------------------------------- + # Set nodes + #------------------------------- + canvas = find_node("Canvas") + grid = find_node("Grid") + big_grid = find_node("BigGrid") + canvas_layers = find_node("CanvasLayers") + + #------------------------------- + # setup layers and canvas + #------------------------------- + connect("mouse_entered", self, "_on_mouse_entered") + connect("mouse_exited", self, "_on_mouse_exited") + + #------------------------------- + # setup layers and canvas + #------------------------------- + #canvas_size = Vector2(int(rect_size.x / grid_size), int(rect_size.y / grid_size)) + #pixel_size = canvas_size + + active_layer = add_new_layer("Layer1") + preview_layer = add_new_layer("Preview") + tool_layer = add_new_layer("Tool") + + set_process(true) + + +func _process(delta): + if not is_visible_in_tree(): + return + var mouse_position = get_local_mouse_position() + var rect = Rect2(Vector2(0, 0), rect_size) + mouse_in_region = rect.has_point(mouse_position) + + +func _draw(): + for layer in layers: + layer.update_texture() + + preview_layer.update_texture() + tool_layer.update_texture() + + +func resize(width: int, height: int): + if width < 0: + width = 1 + if height < 0: + height = 1 + + set_canvas_width(width) + set_canvas_height(height) + + preview_layer.resize(width, height) + tool_layer.resize(width, height) + for layer in layers: + layer.resize(width, height) + + +#------------------------------- +# Export +#------------------------------- + +func set_pixel_size(size: int): + pixel_size = size + set_grid_size(grid_size) + set_big_grid_size(big_grid_size) + set_canvas_width(canvas_width) + set_canvas_height(canvas_height) + + +func set_grid_size(size): + grid_size = size + if not find_node("Grid"): + return + find_node("Grid").size = size * pixel_size + + +func set_big_grid_size(size): + big_grid_size = size + if not find_node("BigGrid"): + return + find_node("BigGrid").size = size * pixel_size + + +func set_canvas_width(val: int): + canvas_width = val + rect_size.x = canvas_width * pixel_size + + +func set_canvas_height(val: int): + canvas_height = val + rect_size.y = canvas_height * pixel_size + + +#------------------------------- +# Layer +#------------------------------- + + + +func toggle_alpha_locked(layer_name: String): + var layer = find_layer_by_name(layer_name) + layer.toggle_alpha_locked() + + +func is_alpha_locked() -> bool: + return active_layer.alpha_locked + + +func get_content_margin() -> Rect2: + var rect = Rect2(999999, 999999, -999999, -999999) + + preview_layer.image.get_used_rect() + for layer in layers: + + var r = layer.image.get_used_rect() + + if r.position.x < rect.position.x: + rect.position.x = r.position.x + if r.position.y < rect.position.y: + rect.position.y = r.position.y + if r.size.x > rect.size.x: + rect.size.x = r.size.x + if r.size.y > rect.size.y: + rect.size.y = r.size.y + + return rect + + +func crop_to_content(): + var rect = get_content_margin() + + #print(rect) + + for layer in layers: + layer.image + +# set_canvas_width(rect.size.x) +# set_canvas_height(rect.size.x) + +# preview_layer.resize(width, height) +# tool_layer.resize(width, height) +# for layer in layers: +# layer.resize(width, height) + + +func get_active_layer(): + return active_layer + + +func get_preview_layer(): + return preview_layer + + +func clear_active_layer(): + active_layer.clear() + + +func clear_preview_layer(): + preview_layer.clear() + + +func clear_layer(layer_name: String): + for layer in layers: + if layer.name == layer_name: + layer.clear() + break + + +func remove_layer(layer_name: String): + # change current layer if the active layer is removed + var del_layer = find_layer_by_name(layer_name) + del_layer.clear() + if del_layer == active_layer: + for layer in layers: + if layer == preview_layer or layer == active_layer or layer == tool_layer: + continue + active_layer = layer + break + layers.erase(del_layer) + return active_layer + + +func add_new_layer(layer_name: String): + for layer in layers: + if layer.name == layer_name: + return + var layer = GELayer.new() + layer.name = layer_name + + if layer_name == "Preview": + layer.create($PreviewLayer, canvas_width, canvas_height) + elif layer_name == "Tool": + layer.create($ToolPreviewLayer, canvas_width, canvas_height) + else: + var texture_rect = TextureRect.new() + texture_rect.name = layer_name + canvas_layers.add_child(texture_rect, true) + texture_rect.expand = true + texture_rect.anchor_right = 1 + texture_rect.anchor_bottom = 1 + texture_rect.margin_right = 0 + texture_rect.margin_bottom = 0 + texture_rect.mouse_filter = Control.MOUSE_FILTER_IGNORE + layer.create(texture_rect, canvas_width, canvas_height) + layers.append(layer) + + return layer + + +func duplicate_layer(layer_name: String, new_layer_name: String): + for layer in layers: + if layer.name == new_layer_name: + return + + var dup_layer :GELayer = find_layer_by_name(layer_name) + var layer :GELayer = add_new_layer(new_layer_name) + layer.image.copy_from(dup_layer.image) + return layer + + +func toggle_layer_visibility(layer_name: String): + for layer in layers: + if layer.name == layer_name: + layer.visible = not layer.visible + + +func find_layer_by_name(layer_name: String): + for layer in layers: + if layer.name == layer_name: + return layer + return null + + +func toggle_lock_layer(layer_name: String): + find_layer_by_name(layer_name).toggle_lock() + + +func is_active_layer_locked() -> bool: + return active_layer.locked + + +func move_layer_forward(layer_name: String): + var layer = find_layer_by_name(layer_name).texture_rect_ref + var new_idx = max(layer.get_index() - 1, 0) + canvas_layers.move_child(layer, new_idx) + + +func move_layer_back(layer_name: String): + var layer = find_layer_by_name(layer_name).texture_rect_ref + canvas_layers.move_child(layer, layer.get_index() + 1) + + +func select_layer(layer_name: String): + active_layer = find_layer_by_name(layer_name) + + +#------------------------------- +# Check +#------------------------------- + +func _on_mouse_entered(): + mouse_on_top = true + + +func _on_mouse_exited(): + mouse_on_top = false + + +func is_inside_canvas(x, y): + if x < 0 or y < 0: + return false + if x >= canvas_width or y >= canvas_height: + return false + return true + + + +#------------------------------- +# Basic pixel-layer options +#------------------------------- + + +#Note: Arrays are always passed by reference. To get a copy of an array which +# can be modified independently of the original array, use duplicate. +# (https://docs.godotengine.org/en/stable/classes/class_array.html) +func set_pixel_arr(pixels: Array, color: Color): + for pixel in pixels: + _set_pixel(active_layer, pixel.x, pixel.y, color) + + +func set_pixel_v(pos: Vector2, color: Color): + set_pixel(pos.x, pos.y, color) + + +func set_pixel(x: int, y: int, color: Color): + _set_pixel(active_layer, x, y, color) + + +func _set_pixel_v(layer: GELayer, v: Vector2, color: Color): + _set_pixel(layer, v.x, v.y, color) + + +func _set_pixel(layer: GELayer, x: int, y: int, color: Color): + if not is_inside_canvas(x, y): + return + layer.set_pixel(x, y, color) + + +func get_pixel_v(pos: Vector2): + return get_pixel(pos.x, pos.y) + + +func get_pixel(x: int, y: int): + if active_layer: + return active_layer.get_pixel(x, y) + return null + + +func set_preview_pixel_v(pos: Vector2, color: Color): + set_preview_pixel(pos.x, pos.y, color) + + +func set_preview_pixel(x:int, y: int, color: Color): + if not is_inside_canvas(x, y): + return + preview_layer.set_pixel(x, y, color) + + +func get_preview_pixel_v(pos: Vector2): + return get_preview_pixel(pos.x, pos.y) + + +func get_preview_pixel(x: int, y: int): + if not preview_layer: + return null + return preview_layer.get_pixel(x, y) + + + +#------------------------------- +# Grid +#------------------------------- + + +func toggle_grid(): + $Grid.visible = not $Grid.visible + + +func show_grid(): + $Grid.show() + + +func hide_grid(): + $Grid.hide() + + +#------------------------------- +# Handy tools +#------------------------------- + + +func select_color(x, y): + print("???") + var same_color_pixels = [] + var color = get_pixel(x, y) + for x in range(active_layer.layer_width): + for y in range(active_layer.layer_height): + var pixel_color = active_layer.get_pixel(x, y) + if pixel_color == color: + same_color_pixels.append(color) + return same_color_pixels + + +func select_same_color(x, y): + return get_neighbouring_pixels(x, y) + + +# returns array of Vector2 +# yoinked from +# https://www.geeksforgeeks.org/flood-fill-algorithm-implement-fill-paint/ +func get_neighbouring_pixels(pos_x: int, pos_y: int) -> Array: + var pixels = [] + + var to_check_queue = [] + var checked_queue = [] + + to_check_queue.append(GEUtils.to_1D(pos_x, pos_y, canvas_width)) + + var color = get_pixel(pos_x, pos_y) + + while not to_check_queue.empty(): + var idx = to_check_queue.pop_front() + var p = GEUtils.to_2D(idx, canvas_width) + + if idx in checked_queue: + continue + + checked_queue.append(idx) + + if get_pixel(p.x, p.y) != color: + continue + + # add to result + pixels.append(p) + + # check neighbours + var x = p.x - 1 + var y = p.y + if is_inside_canvas(x, y): + idx = GEUtils.to_1D(x, y, canvas_width) + to_check_queue.append(idx) + + x = p.x + 1 + if is_inside_canvas(x, y): + idx = GEUtils.to_1D(x, y, canvas_width) + to_check_queue.append(idx) + + x = p.x + y = p.y - 1 + if is_inside_canvas(x, y): + idx = GEUtils.to_1D(x, y, canvas_width) + to_check_queue.append(idx) + + y = p.y + 1 + if is_inside_canvas(x, y): + idx = GEUtils.to_1D(x, y, canvas_width) + to_check_queue.append(idx) + + return pixels + diff --git a/game/addons/Godoxel/CanvasOutline.gd b/game/addons/Godoxel/CanvasOutline.gd new file mode 100644 index 0000000..8bf94a6 --- /dev/null +++ b/game/addons/Godoxel/CanvasOutline.gd @@ -0,0 +1,31 @@ +tool +extends Control + +export var color = Color() + + +func _ready(): + pass + + +func _draw(): + var size = get_parent().rect_size + var pos = Vector2.ZERO #get_parent().rect_global_position + draw_outline_box(pos, size, color, 1) + + +func draw_outline_box(pos, size, color, width): + #Top line + draw_line(pos, pos + Vector2(size.x, 0), color, width) + #Left line + draw_line(pos, pos + Vector2(0, size.y), color, width) + #Bottom line + draw_line(pos + Vector2(0, size.y), pos + Vector2(size.x, size.y), color, width) + #Right line + draw_line(pos + Vector2(size.x, 0), pos + Vector2(size.x, size.y), color, width) + + +func _process(delta): + if not is_visible_in_tree(): + return + update() diff --git a/game/addons/Godoxel/Colors.gd b/game/addons/Godoxel/Colors.gd new file mode 100644 index 0000000..c198e59 --- /dev/null +++ b/game/addons/Godoxel/Colors.gd @@ -0,0 +1,34 @@ +tool +extends GridContainer + +signal color_change_request + +func _enter_tree(): + for child in get_children(): + child.set("custom_styles/normal", StyleBoxFlat.new()) + child.get("custom_styles/normal").set("bg_color", Color(randf(), randf(), randf())) + for child in get_children(): + if child.is_connected("pressed", self, "change_color_to"): + return + child.connect("pressed", self, "change_color_to", [child.get("custom_styles/normal").bg_color]) + + +func change_color_to(color): + emit_signal("color_change_request", color) + + +func add_color_prefab(color: Color): + var dup = get_child(0).duplicate() + add_child(dup) + move_child(dup, 0) + dup.set("custom_styles/normal", StyleBoxFlat.new()) + dup.get("custom_styles/normal").set("bg_color", color) + for child in get_children(): + if child.is_connected("pressed", self, "change_color_to"): + return + child.connect("pressed", self, "change_color_to", [child.get("custom_styles/normal").bg_color]) + + + + + diff --git a/game/addons/Godoxel/DebugTextDisplay.gd b/game/addons/Godoxel/DebugTextDisplay.gd new file mode 100644 index 0000000..bdb7616 --- /dev/null +++ b/game/addons/Godoxel/DebugTextDisplay.gd @@ -0,0 +1,9 @@ +extends RichTextLabel +tool + +func _ready(): + pass + + +func display_text(text): + self.text = text diff --git a/game/addons/Godoxel/Editor.gd b/game/addons/Godoxel/Editor.gd new file mode 100644 index 0000000..0ae1192 --- /dev/null +++ b/game/addons/Godoxel/Editor.gd @@ -0,0 +1,832 @@ +tool +extends Control + +enum Tools { + PAINT, + BRUSH, + BUCKET, + RAINBOW, + LINE, + RECT, + DARKEN, + BRIGHTEN + COLORPICKER, + CUT, + PASTECUT, +} + +# Keyboard shortcuts +const K_UNDO = KEY_Z +const K_REDO = KEY_Y +const K_PENCIL = KEY_Q +const K_BRUSH = KEY_W +const K_BUCKET = KEY_F +const K_RAINBOW = KEY_R +const K_LINE = KEY_L +const K_DARK = KEY_D +const K_BRIGHT = KEY_B +const K_CUT = KEY_C +const K_PICK = KEY_P + + +var layer_buttons: Control +var paint_canvas_container_node +var paint_canvas: GECanvas +var canvas_background: TextureRect +var grids_node +var colors_grid +var selected_color = Color(1, 1, 1, 1) setget set_selected_color +var util = preload("res://addons/Godoxel/Util.gd") +var textinfo +var allow_drawing = true + +var mouse_in_region = false +var mouse_on_top = false + + +var _middle_mouse_pressed_pos = null +var _middle_mouse_pressed_start_pos = null +var _left_mouse_pressed_start_pos = Vector2() +var _previous_tool +var brush_mode + +var _layer_button_ref = {} + +var _total_added_layers = 1 + +var selected_brush_prefab = 0 +var _last_drawn_pixel = Vector2.ZERO +var _last_preview_draw_cell_pos = Vector2.ZERO + +var _selection_cells = [] +var _selection_colors = [] + +var _cut_pos = Vector2.ZERO +var _cut_size = Vector2.ZERO + +var _actions_history = [] # for undo +var _redo_history = [] +var _current_action + +var _last_mouse_pos_canvas_area = Vector2.ZERO + +var _picked_color = false + +var mouse_position = Vector2() +var canvas_position = Vector2() +var canvas_mouse_position = Vector2() +var cell_mouse_position = Vector2() +var cell_color = Color() + +var last_mouse_position = Vector2() +var last_canvas_position = Vector2() +var last_canvas_mouse_position = Vector2() +var last_cell_mouse_position = Vector2() +var last_cell_color = Color() + +const current_layer_highlight = Color(0.354706, 0.497302, 0.769531) +const other_layer_highlight = Color(0.180392, 0.176471, 0.176471) +const locked_layer_highlight = Color(0.098039, 0.094118, 0.094118) + +var big_grid_pixels = 4 # 1 grid-box is big_grid_pixels big + + + +func _ready(): + #-------------------- + #Setup nodes + #-------------------- + + paint_canvas_container_node = find_node("PaintCanvasContainer") + textinfo = find_node("DebugTextDisplay") + selected_color = find_node("ColorPicker").color + colors_grid = find_node("Colors") + paint_canvas = paint_canvas_container_node.find_node("Canvas") + layer_buttons = find_node("LayerButtons") + canvas_background = find_node("CanvasBackground") + + set_process(true) + + #-------------------- + #connect nodes + #-------------------- + if not colors_grid.is_connected("color_change_request", self, "change_color"): + colors_grid.connect("color_change_request", self, "change_color") + + if not is_connected("visibility_changed", self, "_on_Editor_visibility_changed"): + connect("visibility_changed", self, "_on_Editor_visibility_changed") + + find_node("CanvasBackground").material.set_shader_param( + "pixel_size", 8 * pow(0.5, big_grid_pixels)/paint_canvas.pixel_size) + + # ready + + set_brush(Tools.PAINT) + _layer_button_ref[layer_buttons.get_child(0).name] = layer_buttons.get_child(0) #ugly + _connect_layer_buttons() + highlight_layer(paint_canvas.get_active_layer().name) + + find_node("BrushSizeLabel").text = str(int(find_node("BrushSize").value)) + + paint_canvas.update() + + +func _input(event): + if is_any_menu_open(): + return + if not is_visible_in_tree(): + return + if paint_canvas_container_node == null or paint_canvas == null: + return + + if event is InputEventKey and event.is_pressed() and not event.is_echo(): + _handle_shortcuts(event.scancode) + + if is_mouse_in_canvas(): + _handle_zoom(event) + + if paint_canvas.is_active_layer_locked(): + return + + if brush_mode == Tools.CUT: + if event is InputEventMouseButton: + if event.button_index == BUTTON_LEFT: + if not event.pressed: + commit_action() + + if (paint_canvas.mouse_in_region and paint_canvas.mouse_on_top): + if event is InputEventMouseButton: + match brush_mode: + Tools.BUCKET: + if event.button_index == BUTTON_LEFT: + if event.pressed: + if _current_action == null: + _current_action = get_action() + do_action([cell_mouse_position, last_cell_mouse_position, selected_color]) + + Tools.COLORPICKER: + if event.button_index == BUTTON_LEFT: + if event.pressed: + if paint_canvas.get_pixel(cell_mouse_position.x, cell_mouse_position.y).a == 0: + return + selected_color = paint_canvas.get_pixel(cell_mouse_position.x, cell_mouse_position.y) + _picked_color = true + find_node("Colors").add_color_prefab(selected_color) + elif _picked_color: + set_brush(_previous_tool) + elif event.button_index == BUTTON_RIGHT: + if event.pressed: + set_brush(_previous_tool) + + Tools.PASTECUT: + if event.button_index == BUTTON_RIGHT: + if event.pressed: + commit_action() + set_brush(Tools.PAINT) + + +func _process(delta): + if not is_visible_in_tree(): + return + if paint_canvas_container_node == null or paint_canvas == null: + return + if is_any_menu_open(): + return + + if is_mouse_in_canvas(): + _handle_scroll() + + #Update commonly used variables + var grid_size = paint_canvas.pixel_size + mouse_position = get_global_mouse_position() #paint_canvas.get_local_mouse_position() + canvas_position = paint_canvas.rect_global_position + canvas_mouse_position = Vector2(mouse_position.x - canvas_position.x, mouse_position.y - canvas_position.y) + if is_mouse_in_canvas(): + cell_mouse_position = Vector2( + floor(canvas_mouse_position.x / grid_size), + floor(canvas_mouse_position.y / grid_size)) + cell_color = paint_canvas.get_pixel(cell_mouse_position.x, cell_mouse_position.y) + update_text_info() + +# if not is_mouse_in_canvas(): +# paint_canvas.tool_layer.clear() +# paint_canvas.update() +# paint_canvas.tool_layer.update_texture() +# else: + if is_mouse_in_canvas(): + if not paint_canvas.is_active_layer_locked(): + if is_position_in_canvas(get_global_mouse_position()) or \ + is_position_in_canvas(_last_mouse_pos_canvas_area): + brush_process() + else: + print(cell_mouse_position, " not in ", paint_canvas_container_node.rect_size) + print("not in canvas") + + _draw_tool_brush() + + #Update last variables with the current variables + last_mouse_position = mouse_position + last_canvas_position = canvas_position + last_canvas_mouse_position = canvas_mouse_position + last_cell_mouse_position = cell_mouse_position + last_cell_color = cell_color + _last_mouse_pos_canvas_area = get_global_mouse_position() #paint_canvas_container_node.get_local_mouse_position() + + +func _handle_shortcuts(scancode): + match scancode: + K_UNDO: + undo_action() + + K_REDO: + redo_action() + + K_PENCIL: + set_brush(Tools.PAINT) + + K_BRUSH: + set_brush(Tools.BRUSH) + + K_BUCKET: + set_brush(Tools.BUCKET) + + K_RAINBOW: + set_brush(Tools.RAINBOW) + + K_LINE: + set_brush(Tools.LINE) + + K_DARK: + set_brush(Tools.DARKEN) + + K_BRIGHT: + set_brush(Tools.BRIGHTEN) + + K_CUT: + set_brush(Tools.CUT) + + K_PICK: + set_brush(Tools.COLORPICKER) + + +func _draw_tool_brush(): + paint_canvas.tool_layer.clear() + + match brush_mode: + Tools.PASTECUT: + for idx in range(_selection_cells.size()): + var pixel = _selection_cells[idx] +# if pixel.x < 0 or pixel.y < 0: +# print(pixel) + var color = _selection_colors[idx] + pixel -= _cut_pos + _cut_size / 2 + pixel += cell_mouse_position + paint_canvas._set_pixel_v(paint_canvas.tool_layer, pixel, color) + Tools.BRUSH: + var pixels = BrushPrefabs.get_brush(selected_brush_prefab, find_node("BrushSize").value) + for pixel in pixels: + + paint_canvas._set_pixel(paint_canvas.tool_layer, + cell_mouse_position.x + pixel.x, cell_mouse_position.y + pixel.y, selected_color) + + Tools.RAINBOW: + paint_canvas._set_pixel(paint_canvas.tool_layer, + cell_mouse_position.x, cell_mouse_position.y, Color(0.46875, 0.446777, 0.446777, 0.196078)) + + Tools.COLORPICKER: + paint_canvas._set_pixel(paint_canvas.tool_layer, + cell_mouse_position.x, cell_mouse_position.y, Color(0.866667, 0.847059, 0.847059, 0.196078)) + _: + paint_canvas._set_pixel(paint_canvas.tool_layer, + cell_mouse_position.x, cell_mouse_position.y, selected_color) + + paint_canvas.update() + #TODO add here brush prefab drawing + paint_canvas.tool_layer.update_texture() + + +func _handle_scroll(): + if Input.is_mouse_button_pressed(BUTTON_MIDDLE): + if _middle_mouse_pressed_start_pos == null: + _middle_mouse_pressed_start_pos = paint_canvas.rect_position + _middle_mouse_pressed_pos = get_global_mouse_position() + + paint_canvas.rect_position = _middle_mouse_pressed_start_pos + paint_canvas.rect_position += get_global_mouse_position() - _middle_mouse_pressed_pos + + elif _middle_mouse_pressed_start_pos != null: + _middle_mouse_pressed_start_pos = null + + +const max_zoom_out = 1 +const max_zoom_in = 50 + +func _handle_zoom(event): + if not event is InputEventMouseButton: + return + if event.is_pressed(): + if event.button_index == BUTTON_WHEEL_UP: + var px = min(paint_canvas.pixel_size * 2, max_zoom_in) + if px == paint_canvas.pixel_size: + return + paint_canvas.set_pixel_size(px) + find_node("CanvasBackground").material.set_shader_param( + "pixel_size", 8 * pow(0.5, big_grid_pixels)/paint_canvas.pixel_size) + paint_canvas.rect_position -= paint_canvas.get_local_mouse_position() + paint_canvas.rect_position.x = clamp(paint_canvas.rect_position.x, -paint_canvas.rect_size.x * 0.8, rect_size.x) + paint_canvas.rect_position.y = clamp(paint_canvas.rect_position.y, -paint_canvas.rect_size.y * 0.8, rect_size.y) + elif event.button_index == BUTTON_WHEEL_DOWN: + var px = max(paint_canvas.pixel_size / 2.0, max_zoom_out) + if px == paint_canvas.pixel_size: + return + paint_canvas.set_pixel_size(px) + find_node("CanvasBackground").material.set_shader_param( + # 4 2 1 + "pixel_size", 8 * pow(0.5, big_grid_pixels)/paint_canvas.pixel_size) + paint_canvas.rect_position += paint_canvas.get_local_mouse_position() / 2 + paint_canvas.rect_position.x = clamp(paint_canvas.rect_position.x, -paint_canvas.rect_size.x * 0.8, rect_size.x) + paint_canvas.rect_position.y = clamp(paint_canvas.rect_position.y, -paint_canvas.rect_size.y * 0.8, rect_size.y) + + +func _handle_cut(): + if Input.is_mouse_button_pressed(BUTTON_RIGHT): + paint_canvas.clear_preview_layer() + set_brush(_previous_tool) + return + + if Input.is_mouse_button_pressed(BUTTON_LEFT): + for pixel_pos in GEUtils.get_pixels_in_line(cell_mouse_position, last_cell_mouse_position): + for idx in range(_selection_cells.size()): + var pixel = _selection_cells[idx] + var color = _selection_colors[idx] + pixel -= _cut_pos + _cut_size / 2 + pixel += pixel_pos + paint_canvas.set_pixel_v(pixel, color) + else: + if _last_preview_draw_cell_pos == cell_mouse_position: + return + paint_canvas.clear_preview_layer() + for idx in range(_selection_cells.size()): + var pixel = _selection_cells[idx] + var color = _selection_colors[idx] + pixel -= _cut_pos + _cut_size / 2 + pixel += cell_mouse_position + paint_canvas.set_preview_pixel_v(pixel, color) + _last_preview_draw_cell_pos = cell_mouse_position + + +func brush_process(): + if Input.is_mouse_button_pressed(BUTTON_LEFT): + if _current_action == null: + _current_action = get_action() + if brush_mode == Tools.COLORPICKER: + _current_action = null + + match brush_mode: + Tools.PAINT: + do_action([cell_mouse_position, last_cell_mouse_position, selected_color]) + Tools.BRUSH: + do_action([cell_mouse_position, last_cell_mouse_position, selected_color, + selected_brush_prefab, find_node("BrushSize").value]) + Tools.LINE: + do_action([cell_mouse_position, last_cell_mouse_position, selected_color]) + Tools.RECT: + do_action([cell_mouse_position, last_cell_mouse_position, selected_color]) + Tools.DARKEN: + do_action([cell_mouse_position, last_cell_mouse_position, selected_color]) + Tools.BRIGHTEN: + do_action([cell_mouse_position, last_cell_mouse_position, selected_color]) + Tools.COLORPICKER: + pass + Tools.CUT: + do_action([cell_mouse_position, last_cell_mouse_position, selected_color]) + Tools.PASTECUT: + do_action([cell_mouse_position, last_cell_mouse_position, + _selection_cells, _selection_colors, + _cut_pos, _cut_size]) + Tools.RAINBOW: + do_action([cell_mouse_position, last_cell_mouse_position]) + paint_canvas.update() + + elif Input.is_mouse_button_pressed(BUTTON_RIGHT): + paint_canvas.update() + if _current_action == null: + _current_action = get_action() + + match brush_mode: + Tools.PAINT: + do_action([cell_mouse_position, last_cell_mouse_position, Color.transparent]) + Tools.BRUSH: + do_action([cell_mouse_position, last_cell_mouse_position, Color.transparent, + selected_brush_prefab, find_node("BrushSize").value]) + else: + if _current_action and _current_action.can_commit(): + commit_action() + paint_canvas.update() + + +func update_text_info(): + var text = "" + + var cell_color_text = cell_color + cell_color_text = Color(0, 0, 0, 0) + + text += \ + str("FPS %s\t" + \ + "Mouse Position %s\t" + \ + "Canvas Mouse Position %s \t" + \ + "Canvas Position %s\t\n" + \ + "Cell Position %s \t" + \ + "Cell Color %s\t") % [ + str(Engine.get_frames_per_second()), + str(mouse_position), + str(canvas_mouse_position), + str(canvas_position), + str(cell_mouse_position), + str(cell_color_text), + ] + + find_node("DebugTextDisplay").display_text(text) + + +func _on_Save_pressed(): + get_node("SaveFileDialog").show() + + + +#--------------------------------------- +# Actions +#--------------------------------------- + + +func do_action(data: Array): + if _current_action == null: + #print("clear redo") + _redo_history.clear() + _current_action.do_action(paint_canvas, data) + + +func commit_action(): + if not _current_action: + return + + #print("commit action") + var commit_data = _current_action.commit_action(paint_canvas) + var action = get_action() + action.action_data = _current_action.action_data.duplicate(true) + _actions_history.push_back(action) + _redo_history.clear() + + match brush_mode: + Tools.CUT: + _cut_pos = _current_action.mouse_start_pos + _cut_size = _current_action.mouse_end_pos - _current_action.mouse_start_pos + _selection_cells = _current_action.action_data.redo.cells.duplicate() + _selection_colors = _current_action.action_data.redo.colors.duplicate() + set_brush(Tools.PASTECUT) + _: + _current_action = null + + +func redo_action(): + if _redo_history.empty(): + print("nothing to redo") + return + var action = _redo_history.pop_back() + if not action: + return + _actions_history.append(action) + action.redo_action(paint_canvas) + paint_canvas.update() + #print("redo action") + + +func undo_action(): + var action = _actions_history.pop_back() + if not action: + return + _redo_history.append(action) + action.undo_action(paint_canvas) + update() + paint_canvas.update() + #print("undo action") + + +func get_action(): + match brush_mode: + Tools.PAINT: + return GEPencil.new() + Tools.BRUSH: + return GEBrush.new() + Tools.LINE: + return GELine.new() + Tools.RAINBOW: + return GERainbow.new() + Tools.BUCKET: + return GEBucket.new() + Tools.RECT: + return GERect.new() + Tools.DARKEN: + return GEDarken.new() + Tools.BRIGHTEN: + return GEBrighten.new() + Tools.CUT: + return GECut.new() + Tools.PASTECUT: + return GEPasteCut.new() + _: + #print("no tool!") + return null + + +############################################ +# Brushes +############################################ + + +func set_selected_color(color): + selected_color = color + + +func set_brush(new_mode): + if brush_mode == new_mode: + return + _previous_tool = brush_mode + brush_mode = new_mode + + _current_action = get_action() + + match _previous_tool: + Tools.CUT: + paint_canvas.clear_preview_layer() + Tools.PASTECUT: + _selection_cells.clear() + _selection_colors.clear() + Tools.BUCKET: + _current_action = null + #print("Selected: ", Tools.keys()[brush_mode]) + + +func change_color(new_color): + if new_color.a == 0: + return + selected_color = new_color + find_node("ColorPicker").color = selected_color + + +func _on_ColorPicker_color_changed(color): + selected_color = color + + +func _on_PaintTool_pressed(): + set_brush(Tools.PAINT) + + +func _on_BucketTool_pressed(): + set_brush(Tools.BUCKET) + + +func _on_RainbowTool_pressed(): + set_brush(Tools.RAINBOW) + + +func _on_BrushTool_pressed(): + set_brush(Tools.BRUSH) + + +func _on_LineTool_pressed(): + set_brush(Tools.LINE) + + +func _on_RectTool_pressed(): + set_brush(Tools.RECT) + + +func _on_DarkenTool_pressed(): + set_brush(Tools.DARKEN) + + +func _on_BrightenTool_pressed(): + set_brush(Tools.BRIGHTEN) + + +func _on_ColorPickerTool_pressed(): + set_brush(Tools.COLORPICKER) + + +func _on_CutTool_pressed(): + set_brush(Tools.CUT) + + +func _on_Editor_visibility_changed(): + pause_mode = not visible + + + +############################################ +# Layer +############################################ + +func highlight_layer(layer_name: String): + for button in layer_buttons.get_children(): + if paint_canvas.find_layer_by_name(button.name).locked: + button.get("custom_styles/panel").set("bg_color", locked_layer_highlight) + elif button.name == layer_name: + button.get("custom_styles/panel").set("bg_color", current_layer_highlight) + else: + button.get("custom_styles/panel").set("bg_color", other_layer_highlight) + + +func toggle_layer_visibility(button, layer_name: String): + #print("toggling: ", layer_name) + paint_canvas.toggle_layer_visibility(layer_name) + + +func select_layer(layer_name: String): + #print("select layer: ", layer_name) + paint_canvas.select_layer(layer_name) + highlight_layer(layer_name) + + +func lock_layer(button, layer_name: String): + paint_canvas.toggle_lock_layer(layer_name) + highlight_layer(paint_canvas.get_active_layer().name) + + +func add_new_layer(): + var new_layer_button = layer_buttons.get_child(0).duplicate() + new_layer_button.set("custom_styles/panel", layer_buttons.get_child(0).get("custom_styles/panel").duplicate()) + layer_buttons.add_child_below_node( + layer_buttons.get_child(layer_buttons.get_child_count() - 1), new_layer_button, true) + _total_added_layers += 1 + new_layer_button.find_node("Select").text = "Layer " + str(_total_added_layers) + _layer_button_ref[new_layer_button.name] = new_layer_button + _connect_layer_buttons() + + var layer: GELayer = paint_canvas.add_new_layer(new_layer_button.name) + + highlight_layer(paint_canvas.get_active_layer().name) + #print("added layer: ", layer.name) + return layer + + +func remove_active_layer(): + if layer_buttons.get_child_count() <= 1: + return + var layer_name = paint_canvas.active_layer.name + paint_canvas.remove_layer(layer_name) + layer_buttons.remove_child(_layer_button_ref[layer_name]) + _layer_button_ref[layer_name].queue_free() + _layer_button_ref.erase(layer_name) + + highlight_layer(paint_canvas.get_active_layer().name) + + +func duplicate_active_layer(): + var new_layer_button = layer_buttons.get_child(0).duplicate() + new_layer_button.set("custom_styles/panel", layer_buttons.get_child(0).get("custom_styles/panel").duplicate()) + layer_buttons.add_child_below_node( + layer_buttons.get_child(layer_buttons.get_child_count() - 1), new_layer_button, true) + + _total_added_layers += 1 # for keeping track... + new_layer_button.find_node("Select").text = "Layer " + str(_total_added_layers) + + var new_layer = paint_canvas.duplicate_layer(paint_canvas.active_layer.name, new_layer_button.name) + new_layer.update_texture() + _layer_button_ref[new_layer.name] = new_layer_button + + new_layer_button.find_node("Select").connect("pressed", self, "select_layer", [new_layer_button.name]) + new_layer_button.find_node("Visible").connect("pressed", self, "toggle_layer_visibility", + [new_layer_button.find_node("Visible"), new_layer_button.name]) + new_layer_button.find_node("Up").connect("pressed", self, "move_down", [new_layer_button]) + new_layer_button.find_node("Down").connect("pressed", self, "move_up", [new_layer_button]) + new_layer_button.find_node("Lock").connect("pressed", self, "lock_layer", [new_layer_button, new_layer_button.name]) + + # update highlight + highlight_layer(paint_canvas.get_active_layer().name) + #print("added layer: ", new_layer.name, " (total:", layer_buttons.get_child_count(), ")") + + +func move_up(layer_btn): + var new_idx = min(layer_btn.get_index() + 1, layer_buttons.get_child_count()) + #print("move_up: ", layer_btn.name, " from ", layer_btn.get_index(), " to ", new_idx) + layer_buttons.move_child(layer_btn, new_idx) + paint_canvas.move_layer_back(layer_btn.name) + + +func move_down(layer_btn): + var new_idx = max(layer_btn.get_index() - 1, 0) + #print("move_down: ", layer_btn.name, " from ", layer_btn.get_index(), " to ", new_idx) + layer_buttons.move_child(layer_btn, new_idx) + paint_canvas.move_layer_forward(layer_btn.name) + + +func _connect_layer_buttons(): + for layer_btn in layer_buttons.get_children(): + if layer_btn.find_node("Select").is_connected("pressed", self, "select_layer"): + continue + layer_btn.find_node("Select").connect("pressed", self, "select_layer", [layer_btn.name]) + layer_btn.find_node("Visible").connect("pressed", self, "toggle_layer_visibility", + [layer_btn.find_node("Visible"), layer_btn.name]) + layer_btn.find_node("Up").connect("pressed", self, "move_down", [layer_btn]) + layer_btn.find_node("Down").connect("pressed", self, "move_up", [layer_btn]) + layer_btn.find_node("Lock").connect("pressed", self, "lock_layer", + [layer_btn, layer_btn.name]) + + +func _on_Button_pressed(): + add_new_layer() + + +func _on_PaintCanvasContainer_mouse_entered(): + if mouse_on_top == true: + return + mouse_on_top = true + paint_canvas.tool_layer.clear() + paint_canvas.update() + paint_canvas.tool_layer.update_texture() + + +func _on_PaintCanvasContainer_mouse_exited(): + if mouse_on_top == false: + return + mouse_on_top = false + paint_canvas.tool_layer.clear() + paint_canvas.update() + paint_canvas.tool_layer.update_texture() + + +func _on_ColorPicker_popup_closed(): + find_node("Colors").add_color_prefab(find_node("ColorPicker").color) + + +############################################ +# MISC +############################################ + +func is_position_in_canvas(pos): + if Rect2(paint_canvas_container_node.rect_global_position, + paint_canvas_container_node.rect_global_position + paint_canvas_container_node.rect_size).has_point(pos): + return true + return false + + +func is_mouse_in_canvas() -> bool: + if is_position_in_canvas(get_global_mouse_position()): + return true #mouse_on_top # check if mouse is inside canvas + else: + return false + + +func is_any_menu_open() -> bool: + return $ChangeCanvasSize.visible or \ + $ChangeGridSizeDialog.visible or \ + $Settings.visible or \ + $LoadFileDialog.visible or \ + $SaveFileDialog.visible or \ + find_node("Navbar").is_any_menu_open() + + + +func _on_LockAlpha_pressed(): + var checked = find_node("LockAlpha").pressed + paint_canvas.active_layer.toggle_alpha_locked() + for i in range(find_node("Layer").get_popup().get_item_count()): + if find_node("Layer").get_popup().get_item_text(i) == "Toggle Alpha Locked": + find_node("Layer").get_popup().set_item_checked(i, not find_node("Layer").get_popup().is_item_checked(i)) + + +func _on_BrushRect_pressed(): + if brush_mode != Tools.BRUSH: + set_brush(Tools.BRUSH) + selected_brush_prefab = BrushPrefabs.Type.RECT + + +func _on_BrushCircle_pressed(): + if brush_mode != Tools.BRUSH: + set_brush(Tools.BRUSH) + selected_brush_prefab = BrushPrefabs.Type.CIRCLE + + +func _on_BrushVLine_pressed(): + if brush_mode != Tools.BRUSH: + set_brush(Tools.BRUSH) + selected_brush_prefab = BrushPrefabs.Type.V_LINE + + +func _on_BrushHLine_pressed(): + if brush_mode != Tools.BRUSH: + set_brush(Tools.BRUSH) + selected_brush_prefab = BrushPrefabs.Type.H_LINE + + +func _on_BrushSize_value_changed(value: float): + find_node("BrushSizeLabel").text = str(int(value)) + + +func _on_XSymmetry_pressed(): + paint_canvas.symmetry_x = not paint_canvas.symmetry_x + + +func _on_YSymmetry_pressed(): + paint_canvas.symmetry_y = not paint_canvas.symmetry_y diff --git a/game/addons/Godoxel/Editor.tscn b/game/addons/Godoxel/Editor.tscn new file mode 100644 index 0000000..a7676a5 --- /dev/null +++ b/game/addons/Godoxel/Editor.tscn @@ -0,0 +1,1279 @@ +[gd_scene load_steps=56 format=2] + +[ext_resource path="res://addons/Godoxel/Editor.gd" type="Script" id=1] +[ext_resource path="res://addons/Godoxel/dialogs/LoadFileDialog.gd" type="Script" id=2] +[ext_resource path="res://addons/Godoxel/Canvas.gd" type="Script" id=3] +[ext_resource path="res://addons/Godoxel/VisualGrid.tscn" type="PackedScene" id=4] +[ext_resource path="res://addons/Godoxel/CanvasOutline.gd" type="Script" id=5] +[ext_resource path="res://addons/Godoxel/Navbar.gd" type="Script" id=6] +[ext_resource path="res://addons/Godoxel/MenuButtonExtended.gd" type="Script" id=7] +[ext_resource path="res://addons/Godoxel/Colors.gd" type="Script" id=8] +[ext_resource path="res://addons/Godoxel/SaveFileDialog.gd" type="Script" id=9] +[ext_resource path="res://addons/Godoxel/Settings.tscn" type="PackedScene" id=10] +[ext_resource path="res://addons/Godoxel/DebugTextDisplay.gd" type="Script" id=11] +[ext_resource path="res://addons/Godoxel/LayerButton.tscn" type="PackedScene" id=12] +[ext_resource path="res://addons/Godoxel/assets/grid.png" type="Texture" id=13] +[ext_resource path="res://addons/Godoxel/dialogs/ConfirmationDialog.gd" type="Script" id=14] +[ext_resource path="res://addons/Godoxel/dialogs/ChangeGridSizeDialog.gd" type="Script" id=15] +[ext_resource path="res://addons/Godoxel/assets/BrushVLine.png" type="Texture" id=16] +[ext_resource path="res://addons/Godoxel/assets/BrushRect.png" type="Texture" id=17] +[ext_resource path="res://addons/Godoxel/assets/BrushCircle.png" type="Texture" id=18] +[ext_resource path="res://addons/Godoxel/assets/BrushHLine.png" type="Texture" id=19] +[ext_resource path="res://addons/Godoxel/assets/BrushRect_Hovered.png" type="Texture" id=20] +[ext_resource path="res://addons/Godoxel/assets/BrushCircle_Hovered.png" type="Texture" id=21] +[ext_resource path="res://addons/Godoxel/assets/BrushVLine_Hovered.png" type="Texture" id=22] +[ext_resource path="res://addons/Godoxel/assets/BrushHLine_Hovered.png" type="Texture" id=23] + +[sub_resource type="Shader" id=1] +code = "shader_type canvas_item; + +uniform float pixel_size : hint_range(0.01, 1.0); + + +void fragment() { + vec4 color = texture(TEXTURE, UV); + + float light = 0.8; + float dark = 0.4; + + float val = dark; + + if ( int(UV.y * 8.0 * pixel_size) % 2 == 1 ) { + if ( int(UV.x * 8.0 * pixel_size) % 2 == 1 ) { + val = dark; + } + else { + val = light; + } + } + else { + if ( int(UV.x * 8.0 * pixel_size) % 2 == 1 ) { + val = light; + } + else { + val = dark; + } + } + + color.rgb = vec3(val, val, val); + + COLOR = color; +}" + +[sub_resource type="ShaderMaterial" id=2] +shader = SubResource( 1 ) +shader_param/pixel_size = 0.0625 + +[sub_resource type="Image" id=33] +data = { +"data": PoolByteArray( 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0 ), +"format": "RGBA8", +"height": 64, +"mipmaps": false, +"width": 64 +} + +[sub_resource type="ImageTexture" id=4] +flags = 0 +flags = 0 +image = SubResource( 33 ) +size = Vector2( 64, 64 ) + +[sub_resource type="Image" id=34] +data = { +"data": PoolByteArray( 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0 ), +"format": "RGBA8", +"height": 64, +"mipmaps": false, +"width": 64 +} + +[sub_resource type="ImageTexture" id=6] +flags = 0 +flags = 0 +image = SubResource( 34 ) +size = Vector2( 64, 64 ) + +[sub_resource type="StyleBoxFlat" id=7] +bg_color = Color( 0.2, 0.2, 0.2, 1 ) + +[sub_resource type="StyleBoxFlat" id=8] +bg_color = Color( 0.452144, 0.397716, 0.0538159, 1 ) + +[sub_resource type="StyleBoxFlat" id=9] +bg_color = Color( 0.114134, 0.989919, 0.990908, 1 ) + +[sub_resource type="StyleBoxFlat" id=10] +bg_color = Color( 0.315986, 0.563746, 0.536825, 1 ) + +[sub_resource type="StyleBoxFlat" id=11] +bg_color = Color( 0.218219, 0.336323, 0.0659741, 1 ) + +[sub_resource type="StyleBoxFlat" id=12] +bg_color = Color( 0.163289, 0.240192, 0.37346, 1 ) + +[sub_resource type="StyleBoxFlat" id=13] +bg_color = Color( 0.330661, 0.369256, 0.97379, 1 ) + +[sub_resource type="StyleBoxFlat" id=14] +bg_color = Color( 0.216537, 0.755049, 0.491349, 1 ) + +[sub_resource type="StyleBoxFlat" id=15] +bg_color = Color( 0.826652, 0.848742, 0.0115273, 1 ) + +[sub_resource type="StyleBoxFlat" id=16] +bg_color = Color( 0.122094, 0.920589, 0.44931, 1 ) + +[sub_resource type="StyleBoxFlat" id=17] +bg_color = Color( 0.150271, 0.325517, 0.694568, 1 ) + +[sub_resource type="StyleBoxFlat" id=18] +bg_color = Color( 0.703849, 0.926427, 0.334865, 1 ) + +[sub_resource type="StyleBoxFlat" id=19] +bg_color = Color( 0.471709, 0.00867083, 0.188914, 1 ) + +[sub_resource type="StyleBoxFlat" id=20] +bg_color = Color( 0.300704, 0.501144, 0.687167, 1 ) + +[sub_resource type="StyleBoxFlat" id=21] +bg_color = Color( 0.52919, 0.953225, 0.374313, 1 ) + +[sub_resource type="StyleBoxFlat" id=22] +bg_color = Color( 0.443307, 0.0121565, 0.599621, 1 ) + +[sub_resource type="StyleBoxFlat" id=23] +bg_color = Color( 0.868357, 0.245633, 0.583044, 1 ) + +[sub_resource type="StyleBoxFlat" id=24] +bg_color = Color( 0.20955, 0.510868, 0.721501, 1 ) + +[sub_resource type="StyleBoxFlat" id=25] +bg_color = Color( 0.544154, 0.786819, 0.162435, 1 ) + +[sub_resource type="StyleBoxFlat" id=26] +bg_color = Color( 0.309762, 0.772837, 0.467272, 1 ) + +[sub_resource type="StyleBoxFlat" id=27] +bg_color = Color( 0.0682784, 0.753402, 0.362869, 1 ) + +[sub_resource type="StyleBoxFlat" id=28] +bg_color = Color( 0.343818, 0.0699588, 0.589297, 1 ) + +[sub_resource type="StyleBoxFlat" id=29] +bg_color = Color( 0.290648, 0.443224, 0.249702, 1 ) + +[sub_resource type="StyleBoxFlat" id=30] +bg_color = Color( 0.838284, 0.660357, 0.11075, 1 ) + +[sub_resource type="StyleBoxFlat" id=31] +bg_color = Color( 0.876227, 0.296861, 0.400053, 1 ) + +[sub_resource type="StyleBoxFlat" id=32] +bg_color = Color( 0.156863, 0.156863, 0.156863, 1 ) +border_width_top = 2 +border_color = Color( 0.0901961, 0.0901961, 0.0901961, 1 ) + +[node name="Editor" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +rect_clip_content = true +size_flags_horizontal = 3 +size_flags_vertical = 3 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Panel" type="Panel" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="NoBCViewportsnotworking26181" type="Control" parent="Panel"] +anchor_right = 1.0 +anchor_bottom = 1.0 +__meta__ = { +"_edit_lock_": true, +"_editor_description_": "https://github.com/godotengine/godot/issues/26181" +} + +[node name="Control" type="Control" parent="Panel/NoBCViewportsnotworking26181"] +anchor_top = 0.0833333 +anchor_right = 1.0 +anchor_bottom = 0.93 +__meta__ = { +"_edit_use_anchors_": true +} + +[node name="PaintCanvasContainer" type="Control" parent="Panel/NoBCViewportsnotworking26181/Control"] +anchor_left = 0.137695 +anchor_right = 0.862305 +anchor_bottom = 1.0 +focus_mode = 1 +mouse_filter = 1 +size_flags_horizontal = 3 +size_flags_vertical = 3 +size_flags_stretch_ratio = 6.0 +__meta__ = { +"_edit_use_anchors_": true +} + +[node name="Canvas" type="Control" parent="Panel/NoBCViewportsnotworking26181/Control/PaintCanvasContainer"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -238.288 +margin_top = -118.205 +margin_right = 17.7117 +margin_bottom = 137.795 +mouse_filter = 1 +size_flags_horizontal = 3 +size_flags_vertical = 3 +script = ExtResource( 3 ) +__meta__ = { +"_edit_group_": true, +"_edit_use_anchors_": false +} +pixel_size = 4 +canvas_width = 64 +canvas_height = 64 +grid_size = 1 +big_grid_size = 8 + +[node name="CanvasBackground" type="TextureRect" parent="Panel/NoBCViewportsnotworking26181/Control/PaintCanvasContainer/Canvas"] +show_behind_parent = true +material = SubResource( 2 ) +anchor_right = 1.0 +anchor_bottom = 1.0 +texture = ExtResource( 13 ) +expand = true +stretch_mode = 2 +__meta__ = { +"_edit_lock_": true +} + +[node name="CanvasLayers" type="Control" parent="Panel/NoBCViewportsnotworking26181/Control/PaintCanvasContainer/Canvas"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +__meta__ = { +"_edit_lock_": true, +"_edit_use_anchors_": false +} + +[node name="PreviewLayer" type="TextureRect" parent="Panel/NoBCViewportsnotworking26181/Control/PaintCanvasContainer/Canvas"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +texture = SubResource( 4 ) +expand = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ToolPreviewLayer" type="TextureRect" parent="Panel/NoBCViewportsnotworking26181/Control/PaintCanvasContainer/Canvas"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +texture = SubResource( 6 ) +expand = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Grid" parent="Panel/NoBCViewportsnotworking26181/Control/PaintCanvasContainer/Canvas" instance=ExtResource( 4 )] +mouse_filter = 2 +color = Color( 1, 1, 1, 0.415686 ) +size = 4 + +[node name="CanvasOutline" type="Control" parent="Panel/NoBCViewportsnotworking26181/Control/PaintCanvasContainer/Canvas"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +script = ExtResource( 5 ) +__meta__ = { +"_edit_lock_": true, +"_edit_use_anchors_": false +} +color = Color( 0, 1, 0, 1 ) + +[node name="RightPanel" type="Panel" parent="Panel/NoBCViewportsnotworking26181/Control"] +anchor_left = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = -140.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/panel = SubResource( 7 ) +__meta__ = { +"_edit_use_anchors_": true +} + +[node name="ScrollContainer" type="ScrollContainer" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 4.0 +margin_right = -4.0 +margin_bottom = -4.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ToolMenu" type="VBoxContainer" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer"] +margin_right = 132.0 +margin_bottom = 500.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Tools" type="VBoxContainer" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu"] +margin_right = 132.0 +margin_bottom = 248.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="PaintTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"] +margin_right = 132.0 +margin_bottom = 21.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Pencil (Q)" + +[node name="BrushTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"] +visible = false +margin_top = 24.0 +margin_right = 132.0 +margin_bottom = 44.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Brush" + +[node name="MultiTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"] +visible = false +margin_top = 24.0 +margin_right = 132.0 +margin_bottom = 44.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Polygon" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="BucketTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"] +margin_top = 25.0 +margin_right = 132.0 +margin_bottom = 46.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Bucket Fill (F)" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="RainbowTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"] +margin_top = 50.0 +margin_right = 132.0 +margin_bottom = 71.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Rainbow (R)" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="LineTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"] +margin_top = 75.0 +margin_right = 132.0 +margin_bottom = 96.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Line (L)" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="RectTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"] +margin_top = 100.0 +margin_right = 132.0 +margin_bottom = 122.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Rectangle" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="DarkenTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"] +margin_top = 126.0 +margin_right = 132.0 +margin_bottom = 147.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Darken (D)" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="BrightenTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"] +margin_top = 151.0 +margin_right = 132.0 +margin_bottom = 172.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Brighten (B)" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ColorPickerTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"] +margin_top = 176.0 +margin_right = 132.0 +margin_bottom = 197.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Color Picker (P)" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="CutTool" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"] +margin_top = 201.0 +margin_right = 132.0 +margin_bottom = 222.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Cut Section (C)" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ColorPicker" type="ColorPickerButton" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools"] +margin_top = 226.0 +margin_right = 132.0 +margin_bottom = 248.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Control" type="ScrollContainer" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu"] +margin_top = 252.0 +margin_right = 132.0 +margin_bottom = 500.0 +size_flags_vertical = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Control"] +margin_right = 132.0 +margin_bottom = 248.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="LayerButtons" type="VBoxContainer" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Control/VBoxContainer"] +margin_right = 132.0 +margin_bottom = 219.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Layer1" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Control/VBoxContainer/LayerButtons" instance=ExtResource( 12 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_right = 132.0 +margin_bottom = 32.0 + +[node name="Button" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Control/VBoxContainer"] +margin_top = 223.0 +margin_right = 132.0 +margin_bottom = 248.0 +rect_min_size = Vector2( 0, 25 ) +size_flags_horizontal = 3 +text = "+" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="LeftPanel" type="Panel" parent="Panel/NoBCViewportsnotworking26181/Control"] +anchor_right = 0.0166016 +anchor_bottom = 1.0 +margin_right = 140.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/panel = SubResource( 7 ) +__meta__ = { +"_edit_use_anchors_": true, +"_editor_description_": "" +} + +[node name="MarginContainer" type="MarginContainer" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel"] +anchor_right = 1.0 +anchor_bottom = 1.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer"] +margin_right = 157.0 +margin_bottom = 508.0 +custom_constants/separation = 12 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ScrollContainer" type="ScrollContainer" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer"] +margin_right = 157.0 +margin_bottom = 144.0 +rect_min_size = Vector2( 0, 144 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Colors" type="GridContainer" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer"] +margin_right = 145.0 +margin_bottom = 170.0 +rect_min_size = Vector2( 0, 144 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +columns = 4 +script = ExtResource( 8 ) + +[node name="Button1" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_right = 33.0 +margin_bottom = 25.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 8 ) + +[node name="Button2" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 37.0 +margin_right = 70.0 +margin_bottom = 25.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 9 ) + +[node name="Button3" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 74.0 +margin_right = 107.0 +margin_bottom = 25.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 10 ) + +[node name="Button4" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 111.0 +margin_right = 144.0 +margin_bottom = 25.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 11 ) + +[node name="Button5" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_top = 29.0 +margin_right = 33.0 +margin_bottom = 54.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 12 ) + +[node name="Button6" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 37.0 +margin_top = 29.0 +margin_right = 70.0 +margin_bottom = 54.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 13 ) + +[node name="Button7" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 74.0 +margin_top = 29.0 +margin_right = 107.0 +margin_bottom = 54.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 14 ) + +[node name="Button8" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 111.0 +margin_top = 29.0 +margin_right = 144.0 +margin_bottom = 54.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 15 ) + +[node name="Button9" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_top = 58.0 +margin_right = 33.0 +margin_bottom = 83.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 16 ) + +[node name="Button10" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 37.0 +margin_top = 58.0 +margin_right = 70.0 +margin_bottom = 83.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 17 ) + +[node name="Button11" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 74.0 +margin_top = 58.0 +margin_right = 107.0 +margin_bottom = 83.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 18 ) + +[node name="Button12" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 111.0 +margin_top = 58.0 +margin_right = 144.0 +margin_bottom = 83.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 19 ) + +[node name="Button13" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_top = 87.0 +margin_right = 33.0 +margin_bottom = 112.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 20 ) + +[node name="Button14" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 37.0 +margin_top = 87.0 +margin_right = 70.0 +margin_bottom = 112.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 21 ) + +[node name="Button15" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 74.0 +margin_top = 87.0 +margin_right = 107.0 +margin_bottom = 112.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 22 ) + +[node name="Button16" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 111.0 +margin_top = 87.0 +margin_right = 144.0 +margin_bottom = 112.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 23 ) + +[node name="Button17" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_top = 116.0 +margin_right = 33.0 +margin_bottom = 141.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 24 ) + +[node name="Button18" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 37.0 +margin_top = 116.0 +margin_right = 70.0 +margin_bottom = 141.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 25 ) + +[node name="Button19" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 74.0 +margin_top = 116.0 +margin_right = 107.0 +margin_bottom = 141.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 26 ) + +[node name="Button20" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 111.0 +margin_top = 116.0 +margin_right = 144.0 +margin_bottom = 141.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 27 ) + +[node name="Button21" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_top = 145.0 +margin_right = 33.0 +margin_bottom = 170.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 28 ) + +[node name="Button22" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 37.0 +margin_top = 145.0 +margin_right = 70.0 +margin_bottom = 170.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 29 ) + +[node name="Button23" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 74.0 +margin_top = 145.0 +margin_right = 107.0 +margin_bottom = 170.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 30 ) + +[node name="Button24" type="Button" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/ScrollContainer/Colors"] +margin_left = 111.0 +margin_top = 145.0 +margin_right = 144.0 +margin_bottom = 170.0 +rect_min_size = Vector2( 25, 25 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 31 ) + +[node name="VBoxContainer" type="VBoxContainer" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer"] +margin_top = 156.0 +margin_right = 157.0 +margin_bottom = 196.0 + +[node name="LockAlpha" type="CheckButton" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/VBoxContainer"] +margin_right = 157.0 +margin_bottom = 40.0 +text = "Lock Alpha" +align = 2 + +[node name="BrushSelection" type="GridContainer" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer"] +margin_top = 208.0 +margin_right = 157.0 +margin_bottom = 233.0 +columns = 4 + +[node name="BrushRect" type="TextureButton" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/BrushSelection"] +margin_right = 25.0 +margin_bottom = 25.0 +rect_min_size = Vector2( 25, 25 ) +texture_normal = ExtResource( 17 ) +texture_hover = ExtResource( 20 ) + +[node name="BrushCircle" type="TextureButton" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/BrushSelection"] +margin_left = 29.0 +margin_right = 54.0 +margin_bottom = 25.0 +rect_min_size = Vector2( 25, 25 ) +texture_normal = ExtResource( 18 ) +texture_hover = ExtResource( 21 ) + +[node name="BrushVLine" type="TextureButton" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/BrushSelection"] +margin_left = 58.0 +margin_right = 83.0 +margin_bottom = 25.0 +rect_min_size = Vector2( 25, 25 ) +texture_normal = ExtResource( 16 ) +texture_hover = ExtResource( 22 ) + +[node name="BrushHLine" type="TextureButton" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/BrushSelection"] +margin_left = 87.0 +margin_right = 112.0 +margin_bottom = 25.0 +rect_min_size = Vector2( 25, 25 ) +texture_normal = ExtResource( 19 ) +texture_hover = ExtResource( 23 ) + +[node name="VSplitContainer" type="VBoxContainer" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer"] +margin_top = 245.0 +margin_right = 157.0 +margin_bottom = 279.0 +size_flags_horizontal = 3 + +[node name="BrushLabel" type="Label" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/VSplitContainer"] +margin_right = 157.0 +margin_bottom = 14.0 +text = "Brush Size" + +[node name="HBoxContainer" type="HBoxContainer" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/VSplitContainer"] +margin_top = 18.0 +margin_right = 157.0 +margin_bottom = 34.0 + +[node name="BrushSizeLabel" type="Label" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/VSplitContainer/HBoxContainer"] +margin_top = 1.0 +margin_right = 30.0 +margin_bottom = 15.0 +rect_min_size = Vector2( 30, 0 ) +text = "1" + +[node name="BrushSize" type="HSlider" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/VSplitContainer/HBoxContainer"] +margin_left = 34.0 +margin_right = 157.0 +margin_bottom = 16.0 +size_flags_horizontal = 3 +size_flags_vertical = 2 +min_value = 1.0 +value = 1.0 + +[node name="XSymmetry" type="CheckButton" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer"] +margin_top = 291.0 +margin_right = 157.0 +margin_bottom = 331.0 +text = "X Symmetry" + +[node name="YSymmetry" type="CheckButton" parent="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer"] +margin_top = 343.0 +margin_right = 157.0 +margin_bottom = 383.0 +text = "Y Symmetry" + +[node name="Navbar" type="Control" parent="Panel/NoBCViewportsnotworking26181"] +anchor_right = 1.0 +anchor_bottom = 0.0833333 +size_flags_horizontal = 3 +size_flags_vertical = 3 +script = ExtResource( 6 ) +__meta__ = { +"_edit_use_anchors_": true +} + +[node name="Panel" type="Panel" parent="Panel/NoBCViewportsnotworking26181/Navbar"] +self_modulate = Color( 0.854902, 0.854902, 0.854902, 1 ) +anchor_right = 1.0 +anchor_bottom = 1.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Buttons" type="HBoxContainer" parent="Panel/NoBCViewportsnotworking26181/Navbar"] +anchor_left = 0.0078125 +anchor_top = 0.12 +anchor_right = 0.628906 +anchor_bottom = 0.62 +custom_constants/separation = 20 +__meta__ = { +"_edit_use_anchors_": true +} + +[node name="File" type="MenuButton" parent="Panel/NoBCViewportsnotworking26181/Navbar/Buttons"] +margin_right = 73.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "File" +flat = false +items = [ "New", null, 0, false, false, 0, 0, null, "", false, "Save", null, 0, false, false, 1, 0, null, "", false, "Load", null, 0, false, false, 2, 0, null, "", false ] +switch_on_hover = true +script = ExtResource( 7 ) + +[node name="Edit" type="MenuButton" parent="Panel/NoBCViewportsnotworking26181/Navbar/Buttons"] +margin_left = 93.0 +margin_right = 167.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +disabled = true +text = "Edit" +flat = false +items = [ "Undo", null, 0, false, false, 0, 0, null, "", false, "Redo", null, 0, false, false, 1, 0, null, "", false, "Cut", null, 0, false, false, 2, 0, null, "", false, "Copy", null, 0, false, false, 3, 0, null, "", false, "Paste", null, 0, false, false, 4, 0, null, "", false ] +switch_on_hover = true +script = ExtResource( 7 ) + +[node name="Canvas" type="MenuButton" parent="Panel/NoBCViewportsnotworking26181/Navbar/Buttons"] +margin_left = 187.0 +margin_right = 260.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Canvas" +flat = false +items = [ "Change Size", null, 0, false, false, 0, 0, null, "", false, "Crop To Content", null, 0, false, true, 1, 0, null, "", false ] +switch_on_hover = true +script = ExtResource( 7 ) + +[node name="Layer" type="MenuButton" parent="Panel/NoBCViewportsnotworking26181/Navbar/Buttons"] +margin_left = 280.0 +margin_right = 354.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Layer" +flat = false +items = [ "Add Layer", null, 0, false, false, 0, 0, null, "", false, "Delete Layer", null, 0, false, false, 1, 0, null, "", false, "Duplicate Layer", null, 0, false, false, 2, 0, null, "", false, "Clear Layer", null, 0, false, false, 3, 0, null, "", false, "", null, 0, false, false, 4, 0, null, "", true, "Toggle Alpha Locked", null, 1, false, false, 5, 0, null, "", false ] +switch_on_hover = true +script = ExtResource( 7 ) + +[node name="Grid" type="MenuButton" parent="Panel/NoBCViewportsnotworking26181/Navbar/Buttons"] +margin_left = 374.0 +margin_right = 447.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Grid" +flat = false +items = [ "Toggle Grid", null, 0, false, false, 0, 0, null, "", false, "Change Grid Size", null, 0, false, false, 1, 0, null, "", false ] +switch_on_hover = true +script = ExtResource( 7 ) + +[node name="Magic" type="MenuButton" parent="Panel/NoBCViewportsnotworking26181/Navbar/Buttons"] +margin_left = 467.0 +margin_right = 541.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Magic" +flat = false +items = [ "ChangeSingleColor", null, 0, false, false, 0, 0, null, "", false, "ChangeColorRange", null, 0, false, false, 1, 0, null, "", false, "HSV Noise", null, 0, false, false, 2, 0, null, "", false, "HSV Color Modulation", null, 0, false, false, 3, 0, null, "", false ] +switch_on_hover = true +script = ExtResource( 7 ) + +[node name="Editor" type="MenuButton" parent="Panel/NoBCViewportsnotworking26181/Navbar/Buttons"] +margin_left = 561.0 +margin_right = 635.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Editor" +flat = false +items = [ "Settings", null, 0, false, false, 0, 0, null, "", false ] +switch_on_hover = true +script = ExtResource( 7 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label" type="Label" parent="Panel/NoBCViewportsnotworking26181/Navbar"] +modulate = Color( 1, 1, 1, 0.184314 ) +anchor_left = 1.0 +anchor_right = 1.0 +margin_left = -164.0 +margin_bottom = 50.0 +text = "Undo (Z) +Redo (Y)" +align = 1 +valign = 1 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="BottomPanel" type="Panel" parent="Panel/NoBCViewportsnotworking26181"] +anchor_top = 0.931667 +anchor_right = 0.839844 +anchor_bottom = 0.998333 +rect_min_size = Vector2( 0, 40 ) +size_flags_horizontal = 3 +custom_styles/panel = SubResource( 32 ) +__meta__ = { +"_edit_group_": true, +"_edit_use_anchors_": true +} + +[node name="DebugTextDisplay" type="RichTextLabel" parent="Panel/NoBCViewportsnotworking26181/BottomPanel"] +anchor_right = 1.0 +anchor_bottom = 1.0 +text = "FPS 60 Mouse Position (-12, 130) Canvas Mouse Position (-285.711731, -55.794662) Canvas Position (273.711731, 185.794662) +Cell Position (67, -25) Cell Color 0,0,0,0 " +scroll_active = false +script = ExtResource( 11 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="SaveFileDialog" type="FileDialog" parent="."] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -340.0 +margin_top = -165.0 +margin_right = 340.0 +margin_bottom = 165.0 +mouse_filter = 1 +filters = PoolStringArray( "*.png ; PNG Images" ) +script = ExtResource( 9 ) + +[node name="LoadFileDialog" type="FileDialog" parent="."] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -340.0 +margin_top = -165.0 +margin_right = 340.0 +margin_bottom = 165.0 +mouse_filter = 1 +window_title = "Open a File" +mode = 0 +filters = PoolStringArray( "*.png ; PNG Images" ) +script = ExtResource( 2 ) + +[node name="Settings" parent="." instance=ExtResource( 10 )] +visible = false +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -150.0 +margin_top = -50.0 +margin_right = 150.0 +margin_bottom = 50.0 +mouse_filter = 1 + +[node name="ChangeCanvasSize" type="ConfirmationDialog" parent="."] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -162.0 +margin_top = -69.0 +margin_right = 162.0 +margin_bottom = 69.0 +script = ExtResource( 14 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="ChangeCanvasSize"] +anchor_left = 0.104938 +anchor_top = 0.108696 +anchor_right = 0.891975 +anchor_bottom = 0.695652 +margin_left = -25.9999 +margin_top = -7.00005 +margin_right = 27.0001 +margin_bottom = 6.00002 +__meta__ = { +"_edit_use_anchors_": true +} + +[node name="Label" type="Label" parent="ChangeCanvasSize/VBoxContainer"] +margin_top = 7.0 +margin_right = 308.0 +margin_bottom = 21.0 +size_flags_vertical = 6 +text = "Change canvas size?" +align = 1 + +[node name="HBoxContainer" type="HBoxContainer" parent="ChangeCanvasSize/VBoxContainer"] +margin_top = 32.0 +margin_right = 308.0 +margin_bottom = 61.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Label" type="Label" parent="ChangeCanvasSize/VBoxContainer/HBoxContainer"] +margin_top = 7.0 +margin_right = 152.0 +margin_bottom = 21.0 +size_flags_horizontal = 3 +size_flags_vertical = 6 +text = "Width (X)" + +[node name="Width" type="SpinBox" parent="ChangeCanvasSize/VBoxContainer/HBoxContainer"] +margin_left = 156.0 +margin_right = 308.0 +margin_bottom = 29.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +min_value = 1.0 +max_value = 2500.0 +value = 64.0 +align = 1 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBoxContainer2" type="HBoxContainer" parent="ChangeCanvasSize/VBoxContainer"] +margin_top = 65.0 +margin_right = 308.0 +margin_bottom = 94.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Label" type="Label" parent="ChangeCanvasSize/VBoxContainer/HBoxContainer2"] +margin_top = 7.0 +margin_right = 152.0 +margin_bottom = 21.0 +size_flags_horizontal = 3 +size_flags_vertical = 6 +text = "Height (Y)" + +[node name="Height" type="SpinBox" parent="ChangeCanvasSize/VBoxContainer/HBoxContainer2"] +margin_left = 156.0 +margin_right = 308.0 +margin_bottom = 29.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +min_value = 1.0 +max_value = 2500.0 +value = 64.0 +align = 1 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ChangeGridSizeDialog" type="AcceptDialog" parent="."] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -127.0 +margin_top = -74.0 +margin_right = 128.0 +margin_bottom = 73.0 +window_title = "Change Grid Size" +resizable = true +script = ExtResource( 15 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="ChangeGridSizeDialog"] +anchor_left = 0.0313726 +anchor_top = 0.0816327 +anchor_right = 0.968627 +anchor_bottom = 0.727891 +margin_left = -1.23978e-05 +margin_top = -4.00001 +margin_right = 0.00012207 +margin_bottom = 4.00002 +__meta__ = { +"_edit_use_anchors_": true +} + +[node name="Label" type="Label" parent="ChangeGridSizeDialog/VBoxContainer"] +margin_right = 239.0 +margin_bottom = 31.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Change Grid Size" +align = 1 + +[node name="HBoxContainer" type="HBoxContainer" parent="ChangeGridSizeDialog/VBoxContainer"] +margin_top = 35.0 +margin_right = 239.0 +margin_bottom = 67.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Label" type="Label" parent="ChangeGridSizeDialog/VBoxContainer/HBoxContainer"] +margin_top = 9.0 +margin_right = 117.0 +margin_bottom = 23.0 +size_flags_horizontal = 3 +size_flags_vertical = 6 +text = "Grid 1" + +[node name="GridValue" type="SpinBox" parent="ChangeGridSizeDialog/VBoxContainer/HBoxContainer"] +margin_left = 121.0 +margin_top = 4.0 +margin_right = 239.0 +margin_bottom = 28.0 +size_flags_horizontal = 3 +size_flags_vertical = 6 +max_value = 2500.0 +value = 1.0 + +[node name="HBoxContainer2" type="HBoxContainer" parent="ChangeGridSizeDialog/VBoxContainer"] +margin_top = 71.0 +margin_right = 239.0 +margin_bottom = 103.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Label" type="Label" parent="ChangeGridSizeDialog/VBoxContainer/HBoxContainer2"] +margin_top = 9.0 +margin_right = 117.0 +margin_bottom = 23.0 +size_flags_horizontal = 3 +size_flags_vertical = 6 +text = "Grid 2" + +[node name="BigGridValue" type="SpinBox" parent="ChangeGridSizeDialog/VBoxContainer/HBoxContainer2"] +margin_left = 121.0 +margin_top = 4.0 +margin_right = 239.0 +margin_bottom = 28.0 +size_flags_horizontal = 3 +size_flags_vertical = 6 +max_value = 2500.0 +value = 8.0 +[connection signal="mouse_entered" from="Panel/NoBCViewportsnotworking26181/Control/PaintCanvasContainer" to="." method="_on_PaintCanvasContainer_mouse_entered"] +[connection signal="mouse_exited" from="Panel/NoBCViewportsnotworking26181/Control/PaintCanvasContainer" to="." method="_on_PaintCanvasContainer_mouse_exited"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/PaintTool" to="." method="_on_PaintTool_pressed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/BrushTool" to="." method="_on_BrushTool_pressed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/MultiTool" to="." method="_on_MultiTool_pressed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/BucketTool" to="." method="_on_BucketTool_pressed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/RainbowTool" to="." method="_on_RainbowTool_pressed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/LineTool" to="." method="_on_LineTool_pressed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/RectTool" to="." method="_on_RectTool_pressed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/DarkenTool" to="." method="_on_DarkenTool_pressed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/BrightenTool" to="." method="_on_BrightenTool_pressed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/ColorPickerTool" to="." method="_on_ColorPickerTool_pressed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/CutTool" to="." method="_on_CutTool_pressed"] +[connection signal="color_changed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/ColorPicker" to="." method="_on_ColorPicker_color_changed"] +[connection signal="popup_closed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Tools/ColorPicker" to="." method="_on_ColorPicker_popup_closed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/RightPanel/ScrollContainer/ToolMenu/Control/VBoxContainer/Button" to="." method="_on_Button_pressed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/VBoxContainer/LockAlpha" to="." method="_on_LockAlpha_pressed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/BrushSelection/BrushRect" to="." method="_on_BrushRect_pressed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/BrushSelection/BrushCircle" to="." method="_on_BrushCircle_pressed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/BrushSelection/BrushVLine" to="." method="_on_BrushVLine_pressed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/BrushSelection/BrushHLine" to="." method="_on_BrushHLine_pressed"] +[connection signal="value_changed" from="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/VSplitContainer/HBoxContainer/BrushSize" to="." method="_on_BrushSize_value_changed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/XSymmetry" to="." method="_on_XSymmetry_pressed"] +[connection signal="pressed" from="Panel/NoBCViewportsnotworking26181/Control/LeftPanel/MarginContainer/VBoxContainer/YSymmetry" to="." method="_on_YSymmetry_pressed"] +[connection signal="about_to_show" from="SaveFileDialog" to="SaveFileDialog" method="_on_SaveFileDialog_about_to_show"] +[connection signal="confirmed" from="SaveFileDialog" to="SaveFileDialog" method="_on_SaveFileDialog_confirmed"] +[connection signal="file_selected" from="SaveFileDialog" to="SaveFileDialog" method="_on_SaveFileDialog_file_selected"] +[connection signal="visibility_changed" from="SaveFileDialog" to="SaveFileDialog" method="_on_SaveFileDialog_visibility_changed"] +[connection signal="about_to_show" from="LoadFileDialog" to="LoadFileDialog" method="_on_LoadFileDialog_about_to_show"] +[connection signal="confirmed" from="LoadFileDialog" to="LoadFileDialog" method="_on_LoadFileDialog_confirmed"] +[connection signal="file_selected" from="LoadFileDialog" to="LoadFileDialog" method="_on_LoadFileDialog_file_selected"] +[connection signal="visibility_changed" from="LoadFileDialog" to="LoadFileDialog" method="_on_LoadFileDialog_visibility_changed"] +[connection signal="confirmed" from="ChangeCanvasSize" to="ChangeCanvasSize" method="_on_ConfirmationDialog_confirmed"] +[connection signal="visibility_changed" from="ChangeCanvasSize" to="ChangeCanvasSize" method="_on_ChangeCanvasSize_visibility_changed"] +[connection signal="confirmed" from="ChangeGridSizeDialog" to="ChangeGridSizeDialog" method="_on_ChangeGridSizeDialog_confirmed"] +[connection signal="visibility_changed" from="ChangeGridSizeDialog" to="ChangeGridSizeDialog" method="_on_ChangeGridSizeDialog_visibility_changed"] +[connection signal="value_changed" from="ChangeGridSizeDialog/VBoxContainer/HBoxContainer/GridValue" to="ChangeGridSizeDialog" method="_on_GridValue_value_changed"] +[connection signal="value_changed" from="ChangeGridSizeDialog/VBoxContainer/HBoxContainer2/BigGridValue" to="ChangeGridSizeDialog" method="_on_BigGridValue_value_changed"] diff --git a/game/addons/Godoxel/Layer.gd b/game/addons/Godoxel/Layer.gd new file mode 100644 index 0000000..1200f3b --- /dev/null +++ b/game/addons/Godoxel/Layer.gd @@ -0,0 +1,98 @@ +extends Reference +class_name GELayer + + +var name +var layer_width +var layer_height +var visible = true setget set_visible +var locked = false +var alpha_locked = false + +var texture: ImageTexture +var image: Image +var texture_rect_ref + + +func _init(): + texture = ImageTexture.new() + + +func create(texture_rect_ref, width: int, height: int): + self.texture_rect_ref = texture_rect_ref + + layer_width = width + layer_height = height + + image = Image.new() + image.create(width, height, false, Image.FORMAT_RGBA8) + image.fill(Color.transparent) + update_texture() + + +func resize(width: int, height: int): + var pixel_colors = [] + var prev_width = layer_width + var prev_height = layer_height + + image.lock() + for y in range(prev_height): + for x in range(prev_width): + pixel_colors.append(image.get_pixel(x, y)) + image.unlock() + + layer_width = width + layer_height = height + + image.create(width, height, false, Image.FORMAT_RGBA8) + + image.lock() + for x in range(prev_width): + for y in range(prev_height): + if x >= width or y >= height: + continue + image.set_pixel(x, y, pixel_colors[GEUtils.to_1D(x, y, prev_width)]) + image.unlock() + + update_texture() + + +func set_pixel(x, y, color): + image.lock() + image.set_pixel(x, y, color) + image.unlock() + + +func get_pixel(x: int, y: int): + if x < 0 or y < 0 or x >= image.get_width() or y >= image.get_height(): + return null + image.lock() + var pixel = image.get_pixel(x, y) + image.unlock() + return pixel + + +func clear(): + image.fill(Color.transparent) + update_texture() + + +func update_texture(): + texture.create_from_image(image, 0) + texture_rect_ref.texture = texture + texture_rect_ref.margin_right = 0 + texture_rect_ref.margin_bottom = 0 + + +func set_visible(vis: bool): + visible = vis + texture_rect_ref.visible = visible + + +func toggle_lock(): + locked = not locked + + +func toggle_alpha_locked(): + alpha_locked = not alpha_locked + diff --git a/game/addons/Godoxel/LayerButton.tscn b/game/addons/Godoxel/LayerButton.tscn new file mode 100644 index 0000000..9252482 --- /dev/null +++ b/game/addons/Godoxel/LayerButton.tscn @@ -0,0 +1,110 @@ +[gd_scene load_steps=11 format=2] + +[ext_resource path="res://addons/Godoxel/assets/minidotta_invis.png" type="Texture" id=1] +[ext_resource path="res://addons/Godoxel/assets/minidotta.png" type="Texture" id=2] +[ext_resource path="res://addons/Godoxel/assets/arrow_down.png" type="Texture" id=3] +[ext_resource path="res://addons/Godoxel/assets/arrow_up.png" type="Texture" id=4] +[ext_resource path="res://addons/Godoxel/assets/lock_layer_1.png" type="Texture" id=5] +[ext_resource path="res://addons/Godoxel/assets/unlock_layer.png" type="Texture" id=6] + + +[sub_resource type="StyleBoxFlat" id=4] +bg_color = Color( 0.180392, 0.176471, 0.176471, 1 ) + +[sub_resource type="StyleBoxFlat" id=1] +bg_color = Color( 0.25098, 0.25098, 0.25098, 0 ) + +[sub_resource type="StyleBoxFlat" id=2] +bg_color = Color( 0.6, 0.6, 0.6, 0 ) + +[sub_resource type="StyleBoxFlat" id=3] +bg_color = Color( 0.6, 0.6, 0.6, 0 ) + +[node name="Layer1" type="Panel"] +show_behind_parent = true +anchor_right = 0.113281 +anchor_bottom = 0.0416667 +margin_bottom = -1.90735e-06 +rect_min_size = Vector2( 0, 32 ) +mouse_filter = 2 +custom_styles/panel = SubResource( 4 ) +__meta__ = { +"_edit_use_anchors_": true +} + +[node name="Select" type="Button" parent="." groups=[ +"layer_button", +]] +anchor_right = 0.827586 +anchor_bottom = 1.0 +custom_styles/hover = SubResource( 1 ) +custom_styles/pressed = SubResource( 1 ) +custom_styles/focus = SubResource( 1 ) +custom_styles/disabled = SubResource( 1 ) +custom_styles/normal = SubResource( 1 ) +text = "Layer 1" +align = 2 +__meta__ = { +"_edit_use_anchors_": true +} + +[node name="Visible" type="CheckButton" parent="."] +anchor_top = 0.5 +anchor_bottom = 0.5 +margin_left = 3.0 +margin_top = -8.5 +margin_right = 19.0 +margin_bottom = 7.5 +custom_icons/off = ExtResource( 1 ) +custom_icons/on = ExtResource( 2 ) +custom_styles/normal = SubResource( 2 ) +pressed = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Lock" type="CheckButton" parent="."] +anchor_top = 0.5 +anchor_bottom = 0.5 +margin_left = 22.0 +margin_top = -11.0 +margin_right = 46.0 +margin_bottom = 11.0 +custom_icons/off = ExtResource( 6 ) +custom_icons/on = ExtResource( 5 ) +custom_styles/normal = SubResource( 3 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +anchor_left = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = -20.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Up" type="TextureButton" parent="VBoxContainer"] +margin_right = 20.0 +margin_bottom = 14.0 +rect_min_size = Vector2( 20, 0 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture_normal = ExtResource( 4 ) +texture_pressed = ExtResource( 2 ) +expand = true +stretch_mode = 3 + +[node name="Down" type="TextureButton" parent="VBoxContainer"] +margin_top = 18.0 +margin_right = 20.0 +margin_bottom = 32.0 +rect_min_size = Vector2( 20, 0 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture_normal = ExtResource( 3 ) +texture_pressed = ExtResource( 2 ) +expand = true +stretch_mode = 3 diff --git a/game/addons/Godoxel/MenuButtonExtended.gd b/game/addons/Godoxel/MenuButtonExtended.gd new file mode 100644 index 0000000..dd442f6 --- /dev/null +++ b/game/addons/Godoxel/MenuButtonExtended.gd @@ -0,0 +1,13 @@ +tool +extends MenuButton + +var popup = get_popup() +signal item_pressed + +func _ready(): + popup.connect("id_pressed", self, "id_pressed") + +func id_pressed(id): + emit_signal("item_pressed", name, popup.get_item_text(id), id) + + diff --git a/game/addons/Godoxel/Navbar.gd b/game/addons/Godoxel/Navbar.gd new file mode 100644 index 0000000..5752c3f --- /dev/null +++ b/game/addons/Godoxel/Navbar.gd @@ -0,0 +1,106 @@ +tool +extends Control + +var editor +var paint_canvas + +func _ready(): + editor = owner + paint_canvas = editor.find_node("PaintCanvas") + + for i in get_node("Buttons").get_children(): + i.connect("item_pressed", self, "button_pressed") + + +func button_pressed(button_name, button_item, id): +# print("pressed: ", button_name) +# print("pressed item is: '%s'" % button_item) + + match button_name: + "File": + handle_file_menu(button_item, id) + "Edit": + handle_edit_menu(button_item, id) + "Canvas": + handle_canvas_menu(button_item, id) + "Layer": + handle_layer_menu(button_item, id) + "Grid": + handle_grid_menu(button_item, id) + "Magic": + handle_magic_menu(button_item, id) + "Editor": + handle_editor_menu(button_item, id) + + +func handle_file_menu(pressed_item: String, id): + match pressed_item: + "Save": + owner.get_node("SaveFileDialog").show() + "Load": + owner.get_node("LoadFileDialog").show() + "New": + owner.get_node("ConfirmationDialog").show() + + +func handle_edit_menu(pressed_item: String, id): + match pressed_item: + "Add Layer": + editor.add_new_layer() + + +func handle_canvas_menu(pressed_item: String, id): + match pressed_item: + "Change Size": + owner.get_node("ChangeCanvasSize").show() + "Crop To Content": + owner.paint_canvas.crop_to_content() + + +func handle_layer_menu(pressed_item: String, id): + match pressed_item: + "Add Layer": + editor.add_new_layer() + "Delete Layer": + editor.remove_active_layer() + "Duplicate Layer": + editor.duplicate_active_layer() + "Clear Layer": + owner.paint_canvas.clear_active_layer() + "Toggle Alpha Locked": + owner.paint_canvas.active_layer.toggle_alpha_locked() + $Buttons/Layer.get_popup().set_item_checked(id, not $Buttons/Layer.get_popup().is_item_checked(id)) + owner.find_node("LockAlpha").pressed = $Buttons/Layer.get_popup().is_item_checked(id) + + +func handle_grid_menu(pressed_item: String, id): + match pressed_item: + "Change Grid Size": + owner.get_node("ChangeGridSizeDialog").show() + "Toggle Grid": + owner.paint_canvas.toggle_grid() + + +func handle_magic_menu(pressed_item: String, id): + match pressed_item: + "Add Layer": + editor.add_new_layer() + + +func handle_editor_menu(pressed_item: String, id): + match pressed_item: + "Settings": + owner.get_node("Settings").show() + "Toggle Grid": + var grids_node = owner.find_node("Grids") + grids_node.visible = !grids_node.visible + "Reset Canvas Position": + owner.paint_canvas_node.rect_position = Vector2(0, 0) + + +func is_any_menu_open() -> bool: + for child in $Buttons.get_children(): + if child.get_popup().visible: + return true + return false + diff --git a/game/addons/Godoxel/PaintCanvas.gd b/game/addons/Godoxel/PaintCanvas.gd new file mode 100644 index 0000000..934fc34 --- /dev/null +++ b/game/addons/Godoxel/PaintCanvas.gd @@ -0,0 +1,489 @@ +tool +extends Control + +var image = Image.new() +var last_pixel = [] +onready var canvas_image_node = get_node("CanvasImage") +export var grid_size = 16 +export var canvas_size = Vector2(48, 28) +export var region_size = 10 +export var can_draw = true + +var mouse_in_region +var mouse_on_top + +#terms +#global cell - a cell that has a global grid position on the canvas +#local cell - a cell that has a local grid position in a chunk region on the canvas +#chunk region - a set of cells contained in an even number + +#TODO: Maybe each chunk region can hold an image resource so that way the engine wouldn't lag at all when updating the canvas + +var layers = {} +var active_layer + +var preview_layer = "preview" +var preview_enabled = false + + +func _enter_tree(): + #---------------------- + # init Layer + #---------------------- + layers[preview_layer] = { + "layer": null, + "data": [], + "chunks": null, + } + + canvas_size = Vector2(int(rect_size.x / grid_size), int(rect_size.y / grid_size)) + #print("canvas_size: ", canvas_size) + + +func _ready(): + active_layer = add_existing_layer(get_tree().get_nodes_in_group("layer")[0]) + #print("active Layer: ", active_layer) + + +func get_layer_data(layer_name): + return layers[layer_name] + + +func get_active_layer(): + return layers[active_layer] + + +func get_preview_layer(): + return layers[preview_layer] + + +func clear_active_layer(): + for pixel in layers[active_layer].data: + set_global_cell_in_chunk(pixel[0], pixel[1], Color(0,0,0,0)) + + +func clear_layer(layer_name: String): + for pixel in layers[layer_name].data: + set_global_cell_in_chunk(pixel[0], pixel[1], Color(0,0,0,0)) + + +func clear_preview_layer(): + for pixel in layers["preview"].data: + set_global_cell_in_chunk(pixel[0], pixel[1], Color(0,0,0,0)) + + +func remove_layer(layer_name): + get_node("ChunkNodes").remove_child(layers[layer_name].chunks) + layers[layer_name].chunks.queue_free() + + layers.erase(layer_name) + + if active_layer == layer_name: + for layer in layers: + if layer == preview_layer: + continue + active_layer = layer + break + + return active_layer + + + +# only needed for init +func add_existing_layer(layer): + layers[layer.name] = { + "layer": layer, + "data": [], + "chunks": null, + } + generate_chunks() + return layer.name + + +func add_new_layer(layer_name): + layers[layer_name] = { + "layer": null, + "data": [], + "chunks": null, + } + + generate_chunks() + + return layer_name + + +func duplicate_layer(layer: String, neu_layer_name: String): + var _preview = preview_enabled + preview_enabled = false + var _temp = active_layer + active_layer = neu_layer_name + + layers[neu_layer_name] = { + "layer": null, + "data": layers[layer].data.duplicate(true), + "chunks": null, + } + + generate_chunks() +# get_node("ChunkNodes").remove_child(layers[neu_layer_name].chunks) +# get_node("ChunkNodes").add_child_below_node(layers[layer].chunks, layers[neu_layer_name].chunks, true) + + for pixel in layers[neu_layer_name].data: + set_pixel_cell(pixel[0], pixel[1], pixel[2]) + active_layer = _temp + + preview_enabled = _preview + return neu_layer_name + + +func toggle_layer_visibility(layer_name): + layers[layer_name].chunks.visible = not layers[layer_name].chunks.visible + #print("Layer: ", layer_name, " is now: ", layers[layer_name].chunks.visible) + + +var util = preload("res://addons/Godoxel/Util.gd") + + +func _on_mouse_entered(): + mouse_on_top = true + + +func _on_mouse_exited(): + mouse_on_top = false + + +func _process(delta): + var mouse_position = get_local_mouse_position() + var rect = Rect2(Vector2(0, 0), rect_size) + mouse_in_region = rect.has_point(mouse_position) + update() + #if not Engine.editor_hint: + # print(mouse_on_canvas, " | ", has_focus()) + #draw_canvas_out just updates the image constantly + #if can_draw: + # draw_canvas_out() + + +func generate_chunks(): + var maxium_chunk_size = get_maxium_filled_chunks() + #TODO: We probably don't need to check for x and y anymore + for key in layers: + if layers[key].chunks != null: + continue + + var chunk_node = Control.new() + get_node("ChunkNodes").add_child(chunk_node) + chunk_node.owner = self + + layers[key].chunks = chunk_node + + for x in maxium_chunk_size.x: + for y in maxium_chunk_size.y: + var paint_canvas_chunk = load("res://addons/Godoxel/PaintCanvasChunk.tscn").instance() + paint_canvas_chunk.setup(region_size) + paint_canvas_chunk.name = "C-%s-%s" % [x, y] + paint_canvas_chunk.rect_position = Vector2(x * (grid_size * region_size), y * (grid_size * region_size)) + layers[key].chunks.add_child(paint_canvas_chunk) + + +func get_maxium_filled_chunks(): + return Vector2(canvas_size.x / region_size, canvas_size.y / region_size).ceil() + +#TODO: Remake these functions with godot's setget features +#so that we don't have to call these functions +func resize_grid(grid): + #print(grid) + if grid <= 0: + return + grid_size = grid + canvas_image_node.rect_scale = Vector2(grid, grid) + +func resize_canvas(x, y): + image.unlock() + image.create(x, y, true, Image.FORMAT_RGBA8) + canvas_size = Vector2(x, y) + #setup_all_chunks() + image.lock() + +#func draw_canvas_out(a = ""): +# if canvas_image_node == null: +# return +# var image_texture = ImageTexture.new() +# image_texture.create_from_image(image) +# image_texture.set_flags(0) +# canvas_image_node.texture = image_texture + +func get_wrapped_region_cell(x, y): + return Vector2(wrapi(x, 0, region_size), wrapi(y, 0, region_size)) + +func get_region_from_cell(x, y): + return Vector2(floor(x / region_size), floor(y / region_size)) + + +func set_local_cell_in_chunk(chunk_x, chunk_y, local_cell_x, local_cell_y, color): + var chunk_node + + if preview_enabled: + chunk_node = layers.preview.chunks.get_node_or_null("C-%s-%s" % [chunk_x, chunk_y]) + else: + chunk_node = layers[active_layer].chunks.get_node_or_null("C-%s-%s" % [chunk_x, chunk_y]) + + if chunk_node == null: + #print("Can't find chunk node!") + return + chunk_node.set_cell(local_cell_x, local_cell_y, color) + + +func set_global_cell_in_chunk(cell_x, cell_y, color): + var chunk = get_region_from_cell(cell_x, cell_y) + var wrapped_cell = get_wrapped_region_cell(cell_x, cell_y) + set_local_cell_in_chunk(chunk.x, chunk.y, wrapped_cell.x, wrapped_cell.y, color) + +#func update_chunk_region_from_cell(x, y): +# var region_to_update = get_region_from_cell(x, y) +# update_chunk_region(region_to_update.x, region_to_update.y) + +func get_pixel_cell_color(x, y): + if not cell_in_canvas_region(x, y): + return null + var pixel_cell = get_pixel_cell(x, y) + if pixel_cell == null: + #We already checked that the cell can't be out of the canvas region so we can assume the pixel cell is completely transparent if it's null + return Color(0, 0, 0, 0) + else: + return util.color_from_array(pixel_cell[2]) + +func get_pixel_cell_color_v(vec2): + return get_pixel_cell_color(vec2.x, vec2.y) + +func get_pixel_cell(x, y): + if active_layer == null: + return + if not cell_in_canvas_region(x, y): + return null + + for pixel in get_active_layer().data: + if pixel[0] == x and pixel[1] == y: + return pixel + + return null + +func get_pixel_cell_v(vec2): + return get_pixel_cell(vec2.x, vec2.y) + +#func remove_pixel_cell(x, y): +# if can_draw == false: +# return false +# if not cell_in_canvas_region(x, y): +# return false +# var layer_data = get_layer_data("Layer 1") +# for pixel in range(0, layer_data.size()): +# if layer_data[pixel][0] == x and layer_data[pixel][1] == y: +# layer_data.remove(pixel) +# #update_chunk_region_from_cell(x, y) +# #TOOD: If pixel exists in temp_pool_pixels then remove it +# image.set_pixel(x, y, Color(0, 0, 0, 0)) +# return true +# return false + +#func remove_pixel_cell_v(vec2): +# return remove_pixel_cell(vec2.x, vec2.y) + +func set_pixel_cell(x, y, color): + if can_draw == false: + return false + + if not cell_in_canvas_region(x, y): + return false + + var layer + if preview_enabled: + layer = get_preview_layer() + else: + layer = get_active_layer() + + var index = 0 + for pixel in layer.data: + #TODO: Make a better way of accessing the array because the more pixels we have, the longer it takes to + #set the pixel + if pixel[0] == x and pixel[1] == y: + #No reason to set the pixel again if the colors are the same + + #If the color we are setting is 0, 0, 0, 0 then there is no reason to keep the information about the pixel + #so we remove it from the layer data + if color == Color(0, 0, 0, 0): + layer.data.remove(index) + else: + pixel[2] = color + #TODO: The new system is going to allow chunks to each have their own TextureRect and Image + #nodes so what we are doing in here is that we are setting the local cell in the region of that image + set_global_cell_in_chunk(x, y, color) + last_pixel = [x, y, color] + return true + index += 1 + #don't append any data if the color is 0, 0, 0, 0 + if color != Color(0, 0, 0, 0): + #if the pixel data doesn't exist then we add it in + layer.data.append([x, y, color]) + set_global_cell_in_chunk(x, y, color) + last_pixel = [x, y, color] + return true + +func set_pixel_cell_v(vec2, color): + return set_pixel_cell(vec2.x, vec2.y, color) + +func set_pixels_from_line(vec2_1, vec2_2, color): + var points = get_pixels_from_line(vec2_1, vec2_2) + for i in points: + set_pixel_cell_v(i, color) + +func set_random_pixels_from_line(vec2_1, vec2_2): + var points = get_pixels_from_line(vec2_1, vec2_2) + for i in points: + set_pixel_cell_v(i, util.random_color_alt()) + +func get_pixels_from_line(vec2_1, vec2_2): + var points = PoolVector2Array() + + var dx = abs(vec2_2.x - vec2_1.x) + var dy = abs(vec2_2.y - vec2_1.y) + + var x = vec2_1.x + var y = vec2_1.y + + var sx = 0 + if vec2_1.x > vec2_2.x: + sx = -1 + else: + sx = 1 + + var sy = 0 + if vec2_1.y > vec2_2.y: + sy = -1 + else: + sy = 1 + + if dx > dy: + var err = dx / 2 + while(true): + if x == vec2_2.x: + break + points.push_back(Vector2(x, y)) + + err -= dy + if err < 0: + y += sy + err += dx + x += sx + else: + var err = dy / 2 + while (true): + if y == vec2_2.y: + break + points.push_back(Vector2(x, y)) + + err -= dx + if err < 0: + x += sx + err += dy + y += sy + points.push_back(Vector2(x, y)) + return points + + +#even though the function checks for it, we can't afford adding more functions to the call stack +#because godot has a limit until it crashes +var flood_fill_queue = 0 +func flood_fill(x, y, target_color, replacement_color): + #yield(get_tree().create_timer(1), "timeout") + flood_fill_queue += 1 + if not cell_in_canvas_region(x, y): + flood_fill_queue -= 1 + return + if target_color == replacement_color: + flood_fill_queue -= 1 + return + elif not get_pixel_cell_color(x, y) == target_color: + flood_fill_queue -= 1 + return + else: + set_pixel_cell(x, y, replacement_color) + if flood_fill_queue >= 500: + #print(flood_fill_queue) + yield(get_tree().create_timer(0.01), "timeout") + #up + if get_pixel_cell_color(x, y - 1) == target_color: + flood_fill(x, y - 1, target_color, replacement_color) + #down + if get_pixel_cell_color(x, y + 1) == target_color: + flood_fill(x, y + 1, target_color, replacement_color) + #left + if get_pixel_cell_color(x - 1, y) == target_color: + flood_fill(x - 1, y, target_color, replacement_color) + #right + if get_pixel_cell_color(x + 1, y) == target_color: + flood_fill(x + 1, y, target_color, replacement_color) + flood_fill_queue -= 1 + return + +#func flood_fill_erase(x, y, target_color): +# yield(get_tree().create_timer(0.001), "timeout") +# if not cell_in_canvas_region(x, y): +# print("cell not in canvas") +# return +# #if target_color == replacement_color: +# # return +# elif not get_pixel_cell_color(x, y) == target_color: +# print("cell doesn't match pixel color") +# return +# elif not get_pixel_cell(x, y): +# print("cell already erased") +# return +# else: +# print("removed pixel") +# remove_pixel_cell(x, y) +# print("x: ", x, " y: ", y, " color: ", target_color) +# #up +# flood_fill_erase(x, y - 1, target_color) +# #down +# flood_fill_erase(x, y + 1, target_color) +# #left +# flood_fill_erase(x - 1, y, target_color) +# #right +# flood_fill_erase(x + 1, y, target_color) +# return + +func cell_in_canvas_region(x, y): + if x > canvas_size.x - 1 or x < 0 or y > canvas_size.y - 1 or y < 0: + #out of bounds, return false + return false + else: + return true + +#Both of these functions right now just return the starting position of the canvas and the last position of the canvas +func get_all_used_regions_in_canvas(): + var first_used_region = get_first_used_region_in_canvas() + var last_used_region = get_last_used_region_in_canvas() + var chunk_pool = PoolVector2Array() + for chunk_x in range(first_used_region.x, last_used_region.x): + for chunk_y in range(first_used_region.y, last_used_region.y): + chunk_pool.append(Vector2(chunk_x, chunk_y)) + return chunk_pool + +func get_first_used_region_in_canvas(): + return get_region_from_cell(0, 0) + +func get_last_used_region_in_canvas(): + return get_region_from_cell(canvas_size.x - 1, canvas_size.y - 1) + +func get_cells_in_region(x, y): + var start_cell = Vector2(x * region_size, y * region_size) + var end_cell = Vector2((x * region_size) + region_size, (y * region_size) + region_size) + var cell_array = [] + for cx in range(start_cell.x, end_cell.x): + for cy in range(start_cell.y, end_cell.y): + var pixel_cell = get_pixel_cell(cx, cy) + if pixel_cell == null: + pixel_cell = [cx, cy, Color(0, 0, 0, 0)] + cell_array.append(pixel_cell) + return cell_array diff --git a/game/addons/Godoxel/PaintCanvas.tscn b/game/addons/Godoxel/PaintCanvas.tscn new file mode 100644 index 0000000..4ce7581 --- /dev/null +++ b/game/addons/Godoxel/PaintCanvas.tscn @@ -0,0 +1,30 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/Godoxel/PaintCanvas.gd" type="Script" id=1] + + +[node name="PaintCanvas" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +canvas_size = Vector2( 64, 37 ) + +[node name="ChunkNodes" type="Control" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="CanvasImage" type="TextureRect" parent="."] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +expand = true +stretch_mode = 3 diff --git a/game/addons/Godoxel/PaintCanvasChunk.gd b/game/addons/Godoxel/PaintCanvasChunk.gd new file mode 100644 index 0000000..3a49c02 --- /dev/null +++ b/game/addons/Godoxel/PaintCanvasChunk.gd @@ -0,0 +1,27 @@ +tool +extends Control + +var image = Image.new() +var image_texture = ImageTexture.new() + +func _ready(): + mouse_filter = Control.MOUSE_FILTER_IGNORE + +func setup(region_size): + image.create(region_size, region_size, true, Image.FORMAT_RGBA8) + image.lock() + +func update_chunk(): + image_texture.create_from_image(image) + image_texture.set_flags(0) + self.texture = image_texture + +func set_cell(x, y, color): + image.set_pixel(x, y, color) + update_chunk() + +func _on_VisibilityNotifier2D_screen_entered(): + visible = true + +func _on_VisibilityNotifier2D_screen_exited(): + visible = false diff --git a/game/addons/Godoxel/PaintCanvasChunk.tscn b/game/addons/Godoxel/PaintCanvasChunk.tscn new file mode 100644 index 0000000..1f2f2b0 --- /dev/null +++ b/game/addons/Godoxel/PaintCanvasChunk.tscn @@ -0,0 +1,13 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/Godoxel/PaintCanvasChunk.gd" type="Script" id=1] + + +[node name="PaintCanvasChunk" type="TextureRect"] +margin_right = 10.0 +margin_bottom = 10.0 +rect_scale = Vector2( 16, 16 ) +mouse_filter = 2 +expand = true +stretch_mode = 1 +script = ExtResource( 1 ) diff --git a/game/addons/Godoxel/PaintCanvasContainer.gd b/game/addons/Godoxel/PaintCanvasContainer.gd new file mode 100644 index 0000000..34ca400 --- /dev/null +++ b/game/addons/Godoxel/PaintCanvasContainer.gd @@ -0,0 +1,2 @@ +tool +extends Control diff --git a/game/addons/Godoxel/SaveFileDialog.gd b/game/addons/Godoxel/SaveFileDialog.gd new file mode 100644 index 0000000..a803a06 --- /dev/null +++ b/game/addons/Godoxel/SaveFileDialog.gd @@ -0,0 +1,70 @@ +tool +extends FileDialog + +var canvas + +var file_path = "" + + +func _enter_tree(): + canvas = get_parent().find_node("Canvas") + + +func _ready(): + # warning-ignore:return_value_discarded + get_line_edit().connect("text_entered", self, "_on_LineEdit_text_entered") + invalidate() + clear_filters() + add_filter("*.png ; PNG Images") + + +func _on_SaveFileDialog_file_selected(path): + #print("selected file: ", path) + file_path = path + save_file() + + +# warning-ignore:unused_argument +func _on_LineEdit_text_entered(text): + return +# print("text entered: ", text) + + +func _on_SaveFileDialog_confirmed(): + return +# print("confirmed: ", current_path) + + +func save_file(): + var image = Image.new() + image.create(canvas.canvas_width, canvas.canvas_height, true, Image.FORMAT_RGBA8) + image.lock() + + for layer in canvas.layers: + var idx = 0 + if not layer.visible: + continue + for x in range(layer.layer_width): + for y in range(layer.layer_height): + var color = layer.get_pixel(x, y) + var image_color = image.get_pixel(x, y) + + if color.a != 0: + image.set_pixel(x, y, image_color.blend(color)) + else: + image.set_pixel(x, y, color) + image.unlock() + + var dir = Directory.new() + if dir.file_exists(file_path): + dir.remove(file_path) + + image.save_png(file_path) + + +func _on_SaveFileDialog_about_to_show(): + invalidate() + + +func _on_SaveFileDialog_visibility_changed(): + invalidate() diff --git a/game/addons/Godoxel/SelectionBox.gd b/game/addons/Godoxel/SelectionBox.gd new file mode 100644 index 0000000..7ddfd2a --- /dev/null +++ b/game/addons/Godoxel/SelectionBox.gd @@ -0,0 +1,24 @@ +tool +extends Control + +export var outline_size = 3 + +func _ready(): + pass + +func _process(delta): + update() + +func _draw(): + if not rect_size == Vector2(): + draw_outline_box(rect_size, Color.gray, outline_size) + +func draw_outline_box(size, color, width): + #Top line + draw_line(Vector2(0 + 1, 0), Vector2(size.x, 0), color, width) + #Left line + draw_line(Vector2(0 + 1, 0), Vector2(0, size.y), color, width) + #Bottom line + draw_line(Vector2(0 + 1, size.y), Vector2(size.x, size.y), color, width) + #Right line + draw_line(Vector2(size.x, 0), Vector2(size.x, size.y), color, width) diff --git a/game/addons/Godoxel/Settings.gd b/game/addons/Godoxel/Settings.gd new file mode 100644 index 0000000..8657585 --- /dev/null +++ b/game/addons/Godoxel/Settings.gd @@ -0,0 +1,24 @@ +tool +extends Control + +var editor +var canvas_outline +var start_time +var end_time + + +func _enter_tree(): + canvas_outline = get_parent().find_node("CanvasOutline") + editor = get_parent() + + +func _on_ColorPickerButton_color_changed(color): + canvas_outline.color = color + + +func _on_CheckButton_toggled(button_pressed): + canvas_outline.visible = button_pressed + + +func _on_Ok_pressed(): + hide() diff --git a/game/addons/Godoxel/Settings.tscn b/game/addons/Godoxel/Settings.tscn new file mode 100644 index 0000000..f2d9c24 --- /dev/null +++ b/game/addons/Godoxel/Settings.tscn @@ -0,0 +1,64 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/Godoxel/Settings.gd" type="Script" id=1] + + +[node name="Settings" type="WindowDialog"] +visible = true +margin_top = 20.0 +margin_right = 300.0 +margin_bottom = 120.0 +window_title = "Settings" +script = ExtResource( 1 ) + +[node name="Ok" type="Button" parent="."] +margin_left = 210.0 +margin_top = 70.0 +margin_right = 290.0 +margin_bottom = 90.0 +text = "Ok" + +[node name="CanvasOutlineToggle" type="Control" parent="."] +margin_left = 10.0 +margin_top = 10.0 +margin_right = 290.0 +margin_bottom = 30.0 +__meta__ = { +"_edit_group_": true +} + +[node name="Label" type="Label" parent="CanvasOutlineToggle"] +margin_right = 130.0 +margin_bottom = 20.0 +text = "Canvas Outline:" +valign = 1 + +[node name="CheckButton" type="CheckButton" parent="CanvasOutlineToggle"] +margin_left = 210.0 +margin_top = -10.0 +margin_right = 286.0 +margin_bottom = 30.0 +pressed = true + +[node name="CanvasOutlineColor" type="Control" parent="."] +margin_left = 10.0 +margin_top = 40.0 +margin_right = 290.0 +margin_bottom = 60.0 +__meta__ = { +"_edit_group_": true +} + +[node name="Label" type="Label" parent="CanvasOutlineColor"] +margin_right = 130.0 +margin_bottom = 20.0 +text = "Canvas Outline Color:" +valign = 1 + +[node name="ColorPickerButton" type="ColorPickerButton" parent="CanvasOutlineColor"] +margin_left = 170.0 +margin_right = 280.0 +margin_bottom = 20.0 +[connection signal="pressed" from="Ok" to="." method="_on_Ok_pressed"] +[connection signal="toggled" from="CanvasOutlineToggle/CheckButton" to="." method="_on_CheckButton_toggled"] +[connection signal="color_changed" from="CanvasOutlineColor/ColorPickerButton" to="." method="_on_ColorPickerButton_color_changed"] diff --git a/game/addons/Godoxel/TextInfo.gd b/game/addons/Godoxel/TextInfo.gd new file mode 100644 index 0000000..e9368e1 --- /dev/null +++ b/game/addons/Godoxel/TextInfo.gd @@ -0,0 +1,39 @@ +tool +extends Control + +var size = 240 + +#TODO: To make reading the text easier, the text info with the longest text should have it's length applied to all the +#the other text infos + +func add_text_info(text_name, custom_node = null): + var last_text_info_child = null + var child_count = get_child_count() + if not child_count <= 0: + last_text_info_child = get_children()[get_children().size() - 1] + var label = Label.new() + label.name = text_name + label.rect_size = Vector2(size, 14) + if not last_text_info_child == null: + var x = last_text_info_child.rect_position.x + var y = last_text_info_child.rect_position.y + var temp_size = size + if child_count == 4: + x = 0 + y = 20 + temp_size = 0 + label.rect_position = Vector2(x + temp_size, y) + if not custom_node == null: + label.add_child(custom_node) + add_child(label) + +func update_text_info(text_name, text_value = null, node = null, node_target_value = null, node_value = null): + var text_label = self.get_node(text_name) + if text_label == null: + return + if not node == null: + get_node(text_name).get_node(node).set(node_target_value, node_value) + if text_value == null: + text_label.text = "%s: %s" % [text_name, null] + else: + text_label.text = "%s: %s" % [text_name, String(text_value)] diff --git a/game/addons/Godoxel/Util.gd b/game/addons/Godoxel/Util.gd new file mode 100644 index 0000000..9840120 --- /dev/null +++ b/game/addons/Godoxel/Util.gd @@ -0,0 +1,94 @@ +tool +extends Node +class_name GEUtils + + +static func get_pixels_in_line(from: Vector2, to: Vector2): + var dx = to[0] - from[0] + var dy = to[1] - from[1] + var nx = abs(dx) + var ny = abs(dy) + var signX = sign(dx) + var signY = sign(dy) + var p = from + var points : Array = [p] + + var ix = 0 + var iy = 0 + + while ix < nx || iy < ny: + if (1 + (ix << 1)) * ny < (1 + (iy << 1)) * nx: + p[0] += signX + ix +=1 + else: + p[1] += signY + iy += 1 + points.append(p) + return points + + +static func to_1D_v(p, w) -> int: + return p.x + p.y * w + + +static func to_1D(x, y, w) -> int: + return x + y * w + + +static func to_2D(idx, w) -> Vector2: + var p = Vector2() + p.x = int(idx) % int(w) + p.y = int(idx / w) + return p + + + +static func color_from_array(color_array): + var r = color_array[0] + var g = color_array[1] + var b = color_array[2] + var a = color_array[3] + return Color(r, g, b, a) + +static func random_color(): + return Color(randf(), randf(), randf()) + +static func random_color_alt(): + var rand = randi() % 6 + + match rand: + #red + 0: + return Color.red + #blue + 1: + return Color.blue + #green + 2: + return Color.green + #orange + 3: + return Color.orange + #yellow + 4: + return Color.yellow + #purple + 5: + return Color.purple + +static func get_line_string(file, number): + return file.get_as_text().split("\n")[number - 1].strip_edges() + +static func printv(variable): + var stack = get_stack()[get_stack().size() - 1] + var line = stack.line + var source = stack.source + var file = File.new() + file.open(source, File.READ) + var line_string = get_line_string(file, line) + file.close() + var left_p = line_string.find("(") + var left_p_string = line_string.right(left_p + 1) + var right_p = left_p_string.find(")") + var variable_name = left_p_string.left(right_p) + print("%s: %s" % [variable_name, variable]) diff --git a/game/addons/Godoxel/ViewportContainer.gd b/game/addons/Godoxel/ViewportContainer.gd new file mode 100644 index 0000000..5ff1df6 --- /dev/null +++ b/game/addons/Godoxel/ViewportContainer.gd @@ -0,0 +1,6 @@ +extends ViewportContainer +tool + +func _ready(): + get_child(0).size = rect_size + diff --git a/game/addons/Godoxel/VisualGrid.gd b/game/addons/Godoxel/VisualGrid.gd new file mode 100644 index 0000000..a935a15 --- /dev/null +++ b/game/addons/Godoxel/VisualGrid.gd @@ -0,0 +1,41 @@ +tool +extends Control + +export var color = Color() +export var size:int = 16 +export var zoom = 0 +export var offset = Vector2(0, 0) + + +func _enter_tree(): + set_process(true) + + +func _draw(): + if size == 0: + size = 1 + + var temp_size = size + zoom + + var wrap_offset = Vector2(wrapf(offset.x, 0, temp_size), wrapf(offset.y, 0, temp_size)) + + var ceil_x = ceil(rect_size.x / temp_size) + var ceil_y = ceil(rect_size.y / temp_size) + + for i in ceil_y: + var start_x = Vector2(0, (i * temp_size) + wrap_offset.y) + var end_x = Vector2(rect_size.x, (i * temp_size) + wrap_offset.y) +# var end_x = Vector2(int(rect_size.x) + size - int(rect_size.x) % size, (i * temp_size) + wrap_offset.y) + draw_line(start_x, end_x, color, 1) + + for i in ceil_x: + var start_y = Vector2((i * temp_size) + wrap_offset.x, 0) + var end_y = Vector2((i * temp_size) + (wrap_offset.x), rect_size.y) +# var end_y = Vector2((i * temp_size) + (wrap_offset.x), int(rect_size.y) + size - int(rect_size.y) % size) + draw_line(start_y, end_y, color, 1) + + +func _process(delta): + if not is_visible_in_tree(): + return + update() diff --git a/game/addons/Godoxel/VisualGrid.tscn b/game/addons/Godoxel/VisualGrid.tscn new file mode 100644 index 0000000..ac8345a --- /dev/null +++ b/game/addons/Godoxel/VisualGrid.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/Godoxel/VisualGrid.gd" type="Script" id=1] + + +[node name="VisualGrid" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +script = ExtResource( 1 ) diff --git a/game/addons/Godoxel/actions/Action.gd b/game/addons/Godoxel/actions/Action.gd new file mode 100644 index 0000000..97292c2 --- /dev/null +++ b/game/addons/Godoxel/actions/Action.gd @@ -0,0 +1,123 @@ +extends Node +class_name GEAction + + +var action_data = {} + + +func _init(): + action_data["redo"] = {} + action_data["undo"] = {} + action_data["preview"] = {} + + +func do_action(canvas, data: Array): + if not "cells" in action_data.redo: + action_data.redo["cells"] = [] + action_data.redo["colors"] = [] + + if not "cells" in action_data.undo: + action_data.undo["cells"] = [] + action_data.undo["colors"] = [] + + if not "cells" in action_data.preview: + action_data.preview["cells"] = [] + action_data.preview["colors"] = [] + + if not "layer" in action_data: + action_data["layer"] = canvas.active_layer + + +func commit_action(canvas): + print("NO IMPL commit_action ") + return [] + + +func undo_action(canvas): + print("NO IMPL undo_action ") + + +func redo_action(canvas): + print("NO IMPL redo_action ") + + +func can_commit() -> bool: + return not action_data.redo.empty() + + +func get_x_sym_points(canvas_width, pixel): + var p = int(canvas_width - pixel.x) + var all_points = [pixel, Vector2(p-1, pixel.y)] + + var points :Array = [] + for point in all_points: + if point in points: + continue + points.append(point) + return points + + +func get_y_sym_points(canvas_height, pixel): + var p = int(canvas_height - pixel.y) + var all_points = [pixel, Vector2(pixel.x, p-1)] + + var points :Array = [] + for point in all_points: + if point in points: + continue + points.append(point) + return points + + +func get_xy_sym_points(canvas_width, canvas_height, pixel): + var all_points = [] + var xpoints = get_x_sym_points(canvas_width, pixel) + + all_points += get_y_sym_points(canvas_height, xpoints[0]) + all_points += get_y_sym_points(canvas_height, xpoints[1]) + + var points :Array = [] + for point in all_points: + if point in points: + continue + points.append(point) + + return points + + +func get_points(canvas, pixel): + var points = [] + if canvas.symmetry_x and canvas.symmetry_y: + var sym_points = get_xy_sym_points(canvas.canvas_width, canvas.canvas_height, pixel) + for point in sym_points: + if point in action_data.undo.cells or canvas.get_pixel_v(point) == null: + continue + if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent: + continue + points.append(point) + elif canvas.symmetry_y: + var sym_points = get_y_sym_points(canvas.canvas_height, pixel) + for point in sym_points: + if point in action_data.undo.cells or canvas.get_pixel_v(point) == null: + continue + if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent: + continue + points.append(point) + elif canvas.symmetry_x: + var sym_points = get_x_sym_points(canvas.canvas_width, pixel) + for point in sym_points: + if point in action_data.undo.cells or canvas.get_pixel_v(point) == null: + continue + if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent: + continue + points.append(point) + else: + if pixel in action_data.undo.cells or canvas.get_pixel_v(pixel) == null: + return [] + if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent: + return [] + points.append(pixel) + + return points + + diff --git a/game/addons/Godoxel/actions/Brighten.gd b/game/addons/Godoxel/actions/Brighten.gd new file mode 100644 index 0000000..faf7f81 --- /dev/null +++ b/game/addons/Godoxel/actions/Brighten.gd @@ -0,0 +1,53 @@ +extends GEAction +class_name GEBrighten + + +const brighten_color = 0.1 + + +func do_action(canvas, data: Array): + .do_action(canvas, data) + + var pixels = GEUtils.get_pixels_in_line(data[0], data[1]) + for pixel in pixels: + if canvas.get_pixel_v(pixel) == null: + continue + + if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent: + continue + + if pixel in action_data.undo.cells: + var brightened_color = canvas.get_pixel_v(pixel).lightened(0.1) + canvas.set_pixel_v(pixel, brightened_color) + + action_data.redo.cells.append(pixel) + action_data.redo.colors.append(brightened_color) + continue + + action_data.undo.colors.append(canvas.get_pixel_v(pixel)) + action_data.undo.cells.append(pixel) + var brightened_color = canvas.get_pixel_v(pixel).lightened(0.1) + canvas.set_pixel_v(pixel, brightened_color) + + action_data.redo.cells.append(pixel) + action_data.redo.colors.append(brightened_color) + + +func commit_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + return [] + + +func undo_action(canvas): + var cells = action_data.undo.cells + var colors = action_data.undo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + +func redo_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) diff --git a/game/addons/Godoxel/actions/Brush.gd b/game/addons/Godoxel/actions/Brush.gd new file mode 100644 index 0000000..edeccaf --- /dev/null +++ b/game/addons/Godoxel/actions/Brush.gd @@ -0,0 +1,47 @@ +extends GEAction +class_name GEBrush + + +func do_action(canvas: GECanvas, data: Array): + .do_action(canvas, data) + + for pixel in GEUtils.get_pixels_in_line(data[0], data[1]): + for off in BrushPrefabs.get_brush(data[3], data[4]): + var p = pixel + off + + if p in action_data.undo.cells or canvas.get_pixel_v(p) == null: + continue + + if canvas.is_alpha_locked() and canvas.get_pixel_v(p) == Color.transparent: + continue + + action_data.undo.colors.append(canvas.get_pixel_v(p)) + action_data.undo.cells.append(p) + + canvas.set_pixel_v(p, data[2]) + + action_data.redo.cells.append(p) + action_data.redo.colors.append(data[2]) + + +func commit_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + return [] + + +func undo_action(canvas): + var cells = action_data.undo.cells + var colors = action_data.undo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + +func redo_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + + diff --git a/game/addons/Godoxel/actions/Bucket.gd b/game/addons/Godoxel/actions/Bucket.gd new file mode 100644 index 0000000..8ff2f90 --- /dev/null +++ b/game/addons/Godoxel/actions/Bucket.gd @@ -0,0 +1,49 @@ +extends GEAction +class_name GEBucket + + + +func do_action(canvas, data: Array): + .do_action(canvas, data) + + if canvas.get_pixel_v(data[0]) == data[2]: + return + var pixels = canvas.select_same_color(data[0].x, data[0].y) + + for pixel in pixels: + if pixel in action_data.undo.cells: + continue + + if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent: + continue + + action_data.undo.colors.append(canvas.get_pixel_v(pixel)) + action_data.undo.cells.append(pixel) + + canvas.set_pixel_v(pixel, data[2]) + + action_data.redo.cells.append(pixel) + action_data.redo.colors.append(data[2]) + + +func commit_action(canvas): + var cells = action_data.preview.cells + var colors = action_data.preview.colors + return [] + + +func undo_action(canvas): + var cells = action_data.undo.cells + var colors = action_data.undo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + +func redo_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + + diff --git a/game/addons/Godoxel/actions/Cut.gd b/game/addons/Godoxel/actions/Cut.gd new file mode 100644 index 0000000..4f60815 --- /dev/null +++ b/game/addons/Godoxel/actions/Cut.gd @@ -0,0 +1,82 @@ +extends GEAction +class_name GECut + +const selection_color = Color(0.8, 0.8, 0.8, 0.5) +var mouse_start_pos = null +var mouse_end_pos = null + + +func can_commit() -> bool: + return false #ugly way of handling a cut + + +func do_action(canvas, data: Array): + .do_action(canvas, data) + + if mouse_start_pos == null: + mouse_start_pos = data[0] + mouse_end_pos = data[0] + + action_data.preview.cells.clear() + action_data.preview.colors.clear() + canvas.clear_preview_layer() + + var p = mouse_start_pos + var s = mouse_end_pos - mouse_start_pos + + var pixels = GEUtils.get_pixels_in_line(p, p + Vector2(s.x, 0)) + pixels += GEUtils.get_pixels_in_line(p, p + Vector2(0, s.y)) + pixels += GEUtils.get_pixels_in_line(p + s, p + s + Vector2(0, -s.y)) + pixels += GEUtils.get_pixels_in_line(p + s, p + s + Vector2(-s.x, 0)) + + for pixel in pixels: + canvas.set_preview_pixel_v(pixel, selection_color) + action_data.preview.cells.append(pixel) + action_data.preview.colors.append(selection_color) + + +func commit_action(canvas): + canvas.clear_preview_layer() + var p = mouse_start_pos + var s = mouse_end_pos - mouse_start_pos + + for x in range(abs(s.x)+1): + for y in range(abs(s.y)+1): + var px = x + var py = y + if s.x < 0: + px *= -1 + if s.y < 0: + py *= -1 + + var pos = p + Vector2(px, py) + var color = canvas.get_pixel(pos.x, pos.y) + + if color == null or color.a == 0.0: + continue + + action_data.redo.cells.append(pos) + action_data.redo.colors.append(canvas.get_pixel_v(pos)) + + canvas.set_pixel_v(pos, Color.transparent) + + action_data.undo.cells.append(pos) + action_data.undo.colors.append(Color.transparent) + return [] + + +func undo_action(canvas): + var cells = action_data.undo.cells + var colors = action_data.undo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + +func redo_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + + diff --git a/game/addons/Godoxel/actions/Darken.gd b/game/addons/Godoxel/actions/Darken.gd new file mode 100644 index 0000000..3832a17 --- /dev/null +++ b/game/addons/Godoxel/actions/Darken.gd @@ -0,0 +1,55 @@ +extends GEAction +class_name GEDarken + +const dark_factor = 0.1 + + +func do_action(canvas, data: Array): + .do_action(canvas, data) + + var pixels = GEUtils.get_pixels_in_line(data[0], data[1]) + for pixel in pixels: + if canvas.get_pixel_v(pixel) == null: + continue + + if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent: + continue + + if pixel in action_data.undo.cells: + var darkened_color = canvas.get_pixel_v(pixel).darkened(dark_factor) + canvas.set_pixel_v(pixel, darkened_color) + + action_data.redo.cells.append(pixel) + action_data.redo.colors.append(darkened_color) + continue + + action_data.undo.colors.append(canvas.get_pixel_v(pixel)) + action_data.undo.cells.append(pixel) + var darkened_color = canvas.get_pixel_v(pixel).darkened(dark_factor) + canvas.set_pixel_v(pixel, darkened_color) + + action_data.redo.cells.append(pixel) + action_data.redo.colors.append(darkened_color) + + +func commit_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + return [] + + +func undo_action(canvas): + var cells = action_data.undo.cells + var colors = action_data.undo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + +func redo_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + + diff --git a/game/addons/Godoxel/actions/Line.gd b/game/addons/Godoxel/actions/Line.gd new file mode 100644 index 0000000..6f17316 --- /dev/null +++ b/game/addons/Godoxel/actions/Line.gd @@ -0,0 +1,59 @@ +extends GEAction +class_name GELine + + +var mouse_start_pos = null + +func do_action(canvas, data: Array): + .do_action(canvas, data) + + if mouse_start_pos == null: + mouse_start_pos = data[0] + + action_data.preview.cells.clear() + action_data.preview.colors.clear() + canvas.clear_preview_layer() + + var pixels = GEUtils.get_pixels_in_line(data[0], mouse_start_pos) + for pixel in pixels: + if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent: + continue + + canvas.set_preview_pixel_v(pixel, data[2]) + action_data.preview.cells.append(pixel) + action_data.preview.colors.append(data[2]) + + +func commit_action(canvas): + canvas.clear_preview_layer() + var cells = action_data.preview.cells + var colors = action_data.preview.colors + for idx in range(cells.size()): + if canvas.get_pixel_v(cells[idx]) == null: + continue + action_data.undo.cells.append(cells[idx]) + action_data.undo.colors.append(canvas.get_pixel_v(cells[idx])) + + canvas.set_pixel_v(cells[idx], colors[idx]) + + action_data.redo.cells.append(cells[idx]) + action_data.redo.colors.append(colors[idx]) + mouse_start_pos = null + return [] + + +func undo_action(canvas): + var cells = action_data.undo.cells + var colors = action_data.undo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + +func redo_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + + diff --git a/game/addons/Godoxel/actions/MultiLine.gd b/game/addons/Godoxel/actions/MultiLine.gd new file mode 100644 index 0000000..b3850ff --- /dev/null +++ b/game/addons/Godoxel/actions/MultiLine.gd @@ -0,0 +1,44 @@ +extends GEAction +class_name GEMultiLine + + +func can_commit() -> bool: + return false + + +func update_action(canvas, data: Array): + .update_action(canvas, data) + + var pixels = GEUtils.get_pixels_in_line(data[0], data[1]) + for pixel in pixels: + if pixel in action_data.undo.cells or canvas.get_pixel_v(pixel) == null or canvas.is_alpha_locked(): + continue + action_data.undo.colors.append(canvas.get_pixel_v(pixel)) + action_data.undo.cells.append(pixel) + canvas.set_pixel_v(pixel, data[2]) + + action_data.redo.cells.append(pixel) + action_data.redo.colors.append(data[2]) + + +func commit_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + return [] + + +func undo_action(canvas): + var cells = action_data.undo.cells + var colors = action_data.undo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + +func redo_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + + diff --git a/game/addons/Godoxel/actions/PasteCut.gd b/game/addons/Godoxel/actions/PasteCut.gd new file mode 100644 index 0000000..5ffaa8e --- /dev/null +++ b/game/addons/Godoxel/actions/PasteCut.gd @@ -0,0 +1,59 @@ +extends GEAction +class_name GEPasteCut + + +#data[2] = selection_pos +#data[3] = selection_color +#data[4] = cut pos +#data[5] = cut size +func do_action(canvas, data: Array): + .do_action(canvas, data) + + for pixel_pos in GEUtils.get_pixels_in_line(data[0], data[1]): + for idx in range(data[2].size()): + var pixel = data[2][idx] + var color = data[3][idx] + pixel -= data[4] + data[5] / 2 + pixel += pixel_pos + + if canvas.get_pixel_v(pixel) == null: + continue + + if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent: + continue + + var found = action_data.redo.cells.find(pixel) + if found == -1: + action_data.redo.cells.append(pixel) + action_data.redo.colors.append(color) + else: + action_data.redo.colors[found] = color + + found = action_data.undo.cells.find(pixel) + if found == -1: + action_data.undo.colors.append(canvas.get_pixel_v(pixel)) + action_data.undo.cells.append(pixel) + + canvas.set_pixel_v(pixel, color) + + +func commit_action(canvas): + canvas.clear_preview_layer() + return [] + + +func undo_action(canvas): + var cells = action_data.undo.cells + var colors = action_data.undo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + +func redo_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + + diff --git a/game/addons/Godoxel/actions/Pencil.gd b/game/addons/Godoxel/actions/Pencil.gd new file mode 100644 index 0000000..906236f --- /dev/null +++ b/game/addons/Godoxel/actions/Pencil.gd @@ -0,0 +1,43 @@ +extends GEAction +class_name GEPencil + + +func do_action(canvas, data: Array): + .do_action(canvas, data) + + var pixels = GEUtils.get_pixels_in_line(data[0], data[1]) + for pixel in pixels: + for p in get_points(canvas, pixel): + _set_pixel(canvas, p, data[2]) + + +func _set_pixel(canvas, pixel, color): + action_data.undo.colors.append(canvas.get_pixel_v(pixel)) + action_data.undo.cells.append(pixel) + canvas.set_pixel_v(pixel, color) + + action_data.redo.cells.append(pixel) + action_data.redo.colors.append(color) + + +func commit_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + return [] + + +func undo_action(canvas): + var cells = action_data.undo.cells + var colors = action_data.undo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + +func redo_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + + diff --git a/game/addons/Godoxel/actions/Rainbow.gd b/game/addons/Godoxel/actions/Rainbow.gd new file mode 100644 index 0000000..618bdd1 --- /dev/null +++ b/game/addons/Godoxel/actions/Rainbow.gd @@ -0,0 +1,58 @@ +extends GEAction +class_name GERainbow + + +func do_action(canvas, data: Array): + .do_action(canvas, data) + + var pixels = GEUtils.get_pixels_in_line(data[0], data[1]) + for pixel in pixels: + if canvas.get_pixel_v(pixel) == null: + continue + + if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent: + continue + + if pixel in action_data.undo.cells: + var color = GEUtils.random_color() + canvas.set_pixel_v(pixel, color) + + var idx = action_data.redo.cells.find(pixel) + action_data.redo.cells.remove(idx) + action_data.redo.colors.remove(idx) + + action_data.redo.cells.append(pixel) + action_data.redo.colors.append(color) + continue + + action_data.undo.colors.append(canvas.get_pixel_v(pixel)) + action_data.undo.cells.append(pixel) + + var color = GEUtils.random_color() + canvas.set_pixel_v(pixel, color) + + action_data.redo.cells.append(pixel) + action_data.redo.colors.append(color) + + +func commit_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + return [] + + +func undo_action(canvas): + var cells = action_data.undo.cells + var colors = action_data.undo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + +func redo_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + + diff --git a/game/addons/Godoxel/actions/Rect.gd b/game/addons/Godoxel/actions/Rect.gd new file mode 100644 index 0000000..770e28b --- /dev/null +++ b/game/addons/Godoxel/actions/Rect.gd @@ -0,0 +1,69 @@ +extends GEAction +class_name GERect + + +var mouse_start_pos = null + +func do_action(canvas, data: Array): + .do_action(canvas, data) + + if mouse_start_pos == null: + mouse_start_pos = data[0] + #print("init:", mouse_start_pos) + + + action_data.undo.cells.clear() + action_data.undo.colors.clear() + action_data.preview.cells.clear() + action_data.preview.colors.clear() + canvas.clear_preview_layer() + + var p = mouse_start_pos + var s = data[0] - mouse_start_pos + var pixels = GEUtils.get_pixels_in_line(p, p + Vector2(s.x, 0)) + pixels += GEUtils.get_pixels_in_line(p, p + Vector2(0, s.y)) + pixels += GEUtils.get_pixels_in_line(p + s, p + s + Vector2(0, -s.y)) + pixels += GEUtils.get_pixels_in_line(p + s, p + s + Vector2(-s.x, 0)) + + for pixel in pixels: + if canvas.get_pixel_v(pixel) == null: + continue + + if canvas.is_alpha_locked() and canvas.get_pixel_v(pixel) == Color.transparent: + continue + + canvas.set_preview_pixel_v(pixel, data[2]) + action_data.undo.cells.append(pixel) + action_data.undo.colors.append(canvas.get_pixel_v(pixel)) + action_data.preview.cells.append(pixel) + action_data.preview.colors.append(data[2]) + + +func commit_action(canvas): + canvas.clear_preview_layer() + var cells = action_data.preview.cells + var colors = action_data.preview.colors + for idx in range(cells.size()): + canvas.set_pixel_v(cells[idx], colors[idx]) + + action_data.redo.cells.append(cells[idx]) + action_data.redo.colors.append(colors[idx]) + mouse_start_pos = null + return [] + + +func undo_action(canvas): + var cells = action_data.undo.cells + var colors = action_data.undo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + +func redo_action(canvas): + var cells = action_data.redo.cells + var colors = action_data.redo.colors + for idx in range(cells.size()): + canvas._set_pixel_v(action_data.layer, cells[idx], colors[idx]) + + + diff --git a/game/addons/Godoxel/assets/BrushCircle.png b/game/addons/Godoxel/assets/BrushCircle.png new file mode 100644 index 0000000000000000000000000000000000000000..29249806cb74b8d8983cc792f0f652fa6bd0bf4a GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)uAIjKx9jP7LeL$-D$|YCT;XLp(a) zPCY2ppupkM`0{^!VG(3i$dR0@pyd8!!m3@@Sr@F^AHFW|gT@NZ zlPvuQR?R!ZQ1x%hF?+{nlHr}-T28lYKXZ~baq26!#8>S#vPQqwZPt1md45As=uU|R t7t+qGnEIr8wjp!(6myoDSEpH8GVWYtt@txu?-bA>44$rjF6*2UngHuPO&S0I literal 0 HcmV?d00001 diff --git a/game/addons/Godoxel/assets/BrushCircle.png.import b/game/addons/Godoxel/assets/BrushCircle.png.import new file mode 100644 index 0000000..1925324 --- /dev/null +++ b/game/addons/Godoxel/assets/BrushCircle.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/BrushCircle.png-dd250909fee7964ffc38f7e4fcfe9c07.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/BrushCircle.png" +dest_files=[ "res://.import/BrushCircle.png-dd250909fee7964ffc38f7e4fcfe9c07.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/game/addons/Godoxel/assets/BrushCircle_Hovered.png b/game/addons/Godoxel/assets/BrushCircle_Hovered.png new file mode 100644 index 0000000000000000000000000000000000000000..d955418cde60bb56cd3d2b35ac56f90528555d67 GIT binary patch literal 3413 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 rjaU=CAkOvOGRh4uc!}Na)Rdx Zqv<6s-Cv4RD}jbEc)I$ztaD0e0sy{xDL()J literal 0 HcmV?d00001 diff --git a/game/addons/Godoxel/assets/BrushHLine.png.import b/game/addons/Godoxel/assets/BrushHLine.png.import new file mode 100644 index 0000000..1a63cf3 --- /dev/null +++ b/game/addons/Godoxel/assets/BrushHLine.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/BrushHLine.png-9182ec8ac804af16d356bf911782e299.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/BrushHLine.png" +dest_files=[ "res://.import/BrushHLine.png-9182ec8ac804af16d356bf911782e299.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/game/addons/Godoxel/assets/BrushHLine_Hovered.png b/game/addons/Godoxel/assets/BrushHLine_Hovered.png new file mode 100644 index 0000000000000000000000000000000000000000..c2a5238877e421d043bb6dd93c7c6b19d77591f1 GIT binary patch literal 1930 zcmV;52X**~P)P000>X1^@s6#OZ}&000F)dQ@0+Qek%> zaB^>EX>4U6ba`-PAZ2)IW&i+q+U;0dmg6W4{bv=k1S1d<%i(!W?_iccSJ+7iMhq*w`}C6}m{^xbg3=>HfhlY>`}K(Ueo#@QXQSD!9>Y|K)Y{TU^)uAs_Gjz1&@2 z5JUlO*dL`F{R`y$p>Vj#_7Yy0%`>m6Z(=PY%FqFrBld{UKtMxF{ zj*iQf%pb zkFLaoh^Avktzi3$8FZ`&d01)*hu~z~%Q`X+1xy3weQR6A(R}susY6MQb;jzN=cFxxgtTL zup|*t$x<|ERMw=Ts#!~>98d!}rz}}>&ZUqm04lIm(7!-ZsfHRW*Hooy&9yX4pB5Xp z)TC+4t#s<4qfGSFrEAZ<4DSXi#fXDP8Zva`Q6}cv3^PuiY0A`@XSuR=u=;Skz?wf; zqs5fuIGcZQcgK;qiFrmpf+tkNM#+-4sWwLrkaFUH1*S#?Y3ghs^ z(_gv!VD3x2Io2=nMt@??8FhbyIS1++UUslI!DBMToz1f4mgpCrDKCOLzNccNhZZQXV_2{UupSl_e70hLY96tDP=2@llOY~8PkdX|A>nE-I2Ip6*;f%Ur9PJr@W_xjsbTYQ@ zxxS-%ACo%`>Jzpt3631t*?!>0{U!F#hE8m!y#hRNeWe-`;h@^xaGkqop2H_AB2flW zEuHJENk*H)E*)FgECM6g|H81S$=Zy?VcfPK2ra`6AA#3n3wsFJh#-8SD_ih6EQUtR zvPTWP)Qhsa(_Xq3decU^;yqQDg#$+JEcWT$ka2mYim${uSlz_hjwN~( zsH8&zs$49iA}Q@(PTP`ysde2R|084ld5RI=Bjg;0K74qm!bGl=#1-&?3fz<9@um_qclp2=y{k&5m(E z)hr_wkBQmbiWq!FHwF>FFhq%&dLq4$f#>+ThmWs!QJ&>}?$6Pq(&RnhatG*t(j`N3BtK1|PypV~=$mpt-!0I!>h{*$$LRx*p{|y0 zfP+I|v`E=&9`EjK@9p0+&HjD>m^^Z}heg$~00006VoOIv0RI600RN!9r;`8x010qN zS#tmY3ljhU3ljkVnw%H_000McNliru@GBL#WEQ@#KI06R%UK~zY`?bXo<03Zwl z(NtWn6KA|QMMdFmf%j2DD~YCCx)2D+=g5|%?jBjB?cydNvlagY1mq3m0Duw-Ert@M Qw*UYD07*qoM6N<$f(V(HJpcdz literal 0 HcmV?d00001 diff --git a/game/addons/Godoxel/assets/BrushHLine_Hovered.png.import b/game/addons/Godoxel/assets/BrushHLine_Hovered.png.import new file mode 100644 index 0000000..43cc5ed --- /dev/null +++ b/game/addons/Godoxel/assets/BrushHLine_Hovered.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/BrushHLine_Hovered.png-e51d5f3c1628c510a225057f3ed60d5a.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/BrushHLine_Hovered.png" +dest_files=[ "res://.import/BrushHLine_Hovered.png-e51d5f3c1628c510a225057f3ed60d5a.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/game/addons/Godoxel/assets/BrushRect.png b/game/addons/Godoxel/assets/BrushRect.png new file mode 100644 index 0000000000000000000000000000000000000000..a88cc75a387160bf397459cd06853946d4103680 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)uAIjKx9jP7LeL$-D$|tUO&DLp(a) zUfamaV8FxV*ss7U2ng6dg|!vGD1M4`=7I_yI4E9 Vbj#0(E&`gu;OXk;vd$@?2>|X_C=~zz literal 0 HcmV?d00001 diff --git a/game/addons/Godoxel/assets/BrushRect.png.import b/game/addons/Godoxel/assets/BrushRect.png.import new file mode 100644 index 0000000..3517f2c --- /dev/null +++ b/game/addons/Godoxel/assets/BrushRect.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/BrushRect.png-2b2d0ae4889c1fbc5c7bee7ae5515663.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/BrushRect.png" +dest_files=[ "res://.import/BrushRect.png-2b2d0ae4889c1fbc5c7bee7ae5515663.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/game/addons/Godoxel/assets/BrushRect_Hovered.png b/game/addons/Godoxel/assets/BrushRect_Hovered.png new file mode 100644 index 0000000000000000000000000000000000000000..4df526ae9e31b6212c521fe9636c1c154f79d545 GIT binary patch literal 1819 zcmV+$2juvPP)P000>X1^@s6#OZ}&000EhdQ@0+Qek%> zaB^>EX>4U6ba`-PAZ2)IW&i+q+U;0fcJn9 z?ZZ4I9D^f}uFyq_9qRx78T1c6&RZa_7DEbQ!^bC|B;zJ-`zNiQH^2J*OFHKGR!-Lm zfyiNW`&Y}y`V6`LRk&bqxs_8qW+Wbl_-c54+(e%D?X8oL%Pwbs7)pJ=2`SoJSIc3j z9t)Q%$K|hX?Zf;|Hv&VHngYm)bjNO6ecU~8`;{SK^x_QbHWzU3oYE3qwuFG(Z0|B| z+uH!$1o?7D@1uXcdl!7khupo3WjJDln}-vu@8s?ZBX5D-)g!r`(6-gP?Htz_EsoLm z-DMvT(Quro6>Pqk!NP)&yQLP;442~GR!eAc%UcEI6Rx0DPAp($5PNQ%d2nB23KSYqdA<00mfYc7JUDxE-`cXIWG7j9a3l_QWFW2rEVF;qTm^x5Qh z8jUey%e=*Ftl*c-a}75pbF;@P5W?f&O;>;~?Vx{qbAIMg^;kB;9I?T?mEA;9{(H9E z;@M%HV%$@R$=YE6Ap*9-8Ki*cEwED#yqSnGBaRUSWq2;mO92C{Dh*DGcPN-U}5isMs#)f%eR zSX0eSnrkQ%Ei`MfrItHWN2Tb#YY*Le?5XF0vo_rDLq`}k;z%Q3Svy$0Yu{jv57uNc zHP_jdHAuVI=P|7lQB@}JBtp! za`%_Hr+6ccPw^&SF-McS-(ZeF-92v)SZnilt}e#*ESxdj9I_8Tu* zKRA!rY;b5>bk< zs#Ay>F-8ev8TY-^)B)VWjV|Vv?ou34r>c^y2?X2b7z!e7%k6jC7vuvN<8A@JJ2HD3 zyN!=6JjB0;r*ruC@N^FU9-hwO-^0^6{CjvhhyS8~$1k~z4Nu`SCFg@nF&irzYZ^hv zGPv?F6(l6}nUKM8v7s5IM+!{$Ew3c529y?Isd?0+q4qxiYj)kii%NCneQ)rlH@7?; z`gsyRtSa;e2^7nJfKYO{5ix>n(fN##_c!ADR#Kp|mW(n`vXWaDdYp^he-y2K^B@ok4#DPG`^` zfzuiEN8oe@{Si3*l=h1<{gn0#IQ^9NOX|{tLiH(j&!e&)c{o$L?RiK@L`BY(S}uvG zGY?CF(52e@Xfw-m{i3SSul&qDV+a*ww1i;(2L$#$7$qt<(*OVgg=s@WP)S2WAaHVT zW@&6?004NLeUUv#!$2IxUsFp(D-L!Lb%;=%EQpFYN)?M>p|llRbuhW~Luk^Fq_{W= zt_24_7OM^}&bm6d3WDGVh?Ap}qKlOHzogJ2#)IR2yu0_fdj|;hGE>ctaX{59BNdN{ z+1!d4d_^|~5x_7+iJ5vLy^w+D__~LWuXjJzVjIhC%u0qzJVhK)RE_e5tjh}L zEzWAW%9{7&FAU|i?Y{03*jd zDo`Oge(*o|-K|-eoN$vuF(B|_+aDu9a2IIQZ2SAzwi_pa{~5T_TK-BMnE52V*3u$J zK<_qiaoy77J>YT&=zr2BLvkcPO`%W#-p}ZpazNiL(6#FJ*4)SG1CXJvmTrK9LtwN> z*=ru}?riVv-!skregK#}a<+#>)v*8o00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF->y8wDd68pl6p0000wNklpR?z?e literal 0 HcmV?d00001 diff --git a/game/addons/Godoxel/assets/BrushRect_Hovered.png.import b/game/addons/Godoxel/assets/BrushRect_Hovered.png.import new file mode 100644 index 0000000..0257918 --- /dev/null +++ b/game/addons/Godoxel/assets/BrushRect_Hovered.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/BrushRect_Hovered.png-b09066b673d6082ce887a03a19f17977.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/BrushRect_Hovered.png" +dest_files=[ "res://.import/BrushRect_Hovered.png-b09066b673d6082ce887a03a19f17977.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/game/addons/Godoxel/assets/BrushVLine.png b/game/addons/Godoxel/assets/BrushVLine.png new file mode 100644 index 0000000000000000000000000000000000000000..dd047f70b9f1a87e5fb84417058c7947249b9b3a GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)uAIjKx9jP7LeL$-D$|tUX;ELp(a) zUfamapuofID7W$dsWfIKCC9IMvM*!WR34Xxl`>4xo>cJa`PoHzE>Ljm;qm)h8RxWf V={o&5DFHNw!PC{xWt~$(69DK1DaQZ+ literal 0 HcmV?d00001 diff --git a/game/addons/Godoxel/assets/BrushVLine.png.import b/game/addons/Godoxel/assets/BrushVLine.png.import new file mode 100644 index 0000000..31b70a3 --- /dev/null +++ b/game/addons/Godoxel/assets/BrushVLine.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/BrushVLine.png-022220d888fe2fe2f8a081bcca62b4b2.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/BrushVLine.png" +dest_files=[ "res://.import/BrushVLine.png-022220d888fe2fe2f8a081bcca62b4b2.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/game/addons/Godoxel/assets/BrushVLine_Hovered.png b/game/addons/Godoxel/assets/BrushVLine_Hovered.png new file mode 100644 index 0000000000000000000000000000000000000000..7ad6863566c1f9925d384dbaf96dd98a160c3018 GIT binary patch literal 1998 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%0AiBKTq!b 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 literal 0 HcmV?d00001 diff --git a/game/addons/Godoxel/assets/Godoxel_Preview.png.import b/game/addons/Godoxel/assets/Godoxel_Preview.png.import new file mode 100644 index 0000000..0e23ff4 --- /dev/null +++ b/game/addons/Godoxel/assets/Godoxel_Preview.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Godoxel_Preview.png-e30103581d3fc0ed2a2c92cdf72b5c70.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/Godoxel_Preview.png" +dest_files=[ "res://.import/Godoxel_Preview.png-e30103581d3fc0ed2a2c92cdf72b5c70.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/game/addons/Godoxel/assets/arrow_down.png b/game/addons/Godoxel/assets/arrow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..9673c8de23e86a4c1670e5017c56bdabac14a138 GIT binary patch literal 562 zcmV-20?qx2P)EX>4Tx04R}tkv&MmKpe$iQ%j{(9NIy|AwzW#3!);9T7@E12(?114knj=L6e3g z#l=x@EjakGSaoo5*44pP5ClI!oE)7LU8KbSrG*wT9vt`M-Mz=%J3weum}d2i1DbA| z>10C8=2pevD?%7R1Obf7%rfRADFx5*bq^n3@8Uem``n+SPt98l@QK8;%rI@@4dUrd z+u*!U9Azb0B|aw}GwFiFk6c$;{KmQHvcNN=W+pvP93>WuU95C5E14Sc6md+|bjla9 zEmk>ian>p|*1jiyVK}d^EOVXa5RzEL5+sOFP(v9N*of1rlVTxF`w0*KpzD{&rI4!( zMvetkp+R>2;D7MDTdOcR(Mk#@fWV96d<+A@U7%TaobO}DX`TT7XW&Zj_^Sg+c*%KcjET0g+oEwASjay^qreAVXcHZh(VB zV5CUd>mKj!?e6X0GwuF<0Awk0p;F4c2mk;824YJ`L;(K){{a7>y{D4^000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2jmJE6Ez?iBWtn%001sYL_t&-(_>&j1^=NK4wx7S z0HPH9$0Prr3CV5-Ebd`oBwzvqBOViw<#Brx0I&)Q0{=2~{Qv*}07*qoM6N<$f{M21 AwEzGB literal 0 HcmV?d00001 diff --git a/game/addons/Godoxel/assets/arrow_down.png.import b/game/addons/Godoxel/assets/arrow_down.png.import new file mode 100644 index 0000000..bcb4645 --- /dev/null +++ b/game/addons/Godoxel/assets/arrow_down.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/arrow_down.png-d2bd93428c0bc172a28a43c55aac576e.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/arrow_down.png" +dest_files=[ "res://.import/arrow_down.png-d2bd93428c0bc172a28a43c55aac576e.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/game/addons/Godoxel/assets/arrow_up.png b/game/addons/Godoxel/assets/arrow_up.png new file mode 100644 index 0000000000000000000000000000000000000000..b6bec658f8564ee995f63424c1d6ca7391ccaa3c GIT binary patch literal 565 zcmV-50?Pe~P)EX>4Tx04R}tkv&MmKpe$iQ%j{(9NIy|AwzW#3!);9T7@E12(?114knj=L6e3g z#l=x@EjakGSaoo5*44pP5ClI!oE)7LU8KbSrG*wT9vt`M-Mz=%J3weum}d2i1DbA| z>10C8=2pevD?%7R1Obf7%rfRADFx5*bq^n3@8Uem``n+SPt98l@QK8;%rI@@4dUrd z+u*!U9Azb0B|aw}GwFiFk6c$;{KmQHvcNN=W+pvP93>WuU95C5E14Sc6md+|bjla9 zEmk>ian>p|*1jiyVK}d^EOVXa5RzEL5+sOFP(v9N*of1rlVTxF`w0*KpzD{&rI4!( zMvetkp+R>2;D7MDTdOcR(Mk#@fWV96d<+A@U7%TaobO}DX`TT7XW&Zj_^Sg+c*%KcjET0g+oEwASjay^qreAVXcHZh(VB zV5CUd>mKj!?e6X0GwuF<0Awk0p;F4c2mk;824YJ`L;(K){{a7>y{D4^000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2jmJE6EzS&`dc0V001#bL_t&-(_>&j1^=NK4j7Rn zumMI!Jdz9y3=9lRSWH7{ZGphy)io%`j00000NkvXXu0mjf D_50@% literal 0 HcmV?d00001 diff --git a/game/addons/Godoxel/assets/arrow_up.png.import b/game/addons/Godoxel/assets/arrow_up.png.import new file mode 100644 index 0000000..15ac470 --- /dev/null +++ b/game/addons/Godoxel/assets/arrow_up.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/arrow_up.png-2598e148d1b795a628ce80a4fd5cf401.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/arrow_up.png" +dest_files=[ "res://.import/arrow_up.png-2598e148d1b795a628ce80a4fd5cf401.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/game/addons/Godoxel/assets/bitstream_vera_sans_font_6016/COPYRIGHT.TXT b/game/addons/Godoxel/assets/bitstream_vera_sans_font_6016/COPYRIGHT.TXT new file mode 100644 index 0000000..e651be1 --- /dev/null +++ b/game/addons/Godoxel/assets/bitstream_vera_sans_font_6016/COPYRIGHT.TXT @@ -0,0 +1,124 @@ +Bitstream Vera Fonts Copyright + +The fonts have a generous copyright, allowing derivative works (as +long as "Bitstream" or "Vera" are not in the names), and full +redistribution (so long as they are not *sold* by themselves). They +can be be bundled, redistributed and sold with any software. + +The fonts are distributed under the following copyright: + +Copyright +========= + +Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream +Vera is a trademark of Bitstream, Inc. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the fonts accompanying this license ("Fonts") and associated +documentation files (the "Font Software"), to reproduce and distribute +the Font Software, including without limitation the rights to use, +copy, merge, publish, distribute, and/or sell copies of the Font +Software, and to permit persons to whom the Font Software is furnished +to do so, subject to the following conditions: + +The above copyright and trademark notices and this permission notice +shall be included in all copies of one or more of the Font Software +typefaces. + +The Font Software may be modified, altered, or added to, and in +particular the designs of glyphs or characters in the Fonts may be +modified and additional glyphs or characters may be added to the +Fonts, only if the fonts are renamed to names not containing either +the words "Bitstream" or the word "Vera". + +This License becomes null and void to the extent applicable to Fonts +or Font Software that has been modified and is distributed under the +"Bitstream Vera" names. + +The Font Software may be sold as part of a larger software package but +no copy of one or more of the Font Software typefaces may be sold by +itself. + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL +BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, +OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT +SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. + +Except as contained in this notice, the names of Gnome, the Gnome +Foundation, and Bitstream Inc., shall not be used in advertising or +otherwise to promote the sale, use or other dealings in this Font +Software without prior written authorization from the Gnome Foundation +or Bitstream Inc., respectively. For further information, contact: +fonts at gnome dot org. + +Copyright FAQ +============= + + 1. I don't understand the resale restriction... What gives? + + Bitstream is giving away these fonts, but wishes to ensure its + competitors can't just drop the fonts as is into a font sale system + and sell them as is. It seems fair that if Bitstream can't make money + from the Bitstream Vera fonts, their competitors should not be able to + do so either. You can sell the fonts as part of any software package, + however. + + 2. I want to package these fonts separately for distribution and + sale as part of a larger software package or system. Can I do so? + + Yes. A RPM or Debian package is a "larger software package" to begin + with, and you aren't selling them independently by themselves. + See 1. above. + + 3. Are derivative works allowed? + Yes! + + 4. Can I change or add to the font(s)? + Yes, but you must change the name(s) of the font(s). + + 5. Under what terms are derivative works allowed? + + You must change the name(s) of the fonts. This is to ensure the + quality of the fonts, both to protect Bitstream and Gnome. We want to + ensure that if an application has opened a font specifically of these + names, it gets what it expects (though of course, using fontconfig, + substitutions could still could have occurred during font + opening). You must include the Bitstream copyright. Additional + copyrights can be added, as per copyright law. Happy Font Hacking! + + 6. If I have improvements for Bitstream Vera, is it possible they might get + adopted in future versions? + + Yes. The contract between the Gnome Foundation and Bitstream has + provisions for working with Bitstream to ensure quality additions to + the Bitstream Vera font family. Please contact us if you have such + additions. Note, that in general, we will want such additions for the + entire family, not just a single font, and that you'll have to keep + both Gnome and Jim Lyles, Vera's designer, happy! To make sense to add + glyphs to the font, they must be stylistically in keeping with Vera's + design. Vera cannot become a "ransom note" font. Jim Lyles will be + providing a document describing the design elements used in Vera, as a + guide and aid for people interested in contributing to Vera. + + 7. I want to sell a software package that uses these fonts: Can I do so? + + Sure. Bundle the fonts with your software and sell your software + with the fonts. That is the intent of the copyright. + + 8. If applications have built the names "Bitstream Vera" into them, + can I override this somehow to use fonts of my choosing? + + This depends on exact details of the software. Most open source + systems and software (e.g., Gnome, KDE, etc.) are now converting to + use fontconfig (see www.fontconfig.org) to handle font configuration, + selection and substitution; it has provisions for overriding font + names and subsituting alternatives. An example is provided by the + supplied local.conf file, which chooses the family Bitstream Vera for + "sans", "serif" and "monospace". Other software (e.g., the XFree86 + core server) has other mechanisms for font substitution. + diff --git a/game/addons/Godoxel/assets/bitstream_vera_sans_font_6016/README.TXT b/game/addons/Godoxel/assets/bitstream_vera_sans_font_6016/README.TXT new file mode 100644 index 0000000..0f71795 --- /dev/null +++ b/game/addons/Godoxel/assets/bitstream_vera_sans_font_6016/README.TXT @@ -0,0 +1,11 @@ +Contained herin is the Bitstream Vera font family. + +The Copyright information is found in the COPYRIGHT.TXT file (along +with being incoporated into the fonts themselves). + +The releases notes are found in the file "RELEASENOTES.TXT". + +We hope you enjoy Vera! + + Bitstream, Inc. + The Gnome Project diff --git a/game/addons/Godoxel/assets/bitstream_vera_sans_font_6016/RELEASENOTES.TXT b/game/addons/Godoxel/assets/bitstream_vera_sans_font_6016/RELEASENOTES.TXT new file mode 100644 index 0000000..270bc0d --- /dev/null +++ b/game/addons/Godoxel/assets/bitstream_vera_sans_font_6016/RELEASENOTES.TXT @@ -0,0 +1,162 @@ +Bitstream Vera Fonts - April 16, 2003 +===================================== + +The version number of these fonts is 1.10 to distinguish them from the +beta test fonts. + +Note that the Vera copyright is incorporated in the fonts themselves. +The License field in the fonts contains the copyright license as it +appears below. The TrueType copyright field is not large enough to +contain the full license, so the license is incorporated (as you might +think if you thought about it) into the license field, which +unfortunately can be obscure to find. (In pfaedit, see: Element->Font +Info->TTFNames->License). + +Our apologies for it taking longer to complete the fonts than planned. +Beta testers requested a tighter line spacing (less leading) and Jim +Lyles redesigned Vera's accents to bring its line spacing to more +typical of other fonts. This took additional time and effort. Our +thanks to Jim for this effort above and beyond the call of duty. + +There are four monospace and sans faces (normal, oblique, bold, bold +oblique) and two serif faces (normal and bold). Fontconfig/Xft2 (see +www.fontconfig.org) can artificially oblique the serif faces for you: +this loses hinting and distorts the faces slightly, but is visibly +different than normal and bold, and reasonably pleasing. + +On systems with fontconfig 2.0 or 2.1 installed, making your sans, +serif and monospace fonts default to these fonts is very easy. Just +drop the file local.conf into your /etc/fonts directory. This will +make the Bitstream fonts your default fonts for all applications using +fontconfig (if sans, serif, or monospace names are used, as they often +are as default values in many desktops). The XML in local.conf may +need modification to enable subpixel decimation, if appropriate, +however, the commented out phrase does so for XFree86 4.3, in the case +that the server does not have sufficient information to identify the +use of a flat panel. Fontconfig 2.2 adds Vera to the list of font +families and will, by default use it as the default sans, serif and +monospace fonts. + +During the testing of the final Vera fonts, we learned that screen +fonts in general are only typically hinted to work correctly at +integer pixel sizes. Vera is coded internally for integer sizes only. +We need to investigate further to see if there are commonly used fonts +that are hinted to be rounded but are not rounded to integer sizes due +to oversights in their coding. + +Most fonts work best at 8 pixels and below if anti-aliased only, as +the amount of work required to hint well at smaller and smaller sizes +becomes astronomical. GASP tables are typically used to control +whether hinting is used or not, but Freetype/Xft does not currently +support GASP tables (which are present in Vera). + +To mitigate this problem, both for Vera and other fonts, there will be +(very shortly) a new fontconfig 2.2 release that will, by default not +apply hints if the size is below 8 pixels. if you should have a font +that in fact has been hinted more agressively, you can use fontconfig +to note this exception. We believe this should improve many hinted +fonts in addition to Vera, though implemeting GASP support is likely +the right long term solution. + +Font rendering in Gnome or KDE is the combination of algorithms in +Xft2 and Freetype, along with hinting in the fonts themselves. It is +vital to have sufficient information to disentangle problems that you +may observe. + +Note that having your font rendering system set up correctly is vital +to proper judgement of problems of the fonts: + + * Freetype may or may not be configured to in ways that may + implement execution of possibly patented (in some parts of the world) + TrueType hinting algorithms, particularly at small sizes. Best + results are obtained while using these algorithms. + + * The freetype autohinter (used when the possibly patented + algorithms are not used) continues to improve with each release. If + you are using the autohinter, please ensure you are using an up to + date version of freetype before reporting problems. + + * Please identify what version of freetype you are using in any + bug reports, and how your freetype is configured. + + * Make sure you are not using the freetype version included in + XFree86 4.3, as it has bugs that significantly degrade most fonts, + including Vera. if you build XFree86 4.3 from source yourself, you may + have installed this broken version without intending it (as I + did). Vera was verified with the recently released Freetype 2.1.4. On + many systems, 'ldd" can be used to see which freetype shared library + is actually being used. + + * Xft/X Render does not (yet) implement gamma correction. This + causes significant problems rendering white text on a black background + (causing partial pixels to be insufficiently shaded) if the gamma of + your monitor has not been compensated for, and minor problems with + black text on a while background. The program "xgamma" can be used to + set a gamma correction value in the X server's color pallette. Most + monitors have a gamma near 2. + + * Note that the Vera family uses minimal delta hinting. Your + results on other systems when not used anti-aliased may not be + entirely satisfying. We are primarily interested in reports of + problems on open source systems implementing Xft2/fontconfig/freetype + (which implements antialiasing and hinting adjustements, and + sophisticated subpixel decimation on flatpanels). Also, the + algorithms used by Xft2 adjust the hints to integer widths and the + results are crisper on open source systems than on Windows or + MacIntosh. + + * Your fontconfig may (probably does) predate the release of + fontconfig 2.2, and you may see artifacts not present when the font is + used at very small sizes with hinting enabled. "vc-list -V" can be + used to see what version you have installed. + +We believe and hope that these fonts will resolve the problems +reported during beta test. The largest change is the reduction of +leading (interline spacing), which had annoyed a number of people, and +reduced Vera's utility for some applcations. The Vera monospace font +should also now make '0' and 'O' and '1' and 'l' more clearly +distinguishable. + +The version of these fonts is version 1.10. Fontconfig should be +choosing the new version of the fonts if both the released fonts and +beta test fonts are installed (though please discard them: they have +names of form tt20[1-12]gn.ttf). Note that older versions of +fontconfig sometimes did not rebuild their cache correctly when new +fonts are installed: please upgrade to fontconfig 2.2. "fc-cache -f" +can be used to force rebuilding fontconfig's cache files. + +If you note problems, please send them to fonts at gnome dot org, with +exactly which face and size and unicode point you observe the problem +at. The xfd utility from XFree86 CVS may be useful for this (e.g. "xfd +-fa sans"). A possibly more useful program to examine fonts at a +variety of sizes is the "waterfall" program found in Keith Packard's +CVS. + + $ cvs -d :pserver:anoncvs@keithp.com:/local/src/CVS login + Logging in to :pserver:anoncvs@keithp.com:2401/local/src/CVS + CVS password: + $ cvs -d :pserver:anoncvs@keithp.com:/local/src/CVS co waterfall + $ cd waterfall + $ xmkmf -a + $ make + # make install + # make install.man + +Again, please make sure you are running an up-to-date freetype, and +that you are only examining integer sizes. + +Reporting Problems +================== + +Please send problem reports to fonts at gnome org, with the following +information: + + 1. Version of Freetype, Xft2 and fontconfig + 2. Whether TT hinting is being used, or the autohinter + 3. Application being used + 4. Character/Unicode code point that has problems (if applicable) + 5. Version of which operating system + 6. Please include a screenshot, when possible. + +Please check the fonts list archives before reporting problems to cut +down on duplication. diff --git a/game/addons/Godoxel/assets/bitstream_vera_sans_font_6016/Vera.ttf b/game/addons/Godoxel/assets/bitstream_vera_sans_font_6016/Vera.ttf new file mode 100644 index 0000000000000000000000000000000000000000..58cd6b5e61eff273e920942e28041f8ddcf1e1b5 GIT binary patch literal 65932 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

B-* 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

1$W7r@e0!HPu@g0mkJPQ3hhEb-G4zU50u9!$ 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 W_YF69v_ymE68(IXMraZLEdC#Jb*K;k literal 0 HcmV?d00001 diff --git a/game/addons/Godoxel/assets/bitstream_vera_sans_font_6016/VeraBd.ttf b/game/addons/Godoxel/assets/bitstream_vera_sans_font_6016/VeraBd.ttf new file mode 100644 index 0000000000000000000000000000000000000000..51d6111d722981a86766cc99c53f1956e5c0a229 GIT binary patch literal 58716 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 V!o5>kzlbDRJjU5v3Ujx#{eMf40U-bY literal 0 HcmV?d00001 diff --git a/game/addons/Godoxel/assets/bitstream_vera_sans_font_6016/all-free-download.com.url b/game/addons/Godoxel/assets/bitstream_vera_sans_font_6016/all-free-download.com.url new file mode 100644 index 0000000..be505ef --- /dev/null +++ b/game/addons/Godoxel/assets/bitstream_vera_sans_font_6016/all-free-download.com.url @@ -0,0 +1,8 @@ +[InternetShortcut] +URL=http://www.all-free-download.com/ +IDList= +HotKey=0 +IconFile=C:\WINDOWS\system32\SHELL32.dll +IconIndex=23 +[{000214A0-0000-0000-C000-000000000046}] +Prop3=19,2 diff --git a/game/addons/Godoxel/assets/grid.png b/game/addons/Godoxel/assets/grid.png new file mode 100644 index 0000000000000000000000000000000000000000..71a1664785972c0037b5c3d88fc9328619671bc4 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}ex5FlArY;~ zb4-hW)w6LmG{)Mf-jbZ5amkm};8jB)dyiGZ6~@JU5~T-LFiZHy{&x$kesE}EtB7U7 i0cV7an=Du{1H+~zob#9(9e)B%X7F_Nb6Mw<&;$U~#V#xW literal 0 HcmV?d00001 diff --git a/game/addons/Godoxel/assets/grid.png.import b/game/addons/Godoxel/assets/grid.png.import new file mode 100644 index 0000000..846eeb6 --- /dev/null +++ b/game/addons/Godoxel/assets/grid.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/grid.png-e3d637acacdb891e09f422df261dbd1e.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/grid.png" +dest_files=[ "res://.import/grid.png-e3d637acacdb891e09f422df261dbd1e.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/game/addons/Godoxel/assets/lock_layer.png b/game/addons/Godoxel/assets/lock_layer.png new file mode 100644 index 0000000000000000000000000000000000000000..8bd4802d93a3b025750810f0304384d8e9d48fe5 GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|wtBiahIn*7 zoo36`Vj$3ZU+3P5ux$cCy46t|xgt8&rgvR+STs2{-DeuB{RWAS_o;O~3k8_6E*)ts zUe_`E`#cwBhKjPcsvj#OC;v!L(6#E`VtJ9l$a_iqaYA5LHD9<|(TLQ7Er z+fAWJm+y}l9Au_Q1-4bsNGT|FnOVVg)%RMFadYAvgPvg7=7@;opuH~f_9oiP79TqF zf69x$uYB3|pFQwP{Wpu}cCOQcbC-VGn#!E~&P+(V{>ww42N*nE{an^LB{Ts5He6&z literal 0 HcmV?d00001 diff --git a/game/addons/Godoxel/assets/lock_layer.png.import b/game/addons/Godoxel/assets/lock_layer.png.import new file mode 100644 index 0000000..70c3e6e --- /dev/null +++ b/game/addons/Godoxel/assets/lock_layer.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/lock_layer.png-076954b389746de9e13c853ed5d9ba59.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/lock_layer.png" +dest_files=[ "res://.import/lock_layer.png-076954b389746de9e13c853ed5d9ba59.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/game/addons/Godoxel/assets/lock_layer_1.png b/game/addons/Godoxel/assets/lock_layer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..317cb3fcedb5405b8b88c85dfa45932a95e2ec87 GIT binary patch literal 242 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 AQUCw| literal 0 HcmV?d00001 diff --git a/game/addons/Godoxel/assets/minidotta.png.import b/game/addons/Godoxel/assets/minidotta.png.import new file mode 100644 index 0000000..b7d2a0b --- /dev/null +++ b/game/addons/Godoxel/assets/minidotta.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/minidotta.png-adac81df344972ef82e2499656aa288e.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/minidotta.png" +dest_files=[ "res://.import/minidotta.png-adac81df344972ef82e2499656aa288e.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/game/addons/Godoxel/assets/minidotta_invis.png b/game/addons/Godoxel/assets/minidotta_invis.png new file mode 100644 index 0000000000000000000000000000000000000000..305092835e71fcfca099117e59cae1de30e75fd0 GIT binary patch literal 1746 zcmV;@1}*uCP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+TB-CcH}4w{O1&N1WQ5)j)TFxH#gYhZ((D%+i54A z&3x<|^V(n;q@qg5iCg~p-P|u+lwx#VErt}rgv%$NIAai}?MmyNCcoat!?X{c?CyBM zFbR6u9xadg8Fqav*kjQAY zE0po`2du5@&+f@!V5uqs3G*T(6YeYnfo#9r?YOh}J`Yb>M7-O&;S7X4ZSNp(IurCn z@;-7`_K(qpe9prz7cRr#2!od|NH2Cd!tgn;9EkY&MXbB4k0iHNV{6N{yX*rP4I`sg zvT1jNi8Cmdby+|&{1jtbTSALdo(d$dQ<-M8LWvmcH%Fc-WoopneW3z~o)vWj|D4Qd*lCe1;D4;n(S(2HC)F>h+Y%%UaBQKF9;L$nxU ziaBu-)Id!kS&Av8oY`dr%J7vjKf^NfEVG|=4zta1PIE3upW=&_P^`p~O0Ha`qD<6K zt;U*aUdSz|6pLSU35zXpNlR|XwIBe6v=el%%LOBQNKI-;Dwc5XPWmRlDg`Lw$aQYg}nWF<9)C!Im=jjK%`>BKft0Pm? zZ0(=#xp&$>ZV`0s!GaQjIc(J1SRu4LOa ze7bJrHJ;o**>^Zzg#9F{J2QU}TJJO}w^F#zwRqs-FEnuXGw;}VO@=!&DtWvLyR+r1 ztU98(WnWwW6OaRkI|K38c-OUhoe&Nf?q@h2%DT6Y>Fx2Y`&qlojRUvoYYEX>4Tx0C=2zkv&MmKpe$iQ%j{( z9NIy|AwzW#3!);9T7@E12(?114knj=L6e3g#l=x@EjakGSaoo5*44pP5ClI!oE)7L zU8KbSrG*wT9vt`M-Mz=%J3weum}d2i1DbA|>10C8=2pevD?%7R1Obf7%rfRADFx5* zbq^n3@8Uem``n+SPt98l@QK8;%rI@@4dUrd+u*!U9Azb0B|aw}GwFiFk6c$;{KmQH zvcNN=W+pvP93>WuU95C5E14Sc6md+|bjla9Emk>ian>p|*1jiyVK}d^EOVXa5RzEL z5+sOFP(v9N*of1rlVTxF`w0*KpzD{&rI4!(Mvetkp+R>2;D7MDTdOcR(Mk#@fWV96 zd<+A@U7%TaobO}DX`TT7XW&Zj_^S zg+c*%KcjET0g+oEwASjay^qreAVXcHZh(VBV5CUd>mKj!?e6X0GwuF<0Awk0p;{Ss z&j0`b24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2jmJE z6CxvpslJ{7009a~L_t(I%bk<4b;CdmLqB+$!G+_-17(nSp$r&jiyV=HC*>?Vh0RKj zB5?#j>U=!B1D~Kbo(g{hA37foU!W5&g|ExLxkVrWXkUyCJ#)(Gv}~V1YYp3^4fyUo zA(qzYy>EXvfM|hjBnSlnnN=21)7Zu~(SqLd7C?y6N6$oPYs@sp8$D0MEi=cSu11Np zS?L;AZUBY;^oc#s2-O5CppcL%w@x(2^2nSP4YP__3b$wvja*g-ga(a#V0Y2LlU~E8 zSYPln>ocv%QudTZt9^Efwci10wsWV!I=Tkm88Dqg$bMttLlLW>n(YEDAm23)0AKg_ o@YDA~_J5BlfXg^dUO4B=FF0h0xg6motN;K207*qoM6N<$g1a{|%m4rY literal 0 HcmV?d00001 diff --git a/game/addons/Godoxel/assets/minidotta_invis.png.import b/game/addons/Godoxel/assets/minidotta_invis.png.import new file mode 100644 index 0000000..8c3774f --- /dev/null +++ b/game/addons/Godoxel/assets/minidotta_invis.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/minidotta_invis.png-5232a113bb226997ae55212b2aa90bd4.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/Godoxel/assets/minidotta_invis.png" +dest_files=[ "res://.import/minidotta_invis.png-5232a113bb226997ae55212b2aa90bd4.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/game/addons/Godoxel/assets/unlock_layer.png b/game/addons/Godoxel/assets/unlock_layer.png new file mode 100644 index 0000000000000000000000000000000000000000..36694fdcf3a33dffcb5825b891952f9fc4b1f303 GIT binary patch literal 240 zcmVPx#s!2paR5*>zl}iqTFbqUzs?yTlE2qxApui$sSxUgr*a4|eVqwY5;7lhH2{ER{xpeqkG_aE23k@r+Q+E|Kv`xDd3#AhW_z=U$jjQJ<(UmMp*^I6 z-4=O7*Wv&`3C>zkL1tJ~(7K{RzJ=x?TQM07 layer.layer_width: + continue + + layer.set_pixel(pos.x, pos.y, color) + layer.update_texture() + + + +func _on_LoadFileDialog_about_to_show(): + invalidate() + + +func _on_LoadFileDialog_visibility_changed(): + invalidate() diff --git a/game/addons/Godoxel/dialogs/LoadFileDialog.tscn b/game/addons/Godoxel/dialogs/LoadFileDialog.tscn new file mode 100644 index 0000000..0d083c0 --- /dev/null +++ b/game/addons/Godoxel/dialogs/LoadFileDialog.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=2 format=2] + +[sub_resource type="GDScript" id=1] +script/source = "extends ConfirmationDialog + +func _ready(): + get_ok().connect(\"pressed\", self, \"hide\") + get_cancel().connect(\"pressed\", self, \"hide\") + + + +" + +[node name="LoadFileDialog" type="FileDialog"] +margin_right = 604.0 +margin_bottom = 367.0 +window_title = "Open a File" +mode = 0 +access = 2 +current_dir = "/Projects/BitBucket/GraphicsEditor" +current_path = "/Projects/BitBucket/GraphicsEditor/" +script = SubResource( 1 ) diff --git a/game/addons/Godoxel/plugin.cfg b/game/addons/Godoxel/plugin.cfg new file mode 100644 index 0000000..526cfb3 --- /dev/null +++ b/game/addons/Godoxel/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="Godoxel - Pixel Image Editor" +description="" +author="" +version="" +script="plugin.gd" diff --git a/game/addons/Godoxel/plugin.gd b/game/addons/Godoxel/plugin.gd new file mode 100644 index 0000000..c288aaf --- /dev/null +++ b/game/addons/Godoxel/plugin.gd @@ -0,0 +1,37 @@ +tool +extends EditorPlugin + +var editor_scene = load("res://addons/Godoxel/Editor.tscn").instance() + +func _enter_tree(): + editor_scene.name = "Editor" + if get_editor_interface().get_editor_viewport().has_node("Editor"): + var n = get_editor_interface().get_editor_viewport().get_node("Editor") + n.name = "EditorDel" + n.queue_free() + get_editor_interface().get_editor_viewport().add_child(editor_scene, true) + editor_scene.owner = get_editor_interface().get_editor_viewport() + make_visible(false) + + +func _exit_tree(): + if editor_scene: + editor_scene.queue_free() + + +func has_main_screen(): + return true + + +func make_visible(visible): + if editor_scene: + editor_scene.visible = visible + + +func get_plugin_name(): + return "Godoxel" + + +func get_plugin_icon(): + # Must return some kind of Texture for the icon. + return get_editor_interface().get_base_control().get_icon("CanvasModulate", "EditorIcons") diff --git a/game/addons/module_manager/LICENSE b/game/addons/module_manager/LICENSE new file mode 100644 index 0000000..386f030 --- /dev/null +++ b/game/addons/module_manager/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Péter Magyar + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/game/addons/module_manager/README.md b/game/addons/module_manager/README.md new file mode 100644 index 0000000..025d3bb --- /dev/null +++ b/game/addons/module_manager/README.md @@ -0,0 +1,7 @@ +# ESS Data + +This is an addon for https://github.com/Relintai/entity_spell_system, to help with editing, and managing all game related the data in the project. + +Looks like this: + +![ess_data screenshot](screenshots/ess_data.png) diff --git a/game/addons/module_manager/icons/empty.png b/game/addons/module_manager/icons/empty.png new file mode 100644 index 0000000000000000000000000000000000000000..25043861ab61e8f6932a1597b2fa58f68a990752 GIT binary patch literal 939 zcmaJ=O^ee&7>*VeS$4sbpddTUA}H7-leSqB8cWl(Zorh1EpEY!X)#S{$j*bg=Mj=i34VD+rxx@G_}^)dMXOV^HHOWmiN9$TE+rHCaXvfg~bH z5ZNo2QB|$Us&oX_4`k6|Z=~8rXB~^JG&rF&QUxJRQ$DTmBpwS$QIuRmlFAHGPUazX zvT~Rl777MV+}Mw(PePC@Izuv}8f2MXmJmc6*)Ulj6FV>=b0PupVqQ`Kw5qL8id_zNhNdj?%2OQAe+~5NgX!rJ}S&8KEP+ijbriT!Xl?0Ee{T zdRJU&D>t`75V6Pxj{TR|>%=4gtCCfJYc57-tKORHZO=vA$`x2LLf+WF8eMEL_vF)! zZP{XDd>k^j$IRBhp4wm7l{hesWXhFNCv+Jn`$=5fu;VdjpR%M9&iDnv%H zi{N|cSkYzWXQ1)?Mf0fdl5reNSqO)WS;CT8Gb{COmv zk_Aa+AsH$tDuW*_%19E?#khctzy>Xd3dkWu0BGgO3N@%@;HGs!bZ*`z;(%!glElFM z<5Vm!9ALpJ2=FKP;zcAf8K6=LWIul@mAnq1kjNAw34N$|vLEPA1t~P({e?rVslT1tQSm6>7H`1vaD>sboq- z1}gxwqCg0zA`Ber=|3UJm9w%6_4_oT2_tF+N+Ov+GKVw+ZR#rGf+qtcr%=LRj3hxLIiQy3>>OJkjca#o62I6NMt67!t^DRgJ^UXo5`dH2GKbbCW}QS&v4nW zC{+$AkQuJ{1D7=?*W3znC2E-ssbp!8n4^N_z;wuEo-^d&W}9TaAJ@4(Ljc& z&qUS2%`_VugKdIAN55iPgT2upXmY=ASg8L~)6DpOW$CT-y#;LmZ7hENUzVm6a2{4!DQW*et~~|0b&1q-j8D3Hk2U3SWAl|oA;Eq7(w7%H5^5_7 zb)0AKLJA`Sn;d1kQv@PxTw>0iA`rNK(#jB5hyk-4Tq06y2fg#$g(56>6!?M7b+YjZ z|9bgI6E3~&rj1U8Pm^>7sA^>+MWDoWE}2TxBCu#z2RwDME@kJ&F$y!Z85 zIYm_sWX+FXOgX!AY(4o^=dzCD^|iTn73ZukKVFh!pKz@sJa12;S8}JHOIPRRk?ad~ zS#%@dn0u%qJScvgma)1l>XE)p7`4<#Z<6#*aLf47o9ErDU3Q*uR9@71ih9w;I=}AX z{-vctm$8;GCMk3$sJc_pstMrTaUL%kt@`L@eL;^}U$*tk0b*gXb9qgCdCY_1*O{lb z7Ul(ImFRn#f&R69{LiGL80B{dq&$4CrT_7_4z32*QT&3yr|p1$lpwBVNaCnpa4o_$ zr>m>IF0a!4=0Nui$2$o>wvUHiKTUWXd6b@VZTqF3!erxw@ug+cu1&PDmb9dZUE*@= z;ifBo4?GJGg7~o4@17mbF|EWJ9m2N-HGacCL^nQ3v43vLCP%F~xWwh4ujHm&m$`71 zX%7s0j63^0pPUpfA9`(9ZA=>O*5&WNxU23$_S2G|PwXpr=f5%W#AE K>;`7S&c6Y$GObYn literal 0 HcmV?d00001 diff --git a/game/addons/module_manager/icons/gom.png.import b/game/addons/module_manager/icons/gom.png.import new file mode 100644 index 0000000..dfac2d6 --- /dev/null +++ b/game/addons/module_manager/icons/gom.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/gom.png-7469f830e410a943b31bbb19c8debf4e.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/module_manager/icons/gom.png" +dest_files=[ "res://.import/gom.png-7469f830e410a943b31bbb19c8debf4e.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/game/addons/module_manager/icons/icon_add.png b/game/addons/module_manager/icons/icon_add.png new file mode 100644 index 0000000000000000000000000000000000000000..297be1464c2abce00632c973439a617ee3366bdb GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`W}YsNAr`&K2@6y!K0G-1pPgUs z&++ALok8Aiya@>jDG3cNW|p%=MMNYt%NXMfX7Rm9VK~aba6C_F%1<@D+dvZ-JYD@< J);T3K0RUK(AnE`B literal 0 HcmV?d00001 diff --git a/game/addons/module_manager/icons/icon_add.png.import b/game/addons/module_manager/icons/icon_add.png.import new file mode 100644 index 0000000..fd7633e --- /dev/null +++ b/game/addons/module_manager/icons/icon_add.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/icon_add.png-b78af00c3ee58b2d523f0a86c227a437.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/module_manager/icons/icon_add.png" +dest_files=[ "res://.import/icon_add.png-b78af00c3ee58b2d523f0a86c227a437.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/game/addons/module_manager/icons/icon_copy.png b/game/addons/module_manager/icons/icon_copy.png new file mode 100644 index 0000000000000000000000000000000000000000..d777f132d87ff6cfbf0497ea001a801267624df5 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt^@JzX3_ zEP9ttbmTi^z{7I9qy5Hx2boi=AB62VxOxRkZTsKJ1q(a^MV*ws3FS_nnT~gVdk;>zwAeiO3b(|L=&QV@nj3)*XYh3Ob6Mw<&;$U0z+?mf literal 0 HcmV?d00001 diff --git a/game/addons/module_manager/icons/icon_copy.png.import b/game/addons/module_manager/icons/icon_copy.png.import new file mode 100644 index 0000000..35c2c52 --- /dev/null +++ b/game/addons/module_manager/icons/icon_copy.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/icon_copy.png-2686b5282d44e971e22e560caf7cb772.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/module_manager/icons/icon_copy.png" +dest_files=[ "res://.import/icon_copy.png-2686b5282d44e971e22e560caf7cb772.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/game/addons/module_manager/icons/icon_display-name.png b/game/addons/module_manager/icons/icon_display-name.png new file mode 100644 index 0000000000000000000000000000000000000000..7c4493395ef189a22396208d4cc4162cf859bb95 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_&o-U3d z7QK5Xo#s8PAmDO8;$8Dv<*qw>G*h%Wce0$EcCbb#)z9G3SskVd4aObSEOE{YM4UNp zf4a?okU?{)`GG2vvpJgb_NVXKSKej4vvRwkFMG-ku}#y?gk={uNyU89XWV->a=P}6 vnah~_-rrvR|4(yT!x9TFuUqq{F@IncRMoC2DOflU=nw`^S3j3^P6|i``PW7mOSW<3y zKtRF~HNPp0H)7a~CoC~Iz~;t#K#+UKA|B}mZ51`aMB_P0`T;x)MeB6tg)Y5%0%#9| Mr>mdKI;Vst0Gn(%zW@LL literal 0 HcmV?d00001 diff --git a/game/addons/module_manager/icons/icon_duplicate.png.import b/game/addons/module_manager/icons/icon_duplicate.png.import new file mode 100644 index 0000000..84e1a2a --- /dev/null +++ b/game/addons/module_manager/icons/icon_duplicate.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/icon_duplicate.png-2fca67563e92c088a06d8cd03e837bd7.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/module_manager/icons/icon_duplicate.png" +dest_files=[ "res://.import/icon_duplicate.png-2fca67563e92c088a06d8cd03e837bd7.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/game/addons/module_manager/icons/icon_edit.png b/game/addons/module_manager/icons/icon_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..c114d2f84d99c530f47fec9a199afdfb86fecef9 GIT binary patch literal 346 zcmV-g0j2(lP)NeVk#i#2m?%#saRcO!n?4ELP-13i;v*`WCj`oPY)bT}NomSwr! zTcE0e_x=LdtE%e0D2lDM1=iY45%FOd9sw`FuJ?YLW!Ye*z&V!!Z`Ru5D2hH*^#FJR zE|Vmg$!~C;=VK9>03k2~#>SXiRSiVM11uG^;5whcjxpxF{^(r6IhS_86>#2!J120? zrK)<}0iPOUuG;krg1+#A;4ko8V6EK;9$N61s-DDge6tLOpChX3VMph)Rq$LOB1xaI so2k2Q0C%eT90b91G#Wjw1OH3D0d_HXv74Wf=g#o#;Oi1emML#IzPk1^=YzfT%O3B%WxLdb zu`ex6Y10}jv5BGui~(1--P)TU?;_TG>NVrL`cSEbKYuOv-*Keptj@$aVL&%Bc)I$z JtaD0e0sve*WHUKAa97EW-zCWk=rGL=Fl0)d@n8yzrtp!uPZxWM2no-e zKWY8$@;d)=y9eG!R=Y(`%Zt!nDz>jY?xXBKMthDI=OaR|PMrB!VY0w-jjl3(VGqsk z4CfgCaSO`sTEs8lWRdK{_P{Jzug5TRl1kYoC->Ov-p}ud9>}_qwPtJf+OM@5es+Og zHyLg)Wv~~WJ~MmcO=$)Oua!&=r_P8qBtO&Xd%W}NAAvwW7su&8XRxb2bPSRVG*}1p O41=eupUXO@geCxf5M?I- literal 0 HcmV?d00001 diff --git a/game/addons/module_manager/icons/icon_move_down.png.import b/game/addons/module_manager/icons/icon_move_down.png.import new file mode 100644 index 0000000..e7031cc --- /dev/null +++ b/game/addons/module_manager/icons/icon_move_down.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/icon_move_down.png-311d6181aa94759234bf843cb87c2d38.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/module_manager/icons/icon_move_down.png" +dest_files=[ "res://.import/icon_move_down.png-311d6181aa94759234bf843cb87c2d38.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/game/addons/module_manager/icons/icon_move_up.png b/game/addons/module_manager/icons/icon_move_up.png new file mode 100644 index 0000000000000000000000000000000000000000..684013dc4046f14021fb5ae2637be66c363e88b8 GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_KJY5_^ zEPCHgwC8Iw5NWUPFVR+4FkCptLGQu2BM&UUsHn*uI>{?k_J}uTmtaN}+jBed4vt$A z|8weYSO49szh3u)_pWufx8?5snEK*oqoG>zvq>FHX>r<1Pfce%Hbdk9r^AiydS~_o zdCgsZGvU^TYiFVdQ&MBb@0MO5EjQ{`u literal 0 HcmV?d00001 diff --git a/game/addons/module_manager/icons/icon_move_up.png.import b/game/addons/module_manager/icons/icon_move_up.png.import new file mode 100644 index 0000000..08d94a1 --- /dev/null +++ b/game/addons/module_manager/icons/icon_move_up.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/icon_move_up.png-d4081170c845eac210690228db6a49a8.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/module_manager/icons/icon_move_up.png" +dest_files=[ "res://.import/icon_move_up.png-d4081170c845eac210690228db6a49a8.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/game/addons/module_manager/icons/icon_multi_line.png b/game/addons/module_manager/icons/icon_multi_line.png new file mode 100644 index 0000000000000000000000000000000000000000..95a029cc6e52396d5f7f22d5a069bf94a78b1d2a GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_Ro-U3d z7QM*{3j_>|3=9lxDn2~0*JI`4;QWRUxX^PLB{`Q{6ZHb(6%?{J zLZr$e#|T|6>=`EG1eAQ}Mfb1%^{cBI_JrF-h)8hG2|$c742Q$7uDGnZQPr`CjMDb9 z&f?rv5*?}PxYI!*?g0ZHfK%W&(Mwh2_d+wefVEw0A^O0*%WxMh|Okmw_dOFl>M%8XK7|rGb`#6DyZrV*y?i! z<{^Z-OSM2*mS-`>H(JBhfoNtIRVV7;7~^3QjKGYa;i+u{^Tavl+(D;wbCgA7qN=8< mmRgL6obMdvHvamV_Qp4&vXm;#cB%LP0000o?b9VrCmJ|({`9MlJ6Zxhblma-i)>f^x)eyoVfL8!b z=iIGQsuIn?D2lpsh?#e#lyAAFo5^JI7(y5VXfpHZqLGL?nY}1L0DxMp_U^sE1OOpK zN91Ok0AQ_sSh63SbN89u5?brN*4hJD0f0D;KeX2UpFknR;+P_i<1+xG+1kE9+hJvQ`DHHM@5wSn=*z2Zbz=YTwY_xOf*U^8ayAto+?_62Nme`&#WOZHQNN^Pf#iQ=p!@*PDo_wTNB z`G26g{^Pyl5AQ7BI^nwYbGgeArf>X}tfq=2Kl>dri6zVXc(CVG@3_e_LMk7m4UT=t zJ9z2ra|@e8vmS(A-^#S0^Tpmsh6l^G{?k~xs3YckNx+deqC!fSj!5L*-o~@wB&X8Z z`p1zjOdDdFXEI;3Xp&WNH7I_u>)fp!vD7&&#U+PEYc=y(QCS3j3^P6dwi~%Kh4i<{p+ma-uXKi<*sR!WWJfO5a void: + _resource_type = resource_type + + +func about_to_show(): + _option_button.clear() + + if not ClassDB.class_exists(_resource_type): + return + + var arr : PoolStringArray = PoolStringArray() + arr.append(_resource_type) + arr.append_array(ClassDB.get_inheriters_from_class(_resource_type)) + + var gsc : Array = ProjectSettings.get("_global_script_classes") + + var l : int = arr.size() - 1 + + while (arr.size() != l): + l = arr.size() + + for i in range(gsc.size()): + var d : Dictionary = gsc[i] as Dictionary + + var found = false + for j in range(arr.size()): + if arr[j] == d["class"]: + found = true + break + + if found: + continue + + for j in range(arr.size()): + if arr[j] == d["base"]: + arr.append(d["class"]) + + for a in arr: + _option_button.add_item(a) + + +func _on_OK_pressed(): + emit_signal("ok_pressed", _line_edit.text, _option_button.get_item_text(_option_button.selected)) + hide() diff --git a/game/addons/module_manager/panels/CreateNamePopup.tscn b/game/addons/module_manager/panels/CreateNamePopup.tscn new file mode 100644 index 0000000..02f4b60 --- /dev/null +++ b/game/addons/module_manager/panels/CreateNamePopup.tscn @@ -0,0 +1,58 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/module_manager/panels/CreateNamePopup.gd" type="Script" id=1] + + +[node name="CreateNamePopup" type="ConfirmationDialog"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -245.5 +margin_top = -125.5 +margin_right = 245.5 +margin_bottom = 125.5 +window_title = "Create New Resource" +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +line_edit_path = NodePath("VBoxContainer/LineEdit") +option_button_path = NodePath("VBoxContainer/OptionButton") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +margin_left = 8.0 +margin_top = 8.0 +margin_right = 483.0 +margin_bottom = 215.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label2" type="Label" parent="VBoxContainer"] +margin_right = 449.0 +margin_bottom = 25.0 +size_flags_horizontal = 3 +text = "Type" + +[node name="OptionButton" type="OptionButton" parent="VBoxContainer"] +margin_top = 33.0 +margin_right = 449.0 +margin_bottom = 70.0 +size_flags_horizontal = 3 + +[node name="Label" type="Label" parent="VBoxContainer"] +margin_top = 78.0 +margin_right = 449.0 +margin_bottom = 103.0 +size_flags_horizontal = 3 +text = "Name" + +[node name="LineEdit" type="LineEdit" parent="VBoxContainer"] +margin_top = 111.0 +margin_right = 449.0 +margin_bottom = 156.0 +size_flags_horizontal = 3 +caret_blink = true diff --git a/game/addons/module_manager/panels/EntryButton.gd b/game/addons/module_manager/panels/EntryButton.gd new file mode 100644 index 0000000..80913e3 --- /dev/null +++ b/game/addons/module_manager/panels/EntryButton.gd @@ -0,0 +1,93 @@ +tool +extends Control + +signal inspect_data +signal duplicate +signal delete + +export(PackedScene) var spatial_preview : PackedScene +export(PackedScene) var node2d_preview : PackedScene +export(PackedScene) var control_preview : PackedScene +export(PackedScene) var texture_preview : PackedScene + +export(NodePath) var main_button_path : NodePath + +var _main_button : Button + +var _preview : Node +var _data : Resource + +func _ready(): + _main_button = get_node(main_button_path) as Button + +func set_resource(data : Resource) -> void: + _data = data + + _main_button.set_resource(data) + + var name_text : String = "" + + if data.has_method("get_id"): + name_text += str(data.get_id()) + " - " + + if data.has_method("get_text_name"): + name_text += str(data.get_text_name()) + else: + if data.resource_name != "": + name_text += data.resource_name + else: + name_text += data.resource_path + + if data.has_method("get_rank"): + name_text += " - Rank " + str(data.get_rank()) + + if data is Texture: + _preview = texture_preview.instance() + add_child(_preview) + _preview.owner = self + move_child(_preview, 0) + + _preview.set_texture(data as Texture) + elif data is PackedScene: + var n : Node = data.instance() + + if _preview != null: + _preview.queue_free() + + if n is Spatial: + _preview = spatial_preview.instance() + add_child(_preview) + _preview.owner = self + move_child(_preview, 0) + + _preview.preview(n as Spatial) + elif n is Node2D: + _preview = node2d_preview.instance() + add_child(_preview) + _preview.owner = self + move_child(_preview, 0) + + _preview.preview(n as Node2D) + elif n is Control: + _preview = control_preview.instance() + add_child(_preview) + _preview.owner = self + move_child(_preview, 0) + + _preview.preview(n as Control) + else: + n.queue_free() + + _main_button.text = name_text + +func can_drop_data(position, data): + return false + +func inspect(): + emit_signal("inspect_data", _data) + +func duplicate_data(): + emit_signal("duplicate", _data) + +func delete(): + emit_signal("delete", _data) diff --git a/game/addons/module_manager/panels/FolderEntryButton.gd b/game/addons/module_manager/panels/FolderEntryButton.gd new file mode 100644 index 0000000..8fc59cb --- /dev/null +++ b/game/addons/module_manager/panels/FolderEntryButton.gd @@ -0,0 +1,12 @@ +tool +extends Button + +export(int) var tab = 0 + +var _panel + +func _pressed(): + _panel.set_tab(tab) + +func set_main_panel(panel): + _panel = panel diff --git a/game/addons/module_manager/panels/FolderEntryButton.tscn b/game/addons/module_manager/panels/FolderEntryButton.tscn new file mode 100644 index 0000000..099771a --- /dev/null +++ b/game/addons/module_manager/panels/FolderEntryButton.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/module_manager/panels/FolderEntryButton.gd" type="Script" id=1] + + +[node name="FolderEntryButton" type="Button"] +margin_right = 210.0 +margin_bottom = 20.0 +size_flags_horizontal = 3 +script = ExtResource( 1 ) diff --git a/game/addons/module_manager/panels/HistoryEntry.gd b/game/addons/module_manager/panels/HistoryEntry.gd new file mode 100644 index 0000000..f32b6e1 --- /dev/null +++ b/game/addons/module_manager/panels/HistoryEntry.gd @@ -0,0 +1,39 @@ +tool +extends Button + +signal history_entry_selected + +var data : Resource setget set_data#, get_data + +func _pressed() -> void: + emit_signal("history_entry_selected", data) + +func set_data(pdata: Resource) -> void: + data = pdata + + var s : String = "(" + data.get_class() + ") " + + if data.has_method("get_id"): + s += str(data.get_id()) + " - " + + if data.has_method("get_text_name"): + s += str(data.get_text_name()) + + if data.has_method("get_rank"): + s += " (R " + str(data.get_rank()) + ")" + + text = s + +func get_data() -> Resource: + return data + +func get_drag_data(position): + if data == null: + return null + + var d : Dictionary = Dictionary() + d["type"] = "resource" + d["resource"] = data + d["from"] = self + + return d diff --git a/game/addons/module_manager/panels/HistoryEntry.tscn b/game/addons/module_manager/panels/HistoryEntry.tscn new file mode 100644 index 0000000..609bf8a --- /dev/null +++ b/game/addons/module_manager/panels/HistoryEntry.tscn @@ -0,0 +1,12 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/module_manager/panels/HistoryEntry.gd" type="Script" id=1] + + +[node name="HistoryEntry" type="Button"] +margin_right = 236.0 +margin_bottom = 37.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/game/addons/module_manager/panels/MainPanel.gd b/game/addons/module_manager/panels/MainPanel.gd new file mode 100644 index 0000000..d87da0f --- /dev/null +++ b/game/addons/module_manager/panels/MainPanel.gd @@ -0,0 +1,89 @@ +tool +extends Control + +signal inspect_data + +export(PackedScene) var resource_scene : PackedScene +export(PackedScene) var folder_entry_button_scene : PackedScene +export(String) var base_folder : String = "res://modules/" +export(NodePath) var main_container : NodePath +export(NodePath) var folder_entry_container_path : NodePath + + +var _main_container : Node +var _resource_scene : Node +var _folder_entry_container : Node + + +var _folders : Array = [ +] + +func _ready(): + var dir : Directory = Directory.new() + + + if dir.file_exists("res://ess_data.json"): + var file : File = File.new() + + if file.open("res://ess_data.json", File.READ) == OK: + var s : String = file.get_as_text() + + _folders = parse_json(s) + + file.close() +# else: +# var file : File = File.new() +# +# if file.open("res://ess_data.json", File.WRITE) == OK: +# file.store_string(to_json(_folders)) +# +# file.close() + + _main_container = get_node(main_container) + + _resource_scene = resource_scene.instance() + _main_container.add_child(_resource_scene) + _resource_scene.owner = _main_container + _resource_scene.connect("inspect_data", self, "inspect_data") + + _folder_entry_container = get_node(folder_entry_container_path) + + for ch in _folder_entry_container.get_children(): + ch.queue_free() + + var index = 0 + for f in _folders: + if f.has("header"): + var h : Label = Label.new() + + _folder_entry_container.add_child(h) + h.owner = _folder_entry_container + + h.text = f["header"] + + var fe : Node = folder_entry_button_scene.instance() + + _folder_entry_container.add_child(fe) + fe.owner = _folder_entry_container + + fe.text = f["name"] + fe.tab = index + + fe.set_main_panel(self) + + index += 1 + + set_tab(0) +# set_tab("test") + +func set_tab(tab_index : int) -> void: + hide_all() + + _resource_scene.show() + _resource_scene.set_resource_type(_folders[tab_index]["folder"], _folders[tab_index]["type"]) + +func hide_all() -> void: + _resource_scene.hide() + +func inspect_data(var data : Resource) -> void: + emit_signal("inspect_data", data) diff --git a/game/addons/module_manager/panels/MainPanel.tscn b/game/addons/module_manager/panels/MainPanel.tscn new file mode 100644 index 0000000..5ec28fb --- /dev/null +++ b/game/addons/module_manager/panels/MainPanel.tscn @@ -0,0 +1,45 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://addons/module_manager/panels/MainPanel.gd" type="Script" id=1] +[ext_resource path="res://addons/module_manager/panels/FolderEntryButton.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/module_manager/panels/ResourcePanel.tscn" type="PackedScene" id=3] + + +[node name="Panel" type="MarginContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +resource_scene = ExtResource( 3 ) +folder_entry_button_scene = ExtResource( 2 ) +base_folder = "res://data/" +main_container = NodePath("HSplitContainer/MarginContainer") +folder_entry_container_path = NodePath("HSplitContainer/ScrollContainer/VBoxContainer") + +[node name="HSplitContainer" type="HSplitContainer" parent="."] +margin_right = 1024.0 +margin_bottom = 600.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +split_offset = 210 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ScrollContainer" type="ScrollContainer" parent="HSplitContainer"] +margin_right = 210.0 +margin_bottom = 600.0 +size_flags_vertical = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="HSplitContainer/ScrollContainer"] +margin_right = 210.0 +size_flags_horizontal = 3 + +[node name="MarginContainer" type="MarginContainer" parent="HSplitContainer"] +margin_left = 222.0 +margin_right = 1024.0 +margin_bottom = 600.0 diff --git a/game/addons/module_manager/panels/ResourcePanel.gd b/game/addons/module_manager/panels/ResourcePanel.gd new file mode 100644 index 0000000..66b0ba5 --- /dev/null +++ b/game/addons/module_manager/panels/ResourcePanel.gd @@ -0,0 +1,291 @@ +tool +extends Control + +signal inspect_data + +export(PackedScene) var resource_row_scene : PackedScene +export(PackedScene) var history_row_scene : PackedScene + +export(NodePath) var entry_container_path : NodePath + +export(NodePath) var name_popup_path : NodePath +export(NodePath) var create_popup_path : NodePath +export(NodePath) var delete_popup_path : NodePath + +export(NodePath) var history_container_path : NodePath + +var _filter_term : String + +var _entry_container : Node +var _name_popup : Node +var _create_popup : ConfirmationDialog +var _delete_popup : ConfirmationDialog + +var _history_container : Node + +var _folder : String +var _resource_type : String + +var _queue_deleted : Resource + +var _state : Dictionary +var _states : Dictionary + +func _ready(): + _history_container = get_node(history_container_path) + + _entry_container = get_node(entry_container_path) + _name_popup = get_node(name_popup_path) + _name_popup.connect("ok_pressed", self, "ok_pressed") + + _create_popup = get_node(create_popup_path) + _delete_popup = get_node(delete_popup_path) + +func set_resource_type(folder : String, resource_type : String) -> void: + if folder == _folder and _resource_type == resource_type: + return + + _states[_folder + "," + _resource_type] = _state + + if _states.has(folder + "," + resource_type): + _state = _states[folder + "," + resource_type] + else: + _state = Dictionary() + + _folder = folder + _resource_type = resource_type + +# _filter_term = "" + + _create_popup.set_resource_type(resource_type) + + refresh() + +func refresh() -> void: + for ch in _entry_container.get_children(): + ch.queue_free() + + var dir : Directory = Directory.new() + + if dir.open(_folder) == OK: + dir.list_dir_begin() + var data_array : Array = Array() + + var file_name = dir.get_next() + + while (file_name != ""): + if not dir.current_is_dir(): + + if ResourceLoader.exists(_folder + file_name, _resource_type): + + var res = ResourceLoader.load(_folder + file_name, _resource_type) + + if _filter_term != "": + var ftext : String = "" + + if res.has_method("get_text_name"): + ftext = res.get_text_name() + + if ftext == "": + if res.resource_name != "": + ftext = res.resource_name + else: + ftext = res.resource_path + + ftext = ftext.to_lower() + + if ftext.find(_filter_term) == -1: + file_name = dir.get_next() + continue + + var id : int = 0 + + if res.has_method("get_id"): + id = res.get_id() + + data_array.append({ + "id": id, + "resource": res + }) + + file_name = dir.get_next() + + data_array.sort_custom(self, "sort_entries") + + for d in data_array: + + var resn : Node = resource_row_scene.instance() + + _entry_container.add_child(resn) + resn.owner = _entry_container + resn.set_resource(d["resource"]) + resn.connect("inspect_data", self, "inspect_data") + resn.connect("duplicate", self, "duplicate_data") + resn.connect("delete", self, "delete") + +func inspect_data(var data : Resource) -> void: + var found : bool = false + + for ch in _history_container.get_children(): + if ch.data == data: + found = true + + _history_container.move_child(ch, 0) + + break + + if not found: + var n : Node = history_row_scene.instance() + + _history_container.add_child(n) + _history_container.move_child(n, 0) + n.owner = _history_container + + n.data = data + n.connect("history_entry_selected", self, "inspect_data") + + if _history_container.get_child_count() > 20: + var ch : Node = _history_container.get_child(_history_container.get_child_count() - 1) + + ch.queue_free() + + emit_signal("inspect_data", data) + +func ok_pressed(res_name: String, pclass_name: String) -> void: + + var d : Directory = Directory.new() + + if d.open(_folder) == OK: + d.list_dir_begin() + + var file_name = d.get_next() + + var max_ind : int = 0 + + while (file_name != ""): + + if not d.current_is_dir(): + + var curr_ind : int = int(file_name.split("_")[0]) + + if curr_ind > max_ind: + max_ind = curr_ind + + file_name = d.get_next() + + max_ind += 1 + + var newfname : String = str(res_name) + newfname = newfname.replace(" ", "_") + newfname = newfname.to_lower() + newfname = str(max_ind) + "_" + newfname + ".tres" + + var res : Resource = null + + if ClassDB.class_exists(pclass_name) and ClassDB.can_instance(pclass_name): + res = ClassDB.instance(pclass_name) + else: + var gsc : Array = ProjectSettings.get("_global_script_classes") + + for i in range(gsc.size()): + var gsce : Dictionary = gsc[i] as Dictionary + + if gsce["class"] == pclass_name: + var script : Script = load(gsce["path"]) + + res = script.new() + + break + + if res == null: + print("ESSData: Error in creating resource type " + pclass_name) + return + + if res.has_method("set_id"): + res.set_id(max_ind) + + if res.has_method("set_text_name"): + res.set_text_name(str(res_name)) + + ResourceSaver.save(_folder + newfname, res) + + refresh() + +func duplicate_data(data): + if not data is Resource: + return + + var d : Directory = Directory.new() + + if d.open(_folder) == OK: + d.list_dir_begin() + + var file_name = d.get_next() + + var max_ind : int = 0 + + while (file_name != ""): + + if not d.current_is_dir(): + + var curr_ind : int = int(file_name.split("_")[0]) + + if curr_ind > max_ind: + max_ind = curr_ind + + file_name = d.get_next() + + max_ind += 1 + + var res_name : String = "" + + if data.has_method("get_text_name"): + res_name = data.get_text_name() + + var newfname : String = res_name + newfname = newfname.replace(" ", "_") + newfname = newfname.to_lower() + newfname = str(max_ind) + "_" + newfname + ".tres" + + var res : Resource = data.duplicate() + + if res.has_method("set_id"): + res.set_id(max_ind) + + if res.has_method("set_text_name"): + res.set_text_name(str(res_name)) + + ResourceSaver.save(_folder + newfname, res) + + refresh() + +func delete(data): + if data == null or data as Resource == null: + return + + _queue_deleted = data as Resource + + _delete_popup.popup_centered() + +func delete_confirm(): + if _queue_deleted == null: + return + + var d : Directory = Directory.new() + d.remove(_queue_deleted.resource_path) + + _queue_deleted = null + + refresh() + +func clear_history() -> void: + for ch in _history_container.get_children(): + ch.queue_free() + +func search(text : String) -> void: + _filter_term = text.to_lower() + + refresh() + +func sort_entries(a, b): + return a["id"] < b["id"] diff --git a/game/addons/module_manager/panels/ResourcePanel.tscn b/game/addons/module_manager/panels/ResourcePanel.tscn new file mode 100644 index 0000000..32a45d4 --- /dev/null +++ b/game/addons/module_manager/panels/ResourcePanel.tscn @@ -0,0 +1,118 @@ +[gd_scene load_steps=8 format=2] + +[ext_resource path="res://addons/module_manager/panels/CreateNamePopup.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/module_manager/panels/ResourceRow.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/module_manager/panels/HistoryEntry.tscn" type="PackedScene" id=3] +[ext_resource path="res://addons/module_manager/icons/icon_add.png" type="Texture" id=4] +[ext_resource path="res://addons/module_manager/panels/ResourcePanel.gd" type="Script" id=5] +[ext_resource path="res://addons/module_manager/icons/icon_empty.png" type="Texture" id=6] +[ext_resource path="res://addons/module_manager/icons/icon_reload_small.png" type="Texture" id=7] + + +[node name="Panel" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +script = ExtResource( 5 ) +__meta__ = { +"_edit_use_anchors_": false +} +resource_row_scene = ExtResource( 2 ) +history_row_scene = ExtResource( 3 ) +entry_container_path = NodePath("ResourcePanel/VBoxContainer2/ScrollContainer2/VBoxContainer") +name_popup_path = NodePath("CreateNamePopup") +create_popup_path = NodePath("CreateNamePopup") +delete_popup_path = NodePath("DeletePopup") +history_container_path = NodePath("ResourcePanel/VBoxContainer/ScrollContainer/VBoxContainer") + +[node name="ResourcePanel" type="HSplitContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +split_offset = 500 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer2" type="VBoxContainer" parent="ResourcePanel"] +margin_right = 664.0 +margin_bottom = 600.0 + +[node name="LineEdit" type="LineEdit" parent="ResourcePanel/VBoxContainer2"] +margin_right = 664.0 +margin_bottom = 45.0 +right_icon = ExtResource( 6 ) +placeholder_text = "Filter" +caret_blink = true + +[node name="CreateButton" type="Button" parent="ResourcePanel/VBoxContainer2"] +margin_top = 53.0 +margin_right = 664.0 +margin_bottom = 90.0 +rect_min_size = Vector2( 100, 0 ) +text = "Create" +icon = ExtResource( 4 ) +expand_icon = true + +[node name="HSeparator" type="HSeparator" parent="ResourcePanel/VBoxContainer2"] +margin_top = 98.0 +margin_right = 664.0 +margin_bottom = 106.0 +size_flags_horizontal = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ScrollContainer2" type="ScrollContainer" parent="ResourcePanel/VBoxContainer2"] +margin_top = 114.0 +margin_right = 664.0 +margin_bottom = 600.0 +size_flags_vertical = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="ResourcePanel/VBoxContainer2/ScrollContainer2"] +margin_right = 664.0 +size_flags_horizontal = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="ResourcePanel"] +margin_left = 688.0 +margin_right = 1024.0 +margin_bottom = 600.0 + +[node name="Button" type="Button" parent="ResourcePanel/VBoxContainer"] +margin_right = 336.0 +margin_bottom = 37.0 +size_flags_horizontal = 3 +text = "Clear History" +icon = ExtResource( 7 ) + +[node name="HSeparator" type="HSeparator" parent="ResourcePanel/VBoxContainer"] +margin_top = 45.0 +margin_right = 336.0 +margin_bottom = 53.0 +size_flags_horizontal = 3 + +[node name="ScrollContainer" type="ScrollContainer" parent="ResourcePanel/VBoxContainer"] +margin_top = 61.0 +margin_right = 336.0 +margin_bottom = 600.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="ResourcePanel/VBoxContainer/ScrollContainer"] +margin_right = 336.0 +size_flags_horizontal = 3 + +[node name="CreateNamePopup" parent="." instance=ExtResource( 1 )] + +[node name="DeletePopup" type="ConfirmationDialog" parent="."] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -139.0 +margin_top = -55.0 +margin_right = 139.0 +margin_bottom = 55.0 +dialog_text = "Delete?" +[connection signal="text_entered" from="ResourcePanel/VBoxContainer2/LineEdit" to="." method="search"] +[connection signal="pressed" from="ResourcePanel/VBoxContainer2/CreateButton" to="CreateNamePopup" method="popup"] +[connection signal="pressed" from="ResourcePanel/VBoxContainer/Button" to="." method="clear_history"] +[connection signal="confirmed" from="DeletePopup" to="." method="delete_confirm"] diff --git a/game/addons/module_manager/panels/ResourceRow.tscn b/game/addons/module_manager/panels/ResourceRow.tscn new file mode 100644 index 0000000..8bed407 --- /dev/null +++ b/game/addons/module_manager/panels/ResourceRow.tscn @@ -0,0 +1,47 @@ +[gd_scene load_steps=9 format=2] + +[ext_resource path="res://addons/module_manager/previews/TexturePreview.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/module_manager/previews/ControlPreview.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/module_manager/previews/Node2DPreview.tscn" type="PackedScene" id=3] +[ext_resource path="res://addons/module_manager/previews/SpatialPreview.tscn" type="PackedScene" id=4] +[ext_resource path="res://addons/module_manager/panels/ResourceRowMainButton.gd" type="Script" id=5] +[ext_resource path="res://addons/module_manager/panels/EntryButton.gd" type="Script" id=6] +[ext_resource path="res://addons/module_manager/icons/icon_duplicate.png" type="Texture" id=7] +[ext_resource path="res://addons/module_manager/icons/icon_remove.png" type="Texture" id=8] + + +[node name="ResourceRow" type="HBoxContainer"] +margin_right = 634.0 +margin_bottom = 37.0 +rect_min_size = Vector2( 100, 0 ) +size_flags_horizontal = 3 +script = ExtResource( 6 ) +__meta__ = { +"_edit_use_anchors_": false +} +spatial_preview = ExtResource( 4 ) +node2d_preview = ExtResource( 3 ) +control_preview = ExtResource( 2 ) +texture_preview = ExtResource( 1 ) +main_button_path = NodePath("ResourceRowMainButton") + +[node name="ResourceRowMainButton" type="Button" parent="."] +margin_right = 570.0 +margin_bottom = 37.0 +size_flags_horizontal = 3 +script = ExtResource( 5 ) + +[node name="Button2" type="Button" parent="."] +margin_left = 574.0 +margin_right = 602.0 +margin_bottom = 37.0 +icon = ExtResource( 7 ) + +[node name="Button3" type="Button" parent="."] +margin_left = 606.0 +margin_right = 634.0 +margin_bottom = 37.0 +icon = ExtResource( 8 ) +[connection signal="pressed" from="ResourceRowMainButton" to="." method="inspect"] +[connection signal="pressed" from="Button2" to="." method="duplicate_data"] +[connection signal="pressed" from="Button3" to="." method="delete"] diff --git a/game/addons/module_manager/panels/ResourceRowMainButton.gd b/game/addons/module_manager/panels/ResourceRowMainButton.gd new file mode 100644 index 0000000..37177fc --- /dev/null +++ b/game/addons/module_manager/panels/ResourceRowMainButton.gd @@ -0,0 +1,18 @@ +tool +extends Button + +var _data : Resource + +func get_drag_data(position): + if _data == null: + return null + + var d : Dictionary = Dictionary() + d["type"] = "resource" + d["resource"] = _data + d["from"] = self + + return d + +func set_resource(data : Resource) -> void: + _data = data diff --git a/game/addons/module_manager/plugin.cfg b/game/addons/module_manager/plugin.cfg new file mode 100644 index 0000000..1f7b6ab --- /dev/null +++ b/game/addons/module_manager/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="Entity Spell System Data Manager" +description="" +author="Relintai" +version="1.0" +script="plugin.gd" diff --git a/game/addons/module_manager/plugin.gd b/game/addons/module_manager/plugin.gd new file mode 100644 index 0000000..6db6e89 --- /dev/null +++ b/game/addons/module_manager/plugin.gd @@ -0,0 +1,36 @@ +tool +extends EditorPlugin + +const _main_panel : PackedScene = preload("res://addons/module_manager/panels/MainPanel.tscn") +const _script_icon : Texture = preload("res://addons/module_manager/icons/icon_multi_line.png") + +var _main_panel_instance : Control + +func _enter_tree(): + _main_panel_instance = _main_panel.instance() as Control + _main_panel_instance.connect("inspect_data", self, "inspect_data") + + get_editor_interface().get_editor_viewport().add_child(_main_panel_instance) + + make_visible(false) + +func _exit_tree(): + _main_panel_instance.queue_free() + +func has_main_screen(): + return true + +func make_visible(visible): + if visible: + _main_panel_instance.show() + else: + _main_panel_instance.hide() + +func get_plugin_icon(): + return _script_icon + +func get_plugin_name(): + return "Modules" + +func inspect_data(var data : Resource) -> void: + get_editor_interface().inspect_object(data) diff --git a/game/addons/module_manager/previews/ControlPreview.gd b/game/addons/module_manager/previews/ControlPreview.gd new file mode 100644 index 0000000..0758c3e --- /dev/null +++ b/game/addons/module_manager/previews/ControlPreview.gd @@ -0,0 +1,14 @@ +tool +extends ViewportContainer + +export(NodePath) var container_path : NodePath + +var _container : Node + +func _ready() -> void: + _container = get_node(container_path) + +func preview(n: Control) -> void: + _container.add_child(n) + n.owner = _container + diff --git a/game/addons/module_manager/previews/ControlPreview.tscn b/game/addons/module_manager/previews/ControlPreview.tscn new file mode 100644 index 0000000..c6c8a23 --- /dev/null +++ b/game/addons/module_manager/previews/ControlPreview.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/module_manager/previews/ControlPreview.gd" type="Script" id=1] + + +[node name="ControlPreview" type="ViewportContainer"] +margin_right = 60.0 +margin_bottom = 60.0 +rect_min_size = Vector2( 60, 60 ) +rect_pivot_offset = Vector2( -198.876, -96.6558 ) +stretch = true +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +container_path = NodePath("Viewport") + +[node name="Viewport" type="Viewport" parent="."] +size = Vector2( 500, 500 ) +own_world = true +handle_input_locally = false +render_target_update_mode = 3 diff --git a/game/addons/module_manager/previews/Node2DPreview.gd b/game/addons/module_manager/previews/Node2DPreview.gd new file mode 100644 index 0000000..586b8d9 --- /dev/null +++ b/game/addons/module_manager/previews/Node2DPreview.gd @@ -0,0 +1,14 @@ +tool +extends ViewportContainer + +export(NodePath) var container_path : NodePath + +var _container : Node + +func _ready() -> void: + _container = get_node(container_path) + +func preview(n: Node2D) -> void: + _container.add_child(n) + n.owner = _container + diff --git a/game/addons/module_manager/previews/Node2DPreview.tscn b/game/addons/module_manager/previews/Node2DPreview.tscn new file mode 100644 index 0000000..58d394c --- /dev/null +++ b/game/addons/module_manager/previews/Node2DPreview.tscn @@ -0,0 +1,25 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/module_manager/previews/Node2DPreview.gd" type="Script" id=1] + + +[node name="Node2DPreview" type="ViewportContainer"] +margin_right = 60.0 +margin_bottom = 60.0 +rect_min_size = Vector2( 60, 60 ) +rect_pivot_offset = Vector2( -198.876, -96.6558 ) +stretch = true +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +container_path = NodePath("Viewport") + +[node name="Viewport" type="Viewport" parent="."] +size = Vector2( 500, 500 ) +own_world = true +handle_input_locally = false +render_target_update_mode = 3 + +[node name="Camera2D" type="Camera2D" parent="Viewport"] +current = true diff --git a/game/addons/module_manager/previews/SpatialPreview.gd b/game/addons/module_manager/previews/SpatialPreview.gd new file mode 100644 index 0000000..565cb9d --- /dev/null +++ b/game/addons/module_manager/previews/SpatialPreview.gd @@ -0,0 +1,14 @@ +tool +extends ViewportContainer + +export(NodePath) var container_path : NodePath + +var _container : Node + +func _ready() -> void: + _container = get_node(container_path) + +func preview(n: Spatial) -> void: + _container.add_child(n) + n.owner = _container + diff --git a/game/addons/module_manager/previews/SpatialPreview.tscn b/game/addons/module_manager/previews/SpatialPreview.tscn new file mode 100644 index 0000000..59d7418 --- /dev/null +++ b/game/addons/module_manager/previews/SpatialPreview.tscn @@ -0,0 +1,29 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/module_manager/previews/SpatialPreview.gd" type="Script" id=1] + + +[node name="SpatialPreview" type="ViewportContainer"] +margin_right = 60.0 +margin_bottom = 60.0 +rect_min_size = Vector2( 60, 60 ) +rect_pivot_offset = Vector2( -198.876, -96.6558 ) +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +container_path = NodePath("Viewport") + +[node name="Viewport" type="Viewport" parent="."] +size = Vector2( 60, 60 ) +size_override_stretch = true +own_world = true +handle_input_locally = false +render_target_update_mode = 3 + +[node name="Camera" type="Camera" parent="Viewport"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 10.9828 ) +current = true + +[node name="DirectionalLight" type="DirectionalLight" parent="Viewport"] +transform = Transform( 0.276929, 0, -0.96089, 0, 1, 0, 0.96089, 0, 0.276929, -13.093, 0, 6.67786 ) diff --git a/game/addons/module_manager/previews/TexturePreview.gd b/game/addons/module_manager/previews/TexturePreview.gd new file mode 100644 index 0000000..5b50e16 --- /dev/null +++ b/game/addons/module_manager/previews/TexturePreview.gd @@ -0,0 +1,12 @@ +tool +extends TextureRect + +func set_texture(tex: Texture)-> void: + texture = tex + + if tex is PackerImageResource: + var t : ImageTexture = ImageTexture.new() + + t.create_from_image(tex.data, 0) + + texture = t diff --git a/game/addons/module_manager/previews/TexturePreview.tscn b/game/addons/module_manager/previews/TexturePreview.tscn new file mode 100644 index 0000000..a31e057 --- /dev/null +++ b/game/addons/module_manager/previews/TexturePreview.tscn @@ -0,0 +1,13 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/module_manager/previews/TexturePreview.gd" type="Script" id=1] + + +[node name="TexturePreview" type="TextureRect"] +margin_bottom = 37.0 +rect_min_size = Vector2( 50, 50 ) +expand = true +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/game/autoload/Logger.gd b/game/autoload/Logger.gd new file mode 100644 index 0000000..47a8cd2 --- /dev/null +++ b/game/autoload/Logger.gd @@ -0,0 +1,637 @@ +# Copyright (c) 2016 KOBUGE Games +# Distributed under the terms of the MIT license. +# https://github.com/KOBUGE-Games/godot-logger/blob/master/LICENSE.md +# +# Upstream repo: https://github.com/KOBUGE-Games/godot-logger + +extends Node # Needed to work as a singleton + +##================## +## Inner classes ## +##================## + +class Logfile: + # TODO: Godot doesn't support docstrings for inner classes, GoDoIt (GH-1320) + # """Class for log files that can be shared between various modules.""" + var file = null + var path = "" + var queue_mode = QUEUE_NONE + var buffer = PoolStringArray() + var buffer_idx = 0 + + func _init(_path, _queue_mode = QUEUE_NONE): + file = File.new() + if validate_path(_path): + path = _path + queue_mode = _queue_mode + buffer.resize(FILE_BUFFER_SIZE) + + func get_path(): + return path + + func set_queue_mode(new_mode): + queue_mode = new_mode + + func get_queue_mode(): + return queue_mode + + func get_write_mode(): + if not file.file_exists(path): + return File.WRITE # create + else: + return File.READ_WRITE # append + + func validate_path(ppath): + """Validate the path given as argument, making it possible to write to + the designated file or folder. Returns whether the path is valid.""" + if !(ppath.is_abs_path() or ppath.is_rel_path()): + print("[ERROR] [logger] The given path '%s' is not valid." % ppath) + return false + var dir = Directory.new() + var base_dir = ppath.get_base_dir() + if not dir.dir_exists(base_dir): + # TODO: Move directory creation to the function that will actually *write* + var err = dir.make_dir_recursive(base_dir) + if err: + print("[ERROR] [logger] Could not create the '%s' directory; exited with error %d." \ + % [base_dir, err]) + return false + else: + print("[INFO] [logger] Successfully created the '%s' directory." % base_dir) + return true + + func flush_buffer(): + """Flush the buffer, i.e. write its contents to the target file.""" + if buffer_idx == 0: + return # Nothing to write + var err = file.open(path, get_write_mode()) + if err: + print("[ERROR] [logger] Could not open the '%s' log file; exited with error %d." \ + % [path, err]) + return + file.seek_end() + for i in range(buffer_idx): + file.store_line(buffer[i]) + file.close() + buffer_idx = 0 # We don't clear the memory, we'll just overwrite it + + func write(output, level): + """Write the string at the end of the file (append mode), following + the queue mode.""" + var queue_action = queue_mode + if queue_action == QUEUE_SMART: + if level >= WARN: # Don't queue warnings and errors + queue_action = QUEUE_NONE + flush_buffer() + else: # Queue the log, not important enough for "smart" + queue_action = QUEUE_ALL + + if queue_action == QUEUE_NONE: + var err = file.open(path, get_write_mode()) + if err: + print("[ERROR] [logger] Could not open the '%s' log file; exited with error %d." \ + % [path, err]) + return + file.seek_end() + file.store_line(output) + file.close() + + if queue_action == QUEUE_ALL: + buffer[buffer_idx] = output + buffer_idx += 1 + if buffer_idx >= FILE_BUFFER_SIZE: + flush_buffer() + + func get_config(): + return { + "path": get_path(), + "queue_mode": get_queue_mode() + } + + +class Module: + # """Class for customizable logging modules.""" + var name = "" + var output_level = 0 + var output_strategies = [] + var logfile = null + + func _init(_name, _output_level, _output_strategies, _logfile): + name = _name + set_output_level(_output_level) + + if typeof(_output_strategies) == TYPE_INT: # Only one strategy, use it for all + #warning-ignore:unused_variable + for i in range(0, LEVELS.size()): + output_strategies.append(_output_strategies) + else: + for strategy in _output_strategies: # Need to force deep copy + output_strategies.append(strategy) + + set_logfile(_logfile) + + func get_name(): + return name + + func set_output_level(level): + """Set the custom minimal level for the output of the module. + All levels greater or equal to the given once will be output based + on their respective strategies, while levels lower than the given one + will be discarded.""" + if not level in range(0, LEVELS.size()): + print("[ERROR] [%s] The level must be comprised between 0 and %d." \ + % [PLUGIN_NAME, LEVELS.size() - 1]) + return + output_level = level + + func get_output_level(): + return output_level + + func set_common_output_strategy(output_strategy_mask): + """Set the common output strategy mask for all levels of the module.""" + if not output_strategy_mask in range(0, MAX_STRATEGY + 1): + print("[ERROR] [%s] The output strategy mask must be comprised between 0 and %d." \ + % [PLUGIN_NAME, MAX_STRATEGY]) + return + for i in range(0, LEVELS.size()): + output_strategies[i] = output_strategy_mask + + func set_output_strategy(output_strategy_mask, level = -1): + """Set the output strategy for the given level or (by default) all + levels of the module.""" + if not output_strategy_mask in range(0, MAX_STRATEGY + 1): + print("[ERROR] [%s] The output strategy mask must be comprised between 0 and %d." \ + % [PLUGIN_NAME, MAX_STRATEGY]) + return + if level == -1: # Set for all levels + for i in range(0, LEVELS.size()): + output_strategies[i] = output_strategy_mask + else: + if not level in range(0, LEVELS.size()): + print("[ERROR] [%s] The level must be comprised between 0 and %d." \ + % [PLUGIN_NAME, LEVELS.size() - 1]) + return + output_strategies[level] = output_strategy_mask + + func get_output_strategy(level = -1): + if level == -1: + return output_strategies + else: + return output_strategies[level] + + func set_logfile(new_logfile): + """Set the Logfile instance for the module.""" + logfile = new_logfile + + func get_logfile(): + return logfile + + func get_config(): + return { + "name": get_name(), + "output_level": get_output_level(), + "output_strategies": get_output_strategy(), + "logfile_path": get_logfile().get_path() + } + + +##=============## +## Constants ## +##=============## + +const PLUGIN_NAME = "logger" + +# Logging levels - the array and the integers should be matching +const LEVELS = ["VERBOSE", "DEBUG", "INFO", "WARN", "ERROR"] +const VERBOSE = 0 +const DEBUG = 1 +const INFO = 2 +const WARN = 3 +const ERROR = 4 + +# Output strategies +const STRATEGY_MUTE = 0 +const STRATEGY_PRINT = 1 +const STRATEGY_FILE = 2 +const STRATEGY_MEMORY = 4 +const MAX_STRATEGY = STRATEGY_MEMORY*2 - 1 + +# Output format identifiers +const FORMAT_IDS = { + "level": "{LVL}", + "module": "{MOD}", + "message": "{MSG}" +} + +# Queue modes +const QUEUE_NONE = 0 +const QUEUE_ALL = 1 +const QUEUE_SMART = 2 + +const FILE_BUFFER_SIZE = 30 + + +##=============## +## Variables ## +##=============## + +# Configuration +var default_output_level = WARN +# TODO: Find (or implement in Godot) a more clever way to achieve that +var default_output_strategies = [STRATEGY_PRINT, STRATEGY_PRINT, STRATEGY_PRINT, STRATEGY_PRINT, STRATEGY_PRINT] +var default_logfile_path = "user://%s.log" % ProjectSettings.get_setting("application/config/name") +var default_configfile_path = "user://%s.cfg" % PLUGIN_NAME + +# e.g. "[INFO] [main] The young alpaca started growing a goatie." +var output_format = "[{LVL}] [{MOD}] {MSG}" + +# Specific to STRATEGY_MEMORY +var max_memory_size = 30 +var memory_buffer = [] +var memory_idx = 0 +var memory_first_loop = true +var memory_cache = [] +var invalid_memory_cache = false + +# Holds default and custom modules and logfiles defined by the user +# Default modules are initialized in _init via add_module +var logfiles = {} +var modules = {} + + +##=============## +## Functions ## +##=============## + +func put(level, message, module = "main"): + """Log a message in the given module with the given logging level.""" + var module_ref = get_module(module) + var output_strategy = module_ref.get_output_strategy(level) + if output_strategy == STRATEGY_MUTE or module_ref.get_output_level() > level: + return # Out of scope + + var output = format(output_format, level, module, message) + + if output_strategy & STRATEGY_PRINT: + print(output) + + if output_strategy & STRATEGY_FILE: + module_ref.get_logfile().write(output, level) + + if output_strategy & STRATEGY_MEMORY: + memory_buffer[memory_idx] = output + memory_idx += 1 + invalid_memory_cache = true + if memory_idx >= max_memory_size: + memory_idx = 0 + memory_first_loop = false + +# Helper functions for each level +# ------------------------------- + +func verbose(message, module = "main"): + """Log a message in the given module with level VERBOSE.""" + put(VERBOSE, message, module) + +func debug(message, module = "main"): + """Log a message in the given module with level DEBUG.""" + put(DEBUG, message, module) + +func info(message, module = "main"): + """Log a message in the given module with level INFO.""" + put(INFO, message, module) + +func warn(message, module = "main"): + """Log a message in the given module with level WARN.""" + put(WARN, message, module) + +func error(message, module = "main"): + """Log a message in the given module with level ERROR.""" + put(ERROR, message, module) + +# Module management +# ----------------- + +func add_module(name, output_level = default_output_level, \ + output_strategies = default_output_strategies, logfile = null): + """Add a new module with the given parameter or (by default) the + default ones. + Returns a reference to the instanced module.""" + if modules.has(name): + info("The module '%s' already exists; discarding the call to add it anew." \ + % name, PLUGIN_NAME) + else: + if logfile == null: + logfile = get_logfile(default_logfile_path) + modules[name] = Module.new(name, output_level, output_strategies, logfile) + return modules[name] + +func get_module(module = "main"): + """Retrieve the given module if it exists; if not, it will be created.""" + if not modules.has(module): + info("The requested module '%s' does not exist. It will be created with default values." \ + % module, PLUGIN_NAME) + add_module(module) + return modules[module] + +func get_modules(): + """Retrieve the dictionary containing all modules.""" + return modules + +# Logfiles management +# ------------------- + +func set_default_logfile_path(new_logfile_path, keep_old = false): + """Sets the new default logfile path. Unless configured otherwise with + the optional keep_old argument, it will replace the logfile for all + modules which were configured for the previous logfile path.""" + if new_logfile_path == default_logfile_path: + return # Nothing to do + + var old_logfile = get_logfile(default_logfile_path) + var new_logfile = null + if logfiles.has(new_logfile_path): # Already exists + new_logfile = logfiles[new_logfile_path] + else: # Create a new logfile + new_logfile = add_logfile(new_logfile_path) + logfiles[new_logfile_path] = new_logfile + + if not keep_old: # Replace the old defaut logfile in all modules that used it + for module in modules.values(): + if module.get_logfile() == old_logfile: + module.set_logfile(new_logfile) + logfiles.erase(default_logfile_path) + default_logfile_path = new_logfile_path + +func get_default_logfile_path(): + """Return the default logfile path.""" + return default_logfile_path + +func add_logfile(logfile_path = default_logfile_path): + """Add a new logfile that can then be attached to one or more modules. + Returns a reference to the instanced logfile.""" + if logfiles.has(logfile_path): + info("A logfile pointing to '%s' already exists; discarding the call to add it anew." \ + % logfile_path, PLUGIN_NAME) + else: + logfiles[logfile_path] = Logfile.new(logfile_path) + return logfiles[logfile_path] + +func get_logfile(logfile_path): + """Retrieve the given logfile if it exists, otherwise returns null.""" + if not logfiles.has(logfile_path): + warn("The requested logfile pointing to '%s' does not exist." % logfile_path, PLUGIN_NAME) + return null + else: + return logfiles[logfile_path] + +func get_logfiles(): + """Retrieve the dictionary containing all logfiles.""" + return logfiles + +# Default output configuration +# ---------------------------- + +func set_default_output_strategy(output_strategy_mask, level = -1): + """Set the default output strategy mask of the given level or (by + default) all levels for all modules without a custom strategy.""" + if not output_strategy_mask in range(0, MAX_STRATEGY + 1): + error("The output strategy mask must be comprised between 0 and %d." \ + % MAX_STRATEGY, PLUGIN_NAME) + return + if level == -1: # Set for all levels + for i in range(0, LEVELS.size()): + default_output_strategies[i] = output_strategy_mask + info("The default output strategy mask was set to '%d' for all levels." \ + % [output_strategy_mask], PLUGIN_NAME) + else: + if not level in range(0, LEVELS.size()): + error("The level must be comprised between 0 and %d." % (int(LEVELS.size()) - 1), PLUGIN_NAME) + return + default_output_strategies[level] = output_strategy_mask + info("The default output strategy mask was set to '%d' for the '%s' level." \ + % [output_strategy_mask, LEVELS[level]], PLUGIN_NAME) + +func get_default_output_strategy(level): + """Get the default output strategy mask of the given level or (by + default) all levels for all modules without a custom strategy.""" + return default_output_strategies[level] + +func set_default_output_level(level): + """Set the default minimal level for the output of all modules without + a custom output level. + All levels greater or equal to the given once will be output based on + their respective strategies, while levels lower than the given one will + be discarded. + """ + if not level in range(0, LEVELS.size()): + error("The level must be comprised between 0 and %d." % (int(LEVELS.size()) - 1), PLUGIN_NAME) + return + default_output_level = level + info("The default output level was set to '%s'." % LEVELS[level], PLUGIN_NAME) + +func get_default_output_level(): + """Get the default minimal level for the output of all modules without + a custom output level.""" + return default_output_level + +# Output formatting +# ----------------- + +static func format(template, level, module, message): + var output = template + output = output.replace(FORMAT_IDS.level, LEVELS[level]) + output = output.replace(FORMAT_IDS.module, module) + output = output.replace(FORMAT_IDS.message, message) + return output + +func set_output_format(new_format): + """Set the output string format using the following identifiers: + {LVL} for the level, {MOD} for the module, {MSG} for the message. + The three identifiers should be contained in the output format string. + """ + for key in FORMAT_IDS: + if new_format.find(FORMAT_IDS[key]) == -1: + error("Invalid output string format. It lacks the '%s' identifier." \ + % FORMAT_IDS[key], PLUGIN_NAME) + return + output_format = new_format + info("Successfully changed the output format to '%s'." % output_format, PLUGIN_NAME) + +func get_output_format(): + """Get the output string format.""" + return output_format + +# Strategy "memory" +# ----------------- + +func set_max_memory_size(new_size): + """Set the maximum amount of messages to be remembered when + using the STRATEGY_MEMORY output strategy.""" + if new_size <= 0: + error("The maximum amount of remembered messages must be a positive non-null integer. Received %d." \ + % new_size, PLUGIN_NAME) + return + + var new_buffer = [] + var new_idx = 0 + new_buffer.resize(new_size) + + # Better algorithm welcome :D + if memory_first_loop: + var offset = 0 + if memory_idx > new_size: + offset = memory_idx - new_size + memory_first_loop = false + else: + new_idx = memory_idx + for i in range(0, min(memory_idx, new_size)): + new_buffer[i] = memory_buffer[i + offset] + else: + var delta = 0 + if max_memory_size > new_size: + delta = max_memory_size - new_size + else: + new_idx = max_memory_size + memory_first_loop = true + for i in range(0, min(max_memory_size, new_size)): + new_buffer[i] = memory_buffer[(memory_idx + delta + i) % max_memory_size] + + memory_buffer = new_buffer + memory_idx = new_idx + invalid_memory_cache = true + max_memory_size = new_size + info("Successfully set the maximum amount of remembered messages to %d." % max_memory_size, PLUGIN_NAME) + +func get_max_memory_size(): + """Get the maximum amount of messages to be remembered when + using the STRATEGY_MEMORY output strategy.""" + return max_memory_size + +func get_memory(): + """Get an array of the messages remembered following STRATEGY_MEMORY. + The messages are sorted from the oldest to the newest.""" + if invalid_memory_cache: # Need to recreate the cached ordered array + memory_cache = [] + if not memory_first_loop: # else those would be uninitialized + for i in range(memory_idx, max_memory_size): + memory_cache.append(memory_buffer[i]) + for i in range(0, memory_idx): + memory_cache.append(memory_buffer[i]) + invalid_memory_cache = false + return memory_cache + +func clear_memory(): + """Clear the buffer or remembered messages.""" + memory_buffer.clear() + memory_idx = 0 + memory_first_loop = true + invalid_memory_cache = true + + +# Configuration loading/saving +# ---------------------------- + +func save_config(configfile = default_configfile_path): + """Save the default configuration as well as the set of modules and + their respective configurations. + The ConfigFile API is used to generate the config file passed as argument. + A unique section is used, so that it can be merged in a project's engine.cfg. + Returns an error code (OK or some ERR_*).""" + var config = ConfigFile.new() + + # Store default config + config.set_value(PLUGIN_NAME, "default_output_level", default_output_level) + config.set_value(PLUGIN_NAME, "default_output_strategies", default_output_strategies) + config.set_value(PLUGIN_NAME, "default_logfile_path", default_logfile_path) + config.set_value(PLUGIN_NAME, "max_memory_size", max_memory_size) + + # Logfiles config + var logfiles_arr = [] + var sorted_keys = logfiles.keys() + sorted_keys.sort() # Sadly doesn't return the array, so we need to split it + for logfile in sorted_keys: + logfiles_arr.append(logfiles[logfile].get_config()) + config.set_value(PLUGIN_NAME, "logfiles", logfiles_arr) + + # Modules config + var modules_arr = [] + sorted_keys = modules.keys() + sorted_keys.sort() + for module in sorted_keys: + modules_arr.append(modules[module].get_config()) + config.set_value(PLUGIN_NAME, "modules", modules_arr) + + # Save and return the corresponding error code + var err = config.save(configfile) + if err: + error("Could not save the config in '%s'; exited with error %d." \ + % [configfile, err], PLUGIN_NAME) + return err + info("Successfully saved the config to '%s'." % configfile, PLUGIN_NAME) + return OK + +func load_config(configfile = default_configfile_path): + """Load the configuration as well as the set of defined modules and + their respective configurations. The expect file contents must be those + produced by the ConfigFile API. + Returns an error code (OK or some ERR_*).""" + # Look for the file + var dir = Directory.new() + if not dir.file_exists(configfile): + warn("Could not load the config in '%s', the file does not exist." % configfile, PLUGIN_NAME) + return ERR_FILE_NOT_FOUND + + # Load its contents + var config = ConfigFile.new() + var err = config.load(configfile) + if err: + warn("Could not load the config in '%s'; exited with error %d." \ + % [configfile, err], PLUGIN_NAME) + return err + + # Load default config + default_output_level = config.get_value(PLUGIN_NAME, "default_output_level", default_output_level) + default_output_strategies = config.get_value(PLUGIN_NAME, "default_output_strategies", default_output_strategies) + default_logfile_path = config.get_value(PLUGIN_NAME, "default_logfile_path", default_logfile_path) + max_memory_size = config.get_value(PLUGIN_NAME, "max_memory_size", max_memory_size) + + # Load logfiles config and initialize them + logfiles = {} + for logfile_cfg in config.get_value(PLUGIN_NAME, "logfiles"): + var logfile = Logfile.new(logfile_cfg["path"], logfile_cfg["queue_mode"]) + logfiles[logfile_cfg["path"]] = logfile + + # Load modules config and initialize them + modules = {} + for module_cfg in config.get_value(PLUGIN_NAME, "modules"): + var module = Module.new(module_cfg["name"], module_cfg["output_level"], \ + module_cfg["output_strategies"], get_logfile(module_cfg["logfile_path"])) + modules[module_cfg["name"]] = module + + info("Successfully loaded the config from '%s'." % configfile, PLUGIN_NAME) + return OK + + +##=============## +## Callbacks ## +##=============## + +func _init(): + # Default logfile + add_logfile(default_logfile_path) + # Default modules + add_module(PLUGIN_NAME) # needs to be instanced first + add_module("main") + memory_buffer.resize(max_memory_size) + +func _exit_tree(): + # Flush non-empty buffers + var processed_logfiles = [] + var logfile = null + for module in modules: + logfile = modules[module].get_logfile() + if logfile in processed_logfiles: + continue + logfile.flush_buffer() + processed_logfiles.append(logfile) diff --git a/game/autoload/Logger.tscn b/game/autoload/Logger.tscn new file mode 100644 index 0000000..f504f33 --- /dev/null +++ b/game/autoload/Logger.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://autoload/Logger.gd" type="Script" id=1] + +[node name="Logger" type="Node"] +script = ExtResource( 1 ) diff --git a/game/autoload/Server.gd b/game/autoload/Server.gd new file mode 100644 index 0000000..10b3773 --- /dev/null +++ b/game/autoload/Server.gd @@ -0,0 +1,220 @@ +extends Node + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export (int) var port : int = 23223 + +signal cplayer_master_created(player_master) +signal cplayer_master_destroyed(player_master) + +signal splayer_master_created(player_master) +signal splayer_master_destroyed(player_master) + +var splayers_dict : Dictionary = {} +var splayers_array : Array = [] + +var cplayers_dict : Dictionary = {} +var cplayers_array : Array = [] + +var _sseed : int +var _cseed : int + +var local_player_master : PlayerMaster = PlayerMaster.new() + +func _ready() -> void: + #Temporary! REMOVE! + get_multiplayer().allow_object_decoding = true + + get_tree().connect("network_peer_connected", self, "_network_peer_connected") + get_tree().connect("network_peer_disconnected", self, "_network_peer_disconnected") + get_tree().connect("connected_to_server", self, "_connected_to_server") + get_tree().connect("connection_failed", self, "_connection_failed") + get_tree().connect("server_disconnected", self, "_server_disconnected") + + +func start_hosting(p_port : int = 0) -> int: + if p_port == 0: + p_port = port + + var peer : NetworkedMultiplayerENet = NetworkedMultiplayerENet.new() + var err : int = peer.create_server(p_port, 32) + get_tree().set_network_peer(peer) + + _connected_to_server() + + return err + +func start_hosting_websocket(p_port : int = 0) -> int: + if p_port == 0: + p_port = port + + var peer : WebSocketServer = WebSocketServer.new() + var err : int = peer.listen(p_port, [], true) + get_tree().set_network_peer(peer) + + _connected_to_server() + + return err + +func connect_to_server(address : String = "127.0.0.1", p_port : int = 0) -> int: + if p_port == 0: + p_port = port + + var peer = NetworkedMultiplayerENet.new() + var err : int = peer.create_client(address, p_port) + get_tree().set_network_peer(peer) + + return err + +func connect_to_server_websocket(address : String = "127.0.0.1", p_port : int = 0) -> int: + if p_port == 0: + p_port = port + + var peer = WebSocketClient.new() + var err : int = peer.connect_to_url(address + ":" + str(p_port), [], true) + get_tree().set_network_peer(peer) + + return err + +func _network_peer_connected(id : int) -> void: +# Logger.verbose("NetworkManager peer connected " + str(id)) + +# for p in splayers_array: +# rpc_id(id, "cspawn_player", p.my_info, p.sid, p.player.translation) + + var pm : PlayerMaster = PlayerMaster.new() + pm.sid = id + + splayers_array.append(pm) + splayers_dict[id] = pm + + emit_signal("splayer_master_created", pm) + + rpc_id(id, "cset_seed", _sseed) + +func _network_peer_disconnected(id : int) -> void: +# Logger.verbose("NetworkManager peer disconnected " + str(id)) + + var player : PlayerMaster = splayers_dict[id] + splayers_dict.erase(id) + + for pi in range(len(splayers_array)): + if (splayers_array[pi] as PlayerMaster) == player: + splayers_array.remove(pi) + break + + if player: + emit_signal("splayer_master_destroyed", player) + +func _connected_to_server() -> void: +# Logger.verbose("NetworkManager _connected_to_server") + + var pm : PlayerMaster = PlayerMaster.new() + pm.sid = get_tree().get_network_unique_id() + + local_player_master = pm + + emit_signal("cplayer_master_created", pm) + +func _server_disconnected() -> void: +# Logger.verbose("_server_disconnected") + + # Server kicked us; show error and abort. + + for player in get_children(): + emit_signal("NetworkManager cplayer_master_destroyed", player) + player.queue_free() + +func _connection_failed() -> void: +# Logger.verbose("NetworkManager _connection_failed") + + pass # Could not even connect to server; abort. + +func sset_seed(pseed): + _sseed = pseed + + if multiplayer.has_network_peer() and multiplayer.is_network_server(): + rpc("cset_seed", _sseed) + +remote func cset_seed(pseed): + + _cseed = pseed + + print("clientseed set") + + +func set_class(): +# Logger.verbose("set_class") + + if not get_tree().is_network_server(): + rpc_id(1, "crequest_select_class", local_player_master.my_info) + else: + crequest_select_class(local_player_master.my_info) + +remote func crequest_select_class(info : Dictionary) -> void: +# Logger.verbose("NetworkManager crequest_select_class") + + if get_tree().is_network_server(): + var sid : int = get_tree().multiplayer.get_rpc_sender_id() + + if sid == 0: + sid = 1 + + rpc("cspawn_player", info, sid, Vector3(10, 10, 10)) + + +remotesync func cspawn_player(info : Dictionary, sid : int, pos : Vector3): +# Logger.verbose("NetworkManager cspawn_player") + + if sid == get_tree().get_network_unique_id(): + local_player_master.player = ESS.get_ess_entity_spawner().spawn_player(info["selected_class"] as int, pos, info["name"] as String, str(sid), sid) + call_deferred("set_terrarin_player") + + if get_tree().is_network_server() and not splayers_dict.has(sid): + splayers_dict[sid] = local_player_master + splayers_array.append(local_player_master) + else: + var pm : PlayerMaster = PlayerMaster.new() + pm.sid = sid + + pm.player = ESS.get_ess_entity_spawner().spawn_networked_player(info["selected_class"] as int, pos, info["name"] as String, str(sid), sid) + + if get_tree().is_network_server() and not splayers_dict.has(sid): + splayers_dict[sid] = pm + splayers_array.append(pm) + + cplayers_dict[sid] = pm + cplayers_array.append(pm) + + +func upload_character(data : String) -> void: + rpc_id(1, "sreceive_upload_character", data) + +master func sreceive_upload_character(data: String) -> void: + ESS.get_ess_entity_spawner().spawn_networked_player_from_data(data, Vector3(0, 10, 0), multiplayer.get_rpc_sender_id()) + +func set_terrarin_player(): +# Logger.verbose("NetworkManager cspawn_player") + + var terrarin : Node = get_node("/root/GameScene/VoxelWorld") + + if terrarin.has_method("set_player"): + terrarin.set_player(local_player_master.player.get_body()) diff --git a/game/autoload/Server.tscn b/game/autoload/Server.tscn new file mode 100644 index 0000000..2ba6975 --- /dev/null +++ b/game/autoload/Server.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://autoload/Server.gd" type="Script" id=1] + +[node name="Server" type="Node"] +script = ExtResource( 1 ) diff --git a/game/characters/Character.tscn b/game/characters/Character.tscn new file mode 100644 index 0000000..31b09f4 --- /dev/null +++ b/game/characters/Character.tscn @@ -0,0 +1,74 @@ +[gd_scene load_steps=10 format=2] + +[ext_resource path="res://player/CharacterSkeleton2DGD.gd" type="Script" id=1] +[ext_resource path="res://characters/CharacterSideModel.tscn" type="PackedScene" id=2] +[ext_resource path="res://characters/CharacterFrontModel.tscn" type="PackedScene" id=3] +[ext_resource path="res://scripts/item_visuals/CharacterAtlas2D.gd" type="Script" id=4] +[ext_resource path="res://scripts/item_visuals/CharacterAtlasEntry2D.gd" type="Script" id=5] +[ext_resource path="res://characters/char_t1_outline_split.png" type="Texture" id=6] + +[sub_resource type="CharacterAtlasEntry" id=1] +script = ExtResource( 5 ) +front_rect = Rect2( 101, 15, 9, 12 ) +back_rect = Rect2( 74, 18, 9, 12 ) +right_rect = Rect2( 8, 13, 9, 12 ) +left_rect = Rect2( 8, 13, 9, 12 ) + +[sub_resource type="CharacterAtlasEntry" id=2] +script = ExtResource( 5 ) +front_rect = Rect2( 102, 2, 7, 8 ) +back_rect = Rect2( 75, 5, 7, 8 ) +right_rect = Rect2( 9, 0, 7, 8 ) +left_rect = Rect2( 9, 0, 7, 8 ) + +[sub_resource type="CharacterAtlas" id=3] +script = ExtResource( 4 ) +comments = "HUMANOID_BONE_HIP = 0, +HUMANOID_BONE_TORSO = 1, +HUMANOID_BONE_LEG_R = 2, +HUMANOID_BONE_FOOT_R = 3, +HUMANOID_BONE_TOE_R = 4, +HUMANOID_BONE_LEG_L = 5, +HUMANOID_BONE_FOOT_L = 6, +HUMANOID_BONE_TOE_L = 7, +HUMANOID_BONE_ARM_R = 8, +#HUMANOID_BONE_SHOULDER_GUARD_R = 0, +HUMANOID_BONE_HAND_R = 9, +HUMANOID_BONE_FINGERS_R = 10, +HUMANOID_BONE_ARM_L = 11, +#HUMANOID_BONE_SHOULDER_GUARD_L = 0, +HUMANOID_BONE_HAND_L = 12, +HUMANOID_BONE_FINGERS_L = 13, +HUMANOID_BONE_HEAD = 14, +HUMANOID_BONE_HEAD_TOP = 15, +HUMANOID_BONES_MAX = 16," +texture = ExtResource( 6 ) +slots = [ null, SubResource( 1 ), null, null, null, null, null, null, null, null, null, null, null, null, SubResource( 2 ), null ] + +[node name="Character" type="CharacterSkeleton2D"] +entity_type = 1 +attach_point_paths/0_left_hand = NodePath("") +attach_point_paths/1_right_hand = NodePath("") +attach_point_paths/2_torso = NodePath("") +attach_point_paths/3_root = NodePath("") +attach_point_paths/4_right_hip = NodePath("") +attach_point_paths/5_left_hip = NodePath("") +attach_point_paths/6_spine_2 = NodePath("") +attach_point_paths/7_weapon_left = NodePath("") +attach_point_paths/8_weapon_right = NodePath("") +attach_point_paths/9_weapon_left_back = NodePath("") +attach_point_paths/10_weapon_right_back = NodePath("") +attach_point_paths/11_weapon_shield_left = NodePath("") +script = ExtResource( 1 ) +front_node_path = NodePath("CharacterFrontModel") +front_animation_player_path = NodePath("../Character/CharacterFrontModel/AnimationPlayer") +front_animation_tree_path = NodePath("../Character/CharacterFrontModel/AnimationTree") +side_node_path = NodePath("CharacterSideModel") +side_animation_player_path = NodePath("../Character/CharacterSideModel/AnimationPlayer") +side_animation_tree_path = NodePath("../Character/CharacterSideModel/AnimationTree") +character_atlas = SubResource( 3 ) + +[node name="CharacterFrontModel" parent="." instance=ExtResource( 3 )] +visible = false + +[node name="CharacterSideModel" parent="." instance=ExtResource( 2 )] diff --git a/game/characters/CharacterFrontModel.tscn b/game/characters/CharacterFrontModel.tscn new file mode 100644 index 0000000..a985040 --- /dev/null +++ b/game/characters/CharacterFrontModel.tscn @@ -0,0 +1,2387 @@ +[gd_scene load_steps=12 format=2] + +[ext_resource path="res://characters/char_t1_outline_split.png" type="Texture" id=1] +[ext_resource path="res://player/HumanoidCharacterBones2D.gd" type="Script" id=2] + + +[sub_resource type="Animation" id=1] +resource_name = "casting" +length = 2.0 +loop = true +tracks/0/type = "value" +tracks/0/path = NodePath("Hip/Torso/leg_l/foot_l/Position2D:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -0.297693, 7.79954 ), Vector2( -0.297693, 7.79954 ), Vector2( -0.297693, 7.79954 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Hip/Torso/leg_l/foot_l/Position2D:rotation_degrees") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ -0.150298, -0.150298, -0.150298 ] +} +tracks/2/type = "value" +tracks/2/path = NodePath("Hip/Torso/leg_l/foot_l:position") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 4.5 ), Vector2( 0, 4.5 ), Vector2( 0, 4.5 ) ] +} +tracks/3/type = "value" +tracks/3/path = NodePath("Hip/Torso/leg_l/foot_l:rotation_degrees") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ -2.18314, -2.18314, -2.18314 ] +} +tracks/4/type = "value" +tracks/4/path = NodePath("Hip/Torso/leg_l:position") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/keys = { +"times": PoolRealArray( 0, 0.5, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 2, 1.5 ), Vector2( 1.91221, 1.50001 ), Vector2( 2, 1.5 ), Vector2( 2, 1.5 ) ] +} +tracks/5/type = "value" +tracks/5/path = NodePath("Hip/Torso/leg_l:rotation_degrees") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ -7.17636, -7.17636, -7.17636 ] +} +tracks/6/type = "value" +tracks/6/path = NodePath("Hip/Torso/Head/Position2D:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -0.0730991, -6.94428 ), Vector2( -0.0730991, -6.94428 ), Vector2( -0.0730991, -6.94428 ) ] +} +tracks/7/type = "value" +tracks/7/path = NodePath("Hip/Torso/Head/Position2D:rotation_degrees") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/8/type = "value" +tracks/8/path = NodePath("Hip/Torso/Head:position") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, -10 ), Vector2( 0, -10 ), Vector2( 0, -10 ) ] +} +tracks/9/type = "value" +tracks/9/path = NodePath("Hip/Torso/Head:rotation_degrees") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/10/type = "value" +tracks/10/path = NodePath("Hip/Torso/leg_r/foot_r/Position2D:position") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -2.00551, 7.77134 ), Vector2( -2.00551, 7.77134 ), Vector2( -2.00551, 7.77134 ) ] +} +tracks/11/type = "value" +tracks/11/path = NodePath("Hip/Torso/leg_r/foot_r/Position2D:rotation_degrees") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/12/type = "value" +tracks/12/path = NodePath("Hip/Torso/leg_r/foot_r:position") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/keys = { +"times": PoolRealArray( 0, 0.5, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -1, 5 ), Vector2( -1, 5 ), Vector2( -1, 5 ), Vector2( -1, 5 ) ] +} +tracks/13/type = "value" +tracks/13/path = NodePath("Hip/Torso/leg_r/foot_r:rotation_degrees") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/14/type = "value" +tracks/14/path = NodePath("Hip/Torso/leg_r:position") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/keys = { +"times": PoolRealArray( 0, 0.5, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -2, 1 ), Vector2( -2, 1.29 ), Vector2( -2, 1 ), Vector2( -2, 1 ) ] +} +tracks/15/type = "value" +tracks/15/path = NodePath("Hip/Torso/leg_r:rotation_degrees") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/keys = { +"times": PoolRealArray( 0, 0.5, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ 6.92582, 6.92582, 6.92582, 6.92582 ] +} +tracks/16/type = "value" +tracks/16/path = NodePath("Hip/Torso/arm_l/hand_l/end:position") +tracks/16/interp = 1 +tracks/16/loop_wrap = true +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -0.5, 4 ), Vector2( -0.5, 4 ), Vector2( -0.5, 4 ) ] +} +tracks/17/type = "value" +tracks/17/path = NodePath("Hip/Torso/arm_l/hand_l/end:rotation_degrees") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/18/type = "value" +tracks/18/path = NodePath("Hip/Torso/arm_l/hand_l:position") +tracks/18/interp = 1 +tracks/18/loop_wrap = true +tracks/18/imported = false +tracks/18/enabled = true +tracks/18/keys = { +"times": PoolRealArray( 0, 0.5, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 6 ), Vector2( 0, 6 ), Vector2( 0, 6 ), Vector2( 0, 6 ) ] +} +tracks/19/type = "value" +tracks/19/path = NodePath("Hip/Torso/arm_l/hand_l:rotation_degrees") +tracks/19/interp = 1 +tracks/19/loop_wrap = true +tracks/19/imported = false +tracks/19/enabled = true +tracks/19/keys = { +"times": PoolRealArray( 0, 0.5, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ 102.313, 97.3286, 102.313, 102.313 ] +} +tracks/20/type = "value" +tracks/20/path = NodePath("Hip/Torso/arm_l:position") +tracks/20/interp = 1 +tracks/20/loop_wrap = true +tracks/20/imported = false +tracks/20/enabled = true +tracks/20/keys = { +"times": PoolRealArray( 0, 0.5, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 4, -8 ), Vector2( 4, -8 ), Vector2( 4, -8 ), Vector2( 4, -8 ) ] +} +tracks/21/type = "value" +tracks/21/path = NodePath("Hip/Torso/arm_l:rotation_degrees") +tracks/21/interp = 1 +tracks/21/loop_wrap = true +tracks/21/imported = false +tracks/21/enabled = true +tracks/21/keys = { +"times": PoolRealArray( 0, 0.5, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ -0.372368, -5.92958, -8.40393, -0.372368 ] +} +tracks/22/type = "value" +tracks/22/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r/Position2D:position") +tracks/22/interp = 1 +tracks/22/loop_wrap = true +tracks/22/imported = false +tracks/22/enabled = true +tracks/22/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 5 ), Vector2( 0, 5 ), Vector2( 0, 5 ) ] +} +tracks/23/type = "value" +tracks/23/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r/Position2D:rotation_degrees") +tracks/23/interp = 1 +tracks/23/loop_wrap = true +tracks/23/imported = false +tracks/23/enabled = true +tracks/23/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/24/type = "value" +tracks/24/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r:position") +tracks/24/interp = 1 +tracks/24/loop_wrap = true +tracks/24/imported = false +tracks/24/enabled = true +tracks/24/keys = { +"times": PoolRealArray( 0, 0.5, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 5.5 ), Vector2( 0, 5.5 ), Vector2( 0, 5.5 ), Vector2( 0, 5.5 ) ] +} +tracks/25/type = "value" +tracks/25/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r:rotation_degrees") +tracks/25/interp = 1 +tracks/25/loop_wrap = true +tracks/25/imported = false +tracks/25/enabled = true +tracks/25/keys = { +"times": PoolRealArray( 0, 0.5, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ -109.724, -91.7756, -109.724, -109.724 ] +} +tracks/26/type = "value" +tracks/26/path = NodePath("Hip/Torso/remote_arm_r:position") +tracks/26/interp = 1 +tracks/26/loop_wrap = true +tracks/26/imported = false +tracks/26/enabled = true +tracks/26/keys = { +"times": PoolRealArray( 0, 0.5, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -3.50004, -8.61549 ), Vector2( -3.50004, -8.61549 ), Vector2( -3.50004, -8.61549 ), Vector2( -3.50004, -8.61549 ) ] +} +tracks/27/type = "value" +tracks/27/path = NodePath("Hip/Torso/remote_arm_r:rotation_degrees") +tracks/27/interp = 1 +tracks/27/loop_wrap = true +tracks/27/imported = false +tracks/27/enabled = true +tracks/27/keys = { +"times": PoolRealArray( 0, 0.5, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ 4.9682, 25.8311, 4.9682, 4.9682 ] +} +tracks/28/type = "value" +tracks/28/path = NodePath("Hip/Torso/arm_l/shoulder_l:position") +tracks/28/interp = 1 +tracks/28/loop_wrap = true +tracks/28/imported = false +tracks/28/enabled = true +tracks/28/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, -1.5 ), Vector2( 0, -1.5 ), Vector2( 0, -1.5 ) ] +} +tracks/29/type = "value" +tracks/29/path = NodePath("Hip/Torso/arm_l/shoulder_l:rotation_degrees") +tracks/29/interp = 1 +tracks/29/loop_wrap = true +tracks/29/imported = false +tracks/29/enabled = true +tracks/29/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/30/type = "value" +tracks/30/path = NodePath("Hip/Shadow:position") +tracks/30/interp = 1 +tracks/30/loop_wrap = true +tracks/30/imported = false +tracks/30/enabled = true +tracks/30/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -0.5, 14 ), Vector2( -0.5, 14 ), Vector2( -0.5, 14 ) ] +} +tracks/31/type = "value" +tracks/31/path = NodePath("Hip/Shadow:rotation_degrees") +tracks/31/interp = 1 +tracks/31/loop_wrap = true +tracks/31/imported = false +tracks/31/enabled = true +tracks/31/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/32/type = "value" +tracks/32/path = NodePath("Hip/Torso/remote_arm_r/shoulder_guard_r:position") +tracks/32/interp = 1 +tracks/32/loop_wrap = true +tracks/32/imported = false +tracks/32/enabled = true +tracks/32/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 1, -0.2 ), Vector2( 1, -0.2 ), Vector2( 1, -0.2 ) ] +} +tracks/33/type = "value" +tracks/33/path = NodePath("Hip/Torso/remote_arm_r/shoulder_guard_r:rotation_degrees") +tracks/33/interp = 1 +tracks/33/loop_wrap = true +tracks/33/imported = false +tracks/33/enabled = true +tracks/33/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/34/type = "value" +tracks/34/path = NodePath("Hip/Torso:position") +tracks/34/interp = 1 +tracks/34/loop_wrap = true +tracks/34/imported = false +tracks/34/enabled = true +tracks/34/keys = { +"times": PoolRealArray( 0, 0.5, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, -2 ), Vector2( -0.0923008, -1.07587 ), Vector2( 0, -2 ), Vector2( 0, -2 ) ] +} +tracks/35/type = "value" +tracks/35/path = NodePath("Hip/Torso:rotation_degrees") +tracks/35/interp = 1 +tracks/35/loop_wrap = true +tracks/35/imported = false +tracks/35/enabled = true +tracks/35/keys = { +"times": PoolRealArray( 0, 0.5, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ 0.0, -6.16061, 0.0, 0.0 ] +} +tracks/36/type = "value" +tracks/36/path = NodePath("Hip:position") +tracks/36/interp = 1 +tracks/36/loop_wrap = true +tracks/36/imported = false +tracks/36/enabled = true +tracks/36/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, -14 ), Vector2( 0, -14 ), Vector2( 0, -14 ) ] +} +tracks/37/type = "value" +tracks/37/path = NodePath("Hip:rotation_degrees") +tracks/37/interp = 1 +tracks/37/loop_wrap = true +tracks/37/imported = false +tracks/37/enabled = true +tracks/37/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/38/type = "value" +tracks/38/path = NodePath("Hip/Torso/arm_l/hand_l:z_index") +tracks/38/interp = 1 +tracks/38/loop_wrap = true +tracks/38/imported = false +tracks/38/enabled = true +tracks/38/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 1, +"values": [ 1, 1, 1 ] +} + +[sub_resource type="Animation" id=2] +resource_name = "idle" +length = 2.0 +loop = true +tracks/0/type = "value" +tracks/0/path = NodePath("Hip/Torso/leg_l/foot_l/Position2D:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -0.297693, 7.79954 ), Vector2( -0.297693, 7.79954 ), Vector2( -0.297693, 7.79954 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Hip/Torso/leg_l/foot_l/Position2D:rotation_degrees") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ -0.150298, -0.150298, -0.150298 ] +} +tracks/2/type = "value" +tracks/2/path = NodePath("Hip/Torso/leg_l/foot_l:position") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 4.5 ), Vector2( 0, 4.5 ), Vector2( 0, 4.5 ) ] +} +tracks/3/type = "value" +tracks/3/path = NodePath("Hip/Torso/leg_l/foot_l:rotation_degrees") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ -2.18855, -2.18855, -2.18855 ] +} +tracks/4/type = "value" +tracks/4/path = NodePath("Hip/Torso/leg_l:position") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 2, 1.5 ), Vector2( 2, 1.5 ), Vector2( 2, 1.5 ) ] +} +tracks/5/type = "value" +tracks/5/path = NodePath("Hip/Torso/leg_l:rotation_degrees") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.712624, 0.712624, 0.712624 ] +} +tracks/6/type = "value" +tracks/6/path = NodePath("Hip/Torso/Head/Position2D:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -0.0730991, -6.94428 ), Vector2( -0.0730991, -6.94428 ), Vector2( -0.0730991, -6.94428 ) ] +} +tracks/7/type = "value" +tracks/7/path = NodePath("Hip/Torso/Head/Position2D:rotation_degrees") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/8/type = "value" +tracks/8/path = NodePath("Hip/Torso/Head:position") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, -10 ), Vector2( 0, -10 ), Vector2( 0, -10 ) ] +} +tracks/9/type = "value" +tracks/9/path = NodePath("Hip/Torso/Head:rotation_degrees") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/10/type = "value" +tracks/10/path = NodePath("Hip/Torso/leg_r/foot_r/Position2D:position") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 7.771 ), Vector2( 0, 7.771 ), Vector2( 0, 7.771 ) ] +} +tracks/11/type = "value" +tracks/11/path = NodePath("Hip/Torso/leg_r/foot_r/Position2D:rotation_degrees") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/12/type = "value" +tracks/12/path = NodePath("Hip/Torso/leg_r/foot_r:position") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -1, 5 ), Vector2( -1, 5 ), Vector2( -1, 5 ) ] +} +tracks/13/type = "value" +tracks/13/path = NodePath("Hip/Torso/leg_r/foot_r:rotation_degrees") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/14/type = "value" +tracks/14/path = NodePath("Hip/Torso/leg_r:position") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -2, 0.999999 ), Vector2( -2, 1 ), Vector2( -2, 1 ) ] +} +tracks/15/type = "value" +tracks/15/path = NodePath("Hip/Torso/leg_r:rotation_degrees") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ -0.908402, -0.908402, -0.908402 ] +} +tracks/16/type = "value" +tracks/16/path = NodePath("Hip/Torso/arm_l/hand_l/end:position") +tracks/16/interp = 1 +tracks/16/loop_wrap = true +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -0.5, 4 ), Vector2( -0.5, 4 ), Vector2( -0.5, 4 ) ] +} +tracks/17/type = "value" +tracks/17/path = NodePath("Hip/Torso/arm_l/hand_l/end:rotation_degrees") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/18/type = "value" +tracks/18/path = NodePath("Hip/Torso/arm_l/hand_l:position") +tracks/18/interp = 1 +tracks/18/loop_wrap = true +tracks/18/imported = false +tracks/18/enabled = true +tracks/18/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 6 ), Vector2( 0, 6 ), Vector2( 0, 6 ) ] +} +tracks/19/type = "value" +tracks/19/path = NodePath("Hip/Torso/arm_l/hand_l:rotation_degrees") +tracks/19/interp = 1 +tracks/19/loop_wrap = true +tracks/19/imported = false +tracks/19/enabled = true +tracks/19/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/20/type = "value" +tracks/20/path = NodePath("Hip/Torso/arm_l:position") +tracks/20/interp = 1 +tracks/20/loop_wrap = true +tracks/20/imported = false +tracks/20/enabled = true +tracks/20/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 4.98958, -7.86818 ), Vector2( 4.98958, -7.86818 ), Vector2( 4.98958, -7.86818 ) ] +} +tracks/21/type = "value" +tracks/21/path = NodePath("Hip/Torso/arm_l:rotation_degrees") +tracks/21/interp = 1 +tracks/21/loop_wrap = true +tracks/21/imported = false +tracks/21/enabled = true +tracks/21/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/22/type = "value" +tracks/22/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r/Position2D:position") +tracks/22/interp = 1 +tracks/22/loop_wrap = true +tracks/22/imported = false +tracks/22/enabled = true +tracks/22/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 5 ), Vector2( 0, 5 ), Vector2( 0, 5 ) ] +} +tracks/23/type = "value" +tracks/23/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r/Position2D:rotation_degrees") +tracks/23/interp = 1 +tracks/23/loop_wrap = true +tracks/23/imported = false +tracks/23/enabled = true +tracks/23/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/24/type = "value" +tracks/24/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r:position") +tracks/24/interp = 1 +tracks/24/loop_wrap = true +tracks/24/imported = false +tracks/24/enabled = true +tracks/24/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 5.5 ), Vector2( 0, 5.5 ), Vector2( 0, 5.5 ) ] +} +tracks/25/type = "value" +tracks/25/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r:rotation_degrees") +tracks/25/interp = 1 +tracks/25/loop_wrap = true +tracks/25/imported = false +tracks/25/enabled = true +tracks/25/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/26/type = "value" +tracks/26/path = NodePath("Hip/Torso/remote_arm_r:position") +tracks/26/interp = 1 +tracks/26/loop_wrap = true +tracks/26/imported = false +tracks/26/enabled = true +tracks/26/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -5.01738, -8.74725 ), Vector2( -5.01738, -8.74725 ), Vector2( -5.01738, -8.74725 ) ] +} +tracks/27/type = "value" +tracks/27/path = NodePath("Hip/Torso/remote_arm_r:rotation_degrees") +tracks/27/interp = 1 +tracks/27/loop_wrap = true +tracks/27/imported = false +tracks/27/enabled = true +tracks/27/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ -8.44461e-05, -8.44461e-05, -8.44461e-05 ] +} +tracks/28/type = "value" +tracks/28/path = NodePath("Hip/Torso/arm_l/shoulder_l:position") +tracks/28/interp = 1 +tracks/28/loop_wrap = true +tracks/28/imported = false +tracks/28/enabled = true +tracks/28/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -0.913425, -1.12376 ), Vector2( -0.913425, -1.12376 ), Vector2( -0.913425, -1.12376 ) ] +} +tracks/29/type = "value" +tracks/29/path = NodePath("Hip/Torso/arm_l/shoulder_l:rotation_degrees") +tracks/29/interp = 1 +tracks/29/loop_wrap = true +tracks/29/imported = false +tracks/29/enabled = true +tracks/29/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/30/type = "value" +tracks/30/path = NodePath("Hip/Shadow:position") +tracks/30/interp = 1 +tracks/30/loop_wrap = true +tracks/30/imported = false +tracks/30/enabled = true +tracks/30/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -0.5, 14 ), Vector2( -0.5, 14 ), Vector2( -0.5, 14 ) ] +} +tracks/31/type = "value" +tracks/31/path = NodePath("Hip/Shadow:rotation_degrees") +tracks/31/interp = 1 +tracks/31/loop_wrap = true +tracks/31/imported = false +tracks/31/enabled = true +tracks/31/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/32/type = "value" +tracks/32/path = NodePath("Hip/Torso/remote_arm_r/shoulder_guard_r:position") +tracks/32/interp = 1 +tracks/32/loop_wrap = true +tracks/32/imported = false +tracks/32/enabled = true +tracks/32/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 1, -0.2 ), Vector2( 1, -0.2 ), Vector2( 1, -0.2 ) ] +} +tracks/33/type = "value" +tracks/33/path = NodePath("Hip/Torso/remote_arm_r/shoulder_guard_r:rotation_degrees") +tracks/33/interp = 1 +tracks/33/loop_wrap = true +tracks/33/imported = false +tracks/33/enabled = true +tracks/33/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/34/type = "value" +tracks/34/path = NodePath("Hip/Torso:position") +tracks/34/interp = 1 +tracks/34/loop_wrap = true +tracks/34/imported = false +tracks/34/enabled = true +tracks/34/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, -2 ), Vector2( 0, -2.4 ), Vector2( 0, -2 ) ] +} +tracks/35/type = "value" +tracks/35/path = NodePath("Hip/Torso:rotation_degrees") +tracks/35/interp = 1 +tracks/35/loop_wrap = true +tracks/35/imported = false +tracks/35/enabled = true +tracks/35/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/36/type = "value" +tracks/36/path = NodePath("Hip:position") +tracks/36/interp = 1 +tracks/36/loop_wrap = true +tracks/36/imported = false +tracks/36/enabled = true +tracks/36/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, -14 ), Vector2( 0, -14 ), Vector2( 0, -14 ) ] +} +tracks/37/type = "value" +tracks/37/path = NodePath("Hip:rotation_degrees") +tracks/37/interp = 1 +tracks/37/loop_wrap = true +tracks/37/imported = false +tracks/37/enabled = true +tracks/37/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/38/type = "value" +tracks/38/path = NodePath("Hip/Torso/arm_l/hand_l:show_behind_parent") +tracks/38/interp = 1 +tracks/38/loop_wrap = true +tracks/38/imported = false +tracks/38/enabled = true +tracks/38/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ false ] +} +tracks/39/type = "value" +tracks/39/path = NodePath("Hip/Torso/arm_l:show_behind_parent") +tracks/39/interp = 1 +tracks/39/loop_wrap = true +tracks/39/imported = false +tracks/39/enabled = true +tracks/39/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ false ] +} +tracks/40/type = "value" +tracks/40/path = NodePath("Hip/Torso/remote_arm_r:show_behind_parent") +tracks/40/interp = 1 +tracks/40/loop_wrap = true +tracks/40/imported = false +tracks/40/enabled = true +tracks/40/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ false ] +} +tracks/41/type = "value" +tracks/41/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r:show_behind_parent") +tracks/41/interp = 1 +tracks/41/loop_wrap = true +tracks/41/imported = false +tracks/41/enabled = true +tracks/41/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ false ] +} +tracks/42/type = "value" +tracks/42/path = NodePath("Hip/Torso/leg_r/foot_r:show_behind_parent") +tracks/42/interp = 1 +tracks/42/loop_wrap = true +tracks/42/imported = false +tracks/42/enabled = true +tracks/42/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ false ] +} +tracks/43/type = "value" +tracks/43/path = NodePath("Hip/Torso/leg_r:show_behind_parent") +tracks/43/interp = 1 +tracks/43/loop_wrap = true +tracks/43/imported = false +tracks/43/enabled = true +tracks/43/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ false ] +} +tracks/44/type = "value" +tracks/44/path = NodePath("Hip/Torso/leg_l:show_behind_parent") +tracks/44/interp = 1 +tracks/44/loop_wrap = true +tracks/44/imported = false +tracks/44/enabled = true +tracks/44/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ false ] +} +tracks/45/type = "value" +tracks/45/path = NodePath("Hip/Torso/leg_l/foot_l:show_behind_parent") +tracks/45/interp = 1 +tracks/45/loop_wrap = true +tracks/45/imported = false +tracks/45/enabled = true +tracks/45/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ false ] +} + +[sub_resource type="Animation" id=3] +tracks/0/type = "value" +tracks/0/path = NodePath("Hip/Torso/leg_l/foot_l/Position2D:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( -0.297693, 7.79954 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Hip/Torso/leg_l/foot_l/Position2D:rotation_degrees") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ -0.150298 ] +} +tracks/2/type = "value" +tracks/2/path = NodePath("Hip/Torso/leg_l/foot_l:position") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 0, 4.5 ) ] +} +tracks/3/type = "value" +tracks/3/path = NodePath("Hip/Torso/leg_l/foot_l:rotation_degrees") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ -2.18855 ] +} +tracks/4/type = "value" +tracks/4/path = NodePath("Hip/Torso/leg_l:position") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 2, 1.5 ) ] +} +tracks/5/type = "value" +tracks/5/path = NodePath("Hip/Torso/leg_l:rotation_degrees") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.712624 ] +} +tracks/6/type = "value" +tracks/6/path = NodePath("Hip/Torso/Head/Position2D:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( -0.0730991, -6.94428 ) ] +} +tracks/7/type = "value" +tracks/7/path = NodePath("Hip/Torso/Head/Position2D:rotation_degrees") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/8/type = "value" +tracks/8/path = NodePath("Hip/Torso/Head:position") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 0, -10 ) ] +} +tracks/9/type = "value" +tracks/9/path = NodePath("Hip/Torso/Head:rotation_degrees") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/10/type = "value" +tracks/10/path = NodePath("Hip/Torso/leg_r/foot_r/Position2D:position") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 0, 7.771 ) ] +} +tracks/11/type = "value" +tracks/11/path = NodePath("Hip/Torso/leg_r/foot_r/Position2D:rotation_degrees") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/12/type = "value" +tracks/12/path = NodePath("Hip/Torso/leg_r/foot_r:position") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/keys = { +"times": PoolRealArray( 0, 0.724068 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Vector2( -1, 5 ), Vector2( -1, 5 ) ] +} +tracks/13/type = "value" +tracks/13/path = NodePath("Hip/Torso/leg_r/foot_r:rotation_degrees") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/14/type = "value" +tracks/14/path = NodePath("Hip/Torso/leg_r:position") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/keys = { +"times": PoolRealArray( 0, 0.724068 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Vector2( -2, 1 ), Vector2( -2, 1 ) ] +} +tracks/15/type = "value" +tracks/15/path = NodePath("Hip/Torso/leg_r:rotation_degrees") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/keys = { +"times": PoolRealArray( 0, 0.724068 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ -0.908402, -0.908402 ] +} +tracks/16/type = "value" +tracks/16/path = NodePath("Hip/Torso/arm_l/hand_l/end:position") +tracks/16/interp = 1 +tracks/16/loop_wrap = true +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( -0.5, 4 ) ] +} +tracks/17/type = "value" +tracks/17/path = NodePath("Hip/Torso/arm_l/hand_l/end:rotation_degrees") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/18/type = "value" +tracks/18/path = NodePath("Hip/Torso/arm_l/hand_l:position") +tracks/18/interp = 1 +tracks/18/loop_wrap = true +tracks/18/imported = false +tracks/18/enabled = true +tracks/18/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 0, 6 ) ] +} +tracks/19/type = "value" +tracks/19/path = NodePath("Hip/Torso/arm_l/hand_l:rotation_degrees") +tracks/19/interp = 1 +tracks/19/loop_wrap = true +tracks/19/imported = false +tracks/19/enabled = true +tracks/19/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/20/type = "value" +tracks/20/path = NodePath("Hip/Torso/arm_l:position") +tracks/20/interp = 1 +tracks/20/loop_wrap = true +tracks/20/imported = false +tracks/20/enabled = true +tracks/20/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 4.98958, -7.86818 ) ] +} +tracks/21/type = "value" +tracks/21/path = NodePath("Hip/Torso/arm_l:rotation_degrees") +tracks/21/interp = 1 +tracks/21/loop_wrap = true +tracks/21/imported = false +tracks/21/enabled = true +tracks/21/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/22/type = "value" +tracks/22/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r/Position2D:position") +tracks/22/interp = 1 +tracks/22/loop_wrap = true +tracks/22/imported = false +tracks/22/enabled = true +tracks/22/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 0, 5 ) ] +} +tracks/23/type = "value" +tracks/23/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r/Position2D:rotation_degrees") +tracks/23/interp = 1 +tracks/23/loop_wrap = true +tracks/23/imported = false +tracks/23/enabled = true +tracks/23/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/24/type = "value" +tracks/24/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r:position") +tracks/24/interp = 1 +tracks/24/loop_wrap = true +tracks/24/imported = false +tracks/24/enabled = true +tracks/24/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 0, 5.5 ) ] +} +tracks/25/type = "value" +tracks/25/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r:rotation_degrees") +tracks/25/interp = 1 +tracks/25/loop_wrap = true +tracks/25/imported = false +tracks/25/enabled = true +tracks/25/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/26/type = "value" +tracks/26/path = NodePath("Hip/Torso/remote_arm_r:position") +tracks/26/interp = 1 +tracks/26/loop_wrap = true +tracks/26/imported = false +tracks/26/enabled = true +tracks/26/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( -5.01738, -8.74725 ) ] +} +tracks/27/type = "value" +tracks/27/path = NodePath("Hip/Torso/remote_arm_r:rotation_degrees") +tracks/27/interp = 1 +tracks/27/loop_wrap = true +tracks/27/imported = false +tracks/27/enabled = true +tracks/27/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ -8.44461e-05 ] +} +tracks/28/type = "value" +tracks/28/path = NodePath("Hip/Torso/arm_l/shoulder_l:position") +tracks/28/interp = 1 +tracks/28/loop_wrap = true +tracks/28/imported = false +tracks/28/enabled = true +tracks/28/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( -0.913425, -1.12376 ) ] +} +tracks/29/type = "value" +tracks/29/path = NodePath("Hip/Torso/arm_l/shoulder_l:rotation_degrees") +tracks/29/interp = 1 +tracks/29/loop_wrap = true +tracks/29/imported = false +tracks/29/enabled = true +tracks/29/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/30/type = "value" +tracks/30/path = NodePath("Hip/Shadow:position") +tracks/30/interp = 1 +tracks/30/loop_wrap = true +tracks/30/imported = false +tracks/30/enabled = true +tracks/30/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( -0.5, 14 ) ] +} +tracks/31/type = "value" +tracks/31/path = NodePath("Hip/Shadow:rotation_degrees") +tracks/31/interp = 1 +tracks/31/loop_wrap = true +tracks/31/imported = false +tracks/31/enabled = true +tracks/31/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/32/type = "value" +tracks/32/path = NodePath("Hip/Torso/remote_arm_r/shoulder_guard_r:position") +tracks/32/interp = 1 +tracks/32/loop_wrap = true +tracks/32/imported = false +tracks/32/enabled = true +tracks/32/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 1, -0.2 ) ] +} +tracks/33/type = "value" +tracks/33/path = NodePath("Hip/Torso/remote_arm_r/shoulder_guard_r:rotation_degrees") +tracks/33/interp = 1 +tracks/33/loop_wrap = true +tracks/33/imported = false +tracks/33/enabled = true +tracks/33/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/34/type = "value" +tracks/34/path = NodePath("Hip/Torso:position") +tracks/34/interp = 1 +tracks/34/loop_wrap = true +tracks/34/imported = false +tracks/34/enabled = true +tracks/34/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 0, -2 ) ] +} +tracks/35/type = "value" +tracks/35/path = NodePath("Hip/Torso:rotation_degrees") +tracks/35/interp = 1 +tracks/35/loop_wrap = true +tracks/35/imported = false +tracks/35/enabled = true +tracks/35/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/36/type = "value" +tracks/36/path = NodePath("Hip:position") +tracks/36/interp = 1 +tracks/36/loop_wrap = true +tracks/36/imported = false +tracks/36/enabled = true +tracks/36/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 0, -14 ) ] +} +tracks/37/type = "value" +tracks/37/path = NodePath("Hip:rotation_degrees") +tracks/37/interp = 1 +tracks/37/loop_wrap = true +tracks/37/imported = false +tracks/37/enabled = true +tracks/37/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/38/type = "value" +tracks/38/path = NodePath("Hip/Torso/leg_l/foot_l:show_behind_parent") +tracks/38/interp = 1 +tracks/38/loop_wrap = true +tracks/38/imported = false +tracks/38/enabled = true +tracks/38/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ false ] +} +tracks/39/type = "value" +tracks/39/path = NodePath("Hip/Torso/leg_r:show_behind_parent") +tracks/39/interp = 1 +tracks/39/loop_wrap = true +tracks/39/imported = false +tracks/39/enabled = true +tracks/39/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ false ] +} +tracks/40/type = "value" +tracks/40/path = NodePath("Hip/Torso/leg_l:show_behind_parent") +tracks/40/interp = 1 +tracks/40/loop_wrap = true +tracks/40/imported = false +tracks/40/enabled = true +tracks/40/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ false ] +} +tracks/41/type = "value" +tracks/41/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r:show_behind_parent") +tracks/41/interp = 1 +tracks/41/loop_wrap = true +tracks/41/imported = false +tracks/41/enabled = true +tracks/41/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ false ] +} +tracks/42/type = "value" +tracks/42/path = NodePath("Hip/Torso/remote_arm_r:show_behind_parent") +tracks/42/interp = 1 +tracks/42/loop_wrap = true +tracks/42/imported = false +tracks/42/enabled = true +tracks/42/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ false ] +} +tracks/43/type = "value" +tracks/43/path = NodePath("Hip/Torso/arm_l:show_behind_parent") +tracks/43/interp = 1 +tracks/43/loop_wrap = true +tracks/43/imported = false +tracks/43/enabled = true +tracks/43/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ false ] +} +tracks/44/type = "value" +tracks/44/path = NodePath("Hip/Torso/arm_l/hand_l:show_behind_parent") +tracks/44/interp = 1 +tracks/44/loop_wrap = true +tracks/44/imported = false +tracks/44/enabled = true +tracks/44/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ false ] +} + +[sub_resource type="Animation" id=4] +loop = true +step = 0.05 +tracks/0/type = "value" +tracks/0/path = NodePath("Hip/Torso/leg_l/foot_l/Position2D:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -0.297693, 7.79954 ), Vector2( -0.297693, 7.79954 ), Vector2( -0.297693, 7.79954 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Hip/Torso/leg_l/foot_l/Position2D:rotation_degrees") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ -0.150298, -0.150298, -0.150298 ] +} +tracks/2/type = "value" +tracks/2/path = NodePath("Hip/Torso/leg_l/foot_l:position") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/keys = { +"times": PoolRealArray( 0, 0.25, 0.5, 0.75, 0.99, 1 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 4.5 ), Vector2( 0, 4.5 ), Vector2( 0, 4.5 ), Vector2( 0, 4.5 ), Vector2( 0, 4.5 ), Vector2( 0, 4.5 ) ] +} +tracks/3/type = "value" +tracks/3/path = NodePath("Hip/Torso/leg_l/foot_l:rotation_degrees") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/keys = { +"times": PoolRealArray( 0, 0.25, 0.5, 0.75, 0.99, 1 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1 ), +"update": 0, +"values": [ 17.207, 14.9584, 16.2471, 19.1313, 28.7634, 17.207 ] +} +tracks/4/type = "value" +tracks/4/path = NodePath("Hip/Torso/leg_l:position") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/keys = { +"times": PoolRealArray( 0, 0.25, 0.5, 0.75, 1 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 2, 1.5 ), Vector2( 2, 1.5 ), Vector2( 2, 1.5 ), Vector2( 2, 1.5 ), Vector2( 2, 1.5 ) ] +} +tracks/5/type = "value" +tracks/5/path = NodePath("Hip/Torso/leg_l:rotation_degrees") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/keys = { +"times": PoolRealArray( 0, 0.25, 0.5, 0.75, 1 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1 ), +"update": 0, +"values": [ -0.711522, -9.98104, 3.52254, -7.10074, -0.711522 ] +} +tracks/6/type = "value" +tracks/6/path = NodePath("Hip/Torso/Head/Position2D:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -0.0730991, -6.94428 ), Vector2( -0.0730991, -6.94428 ), Vector2( -0.0730991, -6.94428 ) ] +} +tracks/7/type = "value" +tracks/7/path = NodePath("Hip/Torso/Head/Position2D:rotation_degrees") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/8/type = "value" +tracks/8/path = NodePath("Hip/Torso/Head:position") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Vector2( 0, -10 ), Vector2( 0, -10 ) ] +} +tracks/9/type = "value" +tracks/9/path = NodePath("Hip/Torso/Head:rotation_degrees") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0 ] +} +tracks/10/type = "value" +tracks/10/path = NodePath("Hip/Torso/leg_r/foot_r/Position2D:position") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 7.771 ), Vector2( 0, 7.771 ), Vector2( 0, 7.771 ) ] +} +tracks/11/type = "value" +tracks/11/path = NodePath("Hip/Torso/leg_r/foot_r/Position2D:rotation_degrees") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/12/type = "value" +tracks/12/path = NodePath("Hip/Torso/leg_r/foot_r:position") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/keys = { +"times": PoolRealArray( 0, 0.25, 0.5, 0.75, 1 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -1, 5 ), Vector2( -1, 5 ), Vector2( -1, 5 ), Vector2( -1, 5 ), Vector2( -1, 5 ) ] +} +tracks/13/type = "value" +tracks/13/path = NodePath("Hip/Torso/leg_r/foot_r:rotation_degrees") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/keys = { +"times": PoolRealArray( 0, 0.25, 0.5, 0.75, 1 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1 ), +"update": 0, +"values": [ -15.3779, -10.5059, -12.523, -5.35185, -15.3779 ] +} +tracks/14/type = "value" +tracks/14/path = NodePath("Hip/Torso/leg_r:position") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/keys = { +"times": PoolRealArray( 0, 0.25, 0.5, 0.75, 1 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -2, 1 ), Vector2( -2, 1 ), Vector2( -2, 1 ), Vector2( -2, 1 ), Vector2( -2, 1 ) ] +} +tracks/15/type = "value" +tracks/15/path = NodePath("Hip/Torso/leg_r:rotation_degrees") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/keys = { +"times": PoolRealArray( 0, 0.25, 0.5, 0.75, 1 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1 ), +"update": 0, +"values": [ -8.16674, 5.82986, -0.553362, 5.75932, -8.16674 ] +} +tracks/16/type = "value" +tracks/16/path = NodePath("Hip/Torso/arm_l/hand_l/end:position") +tracks/16/interp = 1 +tracks/16/loop_wrap = true +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/keys = { +"times": PoolRealArray( 0, 0.25, 0.5, 0.75, 1 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -0.5, 4 ), Vector2( -0.5, 4 ), Vector2( -0.5, 4 ), Vector2( -0.5, 4 ), Vector2( -0.5, 4 ) ] +} +tracks/17/type = "value" +tracks/17/path = NodePath("Hip/Torso/arm_l/hand_l/end:rotation_degrees") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/18/type = "value" +tracks/18/path = NodePath("Hip/Torso/arm_l/hand_l:position") +tracks/18/interp = 1 +tracks/18/loop_wrap = true +tracks/18/imported = false +tracks/18/enabled = true +tracks/18/keys = { +"times": PoolRealArray( 0, 0.25, 0.5, 0.75, 1 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0.0452981, 5.9654 ), Vector2( 0, 6 ), Vector2( 0, 6 ), Vector2( 0, 6 ), Vector2( 0.0452981, 5.9654 ) ] +} +tracks/19/type = "value" +tracks/19/path = NodePath("Hip/Torso/arm_l/hand_l:rotation_degrees") +tracks/19/interp = 1 +tracks/19/loop_wrap = true +tracks/19/imported = false +tracks/19/enabled = true +tracks/19/keys = { +"times": PoolRealArray( 0, 0.25, 0.5, 0.75, 1 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1 ), +"update": 0, +"values": [ -4.71947, 1.71413, 7.25388, 1.71413, -4.71947 ] +} +tracks/20/type = "value" +tracks/20/path = NodePath("Hip/Torso/arm_l:position") +tracks/20/interp = 1 +tracks/20/loop_wrap = true +tracks/20/imported = false +tracks/20/enabled = true +tracks/20/keys = { +"times": PoolRealArray( 0, 0.25, 0.5, 0.75, 1 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 4.98958, -7.86818 ), Vector2( 4.98958, -7.86818 ), Vector2( 4.98958, -7.86818 ), Vector2( 4.98958, -7.86818 ), Vector2( 4.98958, -7.86818 ) ] +} +tracks/21/type = "value" +tracks/21/path = NodePath("Hip/Torso/arm_l:rotation_degrees") +tracks/21/interp = 1 +tracks/21/loop_wrap = true +tracks/21/imported = false +tracks/21/enabled = true +tracks/21/keys = { +"times": PoolRealArray( 0, 0.25, 0.5, 0.75, 1 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1 ), +"update": 0, +"values": [ 12.7564, -1.05097, 3.19122, -1.05097, 12.7564 ] +} +tracks/22/type = "value" +tracks/22/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r/Position2D:position") +tracks/22/interp = 1 +tracks/22/loop_wrap = true +tracks/22/imported = false +tracks/22/enabled = true +tracks/22/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 5 ), Vector2( 0, 5 ), Vector2( 0, 5 ) ] +} +tracks/23/type = "value" +tracks/23/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r/Position2D:rotation_degrees") +tracks/23/interp = 1 +tracks/23/loop_wrap = true +tracks/23/imported = false +tracks/23/enabled = true +tracks/23/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/24/type = "value" +tracks/24/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r:position") +tracks/24/interp = 1 +tracks/24/loop_wrap = true +tracks/24/imported = false +tracks/24/enabled = true +tracks/24/keys = { +"times": PoolRealArray( 0, 0.25, 0.5, 0.75, 1 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 5.5 ), Vector2( 0, 5.5 ), Vector2( 0, 5.5 ), Vector2( 0, 5.5 ), Vector2( 0, 5.5 ) ] +} +tracks/25/type = "value" +tracks/25/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r:rotation_degrees") +tracks/25/interp = 1 +tracks/25/loop_wrap = true +tracks/25/imported = false +tracks/25/enabled = true +tracks/25/keys = { +"times": PoolRealArray( 0, 0.25, 0.5, 0.75, 1 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1 ), +"update": 0, +"values": [ -15.989, -5.44135, -5.80149, -3.75818, -15.989 ] +} +tracks/26/type = "value" +tracks/26/path = NodePath("Hip/Torso/remote_arm_r:position") +tracks/26/interp = 1 +tracks/26/loop_wrap = true +tracks/26/imported = false +tracks/26/enabled = true +tracks/26/keys = { +"times": PoolRealArray( 0, 0.25, 0.5, 0.75, 1 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -5.01738, -8.74725 ), Vector2( -5.01738, -8.74725 ), Vector2( -5.01738, -8.74725 ), Vector2( -5.01738, -8.74725 ), Vector2( -5.01738, -8.74725 ) ] +} +tracks/27/type = "value" +tracks/27/path = NodePath("Hip/Torso/remote_arm_r:rotation_degrees") +tracks/27/interp = 1 +tracks/27/loop_wrap = true +tracks/27/imported = false +tracks/27/enabled = true +tracks/27/keys = { +"times": PoolRealArray( 0, 0.25, 0.5, 0.75, 1 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1 ), +"update": 0, +"values": [ -6.35693, 1.96771, -5.23182, 1.0922, -6.35693 ] +} +tracks/28/type = "value" +tracks/28/path = NodePath("Hip/Torso/arm_l/shoulder_l:position") +tracks/28/interp = 1 +tracks/28/loop_wrap = true +tracks/28/imported = false +tracks/28/enabled = true +tracks/28/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -0.913425, -1.12376 ), Vector2( -0.913425, -1.12376 ), Vector2( -0.913425, -1.12376 ) ] +} +tracks/29/type = "value" +tracks/29/path = NodePath("Hip/Torso/arm_l/shoulder_l:rotation_degrees") +tracks/29/interp = 1 +tracks/29/loop_wrap = true +tracks/29/imported = false +tracks/29/enabled = true +tracks/29/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/30/type = "value" +tracks/30/path = NodePath("Hip/Shadow:position") +tracks/30/interp = 1 +tracks/30/loop_wrap = true +tracks/30/imported = false +tracks/30/enabled = true +tracks/30/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -0.5, 14 ), Vector2( -0.5, 14 ), Vector2( -0.5, 14 ) ] +} +tracks/31/type = "value" +tracks/31/path = NodePath("Hip/Shadow:rotation_degrees") +tracks/31/interp = 1 +tracks/31/loop_wrap = true +tracks/31/imported = false +tracks/31/enabled = true +tracks/31/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/32/type = "value" +tracks/32/path = NodePath("Hip/Torso/remote_arm_r/shoulder_guard_r:position") +tracks/32/interp = 1 +tracks/32/loop_wrap = true +tracks/32/imported = false +tracks/32/enabled = true +tracks/32/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 1, -0.2 ), Vector2( 1, -0.2 ), Vector2( 1, -0.2 ) ] +} +tracks/33/type = "value" +tracks/33/path = NodePath("Hip/Torso/remote_arm_r/shoulder_guard_r:rotation_degrees") +tracks/33/interp = 1 +tracks/33/loop_wrap = true +tracks/33/imported = false +tracks/33/enabled = true +tracks/33/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/34/type = "value" +tracks/34/path = NodePath("Hip/Torso:position") +tracks/34/interp = 1 +tracks/34/loop_wrap = true +tracks/34/imported = false +tracks/34/enabled = true +tracks/34/keys = { +"times": PoolRealArray( 0, 0.25, 0.5, 0.75, 1 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, -2.2 ), Vector2( 0, -1.9 ), Vector2( 0.125, -2.2 ), Vector2( 0, -1.9 ), Vector2( 0, -2.2 ) ] +} +tracks/35/type = "value" +tracks/35/path = NodePath("Hip/Torso:rotation_degrees") +tracks/35/interp = 1 +tracks/35/loop_wrap = true +tracks/35/imported = false +tracks/35/enabled = true +tracks/35/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/36/type = "value" +tracks/36/path = NodePath("Hip:position") +tracks/36/interp = 1 +tracks/36/loop_wrap = true +tracks/36/imported = false +tracks/36/enabled = true +tracks/36/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Vector2( 0, -14 ), Vector2( 0, -14 ) ] +} +tracks/37/type = "value" +tracks/37/path = NodePath("Hip:rotation_degrees") +tracks/37/interp = 1 +tracks/37/loop_wrap = true +tracks/37/imported = false +tracks/37/enabled = true +tracks/37/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0 ] +} +tracks/38/type = "value" +tracks/38/path = NodePath("Hip/Torso/arm_l/hand_l:show_behind_parent") +tracks/38/interp = 1 +tracks/38/loop_wrap = true +tracks/38/imported = false +tracks/38/enabled = true +tracks/38/keys = { +"times": PoolRealArray( 0, 0.25, 0.75, 1 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 1, +"values": [ true, false, true, true ] +} +tracks/39/type = "value" +tracks/39/path = NodePath("Hip/Torso/arm_l:show_behind_parent") +tracks/39/interp = 1 +tracks/39/loop_wrap = true +tracks/39/imported = false +tracks/39/enabled = true +tracks/39/keys = { +"times": PoolRealArray( 0, 0.25, 0.75, 1 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 1, +"values": [ true, false, true, true ] +} +tracks/40/type = "value" +tracks/40/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r:show_behind_parent") +tracks/40/interp = 1 +tracks/40/loop_wrap = true +tracks/40/imported = false +tracks/40/enabled = true +tracks/40/keys = { +"times": PoolRealArray( 0, 0.25, 0.75, 1, 1.2 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1 ), +"update": 1, +"values": [ false, true, false, false, true ] +} +tracks/41/type = "value" +tracks/41/path = NodePath("Hip/Torso/remote_arm_r:show_behind_parent") +tracks/41/interp = 1 +tracks/41/loop_wrap = true +tracks/41/imported = false +tracks/41/enabled = true +tracks/41/keys = { +"times": PoolRealArray( 0, 0.25, 0.75, 1, 1.2 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1 ), +"update": 1, +"values": [ false, true, false, false, true ] +} +tracks/42/type = "value" +tracks/42/path = NodePath("Hip/Torso/leg_l/foot_l:show_behind_parent") +tracks/42/interp = 1 +tracks/42/loop_wrap = true +tracks/42/imported = false +tracks/42/enabled = true +tracks/42/keys = { +"times": PoolRealArray( 0, 0.25, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 1, +"values": [ false, true, false ] +} +tracks/43/type = "value" +tracks/43/path = NodePath("Hip/Torso/leg_l:show_behind_parent") +tracks/43/interp = 1 +tracks/43/loop_wrap = true +tracks/43/imported = false +tracks/43/enabled = true +tracks/43/keys = { +"times": PoolRealArray( 0, 0.25, 0.75, 1 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 1, +"values": [ false, true, false, false ] +} +tracks/44/type = "value" +tracks/44/path = NodePath("Hip/Torso/leg_r:show_behind_parent") +tracks/44/interp = 1 +tracks/44/loop_wrap = true +tracks/44/imported = false +tracks/44/enabled = true +tracks/44/keys = { +"times": PoolRealArray( 0, 0.25, 0.75, 1 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 1, +"values": [ true, false, true, true ] +} +tracks/45/type = "value" +tracks/45/path = NodePath("Hip/Torso/leg_r/foot_r:show_behind_parent") +tracks/45/interp = 1 +tracks/45/loop_wrap = true +tracks/45/imported = false +tracks/45/enabled = true +tracks/45/keys = { +"times": PoolRealArray( 0, 0.25, 0.75, 1 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 1, +"values": [ true, false, true, true ] +} + +[sub_resource type="AnimationNodeTimeScale" id=5] + +[sub_resource type="AnimationNodeAnimation" id=6] +animation = "idle" + +[sub_resource type="AnimationNodeAnimation" id=7] +animation = "run" + +[sub_resource type="AnimationNodeBlend2" id=8] + +[sub_resource type="AnimationNodeBlendTree" id=9] +graph_offset = Vector2( -322, -28 ) +nodes/RunScale/node = SubResource( 5 ) +nodes/RunScale/position = Vector2( -60, 500 ) +nodes/idle/node = SubResource( 6 ) +nodes/idle/position = Vector2( -240, 340 ) +nodes/output/position = Vector2( 440, 280 ) +nodes/run/node = SubResource( 7 ) +nodes/run/position = Vector2( -280, 500 ) +nodes/walking/node = SubResource( 8 ) +nodes/walking/position = Vector2( 140, 320 ) +node_connections = [ "output", 0, "walking", "walking", 0, "idle", "walking", 1, "RunScale", "RunScale", 0, "run" ] + +[node name="CharacterFrontModel" type="CharacterBones"] +rotation = 0.000121465 +script = ExtResource( 2 ) +help = "HUMANOID_BONE_HIP = 0, +HUMANOID_BONE_TORSO = 1, +HUMANOID_BONE_LEG_R = 2, +HUMANOID_BONE_FOOT_R = 3, +HUMANOID_BONE_TOE_R = 4, +HUMANOID_BONE_LEG_L = 5, +HUMANOID_BONE_FOOT_L = 6, +HUMANOID_BONE_TOE_L = 7, +HUMANOID_BONE_ARM_R = 8, +#HUMANOID_BONE_SHOULDER_GUARD_R = 0, +HUMANOID_BONE_HAND_R = 9, +HUMANOID_BONE_FINGERS_R = 10, +HUMANOID_BONE_ARM_L = 11, +#HUMANOID_BONE_SHOULDER_GUARD_L = 0, +HUMANOID_BONE_HAND_L = 12, +HUMANOID_BONE_FINGERS_L = 13, +HUMANOID_BONE_HEAD = 14, +HUMANOID_BONE_HEAD_TOP = 15, +HUMANOID_BONES_MAX = 16," +bones = [ NodePath("Hip"), NodePath("Hip/Torso"), NodePath("Hip/Torso/leg_r"), NodePath("Hip/Torso/leg_r/foot_r"), NodePath("Hip/Torso/leg_r/foot_r/Position2D"), NodePath("Hip/Torso/leg_l"), NodePath("Hip/Torso/leg_l/foot_l"), NodePath("Hip/Torso/leg_l/foot_l/Position2D"), NodePath("Hip/Torso/remote_arm_r"), NodePath("Hip/Torso/remote_arm_r/remote_hand_r"), NodePath("Hip/Torso/remote_arm_r/remote_hand_r/Position2D"), NodePath("Hip/Torso/arm_l"), NodePath("Hip/Torso/arm_l/hand_l"), NodePath("Hip/Torso/arm_l/hand_l/end"), NodePath("Hip/Torso/Head"), NodePath("Hip/Torso/Head/Position2D") ] + +[node name="Hip" type="Sprite" parent="."] +position = Vector2( 0, -14 ) +texture = ExtResource( 1 ) +region_enabled = true +region_rect = Rect2( 102, 32, 7, 2 ) + +[node name="Shadow" type="Sprite" parent="Hip"] +position = Vector2( -0.5, 14 ) +texture = ExtResource( 1 ) +region_enabled = true +region_rect = Rect2( 27, 57, 14, 6 ) + +[node name="Torso" type="Sprite" parent="Hip"] +position = Vector2( 0, -2.19333 ) +texture = ExtResource( 1 ) +offset = Vector2( 0, -5 ) +region_enabled = true +region_rect = Rect2( 101, 15, 9, 12 ) +__meta__ = { +"_edit_bone_": true +} + +[node name="leg_r" type="Sprite" parent="Hip/Torso"] +position = Vector2( -2, 1 ) +rotation = -0.0158546 +texture = ExtResource( 1 ) +offset = Vector2( 0, 3 ) +region_enabled = true +region_rect = Rect2( 97, 39, 5, 8 ) +__meta__ = { +"_edit_bone_": true, +"_edit_ik_": true +} + +[node name="foot_r" type="Sprite" parent="Hip/Torso/leg_r"] +position = Vector2( -1, 5 ) +texture = ExtResource( 1 ) +offset = Vector2( 0, 4 ) +region_enabled = true +region_rect = Rect2( 96, 51, 6, 10 ) +__meta__ = { +"_edit_bone_": true +} + +[node name="Position2D" type="Position2D" parent="Hip/Torso/leg_r/foot_r"] +position = Vector2( 0, 7.771 ) +__meta__ = { +"_edit_bone_": true +} + +[node name="leg_l" type="Sprite" parent="Hip/Torso"] +position = Vector2( 2, 1.5 ) +rotation = 0.0124376 +texture = ExtResource( 1 ) +offset = Vector2( 0, 3 ) +region_enabled = true +region_rect = Rect2( 109, 39, 5, 8 ) +__meta__ = { +"_edit_bone_": true, +"_edit_ik_": true +} + +[node name="foot_l" type="Sprite" parent="Hip/Torso/leg_l"] +position = Vector2( 0, 4.5 ) +rotation = -0.0381974 +texture = ExtResource( 1 ) +offset = Vector2( 0, 4 ) +region_enabled = true +region_rect = Rect2( 109, 51, 6, 10 ) +__meta__ = { +"_edit_bone_": true +} + +[node name="Position2D" type="Position2D" parent="Hip/Torso/leg_l/foot_l"] +position = Vector2( -0.297693, 7.79954 ) +rotation = -0.0026232 +__meta__ = { +"_edit_bone_": true +} + +[node name="remote_arm_r" type="Sprite" parent="Hip/Torso"] +position = Vector2( -5.01738, -8.74725 ) +rotation = -1.47386e-06 +texture = ExtResource( 1 ) +offset = Vector2( 0, 3 ) +region_enabled = true +region_rect = Rect2( 93, 16, 3, 9 ) +__meta__ = { +"_edit_bone_": true, +"_edit_ik_": true +} + +[node name="shoulder_guard_r" type="Sprite" parent="Hip/Torso/remote_arm_r"] +position = Vector2( 1, -0.2 ) +texture = ExtResource( 1 ) +offset = Vector2( -1, -1 ) +region_enabled = true +region_rect = Rect2( 90, 8, 6, 4 ) + +[node name="remote_hand_r" type="Sprite" parent="Hip/Torso/remote_arm_r"] +position = Vector2( 0, 5.5 ) +texture = ExtResource( 1 ) +offset = Vector2( 0, 3 ) +region_enabled = true +region_rect = Rect2( 93, 28, 3, 6 ) +__meta__ = { +"_edit_bone_": true +} + +[node name="Position2D" type="Position2D" parent="Hip/Torso/remote_arm_r/remote_hand_r"] +position = Vector2( 0, 5 ) +__meta__ = { +"_edit_bone_": true +} + +[node name="arm_l" type="Sprite" parent="Hip/Torso"] +position = Vector2( 4.98958, -7.86818 ) +texture = ExtResource( 1 ) +offset = Vector2( 0, 2.5 ) +region_enabled = true +region_rect = Rect2( 117, 16, 3, 9 ) +__meta__ = { +"_edit_bone_": true, +"_edit_ik_": true +} + +[node name="hand_l" type="Sprite" parent="Hip/Torso/arm_l"] +position = Vector2( 0, 6 ) +scale = Vector2( 0.995, 1.0113 ) +texture = ExtResource( 1 ) +offset = Vector2( 0, 2 ) +region_enabled = true +region_rect = Rect2( 117, 28, 3, 6 ) +__meta__ = { +"_edit_bone_": true +} + +[node name="end" type="Position2D" parent="Hip/Torso/arm_l/hand_l"] +position = Vector2( -0.5, 4 ) +__meta__ = { +"_edit_bone_": true +} + +[node name="CPUParticles2D" type="CPUParticles2D" parent="Hip/Torso/arm_l/hand_l/end"] +visible = false +position = Vector2( -0.53, 0.58 ) +rotation = 0.204192 +preprocess = 0.8 +randomness = 0.07 +local_coords = false +spread = 112.94 +gravity = Vector2( 0, 0 ) +initial_velocity = 12.0 +initial_velocity_random = 0.54 +angular_velocity = 310.59 +angular_velocity_random = 0.84 +linear_accel = 11.77 +radial_accel = 37.26 +tangential_accel = -13.72 +tangential_accel_random = 0.79 +damping = 77.44 +damping_random = 0.09 +angle_random = 0.86 +scale_amount = 2.0 +color = Color( 0.133333, 0.403922, 0.027451, 0.839216 ) +hue_variation = 0.22 +hue_variation_random = 0.88 + +[node name="shoulder_l" type="Sprite" parent="Hip/Torso/arm_l"] +position = Vector2( -0.913425, -1.12376 ) +texture = ExtResource( 1 ) +offset = Vector2( 0, -0.5 ) +region_enabled = true +region_rect = Rect2( 115, 7, 6, 4 ) + +[node name="Head" type="Sprite" parent="Hip/Torso"] +position = Vector2( 0, -10 ) +texture = ExtResource( 1 ) +offset = Vector2( 0, -4 ) +region_enabled = true +region_rect = Rect2( 102, 2, 7, 8 ) +__meta__ = { +"_edit_bone_": true, +"_edit_ik_": true +} + +[node name="Position2D" type="Position2D" parent="Hip/Torso/Head"] +position = Vector2( -0.0730991, -6.94428 ) +__meta__ = { +"_edit_bone_": true +} + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +autoplay = "idle" +anims/casting = SubResource( 1 ) +anims/idle = SubResource( 2 ) +anims/rest = SubResource( 3 ) +anims/run = SubResource( 4 ) +blend_times = [ "casting", "run", 1.0, "run", "idle", 1.0, "run", "rest", 1.0 ] + +[node name="AnimationTree" type="AnimationTree" parent="."] +tree_root = SubResource( 9 ) +anim_player = NodePath("../AnimationPlayer") +active = true +parameters/RunScale/scale = 1.0 +parameters/walking/blend_amount = 0.0 diff --git a/game/characters/CharacterSideModel.tscn b/game/characters/CharacterSideModel.tscn new file mode 100644 index 0000000..e0c0ea6 --- /dev/null +++ b/game/characters/CharacterSideModel.tscn @@ -0,0 +1,2146 @@ +[gd_scene load_steps=12 format=2] + +[ext_resource path="res://characters/char_t1_outline_split.png" type="Texture" id=1] +[ext_resource path="res://player/HumanoidCharacterBones2D.gd" type="Script" id=2] + + +[sub_resource type="Animation" id=1] +resource_name = "casting" +length = 2.0 +loop = true +tracks/0/type = "value" +tracks/0/path = NodePath("Hip/leg_l/foot_l/Position2D:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -0.297693, 7.79954 ), Vector2( -0.297693, 7.79954 ), Vector2( -0.297693, 7.79954 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Hip/leg_l/foot_l/Position2D:rotation_degrees") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ -0.150298, -0.150298, -0.150298 ] +} +tracks/2/type = "value" +tracks/2/path = NodePath("Hip/leg_l/foot_l:position") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 4.5 ), Vector2( 0, 4.5 ), Vector2( 0, 4.5 ) ] +} +tracks/3/type = "value" +tracks/3/path = NodePath("Hip/leg_l/foot_l:rotation_degrees") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ -2.18314, -2.18314, -2.18314 ] +} +tracks/4/type = "value" +tracks/4/path = NodePath("Hip/leg_l:position") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/keys = { +"times": PoolRealArray( 0, 0.5, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 2, 1.5 ), Vector2( 1.91221, 1.50001 ), Vector2( 2, 1.5 ), Vector2( 2, 1.5 ) ] +} +tracks/5/type = "value" +tracks/5/path = NodePath("Hip/leg_l:rotation_degrees") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ -7.17636, -7.17636, -7.17636 ] +} +tracks/6/type = "value" +tracks/6/path = NodePath("Hip/Torso/Head/Position2D:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -0.0730991, -6.94428 ), Vector2( -0.0730991, -6.94428 ), Vector2( -0.0730991, -6.94428 ) ] +} +tracks/7/type = "value" +tracks/7/path = NodePath("Hip/Torso/Head/Position2D:rotation_degrees") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/8/type = "value" +tracks/8/path = NodePath("Hip/Torso/Head:position") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, -10 ), Vector2( 0, -10 ), Vector2( 0, -10 ) ] +} +tracks/9/type = "value" +tracks/9/path = NodePath("Hip/Torso/Head:rotation_degrees") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/10/type = "value" +tracks/10/path = NodePath("Hip/leg_r/foot_r/Position2D:position") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 7.771 ), Vector2( 0, 7.771 ), Vector2( 0, 7.771 ) ] +} +tracks/11/type = "value" +tracks/11/path = NodePath("Hip/leg_r/foot_r/Position2D:rotation_degrees") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/12/type = "value" +tracks/12/path = NodePath("Hip/leg_r/foot_r:position") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/keys = { +"times": PoolRealArray( 0, 0.5, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -1, 5 ), Vector2( -1, 5 ), Vector2( -1, 5 ), Vector2( -1, 5 ) ] +} +tracks/13/type = "value" +tracks/13/path = NodePath("Hip/leg_r/foot_r:rotation_degrees") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/14/type = "value" +tracks/14/path = NodePath("Hip/leg_r:position") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/keys = { +"times": PoolRealArray( 0, 0.5, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -2, 1 ), Vector2( -2, 1.29 ), Vector2( -2, 1 ), Vector2( -2, 1 ) ] +} +tracks/15/type = "value" +tracks/15/path = NodePath("Hip/leg_r:rotation_degrees") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/keys = { +"times": PoolRealArray( 0, 0.5, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ 6.92582, 6.92582, 6.92582, 6.92582 ] +} +tracks/16/type = "value" +tracks/16/path = NodePath("Hip/Torso/arm_l/hand_l/end:position") +tracks/16/interp = 1 +tracks/16/loop_wrap = true +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -0.5, 4 ), Vector2( -0.5, 4 ), Vector2( -0.5, 4 ) ] +} +tracks/17/type = "value" +tracks/17/path = NodePath("Hip/Torso/arm_l/hand_l/end:rotation_degrees") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/18/type = "value" +tracks/18/path = NodePath("Hip/Torso/arm_l/hand_l:position") +tracks/18/interp = 1 +tracks/18/loop_wrap = true +tracks/18/imported = false +tracks/18/enabled = true +tracks/18/keys = { +"times": PoolRealArray( 0, 0.5, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 6 ), Vector2( 0, 6 ), Vector2( 0, 6 ), Vector2( 0, 6 ) ] +} +tracks/19/type = "value" +tracks/19/path = NodePath("Hip/Torso/arm_l/hand_l:rotation_degrees") +tracks/19/interp = 1 +tracks/19/loop_wrap = true +tracks/19/imported = false +tracks/19/enabled = true +tracks/19/keys = { +"times": PoolRealArray( 0, 0.5, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ 102.313, 97.3286, 102.313, 102.313 ] +} +tracks/20/type = "value" +tracks/20/path = NodePath("Hip/Torso/arm_l:position") +tracks/20/interp = 1 +tracks/20/loop_wrap = true +tracks/20/imported = false +tracks/20/enabled = true +tracks/20/keys = { +"times": PoolRealArray( 0, 0.5, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 4, -8 ), Vector2( 4, -8 ), Vector2( 4, -8 ), Vector2( 4, -8 ) ] +} +tracks/21/type = "value" +tracks/21/path = NodePath("Hip/Torso/arm_l:rotation_degrees") +tracks/21/interp = 1 +tracks/21/loop_wrap = true +tracks/21/imported = false +tracks/21/enabled = true +tracks/21/keys = { +"times": PoolRealArray( 0, 0.5, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ -0.372368, -5.92958, -8.40393, -0.372368 ] +} +tracks/22/type = "value" +tracks/22/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r/Position2D:position") +tracks/22/interp = 1 +tracks/22/loop_wrap = true +tracks/22/imported = false +tracks/22/enabled = true +tracks/22/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 5 ), Vector2( 0, 5 ), Vector2( 0, 5 ) ] +} +tracks/23/type = "value" +tracks/23/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r/Position2D:rotation_degrees") +tracks/23/interp = 1 +tracks/23/loop_wrap = true +tracks/23/imported = false +tracks/23/enabled = true +tracks/23/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/24/type = "value" +tracks/24/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r:position") +tracks/24/interp = 1 +tracks/24/loop_wrap = true +tracks/24/imported = false +tracks/24/enabled = true +tracks/24/keys = { +"times": PoolRealArray( 0, 0.5, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 5.5 ), Vector2( 0, 5.5 ), Vector2( 0, 5.5 ), Vector2( 0, 5.5 ) ] +} +tracks/25/type = "value" +tracks/25/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r:rotation_degrees") +tracks/25/interp = 1 +tracks/25/loop_wrap = true +tracks/25/imported = false +tracks/25/enabled = true +tracks/25/keys = { +"times": PoolRealArray( 0, 0.5, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ -109.724, -91.7756, -109.724, -109.724 ] +} +tracks/26/type = "value" +tracks/26/path = NodePath("Hip/Torso/remote_arm_r:position") +tracks/26/interp = 1 +tracks/26/loop_wrap = true +tracks/26/imported = false +tracks/26/enabled = true +tracks/26/keys = { +"times": PoolRealArray( 0, 0.5, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -3.50004, -8.61549 ), Vector2( -3.50004, -8.61549 ), Vector2( -3.50004, -8.61549 ), Vector2( -3.50004, -8.61549 ) ] +} +tracks/27/type = "value" +tracks/27/path = NodePath("Hip/Torso/remote_arm_r:rotation_degrees") +tracks/27/interp = 1 +tracks/27/loop_wrap = true +tracks/27/imported = false +tracks/27/enabled = true +tracks/27/keys = { +"times": PoolRealArray( 0, 0.5, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ 4.9682, 25.8311, 4.9682, 4.9682 ] +} +tracks/28/type = "value" +tracks/28/path = NodePath("Hip/Torso/arm_l/shoulder_l:position") +tracks/28/interp = 1 +tracks/28/loop_wrap = true +tracks/28/imported = false +tracks/28/enabled = true +tracks/28/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, -1.5 ), Vector2( 0, -1.5 ), Vector2( 0, -1.5 ) ] +} +tracks/29/type = "value" +tracks/29/path = NodePath("Hip/Torso/arm_l/shoulder_l:rotation_degrees") +tracks/29/interp = 1 +tracks/29/loop_wrap = true +tracks/29/imported = false +tracks/29/enabled = true +tracks/29/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/30/type = "value" +tracks/30/path = NodePath("Hip/Shadow:position") +tracks/30/interp = 1 +tracks/30/loop_wrap = true +tracks/30/imported = false +tracks/30/enabled = true +tracks/30/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -0.5, 14 ), Vector2( -0.5, 14 ), Vector2( -0.5, 14 ) ] +} +tracks/31/type = "value" +tracks/31/path = NodePath("Hip/Shadow:rotation_degrees") +tracks/31/interp = 1 +tracks/31/loop_wrap = true +tracks/31/imported = false +tracks/31/enabled = true +tracks/31/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/32/type = "value" +tracks/32/path = NodePath("Hip/Torso/remote_arm_r/shoulder_guard_r:position") +tracks/32/interp = 1 +tracks/32/loop_wrap = true +tracks/32/imported = false +tracks/32/enabled = true +tracks/32/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 1, -0.2 ), Vector2( 1, -0.2 ), Vector2( 1, -0.2 ) ] +} +tracks/33/type = "value" +tracks/33/path = NodePath("Hip/Torso/remote_arm_r/shoulder_guard_r:rotation_degrees") +tracks/33/interp = 1 +tracks/33/loop_wrap = true +tracks/33/imported = false +tracks/33/enabled = true +tracks/33/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/34/type = "value" +tracks/34/path = NodePath("Hip/Torso:position") +tracks/34/interp = 1 +tracks/34/loop_wrap = true +tracks/34/imported = false +tracks/34/enabled = true +tracks/34/keys = { +"times": PoolRealArray( 0, 0.5, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, -2 ), Vector2( -0.0923008, -1.07587 ), Vector2( 0, -2 ), Vector2( 0, -2 ) ] +} +tracks/35/type = "value" +tracks/35/path = NodePath("Hip/Torso:rotation_degrees") +tracks/35/interp = 1 +tracks/35/loop_wrap = true +tracks/35/imported = false +tracks/35/enabled = true +tracks/35/keys = { +"times": PoolRealArray( 0, 0.5, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ 0.0, -6.16061, 0.0, 0.0 ] +} +tracks/36/type = "value" +tracks/36/path = NodePath("Hip:position") +tracks/36/interp = 1 +tracks/36/loop_wrap = true +tracks/36/imported = false +tracks/36/enabled = true +tracks/36/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, -14 ), Vector2( 0, -14 ), Vector2( 0, -14 ) ] +} +tracks/37/type = "value" +tracks/37/path = NodePath("Hip:rotation_degrees") +tracks/37/interp = 1 +tracks/37/loop_wrap = true +tracks/37/imported = false +tracks/37/enabled = true +tracks/37/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/38/type = "value" +tracks/38/path = NodePath("hand_r:z_index") +tracks/38/interp = 1 +tracks/38/loop_wrap = true +tracks/38/imported = false +tracks/38/enabled = true +tracks/38/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 1, +"values": [ 1, 1, 1 ] +} +tracks/39/type = "value" +tracks/39/path = NodePath("Hip/Torso/arm_l/hand_l:z_index") +tracks/39/interp = 1 +tracks/39/loop_wrap = true +tracks/39/imported = false +tracks/39/enabled = true +tracks/39/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 1, +"values": [ 1, 1, 1 ] +} + +[sub_resource type="Animation" id=2] +resource_name = "idle" +length = 2.0 +loop = true +tracks/0/type = "value" +tracks/0/path = NodePath("Hip/leg_l/foot_l/Position2D:rotation_degrees") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ -0.150298, -0.150298, -0.150298 ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Hip/leg_l/foot_l:rotation_degrees") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/2/type = "value" +tracks/2/path = NodePath("Hip/leg_l:rotation_degrees") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.433445, 0.433445, 0.433445 ] +} +tracks/3/type = "value" +tracks/3/path = NodePath("Hip/Torso/Head/Position2D:rotation_degrees") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/4/type = "value" +tracks/4/path = NodePath("Hip/Torso/Head:rotation_degrees") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/5/type = "value" +tracks/5/path = NodePath("Hip/leg_r/foot_r/Position2D:rotation_degrees") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/6/type = "value" +tracks/6/path = NodePath("Hip/leg_r/foot_r:rotation_degrees") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/7/type = "value" +tracks/7/path = NodePath("Hip/leg_r:rotation_degrees") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/8/type = "value" +tracks/8/path = NodePath("Hip/Torso/arm_l/hand_l/end:rotation_degrees") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/9/type = "value" +tracks/9/path = NodePath("Hip/Torso/arm_l/hand_l:rotation_degrees") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/10/type = "value" +tracks/10/path = NodePath("Hip/Torso/arm_l:rotation_degrees") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/11/type = "value" +tracks/11/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r/Position2D:rotation_degrees") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/12/type = "value" +tracks/12/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r:rotation_degrees") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/13/type = "value" +tracks/13/path = NodePath("Hip/Torso/remote_arm_r:rotation_degrees") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/14/type = "value" +tracks/14/path = NodePath("Hip/Torso/arm_l/shoulder_l:rotation_degrees") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/15/type = "value" +tracks/15/path = NodePath("Hip/Shadow:rotation_degrees") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/16/type = "value" +tracks/16/path = NodePath("Hip/Torso/remote_arm_r/shoulder_guard_r:rotation_degrees") +tracks/16/interp = 1 +tracks/16/loop_wrap = true +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/17/type = "value" +tracks/17/path = NodePath("Hip/Torso:rotation_degrees") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/18/type = "value" +tracks/18/path = NodePath("Hip:rotation_degrees") +tracks/18/interp = 1 +tracks/18/loop_wrap = true +tracks/18/imported = false +tracks/18/enabled = true +tracks/18/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 0.0, 0.0, 0.0 ] +} +tracks/19/type = "value" +tracks/19/path = NodePath("Hip/leg_l/foot_l/Position2D:position") +tracks/19/interp = 1 +tracks/19/loop_wrap = true +tracks/19/imported = false +tracks/19/enabled = true +tracks/19/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -0.297693, 7.79954 ), Vector2( -0.297693, 7.79954 ), Vector2( -0.297693, 7.79954 ) ] +} +tracks/20/type = "value" +tracks/20/path = NodePath("Hip/leg_l/foot_l:position") +tracks/20/interp = 1 +tracks/20/loop_wrap = true +tracks/20/imported = false +tracks/20/enabled = true +tracks/20/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 4.5 ), Vector2( 0, 4.5 ), Vector2( 0, 4.5 ) ] +} +tracks/21/type = "value" +tracks/21/path = NodePath("Hip/leg_l:position") +tracks/21/interp = 1 +tracks/21/loop_wrap = true +tracks/21/imported = false +tracks/21/enabled = true +tracks/21/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 2, 1.5 ), Vector2( 2, 1.5 ), Vector2( 2, 1.5 ) ] +} +tracks/22/type = "value" +tracks/22/path = NodePath("Hip/Torso/Head/Position2D:position") +tracks/22/interp = 1 +tracks/22/loop_wrap = true +tracks/22/imported = false +tracks/22/enabled = true +tracks/22/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -0.0730991, -6.94428 ), Vector2( -0.0730991, -6.94428 ), Vector2( -0.0730991, -6.94428 ) ] +} +tracks/23/type = "value" +tracks/23/path = NodePath("Hip/Torso/Head:position") +tracks/23/interp = 1 +tracks/23/loop_wrap = true +tracks/23/imported = false +tracks/23/enabled = true +tracks/23/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, -10 ), Vector2( 0, -10 ), Vector2( 0, -10 ) ] +} +tracks/24/type = "value" +tracks/24/path = NodePath("Hip/leg_r/foot_r/Position2D:position") +tracks/24/interp = 1 +tracks/24/loop_wrap = true +tracks/24/imported = false +tracks/24/enabled = true +tracks/24/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 7.771 ), Vector2( 0, 7.771 ), Vector2( 0, 7.771 ) ] +} +tracks/25/type = "value" +tracks/25/path = NodePath("Hip/leg_r/foot_r:position") +tracks/25/interp = 1 +tracks/25/loop_wrap = true +tracks/25/imported = false +tracks/25/enabled = true +tracks/25/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -1, 5 ), Vector2( -1, 5 ), Vector2( -1, 5 ) ] +} +tracks/26/type = "value" +tracks/26/path = NodePath("Hip/leg_r:position") +tracks/26/interp = 1 +tracks/26/loop_wrap = true +tracks/26/imported = false +tracks/26/enabled = true +tracks/26/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -2, 1 ), Vector2( -2, 1 ), Vector2( -2, 1 ) ] +} +tracks/27/type = "value" +tracks/27/path = NodePath("Hip/Torso/arm_l/hand_l/end:position") +tracks/27/interp = 1 +tracks/27/loop_wrap = true +tracks/27/imported = false +tracks/27/enabled = true +tracks/27/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -0.5, 4 ), Vector2( -0.5, 4 ), Vector2( -0.5, 4 ) ] +} +tracks/28/type = "value" +tracks/28/path = NodePath("Hip/Torso/arm_l/hand_l:position") +tracks/28/interp = 1 +tracks/28/loop_wrap = true +tracks/28/imported = false +tracks/28/enabled = true +tracks/28/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 6 ), Vector2( 0, 6 ), Vector2( 0, 6 ) ] +} +tracks/29/type = "value" +tracks/29/path = NodePath("Hip/Torso/arm_l:position") +tracks/29/interp = 1 +tracks/29/loop_wrap = true +tracks/29/imported = false +tracks/29/enabled = true +tracks/29/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 4, -8 ), Vector2( 4, -8 ), Vector2( 4, -8 ) ] +} +tracks/30/type = "value" +tracks/30/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r/Position2D:position") +tracks/30/interp = 1 +tracks/30/loop_wrap = true +tracks/30/imported = false +tracks/30/enabled = true +tracks/30/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 5 ), Vector2( 0, 5 ), Vector2( 0, 5 ) ] +} +tracks/31/type = "value" +tracks/31/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r:position") +tracks/31/interp = 1 +tracks/31/loop_wrap = true +tracks/31/imported = false +tracks/31/enabled = true +tracks/31/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 5.5 ), Vector2( 0, 5.5 ), Vector2( 0, 5.5 ) ] +} +tracks/32/type = "value" +tracks/32/path = NodePath("Hip/Torso/remote_arm_r:position") +tracks/32/interp = 1 +tracks/32/loop_wrap = true +tracks/32/imported = false +tracks/32/enabled = true +tracks/32/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -3.50004, -8.61549 ), Vector2( -3.50004, -8.61549 ), Vector2( -3.50004, -8.61549 ) ] +} +tracks/33/type = "value" +tracks/33/path = NodePath("Hip/Torso/arm_l/shoulder_l:position") +tracks/33/interp = 1 +tracks/33/loop_wrap = true +tracks/33/imported = false +tracks/33/enabled = true +tracks/33/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, -1.5 ), Vector2( 0, -1.5 ), Vector2( 0, -1.5 ) ] +} +tracks/34/type = "value" +tracks/34/path = NodePath("Hip/Shadow:position") +tracks/34/interp = 1 +tracks/34/loop_wrap = true +tracks/34/imported = false +tracks/34/enabled = true +tracks/34/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -0.5, 14 ), Vector2( -0.5, 14 ), Vector2( -0.5, 14 ) ] +} +tracks/35/type = "value" +tracks/35/path = NodePath("Hip/Torso/remote_arm_r/shoulder_guard_r:position") +tracks/35/interp = 1 +tracks/35/loop_wrap = true +tracks/35/imported = false +tracks/35/enabled = true +tracks/35/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 1, -0.2 ), Vector2( 1, -0.2 ), Vector2( 1, -0.2 ) ] +} +tracks/36/type = "value" +tracks/36/path = NodePath("Hip/Torso:position") +tracks/36/interp = 1 +tracks/36/loop_wrap = true +tracks/36/imported = false +tracks/36/enabled = true +tracks/36/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, -2 ), Vector2( 6.95694e-05, -1.42717 ), Vector2( 0, -2 ) ] +} +tracks/37/type = "value" +tracks/37/path = NodePath("Hip:position") +tracks/37/interp = 1 +tracks/37/loop_wrap = true +tracks/37/imported = false +tracks/37/enabled = true +tracks/37/keys = { +"times": PoolRealArray( 0, 1, 2 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, -14 ), Vector2( 0, -14 ), Vector2( 0, -14 ) ] +} +tracks/38/type = "value" +tracks/38/path = NodePath("hand_r:z_index") +tracks/38/interp = 1 +tracks/38/loop_wrap = true +tracks/38/imported = false +tracks/38/enabled = true +tracks/38/keys = { +"times": PoolRealArray( 0, 2 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 1, +"values": [ 0, 0 ] +} + +[sub_resource type="Animation" id=3] +tracks/0/type = "value" +tracks/0/path = NodePath("Hip/leg_l/foot_l/Position2D:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( -0.297693, 7.79954 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Hip/leg_l/foot_l/Position2D:rotation_degrees") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ -0.150298 ] +} +tracks/2/type = "value" +tracks/2/path = NodePath("Hip/leg_l/foot_l:position") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 0, 4.5 ) ] +} +tracks/3/type = "value" +tracks/3/path = NodePath("Hip/leg_l/foot_l:rotation_degrees") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/4/type = "value" +tracks/4/path = NodePath("Hip/leg_l:position") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 2, 1.5 ) ] +} +tracks/5/type = "value" +tracks/5/path = NodePath("Hip/leg_l:rotation_degrees") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.433445 ] +} +tracks/6/type = "value" +tracks/6/path = NodePath("Hip/Torso/Head/Position2D:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( -0.0730991, -6.94428 ) ] +} +tracks/7/type = "value" +tracks/7/path = NodePath("Hip/Torso/Head/Position2D:rotation_degrees") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/8/type = "value" +tracks/8/path = NodePath("Hip/Torso/Head:position") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 0, -10 ) ] +} +tracks/9/type = "value" +tracks/9/path = NodePath("Hip/Torso/Head:rotation_degrees") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/10/type = "value" +tracks/10/path = NodePath("Hip/leg_r/foot_r/Position2D:position") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 0, 7.771 ) ] +} +tracks/11/type = "value" +tracks/11/path = NodePath("Hip/leg_r/foot_r/Position2D:rotation_degrees") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/12/type = "value" +tracks/12/path = NodePath("Hip/leg_r/foot_r:position") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( -1, 5 ) ] +} +tracks/13/type = "value" +tracks/13/path = NodePath("Hip/leg_r/foot_r:rotation_degrees") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/14/type = "value" +tracks/14/path = NodePath("Hip/leg_r:position") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( -2, 1 ) ] +} +tracks/15/type = "value" +tracks/15/path = NodePath("Hip/leg_r:rotation_degrees") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/16/type = "value" +tracks/16/path = NodePath("Hip/Torso/arm_l/hand_l/end:position") +tracks/16/interp = 1 +tracks/16/loop_wrap = true +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( -0.5, 4 ) ] +} +tracks/17/type = "value" +tracks/17/path = NodePath("Hip/Torso/arm_l/hand_l/end:rotation_degrees") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/18/type = "value" +tracks/18/path = NodePath("Hip/Torso/arm_l/hand_l:position") +tracks/18/interp = 1 +tracks/18/loop_wrap = true +tracks/18/imported = false +tracks/18/enabled = true +tracks/18/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 0, 6 ) ] +} +tracks/19/type = "value" +tracks/19/path = NodePath("Hip/Torso/arm_l/hand_l:rotation_degrees") +tracks/19/interp = 1 +tracks/19/loop_wrap = true +tracks/19/imported = false +tracks/19/enabled = true +tracks/19/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/20/type = "value" +tracks/20/path = NodePath("Hip/Torso/arm_l:position") +tracks/20/interp = 1 +tracks/20/loop_wrap = true +tracks/20/imported = false +tracks/20/enabled = true +tracks/20/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 4, -8 ) ] +} +tracks/21/type = "value" +tracks/21/path = NodePath("Hip/Torso/arm_l:rotation_degrees") +tracks/21/interp = 1 +tracks/21/loop_wrap = true +tracks/21/imported = false +tracks/21/enabled = true +tracks/21/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/22/type = "value" +tracks/22/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r/Position2D:position") +tracks/22/interp = 1 +tracks/22/loop_wrap = true +tracks/22/imported = false +tracks/22/enabled = true +tracks/22/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 0, 5 ) ] +} +tracks/23/type = "value" +tracks/23/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r/Position2D:rotation_degrees") +tracks/23/interp = 1 +tracks/23/loop_wrap = true +tracks/23/imported = false +tracks/23/enabled = true +tracks/23/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/24/type = "value" +tracks/24/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r:position") +tracks/24/interp = 1 +tracks/24/loop_wrap = true +tracks/24/imported = false +tracks/24/enabled = true +tracks/24/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 0, 5.5 ) ] +} +tracks/25/type = "value" +tracks/25/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r:rotation_degrees") +tracks/25/interp = 1 +tracks/25/loop_wrap = true +tracks/25/imported = false +tracks/25/enabled = true +tracks/25/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/26/type = "value" +tracks/26/path = NodePath("Hip/Torso/remote_arm_r:position") +tracks/26/interp = 1 +tracks/26/loop_wrap = true +tracks/26/imported = false +tracks/26/enabled = true +tracks/26/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( -3.50004, -8.61549 ) ] +} +tracks/27/type = "value" +tracks/27/path = NodePath("Hip/Torso/remote_arm_r:rotation_degrees") +tracks/27/interp = 1 +tracks/27/loop_wrap = true +tracks/27/imported = false +tracks/27/enabled = true +tracks/27/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/28/type = "value" +tracks/28/path = NodePath("Hip/Torso/arm_l/shoulder_l:position") +tracks/28/interp = 1 +tracks/28/loop_wrap = true +tracks/28/imported = false +tracks/28/enabled = true +tracks/28/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 0, -1.5 ) ] +} +tracks/29/type = "value" +tracks/29/path = NodePath("Hip/Torso/arm_l/shoulder_l:rotation_degrees") +tracks/29/interp = 1 +tracks/29/loop_wrap = true +tracks/29/imported = false +tracks/29/enabled = true +tracks/29/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/30/type = "value" +tracks/30/path = NodePath("Hip/Shadow:position") +tracks/30/interp = 1 +tracks/30/loop_wrap = true +tracks/30/imported = false +tracks/30/enabled = true +tracks/30/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( -0.5, 14 ) ] +} +tracks/31/type = "value" +tracks/31/path = NodePath("Hip/Shadow:rotation_degrees") +tracks/31/interp = 1 +tracks/31/loop_wrap = true +tracks/31/imported = false +tracks/31/enabled = true +tracks/31/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/32/type = "value" +tracks/32/path = NodePath("Hip/Torso/remote_arm_r/shoulder_guard_r:position") +tracks/32/interp = 1 +tracks/32/loop_wrap = true +tracks/32/imported = false +tracks/32/enabled = true +tracks/32/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 1, -0.2 ) ] +} +tracks/33/type = "value" +tracks/33/path = NodePath("Hip/Torso/remote_arm_r/shoulder_guard_r:rotation_degrees") +tracks/33/interp = 1 +tracks/33/loop_wrap = true +tracks/33/imported = false +tracks/33/enabled = true +tracks/33/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/34/type = "value" +tracks/34/path = NodePath("Hip/Torso:position") +tracks/34/interp = 1 +tracks/34/loop_wrap = true +tracks/34/imported = false +tracks/34/enabled = true +tracks/34/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 0, -2 ) ] +} +tracks/35/type = "value" +tracks/35/path = NodePath("Hip/Torso:rotation_degrees") +tracks/35/interp = 1 +tracks/35/loop_wrap = true +tracks/35/imported = false +tracks/35/enabled = true +tracks/35/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/36/type = "value" +tracks/36/path = NodePath("Hip:position") +tracks/36/interp = 1 +tracks/36/loop_wrap = true +tracks/36/imported = false +tracks/36/enabled = true +tracks/36/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 0, -14 ) ] +} +tracks/37/type = "value" +tracks/37/path = NodePath("Hip:rotation_degrees") +tracks/37/interp = 1 +tracks/37/loop_wrap = true +tracks/37/imported = false +tracks/37/enabled = true +tracks/37/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} + +[sub_resource type="Animation" id=4] +loop = true +tracks/0/type = "value" +tracks/0/path = NodePath("Hip/leg_l/foot_l/Position2D:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0.5 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( -0.297693, 7.79954 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Hip/leg_l/foot_l/Position2D:rotation_degrees") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0.5 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ -0.150298 ] +} +tracks/2/type = "value" +tracks/2/path = NodePath("Hip/leg_l/foot_l:position") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 4.5 ), Vector2( 0, 4.5 ), Vector2( 0, 4.5 ) ] +} +tracks/3/type = "value" +tracks/3/path = NodePath("Hip/leg_l/foot_l:rotation_degrees") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ -29.4825, -32.9352, -29.4825 ] +} +tracks/4/type = "value" +tracks/4/path = NodePath("Hip/leg_l:position") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 2, 1.5 ), Vector2( 2, 1.5 ), Vector2( 2, 1.5 ) ] +} +tracks/5/type = "value" +tracks/5/path = NodePath("Hip/leg_l:rotation_degrees") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ -12.7732, 52.6284, -12.7732 ] +} +tracks/6/type = "value" +tracks/6/path = NodePath("Hip/Torso/Head/Position2D:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/keys = { +"times": PoolRealArray( 0.5 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( -0.0730991, -6.94428 ) ] +} +tracks/7/type = "value" +tracks/7/path = NodePath("Hip/Torso/Head/Position2D:rotation_degrees") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/keys = { +"times": PoolRealArray( 0.5 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/8/type = "value" +tracks/8/path = NodePath("Hip/Torso/Head:position") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/keys = { +"times": PoolRealArray( 0.5 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 0, -10 ) ] +} +tracks/9/type = "value" +tracks/9/path = NodePath("Hip/Torso/Head:rotation_degrees") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/keys = { +"times": PoolRealArray( 0.5 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/10/type = "value" +tracks/10/path = NodePath("Hip/leg_r/foot_r/Position2D:position") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 7.771 ), Vector2( 0, 7.771 ), Vector2( 0, 7.771 ) ] +} +tracks/11/type = "value" +tracks/11/path = NodePath("Hip/leg_r/foot_r/Position2D:rotation_degrees") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/keys = { +"times": PoolRealArray( 0.5 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/12/type = "value" +tracks/12/path = NodePath("Hip/leg_r/foot_r:position") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -1, 5 ), Vector2( -1, 5 ), Vector2( -1, 5 ) ] +} +tracks/13/type = "value" +tracks/13/path = NodePath("Hip/leg_r/foot_r:rotation_degrees") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ -23.281, -39.6179, -12.9568 ] +} +tracks/14/type = "value" +tracks/14/path = NodePath("Hip/leg_r:position") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -2, 1 ), Vector2( -2, 1 ), Vector2( -2, 1 ) ] +} +tracks/15/type = "value" +tracks/15/path = NodePath("Hip/leg_r:rotation_degrees") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 42.8046, -23.6482, 32.9892 ] +} +tracks/16/type = "value" +tracks/16/path = NodePath("Hip/Torso/arm_l/hand_l/end:position") +tracks/16/interp = 1 +tracks/16/loop_wrap = true +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/keys = { +"times": PoolRealArray( 0.5 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( -0.5, 4 ) ] +} +tracks/17/type = "value" +tracks/17/path = NodePath("Hip/Torso/arm_l/hand_l/end:rotation_degrees") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/keys = { +"times": PoolRealArray( 0.5 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/18/type = "value" +tracks/18/path = NodePath("Hip/Torso/arm_l/hand_l:position") +tracks/18/interp = 1 +tracks/18/loop_wrap = true +tracks/18/imported = false +tracks/18/enabled = true +tracks/18/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 6 ), Vector2( 0, 6 ), Vector2( 0, 6 ) ] +} +tracks/19/type = "value" +tracks/19/path = NodePath("Hip/Torso/arm_l/hand_l:rotation_degrees") +tracks/19/interp = 1 +tracks/19/loop_wrap = true +tracks/19/imported = false +tracks/19/enabled = true +tracks/19/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 43.0307, 9.14528, 43.0307 ] +} +tracks/20/type = "value" +tracks/20/path = NodePath("Hip/Torso/arm_l:position") +tracks/20/interp = 1 +tracks/20/loop_wrap = true +tracks/20/imported = false +tracks/20/enabled = true +tracks/20/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 4, -8 ), Vector2( 4, -8 ), Vector2( 4, -8 ) ] +} +tracks/21/type = "value" +tracks/21/path = NodePath("Hip/Torso/arm_l:rotation_degrees") +tracks/21/interp = 1 +tracks/21/loop_wrap = true +tracks/21/imported = false +tracks/21/enabled = true +tracks/21/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ 13.9033, -32.423, 13.9033 ] +} +tracks/22/type = "value" +tracks/22/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r/Position2D:position") +tracks/22/interp = 1 +tracks/22/loop_wrap = true +tracks/22/imported = false +tracks/22/enabled = true +tracks/22/keys = { +"times": PoolRealArray( 0.5 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 0, 5 ) ] +} +tracks/23/type = "value" +tracks/23/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r/Position2D:rotation_degrees") +tracks/23/interp = 1 +tracks/23/loop_wrap = true +tracks/23/imported = false +tracks/23/enabled = true +tracks/23/keys = { +"times": PoolRealArray( 0.5 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/24/type = "value" +tracks/24/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r:position") +tracks/24/interp = 1 +tracks/24/loop_wrap = true +tracks/24/imported = false +tracks/24/enabled = true +tracks/24/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 5.5 ), Vector2( 0, 5.5 ), Vector2( 0, 5.5 ) ] +} +tracks/25/type = "value" +tracks/25/path = NodePath("Hip/Torso/remote_arm_r/remote_hand_r:rotation_degrees") +tracks/25/interp = 1 +tracks/25/loop_wrap = true +tracks/25/imported = false +tracks/25/enabled = true +tracks/25/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ -15.7785, 0.207499, -15.7785 ] +} +tracks/26/type = "value" +tracks/26/path = NodePath("Hip/Torso/remote_arm_r:position") +tracks/26/interp = 1 +tracks/26/loop_wrap = true +tracks/26/imported = false +tracks/26/enabled = true +tracks/26/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -3.50004, -8.61549 ), Vector2( -3.50004, -8.61549 ), Vector2( -3.50004, -8.61549 ) ] +} +tracks/27/type = "value" +tracks/27/path = NodePath("Hip/Torso/remote_arm_r:rotation_degrees") +tracks/27/interp = 1 +tracks/27/loop_wrap = true +tracks/27/imported = false +tracks/27/enabled = true +tracks/27/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ -21.3108, 37.0042, -21.3108 ] +} +tracks/28/type = "value" +tracks/28/path = NodePath("Hip/Torso/arm_l/shoulder_l:position") +tracks/28/interp = 1 +tracks/28/loop_wrap = true +tracks/28/imported = false +tracks/28/enabled = true +tracks/28/keys = { +"times": PoolRealArray( 0.5 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 0, -1.5 ) ] +} +tracks/29/type = "value" +tracks/29/path = NodePath("Hip/Torso/arm_l/shoulder_l:rotation_degrees") +tracks/29/interp = 1 +tracks/29/loop_wrap = true +tracks/29/imported = false +tracks/29/enabled = true +tracks/29/keys = { +"times": PoolRealArray( 0.5 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/30/type = "value" +tracks/30/path = NodePath("Hip/Shadow:position") +tracks/30/interp = 1 +tracks/30/loop_wrap = true +tracks/30/imported = false +tracks/30/enabled = true +tracks/30/keys = { +"times": PoolRealArray( 0.5 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( -0.5, 14 ) ] +} +tracks/31/type = "value" +tracks/31/path = NodePath("Hip/Shadow:rotation_degrees") +tracks/31/interp = 1 +tracks/31/loop_wrap = true +tracks/31/imported = false +tracks/31/enabled = true +tracks/31/keys = { +"times": PoolRealArray( 0.5 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/32/type = "value" +tracks/32/path = NodePath("Hip/Torso/remote_arm_r/shoulder_guard_r:position") +tracks/32/interp = 1 +tracks/32/loop_wrap = true +tracks/32/imported = false +tracks/32/enabled = true +tracks/32/keys = { +"times": PoolRealArray( 0.5 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 1, -0.2 ) ] +} +tracks/33/type = "value" +tracks/33/path = NodePath("Hip/Torso/remote_arm_r/shoulder_guard_r:rotation_degrees") +tracks/33/interp = 1 +tracks/33/loop_wrap = true +tracks/33/imported = false +tracks/33/enabled = true +tracks/33/keys = { +"times": PoolRealArray( 0.5 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/34/type = "value" +tracks/34/path = NodePath("Hip/Torso:position") +tracks/34/interp = 1 +tracks/34/loop_wrap = true +tracks/34/imported = false +tracks/34/enabled = true +tracks/34/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -0.146089, -1.13476 ), Vector2( -0.0730226, -1.35406 ), Vector2( 6.95694e-05, -1.42717 ) ] +} +tracks/35/type = "value" +tracks/35/path = NodePath("Hip/Torso:rotation_degrees") +tracks/35/interp = 1 +tracks/35/loop_wrap = true +tracks/35/imported = false +tracks/35/enabled = true +tracks/35/keys = { +"times": PoolRealArray( 0.5 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/36/type = "value" +tracks/36/path = NodePath("Hip:position") +tracks/36/interp = 1 +tracks/36/loop_wrap = true +tracks/36/imported = false +tracks/36/enabled = true +tracks/36/keys = { +"times": PoolRealArray( 0.5 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 0, -14 ) ] +} +tracks/37/type = "value" +tracks/37/path = NodePath("Hip:rotation_degrees") +tracks/37/interp = 1 +tracks/37/loop_wrap = true +tracks/37/imported = false +tracks/37/enabled = true +tracks/37/keys = { +"times": PoolRealArray( 0.5 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} + +[sub_resource type="AnimationNodeTimeScale" id=5] + +[sub_resource type="AnimationNodeAnimation" id=6] +animation = "idle" + +[sub_resource type="AnimationNodeAnimation" id=7] +animation = "run" + +[sub_resource type="AnimationNodeBlend2" id=8] + +[sub_resource type="AnimationNodeBlendTree" id=9] +graph_offset = Vector2( -453, 345 ) +nodes/RunScale/node = SubResource( 5 ) +nodes/RunScale/position = Vector2( -60, 500 ) +nodes/idle/node = SubResource( 6 ) +nodes/idle/position = Vector2( -240, 340 ) +nodes/output/position = Vector2( 440, 280 ) +nodes/run/node = SubResource( 7 ) +nodes/run/position = Vector2( -280, 500 ) +nodes/walking/node = SubResource( 8 ) +nodes/walking/position = Vector2( 140, 320 ) +node_connections = [ "walking", 0, "idle", "walking", 1, "RunScale", "RunScale", 0, "run", "output", 0, "walking" ] + +[node name="CharacterSideModel" type="CharacterBones"] +rotation = 0.000121465 +script = ExtResource( 2 ) +help = "HUMANOID_BONE_HIP = 0, +HUMANOID_BONE_TORSO = 1, +HUMANOID_BONE_LEG_R = 2, +HUMANOID_BONE_FOOT_R = 3, +HUMANOID_BONE_TOE_R = 4, +HUMANOID_BONE_LEG_L = 5, +HUMANOID_BONE_FOOT_L = 6, +HUMANOID_BONE_TOE_L = 7, +HUMANOID_BONE_ARM_R = 8, +#HUMANOID_BONE_SHOULDER_GUARD_R = 0, +HUMANOID_BONE_HAND_R = 9, +HUMANOID_BONE_FINGERS_R = 10, +HUMANOID_BONE_ARM_L = 11, +#HUMANOID_BONE_SHOULDER_GUARD_L = 0, +HUMANOID_BONE_HAND_L = 12, +HUMANOID_BONE_FINGERS_L = 13, +HUMANOID_BONE_HEAD = 14, +HUMANOID_BONE_HEAD_TOP = 15, +HUMANOID_BONES_MAX = 16," +bones = [ NodePath("Hip"), NodePath("Hip/Torso"), NodePath("Hip/leg_r"), NodePath("Hip/leg_r/foot_r"), NodePath("Hip/leg_r/foot_r/Position2D"), NodePath("Hip/leg_l"), NodePath("Hip/leg_l/foot_l"), NodePath("Hip/leg_l/foot_l/Position2D"), NodePath("arm_r"), NodePath("hand_r"), NodePath("Hip/Torso/remote_arm_r/remote_hand_r/Position2D"), NodePath("Hip/Torso/arm_l"), NodePath("Hip/Torso/arm_l/hand_l"), NodePath("Hip/Torso/arm_l/hand_l/end"), NodePath("Hip/Torso/Head"), NodePath("Hip/Torso/Head/Position2D") ] + +[node name="model" type="Sprite" parent="."] +visible = false +texture = ExtResource( 1 ) +offset = Vector2( 0, -15.5 ) +region_enabled = true +region_rect = Rect2( 49, 21, 13, 37 ) + +[node name="arm_r" type="Sprite" parent="."] +position = Vector2( -3.50003, -24.5128 ) +texture = ExtResource( 1 ) +offset = Vector2( 0, 3 ) +region_enabled = true +region_rect = Rect2( 1, 11, 4, 9 ) + +[node name="hand_r" type="Sprite" parent="."] +position = Vector2( -3.50003, -19.0128 ) +texture = ExtResource( 1 ) +offset = Vector2( 0, 3 ) +region_enabled = true +region_rect = Rect2( 1, 23, 4, 6 ) + +[node name="Hip" type="Sprite" parent="."] +position = Vector2( 0, -14 ) +texture = ExtResource( 1 ) +region_enabled = true +region_rect = Rect2( 8, 32, 7, 2 ) + +[node name="Shadow" type="Sprite" parent="Hip"] +position = Vector2( -0.5, 14 ) +texture = ExtResource( 1 ) +region_enabled = true +region_rect = Rect2( 27, 57, 14, 6 ) + +[node name="leg_r" type="Sprite" parent="Hip"] +position = Vector2( -2, 1 ) +texture = ExtResource( 1 ) +offset = Vector2( 0, 3 ) +region_enabled = true +region_rect = Rect2( 5, 36, 5, 8 ) +__meta__ = { +"_edit_bone_": true, +"_edit_ik_": true +} + +[node name="foot_r" type="Sprite" parent="Hip/leg_r"] +position = Vector2( -1, 5 ) +texture = ExtResource( 1 ) +offset = Vector2( 0, 4 ) +region_enabled = true +region_rect = Rect2( 3, 48, 7, 10 ) +__meta__ = { +"_edit_bone_": true +} + +[node name="Position2D" type="Position2D" parent="Hip/leg_r/foot_r"] +position = Vector2( 0, 7.771 ) +__meta__ = { +"_edit_bone_": true +} + +[node name="leg_l" type="Sprite" parent="Hip"] +position = Vector2( 2, 1.5 ) +rotation = 0.00756504 +texture = ExtResource( 1 ) +offset = Vector2( 0, 3 ) +region_enabled = true +region_rect = Rect2( 14, 36, 5, 9 ) +__meta__ = { +"_edit_bone_": true, +"_edit_ik_": true +} + +[node name="foot_l" type="Sprite" parent="Hip/leg_l"] +position = Vector2( 0, 4.5 ) +texture = ExtResource( 1 ) +offset = Vector2( 0, 4 ) +region_enabled = true +region_rect = Rect2( 14, 48, 5, 10 ) +__meta__ = { +"_edit_bone_": true +} + +[node name="Position2D" type="Position2D" parent="Hip/leg_l/foot_l"] +position = Vector2( -0.297693, 7.79954 ) +rotation = -0.0026232 +__meta__ = { +"_edit_bone_": true +} + +[node name="Torso" type="Sprite" parent="Hip"] +position = Vector2( 1.24679e-05, -1.89734 ) +texture = ExtResource( 1 ) +offset = Vector2( 0, -5 ) +region_enabled = true +region_rect = Rect2( 8, 13, 9, 12 ) +__meta__ = { +"_edit_bone_": true +} + +[node name="remote_arm_r" type="RemoteTransform2D" parent="Hip/Torso"] +position = Vector2( -3.50004, -8.61549 ) +remote_path = NodePath("../../../arm_r") +__meta__ = { +"_edit_bone_": true, +"_edit_ik_": true +} + +[node name="shoulder_guard_r" type="Sprite" parent="Hip/Torso/remote_arm_r"] +position = Vector2( 1, -0.2 ) +texture = ExtResource( 1 ) +offset = Vector2( -1, -1 ) +region_enabled = true +region_rect = Rect2( 0.39, 5.79, 6.91, 4.67 ) + +[node name="remote_hand_r" type="RemoteTransform2D" parent="Hip/Torso/remote_arm_r"] +position = Vector2( 0, 5.5 ) +remote_path = NodePath("../../../../hand_r") +__meta__ = { +"_edit_bone_": true +} + +[node name="Position2D" type="Position2D" parent="Hip/Torso/remote_arm_r/remote_hand_r"] +position = Vector2( 0, 5 ) +__meta__ = { +"_edit_bone_": true +} + +[node name="Head" type="Sprite" parent="Hip/Torso"] +position = Vector2( 0, -10 ) +texture = ExtResource( 1 ) +offset = Vector2( 0, -4 ) +region_enabled = true +region_rect = Rect2( 9, 0, 7, 8 ) +__meta__ = { +"_edit_bone_": true, +"_edit_ik_": true +} + +[node name="Position2D" type="Position2D" parent="Hip/Torso/Head"] +position = Vector2( -0.0730991, -6.94428 ) +__meta__ = { +"_edit_bone_": true +} + +[node name="arm_l" type="Sprite" parent="Hip/Torso"] +position = Vector2( 4, -8 ) +texture = ExtResource( 1 ) +offset = Vector2( 0, 2.5 ) +region_enabled = true +region_rect = Rect2( 20, 11, 3, 9 ) +__meta__ = { +"_edit_bone_": true, +"_edit_ik_": true +} + +[node name="hand_l" type="Sprite" parent="Hip/Torso/arm_l"] +position = Vector2( 0, 6 ) +z_index = 1 +texture = ExtResource( 1 ) +offset = Vector2( 0, 2 ) +region_enabled = true +region_rect = Rect2( 20, 24, 3, 6 ) +__meta__ = { +"_edit_bone_": true +} + +[node name="end" type="Position2D" parent="Hip/Torso/arm_l/hand_l"] +position = Vector2( -0.5, 4 ) +__meta__ = { +"_edit_bone_": true +} + +[node name="CPUParticles2D" type="CPUParticles2D" parent="Hip/Torso/arm_l/hand_l/end"] +visible = false +position = Vector2( -0.53, 0.58 ) +rotation = 0.204192 +preprocess = 0.8 +randomness = 0.07 +local_coords = false +spread = 112.94 +gravity = Vector2( 0, 0 ) +initial_velocity = 12.0 +initial_velocity_random = 0.54 +angular_velocity = 310.59 +angular_velocity_random = 0.84 +linear_accel = 11.77 +radial_accel = 37.26 +tangential_accel = -13.72 +tangential_accel_random = 0.79 +damping = 77.44 +damping_random = 0.09 +angle_random = 0.86 +scale_amount = 2.0 +color = Color( 0.133333, 0.403922, 0.027451, 0.839216 ) +hue_variation = 0.22 +hue_variation_random = 0.88 + +[node name="shoulder_l" type="Sprite" parent="Hip/Torso/arm_l"] +position = Vector2( 0, -1.5 ) +texture = ExtResource( 1 ) +offset = Vector2( 0, -0.5 ) +region_enabled = true +region_rect = Rect2( 17.23, 5.56, 6.41, 4.89 ) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +autoplay = "idle" +anims/casting = SubResource( 1 ) +anims/idle = SubResource( 2 ) +anims/rest = SubResource( 3 ) +anims/run = SubResource( 4 ) +blend_times = [ "casting", "run", 1.0, "run", "idle", 1.0, "run", "rest", 1.0 ] + +[node name="AnimationTree" type="AnimationTree" parent="."] +tree_root = SubResource( 9 ) +anim_player = NodePath("../AnimationPlayer") +active = true +parameters/RunScale/scale = 1.0 +parameters/walking/blend_amount = 0.0 diff --git a/game/characters/CharacterTest1Scene.tscn b/game/characters/CharacterTest1Scene.tscn new file mode 100644 index 0000000..fe088e1 --- /dev/null +++ b/game/characters/CharacterTest1Scene.tscn @@ -0,0 +1,109 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://characters/char_t1_outline_split.png" type="Texture" id=1] + + +[node name="CharacterTest1" type="Node2D"] + +[node name="model" type="Sprite" parent="."] +visible = false +texture = ExtResource( 1 ) +offset = Vector2( 0, -15.5 ) +region_enabled = true +region_rect = Rect2( 49, 21, 13, 37 ) + +[node name="Shadow" type="Sprite" parent="."] +position = Vector2( -0.5, 0 ) +texture = ExtResource( 1 ) +region_enabled = true +region_rect = Rect2( 27, 57, 14, 6 ) + +[node name="RightUpperHand" type="Sprite" parent="."] +position = Vector2( -3.5, -25.5 ) +texture = ExtResource( 1 ) +offset = Vector2( 0, 3 ) +region_enabled = true +region_rect = Rect2( 1, 11, 4, 9 ) + +[node name="RightLowerHand" type="Sprite" parent="."] +position = Vector2( -3.47278, -19.9516 ) +texture = ExtResource( 1 ) +offset = Vector2( 0, 3 ) +region_enabled = true +region_rect = Rect2( 1, 23, 4, 8 ) + +[node name="Torso" type="Sprite" parent="."] +position = Vector2( 0, -16 ) +texture = ExtResource( 1 ) +offset = Vector2( 0, -5 ) +region_enabled = true +region_rect = Rect2( 8, 13, 9, 12 ) + +[node name="LeftShoulderGuard" type="Sprite" parent="."] +position = Vector2( -2.5, -25 ) +texture = ExtResource( 1 ) +offset = Vector2( -1, -1 ) +region_enabled = true +region_rect = Rect2( 0.39, 5.79, 6.91, 4.67 ) + +[node name="Head" type="Sprite" parent="."] +position = Vector2( 0, -26 ) +texture = ExtResource( 1 ) +offset = Vector2( 0, -4 ) +region_enabled = true +region_rect = Rect2( 9, 0, 7, 8 ) + +[node name="LeftUpperArm" type="Sprite" parent="."] +position = Vector2( 4, -24 ) +texture = ExtResource( 1 ) +offset = Vector2( 0, 2.5 ) +region_enabled = true +region_rect = Rect2( 20, 11, 3, 9 ) + +[node name="RightShoulderGuard" type="Sprite" parent="."] +position = Vector2( 4, -25.5 ) +texture = ExtResource( 1 ) +offset = Vector2( 0, -0.5 ) +region_enabled = true +region_rect = Rect2( 17.23, 5.56, 6.41, 4.89 ) + +[node name="RightUpperLeg" type="Sprite" parent="."] +position = Vector2( -2, -13 ) +texture = ExtResource( 1 ) +offset = Vector2( 0, 3 ) +region_enabled = true +region_rect = Rect2( 5, 36, 5, 8 ) + +[node name="RightLowerLeg" type="Sprite" parent="."] +position = Vector2( -3, -8 ) +texture = ExtResource( 1 ) +offset = Vector2( 0, 4 ) +region_enabled = true +region_rect = Rect2( 3, 48, 7, 10 ) + +[node name="LeftUpperLeg" type="Sprite" parent="."] +position = Vector2( 2, -12.5 ) +texture = ExtResource( 1 ) +offset = Vector2( 0, 3 ) +region_enabled = true +region_rect = Rect2( 14, 36, 5, 9 ) + +[node name="LeftLowerLeg" type="Sprite" parent="."] +position = Vector2( 2, -8 ) +texture = ExtResource( 1 ) +offset = Vector2( 0, 4 ) +region_enabled = true +region_rect = Rect2( 14, 48, 5, 10 ) + +[node name="Hip" type="Sprite" parent="."] +position = Vector2( 0, -14 ) +texture = ExtResource( 1 ) +region_enabled = true +region_rect = Rect2( 8, 32, 7, 2 ) + +[node name="LeftLowerArm" type="Sprite" parent="."] +position = Vector2( 4, -18 ) +texture = ExtResource( 1 ) +offset = Vector2( 0, 2 ) +region_enabled = true +region_rect = Rect2( 20, 24, 3, 6 ) diff --git a/game/characters/char_t1_outline_split - Copy.png b/game/characters/char_t1_outline_split - Copy.png new file mode 100644 index 0000000000000000000000000000000000000000..92205db44b1d46d6acf025a53ab0a160dfbe88d3 GIT binary patch literal 1228 zcmV;-1T*`IP)Px(hDk(0RCt{2n@>m-Q5?s=D_ZU$QX)iJLc~&`i;-Xjp%?}hc(5Wb+n>V<9d=Ja zc@hG{I)r-=+{z9G2_l^glp^V}9r|-AEQF{q7U|%Y)Ru~`!|r?T%)B@AW_ML#W?^?=a1(#M=+25)3 z4@^Y50qv~t9MTTx={|zCNdmHuIiLQW&?fad)*I2;+l#mgt{)W>n89pG2g4j_3S z4e7Zd0LpwIINvkmXK`|+qnQnEJ)c*94*-NZp{jjA@%?aTJ;|(X000JGeCD0&N~n^| z_|(q~9=`rukn+Qw^#lMiYa5<%f+7TpF&@YozJ@v1ES^GBIglC zgu>Jjq21fD`28Kvh<*M2TJhdcBCBbvel`Q@#)FBD$b+Q8KovoAuCg%TOM~zZc?GP8iYv2+H zoWQI~CSn8ta-pCRmJI5FP*M zS_jIM?tsK9ATrX;#^+;Hx_iP1Nk}pgLwtQ&Q?~${jT-gpWO)*F17_+LkpoD7SBMS9 zW)}g@gVOk=MmC6!f8@zHj<9a|%9r=sP7o9G+IF>G=`IX`nS-@B@g}AF&*J;45nWhD zd|$P$oYPnl0yyy|g_(o3*+Di0G*IKC3(JTWs;$MC4FTOGNN2#9j!bl6*_48I^X0)B z4ycYjoBoY(m@n_U9PobemnnHs)+WhBj12^BGLm0#l(GYqhi3IMTB!_YfKIzyZEUHH z2Y}7Im4hZ|wg27LsC}0N&Ekr< zwGd76HcHgO5a{m;v3L>G0*YRNTWSG{(X&p9uo${cX1Nz5;qZAjh>pAS_W<Nl;({Qlb&<~h3q{7nm_X3JqRgAPK42Kkc-(=Nk8l@#m>#_J4LqY=(Gb0eWA)W qJ^io>6vb8u*m-eDeEC+oXZQyiEuf9H30rRf00001cr17XdUKf0_GEjk|4j}|05eP1b=5& z1x6-kfk$L90|Vb75M~tB@M-`S7F#@B978gk-%jf;T5Q1MI(Mn>iDYSx|Nqy%xq5h8 z4v&S&664*~w5iwAS0mwfrz-WK8*ayqIaiTz>D; za}0M_gQ}0n1#}A?;W_Hjx#^JJ)tR5%8BW!QSx>HX30V*jXgz5z|L5P8Tm|z^=Cd|@ zo6?>g%{^gT`lh)?h7Gs2axsK(h`m|M5Y5sc%)BMHzxLL4-P?wZmp?nYF=+g*+?69O z%5Y4Mp`VjMUg+?G-owA8suePqSl!gy(8Zu}aPi)Bh7ym0)E$Kt@!#)W__}T4v?ttG zKd*_KW5J`CbzRfJ`zNP@jAV(22T(~y{ABAdkJg_mv^b@|*``sqkjbG*k}*I&UQ){G zz_)w$ax77&=3keTp0hqttom_<7Ndf2=NldeEoWzr8~5IS$#-IT$m#iNqRoL7n~$7i z*yCrbpw6$xpu(@9#gI|w{eW$4$2lSPsYd=Qt{47UWc|yI{e{X>5mv^dwlf9dOr*Oq zc^b|MrL#HA&*eHWwUgnAofm^s!e?oQnW}z#557B8a$2qQVMy5iSBrVW6=hb2xvG9_ z56l-vGVSJkJzZhFv55ABe<3UeUW}`zCvXW&(QUkFNqLsuo)_DD2X% z;&dps*l{~h+hCXU9km_WRcsE^zAcLj*~P+eK~Q8{l!r(m2#I_ZiSl4f)5gQ zKNTVccWqhx-htnMXYT7adViN?G5l~YiDy`6EWILFYBuA9Z~5#C($bSJJ$k>2Vb|>5 z8y{DRH0Us{Pv1^8(7~2*{@i=><}G}5jGLPqTAwM3ZIVjecW?8uU8)O?r*JdWgl6i6J^TD#bQM!X$h^0mPgF!qYd(tn zdcHDZ_80jCSFQ)QC)}I;K6O$~aqbT`R)*Zo@+<<(EbG}0SS}EoR`u!PR(pp~@jss# zPP}J~+s~=Zpz*(->B4K*c!P^V8~Io6b~R-vzVt>%wkj&*GK+$81lO9Cp;kZE)X5$2 w^OL!l6tgpaiL?IotOvG}CztW=TUYpp`M%}#{_?-7{Gbxr)78&qol`;+0J+)D6aWAK literal 0 HcmV?d00001 diff --git a/game/characters/char_t1_outline_split.png.import b/game/characters/char_t1_outline_split.png.import new file mode 100644 index 0000000..55430b9 --- /dev/null +++ b/game/characters/char_t1_outline_split.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/char_t1_outline_split.png-9c3f609f043903cf305339bc84929b57.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://characters/char_t1_outline_split.png" +dest_files=[ "res://.import/char_t1_outline_split.png-9c3f609f043903cf305339bc84929b57.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/cursors/arrow.png b/game/cursors/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..cec826cb7e9075a6524e83c82e822bc06c5b304b GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucK_^ca#}JL++CFYB1_ci1?eFTJFHKES;XQJG zo)Y7UMN?I_HAn|0x%h=%{>q@TzMJ#PSuWiNGi1N~J*ap~;a2o-CIdzxU3u2fbyXmT OF?hQAxvX0fhdEP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0T4+5>yh!^8dTTTIcwZ$;|HE{QKYR z1xhLXh`-TVqvr_)MuV}^x1yTNhGy5&sI_cmn9heE0tK5h*&UV)u-@*Nedr*HA})HJ z{+o+144LCNW(K(q&k<$;E!ZW)@_>QYkUZe}OCAtQMTh)4}O-W_G9T z3kql!=)jZ)ciONjE&!bPw}R8S@eNl*9Jz;JksElWT&Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0XIoRK~z{r?Ub=j z!%z%Goi4C-dJ31_dFxWqC)k z>{#ma?agyC5eZ-MCqfALoeL`9`szl)$C1pJv!-iIPtL6RW^p@n6)>{=BkS$G23b9= zt@1-1D2hTKF3vAIF64QxxhzY~WN!{&I7E=TuB~c@GOXo7#{p7Rm1gu=dk-dqcYwn| zmSq89k8Y>~lgX)!$H)54X*-6~8EykMAjZR$o&dm0w<{pVYaLqwV6$0iChS8Tpb)I% z3yuQE5%k#GVSG;g^0l*3Gtxy3?*$^KL5wQTiBCp|Kgu~*n zeh0X-kKq7At?aYA_uj+7pnyX#_$539Nk9^i1SA1TKoXDy{IdX&Ps=r>WaHPz<^TWy M07*qoM6N<$f}i89!~g&Q literal 0 HcmV?d00001 diff --git a/game/cursors/arrow32.png.import b/game/cursors/arrow32.png.import new file mode 100644 index 0000000..22993c7 --- /dev/null +++ b/game/cursors/arrow32.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/arrow32.png-a8397e3d9d049a61672b3e705e50dc8e.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://cursors/arrow32.png" +dest_files=[ "res://.import/arrow32.png-a8397e3d9d049a61672b3e705e50dc8e.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/game/cursors/arrow8.png b/game/cursors/arrow8.png new file mode 100644 index 0000000000000000000000000000000000000000..cec826cb7e9075a6524e83c82e822bc06c5b304b GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucK_^ca#}JL++CFYB1_ci1?eFTJFHKES;XQJG zo)Y7UMN?I_HAn|0x%h=%{>q@TzMJ#PSuWiNGi1N~J*ap~;a2o-CIdzxU3u2fbyXmT OF?hQAxvXPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0W(QNK~y+TrBks= z13?g-6#`;7t_a+9f0U`hG=`hA?1iM5mdkg|tBhb#_a?Sj z0f9Oq3}PJbgEptO1CKb4InQ(Tug{xw&^#vEd!yTFR&-(2RvAT+-WUX-u6Gw_EFy(} znMjJbw!qRB`!fjO%!?>}aFr;u#hzZ|ad@KZ#y41ppFfu93#L3y3+B}N&;S4c07*qo IM6N<$f-57j+W-In literal 0 HcmV?d00001 diff --git a/game/cursors/attack16.png.import b/game/cursors/attack16.png.import new file mode 100644 index 0000000..cb1f374 --- /dev/null +++ b/game/cursors/attack16.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/attack16.png-0100f945c7e85d87a58a394beb8c3ac7.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://cursors/attack16.png" +dest_files=[ "res://.import/attack16.png-0100f945c7e85d87a58a394beb8c3ac7.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/cursors/autoload/CursorManager.gd b/game/cursors/autoload/CursorManager.gd new file mode 100644 index 0000000..b20d1cd --- /dev/null +++ b/game/cursors/autoload/CursorManager.gd @@ -0,0 +1,44 @@ +extends Node + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(Texture) var default_cursor : Texture +export(Texture) var loot_cursor : Texture +export(Texture) var attack_cursor : Texture +export(Texture) var speak_cursor : Texture +export(Texture) var drag_drop_cursor : Texture +export(Texture) var forbidden_cursor : Texture +export(Texture) var text_cursor : Texture +export(Vector2) var text_cursor_hotspot : Vector2 + +func _ready(): + # Changes only the arrow shape of the cursor. + # This is similar to changing it in the project settings. + Input.set_custom_mouse_cursor(default_cursor, Input.CURSOR_ARROW) + Input.set_custom_mouse_cursor(attack_cursor, Input.CURSOR_MOVE) + Input.set_custom_mouse_cursor(loot_cursor, Input.CURSOR_CROSS) + Input.set_custom_mouse_cursor(speak_cursor, Input.CURSOR_HELP) + Input.set_custom_mouse_cursor(drag_drop_cursor, Input.CURSOR_CAN_DROP) + Input.set_custom_mouse_cursor(forbidden_cursor, Input.CURSOR_FORBIDDEN) + Input.set_custom_mouse_cursor(text_cursor, Input.CURSOR_IBEAM, text_cursor_hotspot) + + # Changes a specific shape of the cursor (here, the I-beam shape). +# Input.set_custom_mouse_cursor(beam, Input.CURSOR_IBEAM) diff --git a/game/cursors/autoload/CursorManager.tscn b/game/cursors/autoload/CursorManager.tscn new file mode 100644 index 0000000..5bf7760 --- /dev/null +++ b/game/cursors/autoload/CursorManager.tscn @@ -0,0 +1,24 @@ +[gd_scene load_steps=9 format=2] + +[ext_resource path="res://cursors/autoload/CursorManager.gd" type="Script" id=1] +[ext_resource path="res://cursors/arrow16.png" type="Texture" id=2] +[ext_resource path="res://cursors/loot16.png" type="Texture" id=3] +[ext_resource path="res://cursors/attack16.png" type="Texture" id=4] +[ext_resource path="res://cursors/speak.png" type="Texture" id=5] +[ext_resource path="res://cursors/drag_drop.png" type="Texture" id=6] +[ext_resource path="res://cursors/forbidden.png" type="Texture" id=7] +[ext_resource path="res://cursors/ibeam.png" type="Texture" id=8] + + + + +[node name="CursorManager" type="Node"] +script = ExtResource( 1 ) +default_cursor = ExtResource( 2 ) +loot_cursor = ExtResource( 3 ) +attack_cursor = ExtResource( 4 ) +speak_cursor = ExtResource( 5 ) +drag_drop_cursor = ExtResource( 6 ) +forbidden_cursor = ExtResource( 7 ) +text_cursor = ExtResource( 8 ) +text_cursor_hotspot = Vector2( 2, 11 ) diff --git a/game/cursors/drag_drop.png b/game/cursors/drag_drop.png new file mode 100644 index 0000000000000000000000000000000000000000..457148893784829d61d626837b6c6f5d9c7102fb GIT binary patch literal 371 zcmV-(0gV2MP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0SHM%K~y+TosqF> z!cY{3k2;iYK?Ju3=`&<-cJ%?AyZREoKu76T9Qyz+9b8--?hug-B1nlKSdo;FO6e5+ ze>our)R+&#e@}A1o0F50h{VUMFg)Pxb-?2Nqc65?%X|^BetZa+fB#jc;>|vpaU7S* zT&3`RpQ$pyTI;lotQ@c2_Gc}wXXK^Rl_1*6{&$0C1RYtHC1DuK)E)Dl%77hU6Btc~ z(rUK3&SH#Vre(kxRBKNxo*Q+hZgw1pc}WJz3{=i?O$O{h-<0K+49@-nW})-QBLg0= z{Q730Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0ZBSA%U2fWxm<_*10=O z{3UxcyLp13PnTQ%JvRT^9Xct0ifJ~DF*@rgk#cMh%gf$Hi3=oVY zTEzkoSPiDI)FdTPc<~pk%pxQuXrGl7_am?qoV5oRc}!0dr{Ap$c0gF{AufEZfKTDS zDJxT0QWcie5&(!uI4?)@;FmTH;MfUKO#tVu&I}l19T4A%YLcAw$`U<%{r<|nU?~Bq ejznsmipU-i5ZG%qr7q$C0000QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjK*6b=E{-7<{>do`2|xIcBrI6`oNt+a{2fN2 zcIF99|CcRWmLS#A$l%goDD1(?q2ik29J!)_a|PE`3lqB=5(2E7nU1(0E6^@r+`&{? zS*gJ-dO*~s=7+#3C)N-XM)3v9MRzcW-Zfak+%<8c;G881Y6pH8I9%ZEaZ)NukbQs8 whKaj@!9e$ru%5C;;v?oG)xzQu6|6iw4AL{aF79$Z267;Sr>mdKI;Vst04tzQ`Tzg` literal 0 HcmV?d00001 diff --git a/game/cursors/ibeam.png.import b/game/cursors/ibeam.png.import new file mode 100644 index 0000000..6512460 --- /dev/null +++ b/game/cursors/ibeam.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/ibeam.png-e50b72e1e43b2d2baac009b39086d913.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://cursors/ibeam.png" +dest_files=[ "res://.import/ibeam.png-e50b72e1e43b2d2baac009b39086d913.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/game/cursors/loot16.png b/game/cursors/loot16.png new file mode 100644 index 0000000000000000000000000000000000000000..8a93ddd934071e8d6556309434eb65e7dee35c51 GIT binary patch literal 377 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc4Sb$1jv*HQ$tej5KlqPGJox|rzk+2`1E-76 z``7~sSy`tREPl=>rV?h%(GbgUiHB*q|9mx1W1c_aLKB%QnOA(b?_lT_JY=x-g8@U) z0W)JGqks0nrGB3~o20#J>LnGG&zP|pJ R`M}^}@O1TaS?83{1ORj6eR2Q* literal 0 HcmV?d00001 diff --git a/game/cursors/loot16.png.import b/game/cursors/loot16.png.import new file mode 100644 index 0000000..5a64bd6 --- /dev/null +++ b/game/cursors/loot16.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/loot16.png-79d648584fcb03dcceede3d2ba9034a5.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://cursors/loot16.png" +dest_files=[ "res://.import/loot16.png-79d648584fcb03dcceede3d2ba9034a5.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/cursors/speak.png b/game/cursors/speak.png new file mode 100644 index 0000000000000000000000000000000000000000..909748c449497421812ecef36e4032f035c694ee GIT binary patch literal 426 zcmV;b0agBqP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0Y6DZK~y+Tl~O%R z13?gds}Qh}U?hhY2INY$5U%kLq)3%2zrsQSHd>l8q_nk7WtG2>=6-;USSmRP1RFsx z>%7VBy168rdGKy#=jP+>um*q?uE1K$f2G*r=du5UBuQ{~(bV97iwRZ0Vj@k`t%@D& z!Qlz7A+?qtjg`^m`W?tYCmUnz^Zh=e^J^XzllNin0nu?s?Nz7eYkW77=kaZ0XSK`@nIv!hvt_QR(t@OO6<_$|9#ggYU}!#lOi->9In z7vuX&FOP69vNE5e)qP_J$u2Y?*d%v1g2e#v3(f=) UE3%$*82|tP07*qoM6N<$f)O0GBme*a literal 0 HcmV?d00001 diff --git a/game/cursors/speak.png.import b/game/cursors/speak.png.import new file mode 100644 index 0000000..9455a62 --- /dev/null +++ b/game/cursors/speak.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/speak.png-3d1d6946ebdb2def63f939fa7c38a224.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://cursors/speak.png" +dest_files=[ "res://.import/speak.png-3d1d6946ebdb2def63f939fa7c38a224.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/debug/FreeLookCam.tscn b/game/debug/FreeLookCam.tscn new file mode 100644 index 0000000..424fdff --- /dev/null +++ b/game/debug/FreeLookCam.tscn @@ -0,0 +1,11 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://debug/FreeLookCamera.gd" type="Script" id=1] + + + +[node name="Camera" type="Camera"] +transform = Transform( 0.844995, 0.305893, -0.438648, -0.0119927, 0.830883, 0.556318, 0.534639, -0.464826, 0.705761, -7.76488, 10.4889, 10.3045 ) +v_offset = 0.27 +current = true +script = ExtResource( 1 ) diff --git a/game/debug/FreeLookCamera.gd b/game/debug/FreeLookCamera.gd new file mode 100644 index 0000000..edf4c11 --- /dev/null +++ b/game/debug/FreeLookCamera.gd @@ -0,0 +1,98 @@ +extends Camera + +const SPEED = 10 +const TURN_SENSITIVITY = 0.15 + +var x_rot : float = 0.0 +var y_rot : float = 0.0 + +var mouse_right_down : bool = false + +var input_dir : Vector2 = Vector2() + +var key_left : bool = false +var key_right : bool = false +var key_up : bool = false +var key_down : bool = false + +var cursor_grabbed : bool = false +var last_cursor_pos : Vector2 = Vector2() + +func _physics_process(delta): + process_input(delta) + process_movement(delta) + +func process_input(delta: float) -> void: + var key_dir = Vector2() + + if key_up: + key_dir.y -= 1 + if key_down: + key_dir.y += 1 + if key_left: + key_dir.x -= 1 + if key_right: + key_dir.x += 1 + + input_dir = key_dir + + if input_dir.length_squared() > 0.1: + input_dir = input_dir.normalized() + +func _unhandled_input(event : InputEvent) -> void: + if event is InputEventMouseButton and event.button_index == BUTTON_RIGHT and event.device != -1: + mouse_right_down = event.pressed + + if event is InputEventKey: + if event.scancode == KEY_W: + key_up = event.pressed + if event.scancode == KEY_S: + key_down = event.pressed + if event.scancode == KEY_A: + key_left = event.pressed + if event.scancode == KEY_D: + key_right = event.pressed + + if event is InputEventMouseMotion and mouse_right_down and event.device != -1: + rotate_delta(-event.relative.x, -event.relative.y) + + update_cursor_mode() + +func process_movement(delta): + if input_dir.x > 0.1 or input_dir.y > 0.1 or input_dir.x < -0.1 or input_dir.y < -0.1: + var forward = transform.basis.xform(Vector3(0, 0, 1)) + + var right = forward.cross(Vector3(0, 1, 0)) * -input_dir.x + forward *= input_dir.y #only potentially make it zero after getting the right vector + + var dir : Vector3 = forward + dir += right + + if dir.length_squared() > 0.1: + dir = dir.normalized() + translation += dir * delta * SPEED + +func update_cursor_mode(): + if mouse_right_down: + if not cursor_grabbed: + cursor_grabbed = true + last_cursor_pos = get_viewport().get_mouse_position() + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) + else: + if cursor_grabbed: + cursor_grabbed = false + Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) + get_viewport().warp_mouse(last_cursor_pos) + +func rotate_delta(x_delta : float, y_delta : float) -> void: + x_rot += y_delta * TURN_SENSITIVITY + y_rot += x_delta * TURN_SENSITIVITY + + x_rot = clamp(x_rot, -90, 90) + + if y_rot >= 360: + y_rot = 0 + if y_rot < 0: + y_rot = 360 + + rotation_degrees = Vector3(x_rot, y_rot, 0.0) diff --git a/game/default_bus_layout.tres b/game/default_bus_layout.tres new file mode 100644 index 0000000..eb4accc --- /dev/null +++ b/game/default_bus_layout.tres @@ -0,0 +1,3 @@ +[gd_resource type="AudioBusLayout" format=2] + +[resource] diff --git a/game/ess_data.json b/game/ess_data.json new file mode 100644 index 0000000..41b42e6 --- /dev/null +++ b/game/ess_data.json @@ -0,0 +1,3 @@ +[ + +] diff --git a/game/fonts/OFL.txt b/game/fonts/OFL.txt new file mode 100644 index 0000000..3e89993 --- /dev/null +++ b/game/fonts/OFL.txt @@ -0,0 +1,93 @@ +Copyright (c) 2011, Peter Hull (peter.hull@oikoi.com), with Reserved Font Name "VT323". + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/game/fonts/VT323-Regular.ttf b/game/fonts/VT323-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8eeeae60fa86834116ae615fa67fca5f6ef94bb6 GIT binary patch literal 86576 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 U){O*H&;K*zq?9Eq#EpOaANs6-!vFvP literal 0 HcmV?d00001 diff --git a/game/icon.png.flags b/game/icon.png.flags new file mode 100644 index 0000000..5130fd1 --- /dev/null +++ b/game/icon.png.flags @@ -0,0 +1 @@ +gen_mipmaps=false diff --git a/game/icon.png.import b/game/icon.png.import new file mode 100644 index 0000000..6258420 --- /dev/null +++ b/game/icon.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="StreamTexture" +path.s3tc="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.s3tc.stex" +path.etc2="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.etc2.stex" +path.etc="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.etc.stex" +metadata={ +"imported_formats": [ "s3tc", "etc2", "etc" ], +"vram_texture": true +} + +[deps] + +source_file="res://icon.png" +dest_files=[ "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.s3tc.stex", "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.etc2.stex", "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.etc.stex" ] + +[params] + +compress/mode=2 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=true +flags/filter=true +flags/mipmaps=true +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/modules/core/crafting/1_test_craft.tres b/game/modules/core/crafting/1_test_craft.tres new file mode 100644 index 0000000..3b5e483 --- /dev/null +++ b/game/modules/core/crafting/1_test_craft.tres @@ -0,0 +1,36 @@ +[gd_resource type="CraftRecipe" load_steps=8 format=2] + +[ext_resource path="res://modules/core/item_templates/2_test.tres" type="ItemTemplate" id=1] +[ext_resource path="res://modules/core/item_templates/1_gold.tres" type="ItemTemplate" id=2] + +[sub_resource type="CraftRecipeHelper" id=1] +item = ExtResource( 2 ) +count = 1 + +[sub_resource type="CraftRecipeHelper" id=2] +item = ExtResource( 2 ) +count = 1 + +[sub_resource type="ItemTemplate" id=3] +resource_name = "sdfsdf" +text_name = "sdfsdf" + +[sub_resource type="CraftRecipeHelper" id=4] +item = SubResource( 3 ) + +[sub_resource type="CraftRecipeHelper" id=5] +item = ExtResource( 1 ) +count = 1 + +[resource] +resource_name = "Test" +id = 1 +text_name = "Test" +category = 1 +sub_category = 1 +required_materials_count = 2 +RequiredMaterials_0 = SubResource( 1 ) +RequiredMaterials_1 = SubResource( 2 ) +required_tools_count = 1 +RequiredTools_0 = SubResource( 4 ) +item = SubResource( 5 ) diff --git a/game/modules/core/crafting/2_chest_of_the_infinite_wisdom.tres b/game/modules/core/crafting/2_chest_of_the_infinite_wisdom.tres new file mode 100644 index 0000000..84a6a10 --- /dev/null +++ b/game/modules/core/crafting/2_chest_of_the_infinite_wisdom.tres @@ -0,0 +1,21 @@ +[gd_resource type="CraftRecipe" load_steps=5 format=2] + +[ext_resource path="res://modules/core/item_templates/2_test.tres" type="ItemTemplate" id=1] +[ext_resource path="res://modules/core/item_templates/3_chest_of_the_infinite_wisdom.tres" type="ItemTemplate" id=2] + +[sub_resource type="CraftRecipeHelper" id=1] +item = ExtResource( 1 ) +count = 1 + +[sub_resource type="CraftRecipeHelper" id=2] +item = ExtResource( 2 ) +count = 1 + +[resource] +resource_name = "Chest of the Infinite Wisdom" +id = 2 +text_name = "Chest of the Infinite Wisdom" +category = 3 +required_materials_count = 1 +RequiredMaterials_0 = SubResource( 1 ) +item = SubResource( 2 ) diff --git a/game/modules/core/entity_resources/1_mana_resource.tres b/game/modules/core/entity_resources/1_mana_resource.tres new file mode 100644 index 0000000..909f1ad --- /dev/null +++ b/game/modules/core/entity_resources/1_mana_resource.tres @@ -0,0 +1,7 @@ +[gd_resource type="EntityResource" load_steps=2 format=2] + +[ext_resource path="res://scripts/resources/ManaResource.gd" type="Script" id=1] + +[resource] +id = 1 +script = ExtResource( 1 ) diff --git a/game/modules/core/entity_skills/1_test.tres b/game/modules/core/entity_skills/1_test.tres new file mode 100644 index 0000000..f921777 --- /dev/null +++ b/game/modules/core/entity_skills/1_test.tres @@ -0,0 +1,4 @@ +[gd_resource type="EntitySkillData" format=2] + +[resource] +id = 1 diff --git a/game/modules/core/game_module.tres b/game/modules/core/game_module.tres new file mode 100644 index 0000000..ea6b951 --- /dev/null +++ b/game/modules/core/game_module.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" load_steps=3 format=2] + +[ext_resource path="res://scripts/game_modules/GameModule.gd" type="Script" id=1] +[ext_resource path="res://modules/core/resource_db.tres" type="ESSResourceDBStatic" id=2] + +[resource] +script = ExtResource( 1 ) +enabled = true +resource_db = ExtResource( 2 ) diff --git a/game/modules/core/item_templates/1_gold.tres b/game/modules/core/item_templates/1_gold.tres new file mode 100644 index 0000000..f4eb3d6 --- /dev/null +++ b/game/modules/core/item_templates/1_gold.tres @@ -0,0 +1,11 @@ +[gd_resource type="ItemTemplate" load_steps=2 format=2] + +[ext_resource path="res://modules/icons/items/gold.tres" type="Texture" id=1] + + +[resource] +resource_name = "Gold" +id = 1 +item_type = 13 +icon = ExtResource( 1 ) +text_name = "Gold" diff --git a/game/modules/core/item_templates/2_test.tres b/game/modules/core/item_templates/2_test.tres new file mode 100644 index 0000000..7202038 --- /dev/null +++ b/game/modules/core/item_templates/2_test.tres @@ -0,0 +1,14 @@ +[gd_resource type="ItemTemplate" load_steps=4 format=2] + +[ext_resource path="res://modules/entity_classes/naturalist/spells/13_aspect_of_bees_rank_1.tres" type="Spell" id=1] +[ext_resource path="res://modules/icons/3_iron_bar.tres" type="Texture" id=2] +[ext_resource path="res://scripts/items/ItemTemplateGD.gd" type="Script" id=3] + +[resource] +resource_name = "Iron Bar" +id = 2 +stack_size = 10 +icon = ExtResource( 2 ) +use_spell = ExtResource( 1 ) +text_name = "Iron Bar" +script = ExtResource( 3 ) diff --git a/game/modules/core/item_templates/3_chest_of_the_infinite_wisdom.tres b/game/modules/core/item_templates/3_chest_of_the_infinite_wisdom.tres new file mode 100644 index 0000000..7520c29 --- /dev/null +++ b/game/modules/core/item_templates/3_chest_of_the_infinite_wisdom.tres @@ -0,0 +1,17 @@ +[gd_resource type="ItemTemplate" load_steps=4 format=2] + +[ext_resource path="res://modules/icons/4_chest_of_the_infinite_wisdom.tres" type="Texture" id=2] +[ext_resource path="res://scripts/items/ItemTemplateGD.gd" type="Script" id=3] +[ext_resource path="res://modules/entity_classes/naturalist/spells/14_amplify_pain_rank_1.tres" type="Spell" id=4] + +[resource] +resource_name = "Chest of the Infinite Wisdom" +id = 3 +item_type = 1 +rarity = 6 +armor_type = 1 +equip_slot = 3 +icon = ExtResource( 2 ) +use_spell = ExtResource( 4 ) +text_name = "Chest of the Infinite Wisdom" +script = ExtResource( 3 ) diff --git a/game/modules/core/resource_db.tres b/game/modules/core/resource_db.tres new file mode 100644 index 0000000..d17c5ed --- /dev/null +++ b/game/modules/core/resource_db.tres @@ -0,0 +1,15 @@ +[gd_resource type="ESSResourceDBStatic" load_steps=8 format=2] + +[ext_resource path="res://modules/core/item_templates/2_test.tres" type="ItemTemplate" id=1] +[ext_resource path="res://modules/core/item_templates/3_chest_of_the_infinite_wisdom.tres" type="ItemTemplate" id=2] +[ext_resource path="res://modules/core/crafting/2_chest_of_the_infinite_wisdom.tres" type="CraftRecipe" id=3] +[ext_resource path="res://modules/core/entity_skills/1_test.tres" type="EntitySkillData" id=4] +[ext_resource path="res://modules/core/item_templates/1_gold.tres" type="ItemTemplate" id=5] +[ext_resource path="res://modules/core/crafting/1_test_craft.tres" type="CraftRecipe" id=6] +[ext_resource path="res://modules/core/entity_resources/1_mana_resource.tres" type="EntityResource" id=7] + +[resource] +entity_resources = [ ExtResource( 7 ) ] +entity_skills = [ ExtResource( 4 ) ] +craft_recipes = [ ExtResource( 6 ), ExtResource( 3 ) ] +item_templates = [ ExtResource( 5 ), ExtResource( 1 ), ExtResource( 2 ) ] diff --git a/game/modules/entity_classes/elementalist/2_elementalist.tres b/game/modules/entity_classes/elementalist/2_elementalist.tres new file mode 100644 index 0000000..00fd6be --- /dev/null +++ b/game/modules/entity_classes/elementalist/2_elementalist.tres @@ -0,0 +1,27 @@ +[gd_resource type="EntityClassData" load_steps=51 format=2] + +[ext_resource path="res://scripts/entities/EntityClassDataGD.gd" type="Script" id=1] +[ext_resource path="res://modules/entity_classes/elementalist/character_specs/2_elementalist_fire.tres" type="CharacterSpec" id=2] +[ext_resource path="res://modules/entity_classes/elementalist/character_specs/3_elementalist_water.tres" type="CharacterSpec" id=3] +[ext_resource path="res://modules/entity_classes/elementalist/character_specs/4_elementalist_ice.tres" type="CharacterSpec" id=4] +[ext_resource path="res://modules/entity_classes/elementalist/spells/34_cold.tres" type="Spell" id=5] +[ext_resource path="res://modules/entity_classes/elementalist/spells/32_heat.tres" type="Spell" id=6] +[ext_resource path="res://modules/entity_classes/elementalist/spells/33_normal.tres" type="Spell" id=7] + +[sub_resource type="SimpleLevelStatData" id=1] +agility = 4 +strength = 5 +stamina = 5 +intellect = 3 +spirit = 5 + +[resource] +resource_name = "Elementalist" +id = 2 +text_name = "Elementalist" +stat_data = SubResource( 43 ) +playstyle_type = 2 +specs = [ ExtResource( 2 ), ExtResource( 3 ), ExtResource( 4 ) ] +spells = [ ExtResource( 6 ), ExtResource( 7 ), ExtResource( 5 ) ] +start_spells = [ ExtResource( 7 ) ] +script = ExtResource( 1 ) diff --git a/game/modules/entity_classes/elementalist/character_specs/2_elementalist_fire.tres b/game/modules/entity_classes/elementalist/character_specs/2_elementalist_fire.tres new file mode 100644 index 0000000..759368f --- /dev/null +++ b/game/modules/entity_classes/elementalist/character_specs/2_elementalist_fire.tres @@ -0,0 +1,6 @@ +[gd_resource type="CharacterSpec" format=2] + +[resource] +resource_name = "Elementalist Fire" +id = 2 +text_name = "Elementalist Fire" diff --git a/game/modules/entity_classes/elementalist/character_specs/3_elementalist_water.tres b/game/modules/entity_classes/elementalist/character_specs/3_elementalist_water.tres new file mode 100644 index 0000000..44ccb22 --- /dev/null +++ b/game/modules/entity_classes/elementalist/character_specs/3_elementalist_water.tres @@ -0,0 +1,6 @@ +[gd_resource type="CharacterSpec" format=2] + +[resource] +resource_name = "Elementalist Water" +id = 3 +text_name = "Elementalist Water" diff --git a/game/modules/entity_classes/elementalist/character_specs/4_elementalist_ice.tres b/game/modules/entity_classes/elementalist/character_specs/4_elementalist_ice.tres new file mode 100644 index 0000000..8a517e5 --- /dev/null +++ b/game/modules/entity_classes/elementalist/character_specs/4_elementalist_ice.tres @@ -0,0 +1,6 @@ +[gd_resource type="CharacterSpec" format=2] + +[resource] +resource_name = "Elementalist Ice" +id = 4 +text_name = "Elementalist Ice" diff --git a/game/modules/entity_classes/elementalist/spells/31_overload.tres b/game/modules/entity_classes/elementalist/spells/31_overload.tres new file mode 100644 index 0000000..d27497a --- /dev/null +++ b/game/modules/entity_classes/elementalist/spells/31_overload.tres @@ -0,0 +1,40 @@ +[gd_resource type="Spell" load_steps=7 format=2] + +[ext_resource path="res://modules/entity_classes/naturalist/icons/amplify_pain.tres" type="Texture" id=1] +[ext_resource path="res://scripts/resources/spell_effect_visual_basic.gd" type="Script" id=2] +[ext_resource path="res://scripts/spells/amplify_pain.gd" type="Script" id=3] +[ext_resource path="res://modules/entity_classes/naturalist/spell_effects/nature/AmplifyPain.tscn" type="PackedScene" id=4] +[ext_resource path="res://modules/entity_classes/naturalist/spell_effects/nature/NatureCast.tscn" type="PackedScene" id=5] + + + + +[sub_resource type="SpellEffectVisual" id=1] +script = ExtResource( 2 ) +spell_cast_effect_left_hand = ExtResource( 5 ) +spell_cast_effect_right_hand = ExtResource( 5 ) +torso_aura_effect_time = 0.0 +root_aura_effect_time = 0.0 +torso_spell_cast_finish_effect = ExtResource( 4 ) +torso_spell_cast_finish_effect_time = 0.4 +root_spell_cast_finish_effect_time = 1.0 + +[resource] +resource_name = "Overload" +id = 31 +spell_type = 8 +level = 10 +icon = ExtResource( 1 ) +visual_spell_effects = SubResource( 1 ) +text_name = "Overload" +text_description = "Range: 26m. +Channeled. Free. +Causes your dots to deal 10% more damage." +range_range = 26.0 +cast_cast_time = 1.5 +damage_type = 16 +damage_min = 130 +damage_max = 150 +aoe_targetType = -1910718371 +aoe_colliderType = 1065353216 +script = ExtResource( 3 ) diff --git a/game/modules/entity_classes/elementalist/spells/32_heat.tres b/game/modules/entity_classes/elementalist/spells/32_heat.tres new file mode 100644 index 0000000..35c17a3 --- /dev/null +++ b/game/modules/entity_classes/elementalist/spells/32_heat.tres @@ -0,0 +1,7 @@ +[gd_resource type="Spell" format=2] + +[resource] +resource_name = "Heat" +id = 32 +text_name = "Heat" +text_description = "Increase the temperature of your body, to allow the usange of all fire spells. Water spells are still usable at reduced efficiency." diff --git a/game/modules/entity_classes/elementalist/spells/33_normal.tres b/game/modules/entity_classes/elementalist/spells/33_normal.tres new file mode 100644 index 0000000..0ae7212 --- /dev/null +++ b/game/modules/entity_classes/elementalist/spells/33_normal.tres @@ -0,0 +1,7 @@ +[gd_resource type="Spell" format=2] + +[resource] +resource_name = "Normal temperature" +id = 33 +text_name = "Normal temperature" +text_description = "Use water spells at maximum efficiency. Some ice and fire based spells are also usable at reduced efficiency." diff --git a/game/modules/entity_classes/elementalist/spells/34_cold.tres b/game/modules/entity_classes/elementalist/spells/34_cold.tres new file mode 100644 index 0000000..11bcbbc --- /dev/null +++ b/game/modules/entity_classes/elementalist/spells/34_cold.tres @@ -0,0 +1,7 @@ +[gd_resource type="Spell" format=2] + +[resource] +resource_name = "Cold" +id = 34 +text_name = "Cold" +text_description = "Reduce the temperature of your body, to allow the usange of all ice spells. Water spells are still usable at reduced efficiency." diff --git a/game/modules/entity_classes/naturalist/1_naturalist.tres b/game/modules/entity_classes/naturalist/1_naturalist.tres new file mode 100644 index 0000000..9c5ad19 --- /dev/null +++ b/game/modules/entity_classes/naturalist/1_naturalist.tres @@ -0,0 +1,43 @@ +[gd_resource type="EntityClassData" load_steps=26 format=2] + +[ext_resource path="res://modules/entity_classes/naturalist/spells/16_close_wounds_rank_1.tres" type="Spell" id=1] +[ext_resource path="res://modules/entity_classes/naturalist/spells/19_uproot_rank_1.tres" type="Spell" id=2] +[ext_resource path="res://modules/entity_classes/naturalist/spells/11_aspect_of_wasps_rank_1.tres" type="Spell" id=3] +[ext_resource path="res://modules/core/entity_resources/1_mana_resource.tres" type="EntityResource" id=4] +[ext_resource path="res://modules/entity_classes/naturalist/spells/13_aspect_of_bees_rank_1.tres" type="Spell" id=5] +[ext_resource path="res://modules/entity_classes/naturalist/stats/player_statdata.tres" type="StatData" id=6] +[ext_resource path="res://modules/entity_classes/naturalist/spells/10_aspect_of_scorpions_rank_1.tres" type="Spell" id=7] +[ext_resource path="res://scripts/ai/EntityAIGD.gd" type="Script" id=9] +[ext_resource path="res://modules/entity_classes/naturalist/spells/17_ironbark_rank_1.tres" type="Spell" id=10] +[ext_resource path="res://modules/entity_classes/naturalist/spells/24_attunement_rank_1.tres" type="Spell" id=11] +[ext_resource path="res://modules/entity_classes/naturalist/spells/14_amplify_pain_rank_1.tres" type="Spell" id=12] +[ext_resource path="res://scripts/entities/EntityClassDataGD.gd" type="Script" id=13] +[ext_resource path="res://modules/entity_classes/naturalist/spells/36_regrow.tres" type="Spell" id=14] +[ext_resource path="res://modules/entity_classes/naturalist/spells/12_aspect_of_wolves_rank_1.tres" type="Spell" id=15] +[ext_resource path="res://modules/entity_classes/naturalist/spells/26_rest.tres" type="Spell" id=16] +[ext_resource path="res://modules/entity_classes/naturalist/spells/22_shield_of_barbs_rank_1.tres" type="Spell" id=17] +[ext_resource path="res://modules/entity_classes/naturalist/spells/21_strength_of_nature_rank_1.tres" type="Spell" id=18] +[ext_resource path="res://modules/entity_classes/naturalist/spells/20_root_rank_1.tres" type="Spell" id=19] +[ext_resource path="res://modules/entity_classes/naturalist/spells/23_calm_rank_1.tres" type="Spell" id=20] +[ext_resource path="res://modules/entity_classes/naturalist/spells/35_strike.tres" type="Spell" id=21] +[ext_resource path="res://modules/entity_classes/naturalist/spells/25_inner_will.tres" type="Spell" id=22] +[ext_resource path="res://modules/entity_classes/naturalist/spells/15_rejuvenation_rank_1.tres" type="Spell" id=23] +[ext_resource path="res://modules/entity_classes/naturalist/spells/18_natures_swiftness_rank_1.tres" type="Spell" id=24] + +[sub_resource type="EntityAI" id=1] +script = ExtResource( 9 ) + +[sub_resource type="CharacterSpec" id=2] +id = 1 + +[resource] +resource_name = "Naturalist" +id = 1 +text_name = "Naturalist" +stat_data = ExtResource( 6 ) +entity_resources = [ ExtResource( 4 ) ] +specs = [ SubResource( 2 ) ] +spells = [ ExtResource( 7 ), ExtResource( 3 ), ExtResource( 15 ), ExtResource( 5 ), ExtResource( 12 ), ExtResource( 23 ), ExtResource( 1 ), ExtResource( 10 ), ExtResource( 24 ), ExtResource( 2 ), ExtResource( 19 ), ExtResource( 18 ), ExtResource( 17 ), ExtResource( 20 ), ExtResource( 11 ), ExtResource( 22 ), ExtResource( 16 ), ExtResource( 21 ), ExtResource( 14 ) ] +start_spells = [ ExtResource( 7 ), ExtResource( 21 ), ExtResource( 14 ) ] +ais = [ SubResource( 1 ) ] +script = ExtResource( 13 ) diff --git a/game/modules/entity_classes/naturalist/aura_groups/1_aspect_of_scorpions.tres b/game/modules/entity_classes/naturalist/aura_groups/1_aspect_of_scorpions.tres new file mode 100644 index 0000000..46c7350 --- /dev/null +++ b/game/modules/entity_classes/naturalist/aura_groups/1_aspect_of_scorpions.tres @@ -0,0 +1,3 @@ +[gd_resource type="AuraGroup" format=2] + +[resource] diff --git a/game/modules/entity_classes/naturalist/aura_groups/2_aspect_of_wasps.tres b/game/modules/entity_classes/naturalist/aura_groups/2_aspect_of_wasps.tres new file mode 100644 index 0000000..46c7350 --- /dev/null +++ b/game/modules/entity_classes/naturalist/aura_groups/2_aspect_of_wasps.tres @@ -0,0 +1,3 @@ +[gd_resource type="AuraGroup" format=2] + +[resource] diff --git a/game/modules/entity_classes/naturalist/aura_groups/3_aspect_of_wolves.tres b/game/modules/entity_classes/naturalist/aura_groups/3_aspect_of_wolves.tres new file mode 100644 index 0000000..46c7350 --- /dev/null +++ b/game/modules/entity_classes/naturalist/aura_groups/3_aspect_of_wolves.tres @@ -0,0 +1,3 @@ +[gd_resource type="AuraGroup" format=2] + +[resource] diff --git a/game/modules/entity_classes/naturalist/aura_groups/4_aspect_of_bees.tres b/game/modules/entity_classes/naturalist/aura_groups/4_aspect_of_bees.tres new file mode 100644 index 0000000..46c7350 --- /dev/null +++ b/game/modules/entity_classes/naturalist/aura_groups/4_aspect_of_bees.tres @@ -0,0 +1,3 @@ +[gd_resource type="AuraGroup" format=2] + +[resource] diff --git a/game/modules/entity_classes/naturalist/auras/10_aspect_of_scorpions_rank_1.tres b/game/modules/entity_classes/naturalist/auras/10_aspect_of_scorpions_rank_1.tres new file mode 100644 index 0000000..b008d47 --- /dev/null +++ b/game/modules/entity_classes/naturalist/auras/10_aspect_of_scorpions_rank_1.tres @@ -0,0 +1,22 @@ +[gd_resource type="Aura" load_steps=4 format=2] + +[ext_resource path="res://scripts/auras/aura_script.gd" type="Script" id=1] +[ext_resource path="res://modules/entity_classes/naturalist/aura_groups/1_aspect_of_scorpions.tres" type="AuraGroup" id=2] +[ext_resource path="res://modules/entity_classes/naturalist/icons/aspect_of_scorpions.tres" type="Texture" id=3] + +[resource] +resource_name = "Aspect of Scorpions" +icon = ExtResource( 3 ) +time = 30.0 +tick = 3.0 +debuff = true +rank = 1 +aura_type = 1 +aura_group = ExtResource( 2 ) +text_name = "Aspect of Scorpions" +text_description = "Deals %%damage_min to %%damage_max damage every %%tick sec, and increases damage taken by 10% for 30 sec." +damage_enabled = true +damage_type = 8 +damage_min = 4 +damage_max = 5 +script = ExtResource( 1 ) diff --git a/game/modules/entity_classes/naturalist/auras/11_aspect_of_wasps_rank1.tres b/game/modules/entity_classes/naturalist/auras/11_aspect_of_wasps_rank1.tres new file mode 100644 index 0000000..cfd7431 --- /dev/null +++ b/game/modules/entity_classes/naturalist/auras/11_aspect_of_wasps_rank1.tres @@ -0,0 +1,23 @@ +[gd_resource type="Aura" load_steps=4 format=2] + +[ext_resource path="res://scripts/auras/aura_script.gd" type="Script" id=1] +[ext_resource path="res://modules/entity_classes/naturalist/aura_groups/2_aspect_of_wasps.tres" type="AuraGroup" id=2] +[ext_resource path="res://modules/entity_classes/naturalist/icons/aspect_of_wasps.tres" type="Texture" id=3] + +[resource] +resource_name = "Aspect of Wasps" +id = 1 +icon = ExtResource( 3 ) +time = 21.0 +tick = 1.0 +debuff = true +rank = 10 +aura_type = 1 +aura_group = ExtResource( 2 ) +text_name = "Aspect of Wasps" +text_description = "Deals 230 to 270 damage every 3 sec, this damage increases over the duration, for 21 sec." +damage_enabled = true +damage_type = 16 +damage_min = 280 +damage_max = 300 +script = ExtResource( 1 ) diff --git a/game/modules/entity_classes/naturalist/auras/12_aspect_of_wolves_rank_1.tres b/game/modules/entity_classes/naturalist/auras/12_aspect_of_wolves_rank_1.tres new file mode 100644 index 0000000..88ccd74 --- /dev/null +++ b/game/modules/entity_classes/naturalist/auras/12_aspect_of_wolves_rank_1.tres @@ -0,0 +1,23 @@ +[gd_resource type="Aura" load_steps=4 format=2] + +[ext_resource path="res://scripts/auras/aura_script.gd" type="Script" id=1] +[ext_resource path="res://modules/entity_classes/naturalist/aura_groups/3_aspect_of_wolves.tres" type="AuraGroup" id=2] +[ext_resource path="res://modules/entity_classes/naturalist/icons/aspect_of_wolves.tres" type="Texture" id=3] + +[resource] +resource_name = "Aspect of Wolves" +id = 2 +icon = ExtResource( 3 ) +time = 22.0 +tick = 2.0 +debuff = true +rank = 10 +aura_type = 1 +aura_group = ExtResource( 2 ) +text_name = "Aspect of Wolves" +text_description = "Deals 280 to 330 damage every 2 sec, and reduces melee and spell damage by 10% for 22 sec." +damage_enabled = true +damage_type = 16 +damage_min = 280 +damage_max = 330 +script = ExtResource( 1 ) diff --git a/game/modules/entity_classes/naturalist/auras/13_aspect_of_bees_rank_1.tres b/game/modules/entity_classes/naturalist/auras/13_aspect_of_bees_rank_1.tres new file mode 100644 index 0000000..ca150c5 --- /dev/null +++ b/game/modules/entity_classes/naturalist/auras/13_aspect_of_bees_rank_1.tres @@ -0,0 +1,23 @@ +[gd_resource type="Aura" load_steps=4 format=2] + +[ext_resource path="res://scripts/auras/aura_script.gd" type="Script" id=1] +[ext_resource path="res://modules/entity_classes/naturalist/aura_groups/4_aspect_of_bees.tres" type="AuraGroup" id=2] +[ext_resource path="res://modules/entity_classes/naturalist/icons/aspect_of_bees.tres" type="Texture" id=3] + +[resource] +resource_name = "Aspect of Bees" +id = 3 +icon = ExtResource( 3 ) +time = 21.0 +tick = 3.0 +debuff = true +rank = 10 +aura_type = 1 +aura_group = ExtResource( 2 ) +text_name = "Aspect of Bees" +text_description = "Deals 460 to 540 damage every 3 sec, healing you for 80% of the damage." +damage_enabled = true +damage_type = 16 +damage_min = 420 +damage_max = 440 +script = ExtResource( 1 ) diff --git a/game/modules/entity_classes/naturalist/auras/14_rejuvenation_rank_1.tres b/game/modules/entity_classes/naturalist/auras/14_rejuvenation_rank_1.tres new file mode 100644 index 0000000..db17178 --- /dev/null +++ b/game/modules/entity_classes/naturalist/auras/14_rejuvenation_rank_1.tres @@ -0,0 +1,19 @@ +[gd_resource type="Aura" load_steps=3 format=2] + +[ext_resource path="res://scripts/auras/aura_script.gd" type="Script" id=1] +[ext_resource path="res://modules/entity_classes/naturalist/icons/rejuvenation.tres" type="Texture" id=2] + +[resource] +resource_name = "Rejuvenation" +id = 4 +icon = ExtResource( 2 ) +time = 30.0 +tick = 3.0 +rank = 10 +aura_type = 1 +text_name = "Rejuvenation" +text_description = "Heals you for 400 to 450 every 3 sec for 30 sec." +heal_enabled = true +heal_min = 400 +heal_max = 450 +script = ExtResource( 1 ) diff --git a/game/modules/entity_classes/naturalist/auras/15_close_wounds_rank_1.tres b/game/modules/entity_classes/naturalist/auras/15_close_wounds_rank_1.tres new file mode 100644 index 0000000..7ee3487 --- /dev/null +++ b/game/modules/entity_classes/naturalist/auras/15_close_wounds_rank_1.tres @@ -0,0 +1,18 @@ +[gd_resource type="Aura" load_steps=3 format=2] + +[ext_resource path="res://scripts/auras/aura_script.gd" type="Script" id=1] +[ext_resource path="res://modules/entity_classes/naturalist/icons/close_wounds.tres" type="Texture" id=2] + +[resource] +resource_name = "Close Wounds" +id = 5 +icon = ExtResource( 2 ) +time = 21.0 +tick = 3.0 +aura_type = 1 +text_name = "Close Wounds" +text_description = "Heals you for 720 to 780 every 3 sec for 21 sec." +heal_enabled = true +heal_min = 720 +heal_max = 780 +script = ExtResource( 1 ) diff --git a/game/modules/entity_classes/naturalist/auras/16_ironbark_rank_1.tres b/game/modules/entity_classes/naturalist/auras/16_ironbark_rank_1.tres new file mode 100644 index 0000000..f5cf5d9 --- /dev/null +++ b/game/modules/entity_classes/naturalist/auras/16_ironbark_rank_1.tres @@ -0,0 +1,14 @@ +[gd_resource type="Aura" load_steps=3 format=2] + +[ext_resource path="res://scripts/auras/aura_script.gd" type="Script" id=1] +[ext_resource path="res://modules/entity_classes/naturalist/icons/ironbark.tres" type="Texture" id=2] + +[resource] +resource_name = "Ironbark" +id = 6 +icon = ExtResource( 2 ) +time = 6.0 +aura_type = 1 +text_name = "Ironbark" +text_description = "Reduces damage taken by 70%. This spell is not on the global cooldown." +script = ExtResource( 1 ) diff --git a/game/modules/entity_classes/naturalist/auras/17_natures_swiftness_rank_1.tres b/game/modules/entity_classes/naturalist/auras/17_natures_swiftness_rank_1.tres new file mode 100644 index 0000000..b5e0cd0 --- /dev/null +++ b/game/modules/entity_classes/naturalist/auras/17_natures_swiftness_rank_1.tres @@ -0,0 +1,16 @@ +[gd_resource type="Aura" load_steps=4 format=2] + +[ext_resource path="res://scripts/auras/aura_script.gd" type="Script" id=1] +[ext_resource path="res://modules/entity_classes/naturalist/effect_data/natures_swiftness.tres" type="SpellEffectVisual" id=2] +[ext_resource path="res://modules/entity_classes/naturalist/icons/natures_swiftness.tres" type="Texture" id=3] + +[resource] +resource_name = "Nature's Swiftness" +id = 7 +icon = ExtResource( 3 ) +time = 10.0 +aura_type = 1 +text_name = "Nature's Swiftness" +text_description = "Increases your movement speed by 60% for 6 sec. This spell is not on the global cooldown." +visual_spell_effects = ExtResource( 2 ) +script = ExtResource( 1 ) diff --git a/game/modules/entity_classes/naturalist/auras/20_root_rank_1.tres b/game/modules/entity_classes/naturalist/auras/20_root_rank_1.tres new file mode 100644 index 0000000..4697f8d --- /dev/null +++ b/game/modules/entity_classes/naturalist/auras/20_root_rank_1.tres @@ -0,0 +1,13 @@ +[gd_resource type="Aura" load_steps=3 format=2] + +[ext_resource path="res://scripts/auras/aura_script.gd" type="Script" id=1] +[ext_resource path="res://modules/entity_classes/naturalist/icons/root.tres" type="Texture" id=2] + +[resource] +id = 8 +icon = ExtResource( 2 ) +time = 10.0 +debuff = true +aura_type = 1 +states_add = 4 +script = ExtResource( 1 ) diff --git a/game/modules/entity_classes/naturalist/auras/21_aspect_of_scorpions.tres b/game/modules/entity_classes/naturalist/auras/21_aspect_of_scorpions.tres new file mode 100644 index 0000000..9b831f4 --- /dev/null +++ b/game/modules/entity_classes/naturalist/auras/21_aspect_of_scorpions.tres @@ -0,0 +1,28 @@ +[gd_resource type="Aura" load_steps=4 format=2] + +[ext_resource path="res://scripts/auras/aura_script.gd" type="Script" id=1] +[ext_resource path="res://modules/entity_classes/naturalist/icons/aspect_of_scorpions.tres" type="Texture" id=2] +[ext_resource path="res://modules/entity_classes/naturalist/aura_groups/1_aspect_of_scorpions.tres" type="AuraGroup" id=3] + +[resource] +resource_name = "Aspect of Scorpions" +id = 9 +icon = ExtResource( 2 ) +time = 30.0 +tick = 3.0 +debuff = true +rank = 1 +aura_type = 1 +aura_group = ExtResource( 3 ) +text_name = "Aspect of Scorpions" +text_description = "Deals 340 to 380 damage every 3 sec, and increases damage taken by 10% for 30 sec." +damage_enabled = true +damage_type = 8 +damage_min = 10 +damage_max = 20 +attribute_count = 1 +StatModAttribute_0/stat = 24 +StatModAttribute_0/base_mod = 0.0 +StatModAttribute_0/bonus_mod = 0.0 +StatModAttribute_0/percent_mod = 10.0 +script = ExtResource( 1 ) diff --git a/game/modules/entity_classes/naturalist/auras/22_aspect_of_wasps.tres b/game/modules/entity_classes/naturalist/auras/22_aspect_of_wasps.tres new file mode 100644 index 0000000..70bccb4 --- /dev/null +++ b/game/modules/entity_classes/naturalist/auras/22_aspect_of_wasps.tres @@ -0,0 +1,23 @@ +[gd_resource type="Aura" load_steps=4 format=2] + +[ext_resource path="res://scripts/auras/aura_script.gd" type="Script" id=1] +[ext_resource path="res://modules/entity_classes/naturalist/icons/aspect_of_wasps.tres" type="Texture" id=2] +[ext_resource path="res://modules/entity_classes/naturalist/aura_groups/2_aspect_of_wasps.tres" type="AuraGroup" id=3] + +[resource] +resource_name = "Aspect of Wasps" +id = 10 +icon = ExtResource( 2 ) +time = 21.0 +tick = 1.0 +debuff = true +rank = 1 +aura_type = 1 +aura_group = ExtResource( 3 ) +text_name = "Aspect of Wasps" +text_description = "Deals 230 to 270 damage every 3 sec, this damage increases over the duration, for 21 sec." +damage_enabled = true +damage_type = 16 +damage_min = 6 +damage_max = 7 +script = ExtResource( 1 ) diff --git a/game/modules/entity_classes/naturalist/auras/23_aspect_of_wolves.tres b/game/modules/entity_classes/naturalist/auras/23_aspect_of_wolves.tres new file mode 100644 index 0000000..bedfd68 --- /dev/null +++ b/game/modules/entity_classes/naturalist/auras/23_aspect_of_wolves.tres @@ -0,0 +1,32 @@ +[gd_resource type="Aura" load_steps=4 format=2] + +[ext_resource path="res://scripts/auras/aura_script.gd" type="Script" id=1] +[ext_resource path="res://modules/entity_classes/naturalist/icons/aspect_of_wolves.tres" type="Texture" id=2] +[ext_resource path="res://modules/entity_classes/naturalist/aura_groups/3_aspect_of_wolves.tres" type="AuraGroup" id=3] + +[resource] +resource_name = "Aspect of Wolves" +id = 11 +icon = ExtResource( 2 ) +time = 22.0 +tick = 2.0 +debuff = true +rank = 1 +aura_type = 1 +aura_group = ExtResource( 3 ) +text_name = "Aspect of Wolves" +text_description = "Deals 280 to 330 damage every 2 sec, and reduces melee and spell damage by 10% for 22 sec." +damage_enabled = true +damage_type = 16 +damage_min = 10 +damage_max = 12 +attribute_count = 2 +StatModAttribute_0/stat = 26 +StatModAttribute_0/base_mod = 0.0 +StatModAttribute_0/bonus_mod = 0.0 +StatModAttribute_0/percent_mod = -10.0 +StatModAttribute_1/stat = 27 +StatModAttribute_1/base_mod = 0.0 +StatModAttribute_1/bonus_mod = 0.0 +StatModAttribute_1/percent_mod = -10.0 +script = ExtResource( 1 ) diff --git a/game/modules/entity_classes/naturalist/auras/24_aspect_of_bees.tres b/game/modules/entity_classes/naturalist/auras/24_aspect_of_bees.tres new file mode 100644 index 0000000..4eb008f --- /dev/null +++ b/game/modules/entity_classes/naturalist/auras/24_aspect_of_bees.tres @@ -0,0 +1,23 @@ +[gd_resource type="Aura" load_steps=4 format=2] + +[ext_resource path="res://scripts/auras/aura_script.gd" type="Script" id=1] +[ext_resource path="res://modules/entity_classes/naturalist/icons/aspect_of_bees.tres" type="Texture" id=2] +[ext_resource path="res://modules/entity_classes/naturalist/aura_groups/4_aspect_of_bees.tres" type="AuraGroup" id=3] + +[resource] +resource_name = "Aspect of Bees" +id = 12 +icon = ExtResource( 2 ) +time = 21.0 +tick = 3.0 +debuff = true +rank = 1 +aura_type = 1 +aura_group = ExtResource( 3 ) +text_name = "Aspect of Bees" +text_description = "Deals 460 to 540 damage every 3 sec, healing you for 80% of the damage." +damage_enabled = true +damage_type = 16 +damage_min = 60 +damage_max = 80 +script = ExtResource( 1 ) diff --git a/game/modules/entity_classes/naturalist/effect_data/aspect_of_scorpions.tres b/game/modules/entity_classes/naturalist/effect_data/aspect_of_scorpions.tres new file mode 100644 index 0000000..4488404 --- /dev/null +++ b/game/modules/entity_classes/naturalist/effect_data/aspect_of_scorpions.tres @@ -0,0 +1,15 @@ +[gd_resource type="SpellEffectVisual" load_steps=4 format=2] + +[ext_resource path="res://modules/entity_classes/naturalist/spell_effects/nature/NatureCast.tscn" type="PackedScene" id=1] +[ext_resource path="res://scripts/resources/spell_effect_visual_basic.gd" type="Script" id=2] +[ext_resource path="res://modules/entity_classes/naturalist/spell_effects/nature/AOSCastFinish.tscn" type="PackedScene" id=3] + +[resource] +script = ExtResource( 2 ) +spell_cast_effect_left_hand = ExtResource( 1 ) +spell_cast_effect_right_hand = ExtResource( 1 ) +torso_aura_effect_time = 0.0 +root_aura_effect_time = 0.0 +torso_spell_cast_finish_effect = ExtResource( 3 ) +torso_spell_cast_finish_effect_time = 4.0 +root_spell_cast_finish_effect_time = 1.0 diff --git a/game/modules/entity_classes/naturalist/effect_data/natures_swiftness.tres b/game/modules/entity_classes/naturalist/effect_data/natures_swiftness.tres new file mode 100644 index 0000000..033be2a --- /dev/null +++ b/game/modules/entity_classes/naturalist/effect_data/natures_swiftness.tres @@ -0,0 +1,12 @@ +[gd_resource type="SpellEffectVisual" load_steps=3 format=2] + +[ext_resource path="res://scripts/resources/spell_effect_visual_basic.gd" type="Script" id=1] +[ext_resource path="res://modules/entity_classes/naturalist/spell_effects/nature/NautreSwiftness.tscn" type="PackedScene" id=2] + +[resource] +script = ExtResource( 1 ) +torso_aura_effect_time = 0.0 +root_aura_effect = ExtResource( 2 ) +root_aura_effect_time = 0.0 +torso_spell_cast_finish_effect_time = 1.0 +root_spell_cast_finish_effect_time = 1.0 diff --git a/game/modules/entity_classes/naturalist/entities/1_naturalist.tres b/game/modules/entity_classes/naturalist/entities/1_naturalist.tres new file mode 100644 index 0000000..54df358 --- /dev/null +++ b/game/modules/entity_classes/naturalist/entities/1_naturalist.tres @@ -0,0 +1,15 @@ +[gd_resource type="EntityData" load_steps=4 format=2] + +[ext_resource path="res://modules/entity_classes/naturalist/1_naturalist.tres" type="EntityClassData" id=2] +[ext_resource path="res://modules/species/species_human.tres" type="EntitySpeciesData" id=3] +[ext_resource path="res://scripts/entities/EntityDataGD.gd" type="Script" id=4] + +[resource] +resource_name = "Naturalist" +id = 1 +is_playable = true +text_name = "Naturalist" +bag_size = 24 +entity_species_data = ExtResource( 3 ) +entity_class_data = ExtResource( 2 ) +script = ExtResource( 4 ) diff --git a/game/modules/entity_classes/naturalist/entities/2_naturalist_mob.tres b/game/modules/entity_classes/naturalist/entities/2_naturalist_mob.tres new file mode 100644 index 0000000..6a25d4c --- /dev/null +++ b/game/modules/entity_classes/naturalist/entities/2_naturalist_mob.tres @@ -0,0 +1,38 @@ +[gd_resource type="EntityData" load_steps=7 format=2] + +[ext_resource path="res://modules/species/species_human.tres" type="EntitySpeciesData" id=1] +[ext_resource path="res://modules/entity_classes/naturalist/1_naturalist.tres" type="EntityClassData" id=2] +[ext_resource path="res://scripts/entities/EntityDataGD.gd" type="Script" id=3] + +[sub_resource type="LootDataBase" id=1] + +[sub_resource type="SimpleLevelStatData" id=2] +agility = 3 +strength = 2 +stamina = 3 +intellect = 4 +spirit = 5 + +[sub_resource type="StatData" id=3] +level_stat_data = SubResource( 2 ) +stat/agility = 14.0 +stat/strength = 15.0 +stat/stamina = 13.0 +stat/intellect = 13.0 +stat/spirit = 10.0 +stat/health = 20.0 +stat/mana = 20.0 +stat/speed = 20.0 +stat/global_cooldown = 1.5 + +[resource] +resource_name = "Naturalist" +id = 2 +entity_type = 4 +entity_controller = 2 +text_name = "Naturalist" +stat_data = SubResource( 3 ) +entity_species_data = ExtResource( 1 ) +entity_class_data = ExtResource( 2 ) +loot_db = SubResource( 1 ) +script = ExtResource( 3 ) diff --git a/game/modules/entity_classes/naturalist/game_module.tres b/game/modules/entity_classes/naturalist/game_module.tres new file mode 100644 index 0000000..c7088ca --- /dev/null +++ b/game/modules/entity_classes/naturalist/game_module.tres @@ -0,0 +1,8 @@ +[gd_resource type="Resource" load_steps=3 format=2] + +[ext_resource path="res://scripts/game_modules/GameModule.gd" type="Script" id=1] +[ext_resource path="res://modules/entity_classes/naturalist/resource_db.tres" type="ESSResourceDBStatic" id=2] + +[resource] +script = ExtResource( 1 ) +resource_db = ExtResource( 2 ) diff --git a/game/modules/entity_classes/naturalist/icons/amplify_pain.tres b/game/modules/entity_classes/naturalist/icons/amplify_pain.tres new file mode 100644 index 0000000..8bed7cb --- /dev/null +++ b/game/modules/entity_classes/naturalist/icons/amplify_pain.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://modules/icons/icons-3/beam-jade-2.png" type="Texture" id=1] + + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/modules/entity_classes/naturalist/icons/aspect_of_bees.tres b/game/modules/entity_classes/naturalist/icons/aspect_of_bees.tres new file mode 100644 index 0000000..5f9b9e9 --- /dev/null +++ b/game/modules/entity_classes/naturalist/icons/aspect_of_bees.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://modules/icons/icons-4/explosion-royal-2.png" type="Texture" id=1] + + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/modules/entity_classes/naturalist/icons/aspect_of_scorpions.tres b/game/modules/entity_classes/naturalist/icons/aspect_of_scorpions.tres new file mode 100644 index 0000000..283b228 --- /dev/null +++ b/game/modules/entity_classes/naturalist/icons/aspect_of_scorpions.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://modules/icons/icons-2/enchant-acid-2.png" type="Texture" id=1] + + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/modules/entity_classes/naturalist/icons/aspect_of_wasps.tres b/game/modules/entity_classes/naturalist/icons/aspect_of_wasps.tres new file mode 100644 index 0000000..401be86 --- /dev/null +++ b/game/modules/entity_classes/naturalist/icons/aspect_of_wasps.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://modules/icons/icons-2/enchant-blue-2.png" type="Texture" id=1] + + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/modules/entity_classes/naturalist/icons/aspect_of_wolves.tres b/game/modules/entity_classes/naturalist/icons/aspect_of_wolves.tres new file mode 100644 index 0000000..a8af165 --- /dev/null +++ b/game/modules/entity_classes/naturalist/icons/aspect_of_wolves.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://modules/icons/icons-4/wild-orange-2.png" type="Texture" id=1] + + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/modules/entity_classes/naturalist/icons/attunement.tres b/game/modules/entity_classes/naturalist/icons/attunement.tres new file mode 100644 index 0000000..f31f7e5 --- /dev/null +++ b/game/modules/entity_classes/naturalist/icons/attunement.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://modules/icons/icons-4/horror-acid-3.png" type="Texture" id=1] + + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/modules/entity_classes/naturalist/icons/calm.tres b/game/modules/entity_classes/naturalist/icons/calm.tres new file mode 100644 index 0000000..58a2e56 --- /dev/null +++ b/game/modules/entity_classes/naturalist/icons/calm.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://modules/icons/icons-5/wind-grasp-acid-2.png" type="Texture" id=1] + + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/modules/entity_classes/naturalist/icons/close_wounds.tres b/game/modules/entity_classes/naturalist/icons/close_wounds.tres new file mode 100644 index 0000000..b945e36 --- /dev/null +++ b/game/modules/entity_classes/naturalist/icons/close_wounds.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://modules/icons/icons-2/heal-jade-2.png" type="Texture" id=1] + + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/modules/entity_classes/naturalist/icons/first_aid.tres b/game/modules/entity_classes/naturalist/icons/first_aid.tres new file mode 100644 index 0000000..4c199b6 --- /dev/null +++ b/game/modules/entity_classes/naturalist/icons/first_aid.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://modules/icons/icons-1/61.png" type="Texture" id=1] + + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/modules/entity_classes/naturalist/icons/inner_will.tres b/game/modules/entity_classes/naturalist/icons/inner_will.tres new file mode 100644 index 0000000..b0cc416 --- /dev/null +++ b/game/modules/entity_classes/naturalist/icons/inner_will.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://modules/icons/icons-5/wind-grasp-eerie-2.png" type="Texture" id=1] + + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/modules/entity_classes/naturalist/icons/ironbark.tres b/game/modules/entity_classes/naturalist/icons/ironbark.tres new file mode 100644 index 0000000..f00ed7f --- /dev/null +++ b/game/modules/entity_classes/naturalist/icons/ironbark.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://modules/icons/icons-2/protect-acid-3.png" type="Texture" id=1] + + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/modules/entity_classes/naturalist/icons/natures_swiftness.tres b/game/modules/entity_classes/naturalist/icons/natures_swiftness.tres new file mode 100644 index 0000000..235bb2c --- /dev/null +++ b/game/modules/entity_classes/naturalist/icons/natures_swiftness.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://modules/icons/icons-3/haste-royal-2.png" type="Texture" id=1] + + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/modules/entity_classes/naturalist/icons/regenerate.tres b/game/modules/entity_classes/naturalist/icons/regenerate.tres new file mode 100644 index 0000000..3c4ceeb --- /dev/null +++ b/game/modules/entity_classes/naturalist/icons/regenerate.tres @@ -0,0 +1,9 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://modules/icons/icons-4/wind-blue-1.png" type="Texture" id=1] + + +[resource] +flags = 4 +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/modules/entity_classes/naturalist/icons/rejuvenation.tres b/game/modules/entity_classes/naturalist/icons/rejuvenation.tres new file mode 100644 index 0000000..52672a8 --- /dev/null +++ b/game/modules/entity_classes/naturalist/icons/rejuvenation.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://modules/icons/icons-4/leaf-acid-1.png" type="Texture" id=1] + + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/modules/entity_classes/naturalist/icons/root.tres b/game/modules/entity_classes/naturalist/icons/root.tres new file mode 100644 index 0000000..42eb5f7 --- /dev/null +++ b/game/modules/entity_classes/naturalist/icons/root.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://modules/icons/icons-3/vines-plain-1.png" type="Texture" id=1] + + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/modules/entity_classes/naturalist/icons/shield_of_barbs.tres b/game/modules/entity_classes/naturalist/icons/shield_of_barbs.tres new file mode 100644 index 0000000..6063752 --- /dev/null +++ b/game/modules/entity_classes/naturalist/icons/shield_of_barbs.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://modules/icons/icons-2/protect-eerie-2.png" type="Texture" id=1] + + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/modules/entity_classes/naturalist/icons/strength_of_nature.tres b/game/modules/entity_classes/naturalist/icons/strength_of_nature.tres new file mode 100644 index 0000000..46c481a --- /dev/null +++ b/game/modules/entity_classes/naturalist/icons/strength_of_nature.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://modules/icons/icons-3/lighting-acid-2.png" type="Texture" id=1] + + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/modules/entity_classes/naturalist/icons/test.tres b/game/modules/entity_classes/naturalist/icons/test.tres new file mode 100644 index 0000000..5315e41 --- /dev/null +++ b/game/modules/entity_classes/naturalist/icons/test.tres @@ -0,0 +1,9 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://modules/icons/icons.png" type="Texture" id=1] + + + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 80, 928, 16, 16 ) diff --git a/game/modules/entity_classes/naturalist/icons/uproot.tres b/game/modules/entity_classes/naturalist/icons/uproot.tres new file mode 100644 index 0000000..fd19ec0 --- /dev/null +++ b/game/modules/entity_classes/naturalist/icons/uproot.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://modules/icons/icons-3/vines-plain-2.png" type="Texture" id=1] + + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/modules/entity_classes/naturalist/resource_db.tres b/game/modules/entity_classes/naturalist/resource_db.tres new file mode 100644 index 0000000..a280be7 --- /dev/null +++ b/game/modules/entity_classes/naturalist/resource_db.tres @@ -0,0 +1,45 @@ +[gd_resource type="ESSResourceDBStatic" load_steps=39 format=2] + +[ext_resource path="res://modules/entity_classes/naturalist/spells/16_close_wounds_rank_1.tres" type="Spell" id=1] +[ext_resource path="res://modules/entity_classes/naturalist/auras/16_ironbark_rank_1.tres" type="Aura" id=2] +[ext_resource path="res://modules/entity_classes/naturalist/auras/14_rejuvenation_rank_1.tres" type="Aura" id=3] +[ext_resource path="res://modules/entity_classes/naturalist/spells/19_uproot_rank_1.tres" type="Spell" id=4] +[ext_resource path="res://modules/entity_classes/naturalist/spells/11_aspect_of_wasps_rank_1.tres" type="Spell" id=5] +[ext_resource path="res://modules/entity_classes/naturalist/auras/17_natures_swiftness_rank_1.tres" type="Aura" id=6] +[ext_resource path="res://modules/entity_classes/naturalist/auras/15_close_wounds_rank_1.tres" type="Aura" id=7] +[ext_resource path="res://modules/entity_classes/naturalist/auras/11_aspect_of_wasps_rank1.tres" type="Aura" id=8] +[ext_resource path="res://modules/entity_classes/naturalist/spells/13_aspect_of_bees_rank_1.tres" type="Spell" id=9] +[ext_resource path="res://modules/entity_classes/naturalist/auras/13_aspect_of_bees_rank_1.tres" type="Aura" id=10] +[ext_resource path="res://modules/entity_classes/naturalist/spells/10_aspect_of_scorpions_rank_1.tres" type="Spell" id=11] +[ext_resource path="res://modules/entity_classes/naturalist/auras/10_aspect_of_scorpions_rank_1.tres" type="Aura" id=12] +[ext_resource path="res://modules/entity_classes/naturalist/spells/17_ironbark_rank_1.tres" type="Spell" id=13] +[ext_resource path="res://modules/entity_classes/naturalist/spells/24_attunement_rank_1.tres" type="Spell" id=14] +[ext_resource path="res://modules/entity_classes/naturalist/auras/20_root_rank_1.tres" type="Aura" id=15] +[ext_resource path="res://modules/entity_classes/naturalist/auras/21_aspect_of_scorpions.tres" type="Aura" id=16] +[ext_resource path="res://modules/entity_classes/naturalist/auras/22_aspect_of_wasps.tres" type="Aura" id=17] +[ext_resource path="res://modules/entity_classes/naturalist/spells/27_aspect_of_scorpions.tres" type="Spell" id=18] +[ext_resource path="res://modules/entity_classes/naturalist/spells/29_aspect_of_wolves.tres" type="Spell" id=19] +[ext_resource path="res://modules/entity_classes/naturalist/spells/28_aspectofwasps.tres" type="Spell" id=20] +[ext_resource path="res://modules/entity_classes/naturalist/auras/23_aspect_of_wolves.tres" type="Aura" id=21] +[ext_resource path="res://modules/entity_classes/naturalist/spells/30_aspect_of_bees.tres" type="Spell" id=22] +[ext_resource path="res://modules/entity_classes/naturalist/spells/14_amplify_pain_rank_1.tres" type="Spell" id=23] +[ext_resource path="res://modules/entity_classes/naturalist/auras/24_aspect_of_bees.tres" type="Aura" id=24] +[ext_resource path="res://modules/entity_classes/naturalist/spells/12_aspect_of_wolves_rank_1.tres" type="Spell" id=25] +[ext_resource path="res://modules/entity_classes/naturalist/spells/26_rest.tres" type="Spell" id=26] +[ext_resource path="res://modules/entity_classes/naturalist/spells/22_shield_of_barbs_rank_1.tres" type="Spell" id=27] +[ext_resource path="res://modules/entity_classes/naturalist/spells/21_strength_of_nature_rank_1.tres" type="Spell" id=28] +[ext_resource path="res://modules/entity_classes/naturalist/auras/12_aspect_of_wolves_rank_1.tres" type="Aura" id=29] +[ext_resource path="res://modules/entity_classes/naturalist/spells/20_root_rank_1.tres" type="Spell" id=30] +[ext_resource path="res://modules/entity_classes/naturalist/spells/23_calm_rank_1.tres" type="Spell" id=31] +[ext_resource path="res://modules/entity_classes/naturalist/spells/25_inner_will.tres" type="Spell" id=32] +[ext_resource path="res://modules/entity_classes/naturalist/spells/15_rejuvenation_rank_1.tres" type="Spell" id=33] +[ext_resource path="res://modules/entity_classes/naturalist/spells/18_natures_swiftness_rank_1.tres" type="Spell" id=34] +[ext_resource path="res://modules/entity_classes/naturalist/entities/1_naturalist.tres" type="EntityData" id=35] +[ext_resource path="res://modules/entity_classes/naturalist/entities/2_naturalist_mob.tres" type="EntityData" id=36] +[ext_resource path="res://modules/entity_classes/naturalist/spells/35_strike.tres" type="Spell" id=37] +[ext_resource path="res://modules/entity_classes/naturalist/spells/36_regrow.tres" type="Spell" id=38] + +[resource] +entity_datas = [ ExtResource( 36 ), ExtResource( 35 ) ] +spells = [ ExtResource( 11 ), ExtResource( 5 ), ExtResource( 25 ), ExtResource( 9 ), ExtResource( 23 ), ExtResource( 33 ), ExtResource( 1 ), ExtResource( 13 ), ExtResource( 34 ), ExtResource( 4 ), ExtResource( 30 ), ExtResource( 28 ), ExtResource( 27 ), ExtResource( 31 ), ExtResource( 14 ), ExtResource( 32 ), ExtResource( 26 ), ExtResource( 18 ), ExtResource( 20 ), ExtResource( 19 ), ExtResource( 22 ), ExtResource( 37 ), ExtResource( 38 ) ] +auras = [ ExtResource( 12 ), ExtResource( 8 ), ExtResource( 29 ), ExtResource( 10 ), ExtResource( 3 ), ExtResource( 7 ), ExtResource( 2 ), ExtResource( 6 ), ExtResource( 15 ), ExtResource( 16 ), ExtResource( 17 ), ExtResource( 21 ), ExtResource( 24 ) ] diff --git a/game/modules/entity_classes/naturalist/spell_effects/nature/AOSCastFinish.tscn b/game/modules/entity_classes/naturalist/spell_effects/nature/AOSCastFinish.tscn new file mode 100644 index 0000000..19bd56d --- /dev/null +++ b/game/modules/entity_classes/naturalist/spell_effects/nature/AOSCastFinish.tscn @@ -0,0 +1,3 @@ +[gd_scene format=2] + +[node name="Spatial" type="Spatial"] diff --git a/game/modules/entity_classes/naturalist/spell_effects/nature/AmplifyPain.tscn b/game/modules/entity_classes/naturalist/spell_effects/nature/AmplifyPain.tscn new file mode 100644 index 0000000..9e57332 --- /dev/null +++ b/game/modules/entity_classes/naturalist/spell_effects/nature/AmplifyPain.tscn @@ -0,0 +1,3 @@ +[gd_scene format=2] + +[node name="AmplifyPain" type="Spatial"] diff --git a/game/modules/entity_classes/naturalist/spell_effects/nature/NatureCast.tscn b/game/modules/entity_classes/naturalist/spell_effects/nature/NatureCast.tscn new file mode 100644 index 0000000..64da04d --- /dev/null +++ b/game/modules/entity_classes/naturalist/spell_effects/nature/NatureCast.tscn @@ -0,0 +1,3 @@ +[gd_scene format=2] + +[node name="NatureCast" type="Spatial"] diff --git a/game/modules/entity_classes/naturalist/spell_effects/nature/NautreSwiftness.tscn b/game/modules/entity_classes/naturalist/spell_effects/nature/NautreSwiftness.tscn new file mode 100644 index 0000000..74d25e8 --- /dev/null +++ b/game/modules/entity_classes/naturalist/spell_effects/nature/NautreSwiftness.tscn @@ -0,0 +1,3 @@ +[gd_scene format=2] + +[node name="NautreSwiftness" type="Spatial"] diff --git a/game/modules/entity_classes/naturalist/spell_effects/textures/arrows.png b/game/modules/entity_classes/naturalist/spell_effects/textures/arrows.png new file mode 100644 index 0000000000000000000000000000000000000000..f3f183acc9ff89b9f60f1c63349eae7923ca6f0e GIT binary patch literal 482 zcmV<80UiE{P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0e4A6K~z{r#g>6l z!!Qg*8`kL_>{AAz`>+S|7(Vg$sp_{ZCB5U_{W?{G^eZa~m)6=D-9)S;8B7Yr!6_3m zm=KGT!zN^KAzz#vG9iP3X2nU_#DxU2* zVaSjSw-qK^-R}|pdYcE|$AE6z_Rs+qC+fDc=N0O_&4cp~onQxi@rbAkl^l0=pi=x* zj84D+_9U~nuVl=E9YWg)YshvdV{~@C&Ak_QLzwA=O|DSq?MrGDAMmMUgeTawA7fQd zLLZx5!#vE(<3G&|c&X$Wo(g(p4M0^B%i`3(zm6*g!1Y&rvZ-muzK20?B9p zdX+CNY8chugp$F9W+u{;ZzY2Xc@u|H7M|~tkyU9sCdujS4IE5 znvQ%2t=QnkODyV{89lqFs9uO~6KL8}+q0?cv1Cq=nl7{0x}asAy3Bvh98%p{a?C2o zd-odtYb*lEOkY@cG9GJ7n0D#D-SLZT({^M&y2~^pMfZgB8sCF48!cQ~ezIlWZ8A$- zm2}LiN$kbG1z*JsID_Bt>^a`DWp&aq;{t_UjGa#UzM_xs_ygU@;OXk;vd$@?2>|m3 BUGD$@ literal 0 HcmV?d00001 diff --git a/game/modules/entity_classes/naturalist/spell_effects/textures/big_glow.png.import b/game/modules/entity_classes/naturalist/spell_effects/textures/big_glow.png.import new file mode 100644 index 0000000..0b69843 --- /dev/null +++ b/game/modules/entity_classes/naturalist/spell_effects/textures/big_glow.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/big_glow.png-df97a9764c4514dfeedfecf176820312.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://modules/entity_classes/naturalist/spell_effects/textures/big_glow.png" +dest_files=[ "res://.import/big_glow.png-df97a9764c4514dfeedfecf176820312.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/modules/entity_classes/naturalist/spell_effects/textures/main_texture.png b/game/modules/entity_classes/naturalist/spell_effects/textures/main_texture.png new file mode 100644 index 0000000000000000000000000000000000000000..d2e01a16adda046393f337b6bcf0439ef7c71bd4 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!EjF(#}JL++XYDrqb(#MxzDA>{ zM{3#{PhFGN1m?7F7J(LXE>~VY%`)S)F7p?42W5>T%Y++BXIcHx?)!1P$9(b{;VmzV lolRHsu~x0xH)G#c-rRyc2@6wqF$1k&@O1TaS?83{1OWFhKUx3) literal 0 HcmV?d00001 diff --git a/game/modules/entity_classes/naturalist/spell_effects/textures/main_texture.png.import b/game/modules/entity_classes/naturalist/spell_effects/textures/main_texture.png.import new file mode 100644 index 0000000..3978f10 --- /dev/null +++ b/game/modules/entity_classes/naturalist/spell_effects/textures/main_texture.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/main_texture.png-6116655823a3509ea26ac46bc3689bc0.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://modules/entity_classes/naturalist/spell_effects/textures/main_texture.png" +dest_files=[ "res://.import/main_texture.png-6116655823a3509ea26ac46bc3689bc0.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/modules/entity_classes/naturalist/spell_effects/textures/small_star.png b/game/modules/entity_classes/naturalist/spell_effects/textures/small_star.png new file mode 100644 index 0000000000000000000000000000000000000000..3ce8e073e362927df2d66752ca0d174b289f38f7 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!7@)5#}EtuWQk`F&i~)96rfhf5X(H_zx*i{ z=0!X#nN6B4k_?Xy-(X?%F%)oLbn!?vyQeUZyVFtw2IVPiw|SPtIagFPYH%xmme!EA zX1LjrVjU-*z_1|c)FFmd5xmFRE*&|_zopr0QvVs(EtDd literal 0 HcmV?d00001 diff --git a/game/modules/entity_classes/naturalist/spell_effects/textures/small_star.png.import b/game/modules/entity_classes/naturalist/spell_effects/textures/small_star.png.import new file mode 100644 index 0000000..9b38026 --- /dev/null +++ b/game/modules/entity_classes/naturalist/spell_effects/textures/small_star.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/small_star.png-2aeece93bc0331c8ad7b3682bfb322d2.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://modules/entity_classes/naturalist/spell_effects/textures/small_star.png" +dest_files=[ "res://.import/small_star.png-2aeece93bc0331c8ad7b3682bfb322d2.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=2 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/modules/entity_classes/naturalist/spell_effects/textures/star.png b/game/modules/entity_classes/naturalist/spell_effects/textures/star.png new file mode 100644 index 0000000000000000000000000000000000000000..bf8a13dc007addfed0d32cd71b072217627911e4 GIT binary patch literal 283 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!3~}+jv*HQODCTeJY>M*qTAK%_JD8d0b3KM zvomuxo%ZPBY2PE6`gfvvXHN9{y>A~nuqrRl`eXf!H>YooO;pbv)_evnVgCr8O^ptZ zwwQ@uSl1hPM9IykxaCfk__{0Bp?6k1NK9MJSat4+E35meir}N1{I!mM>;G^3!@aK{ zeN{!!!PY1-!B(k_nn^DVTFgJaoe=+)iLE5UbP0l+XkK_?>PL literal 0 HcmV?d00001 diff --git a/game/modules/entity_classes/naturalist/spell_effects/textures/star.png.import b/game/modules/entity_classes/naturalist/spell_effects/textures/star.png.import new file mode 100644 index 0000000..435d335 --- /dev/null +++ b/game/modules/entity_classes/naturalist/spell_effects/textures/star.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/star.png-f0edde12a69ecac5a6b2138bcc202fd5.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://modules/entity_classes/naturalist/spell_effects/textures/star.png" +dest_files=[ "res://.import/star.png-f0edde12a69ecac5a6b2138bcc202fd5.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/modules/entity_classes/naturalist/spells/10_aspect_of_scorpions_rank_1.tres b/game/modules/entity_classes/naturalist/spells/10_aspect_of_scorpions_rank_1.tres new file mode 100644 index 0000000..a555b2b --- /dev/null +++ b/game/modules/entity_classes/naturalist/spells/10_aspect_of_scorpions_rank_1.tres @@ -0,0 +1,32 @@ +[gd_resource type="Spell" load_steps=7 format=2] + +[ext_resource path="res://modules/core/entity_resources/1_mana_resource.tres" type="EntityResource" id=1] +[ext_resource path="res://modules/entity_classes/naturalist/auras/10_aspect_of_scorpions_rank_1.tres" type="Aura" id=2] +[ext_resource path="res://modules/entity_classes/naturalist/effect_data/aspect_of_scorpions.tres" type="SpellEffectVisual" id=3] +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=4] +[ext_resource path="res://modules/entity_classes/naturalist/icons/aspect_of_scorpions.tres" type="Texture" id=5] + +[sub_resource type="EntityResourceCostDataResource" id=1] +cost = 100 +entity_resource_data = ExtResource( 1 ) + +[resource] +resource_name = "Aspect of Scorpions" +id = 0 +spell_type = 8 +rank = 1 +icon = ExtResource( 5 ) +visual_spell_effects = ExtResource( 3 ) +target_aura_applys = [ ExtResource( 2 ) ] +text_name = "Aspect of Scorpions" +text_description = "Range: 26m. +Casttime: %%cast_cast_time . +Deals 340 to 380 damage every 3 sec, and increases damage taken by 10% for 30 sec." +range_range = 26.0 +cast_enabled = true +cast_cast_time = 1.2 +heal_enabled = true +heal_min = 123 +heal_max = 333 +resource_cost = SubResource( 1 ) +script = ExtResource( 4 ) diff --git a/game/modules/entity_classes/naturalist/spells/11_aspect_of_wasps_rank_1.tres b/game/modules/entity_classes/naturalist/spells/11_aspect_of_wasps_rank_1.tres new file mode 100644 index 0000000..d820c9a --- /dev/null +++ b/game/modules/entity_classes/naturalist/spells/11_aspect_of_wasps_rank_1.tres @@ -0,0 +1,20 @@ +[gd_resource type="Spell" load_steps=4 format=2] + +[ext_resource path="res://modules/entity_classes/naturalist/auras/11_aspect_of_wasps_rank1.tres" type="Aura" id=1] +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=2] +[ext_resource path="res://modules/entity_classes/naturalist/icons/aspect_of_wasps.tres" type="Texture" id=3] + +[resource] +resource_name = "Aspect of Wasps" +spell_type = 8 +rank = 1 +icon = ExtResource( 3 ) +target_aura_applys = [ ExtResource( 1 ) ] +text_name = "Aspect of Wasps" +text_description = "Range: 26m. +Instant. +Deals 230 to 270 damage every 3 sec, this damage increases over the duration, for 21 sec." +range_range = 26.0 +aoe_targetType = 541 +aoe_colliderType = 541 +script = ExtResource( 2 ) diff --git a/game/modules/entity_classes/naturalist/spells/12_aspect_of_wolves_rank_1.tres b/game/modules/entity_classes/naturalist/spells/12_aspect_of_wolves_rank_1.tres new file mode 100644 index 0000000..76e51c1 --- /dev/null +++ b/game/modules/entity_classes/naturalist/spells/12_aspect_of_wolves_rank_1.tres @@ -0,0 +1,21 @@ +[gd_resource type="Spell" load_steps=4 format=2] + +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=1] +[ext_resource path="res://modules/icons/Naturalist/AspectOfScorpions.png" type="Texture" id=2] +[ext_resource path="res://modules/entity_classes/naturalist/auras/12_aspect_of_wolves_rank_1.tres" type="Aura" id=3] + +[resource] +resource_name = "Aspect of Wolves" +id = 2 +spell_type = 8 +rank = 1 +icon = ExtResource( 2 ) +needs_target = true +target_aura_applys = [ ExtResource( 3 ) ] +text_name = "Aspect of Wolves" +text_description = "Range: 26m. +Deals 280 to 330 damage every 2 sec, and reduces melee and spell damage by 10% for 22 sec." +range_range = 26.0 +aoe_targetType = 1129071960 +aoe_colliderType = 1058050193 +script = ExtResource( 1 ) diff --git a/game/modules/entity_classes/naturalist/spells/13_aspect_of_bees_rank_1.tres b/game/modules/entity_classes/naturalist/spells/13_aspect_of_bees_rank_1.tres new file mode 100644 index 0000000..14c44e6 --- /dev/null +++ b/game/modules/entity_classes/naturalist/spells/13_aspect_of_bees_rank_1.tres @@ -0,0 +1,24 @@ +[gd_resource type="Spell" load_steps=4 format=2] + +[ext_resource path="res://modules/entity_classes/naturalist/auras/13_aspect_of_bees_rank_1.tres" type="Aura" id=1] +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=2] +[ext_resource path="res://modules/entity_classes/naturalist/icons/aspect_of_bees.tres" type="Texture" id=3] + +[resource] +resource_name = "Aspect of Bees" +id = 3 +spell_type = 8 +rank = 1 +icon = ExtResource( 3 ) +needs_target = true +target_aura_applys = [ ExtResource( 1 ) ] +text_name = "Aspect of Bees" +text_description = "Range: 26m. +Instant. +Cooldown: %%cooldown_cooldown sec +Deals 460 to 540 damage every 3 sec, healing you for 80% of the damage." +cooldown_cooldown = 21.0 +range_range = 26.0 +aoe_targetType = -1910718371 +aoe_colliderType = -298046312 +script = ExtResource( 2 ) diff --git a/game/modules/entity_classes/naturalist/spells/14_amplify_pain_rank_1.tres b/game/modules/entity_classes/naturalist/spells/14_amplify_pain_rank_1.tres new file mode 100644 index 0000000..7031c2b --- /dev/null +++ b/game/modules/entity_classes/naturalist/spells/14_amplify_pain_rank_1.tres @@ -0,0 +1,39 @@ +[gd_resource type="Spell" load_steps=7 format=2] + +[ext_resource path="res://modules/entity_classes/naturalist/spell_effects/nature/NatureCast.tscn" type="PackedScene" id=1] +[ext_resource path="res://scripts/resources/spell_effect_visual_basic.gd" type="Script" id=2] +[ext_resource path="res://scripts/spells/amplify_pain.gd" type="Script" id=3] +[ext_resource path="res://modules/entity_classes/naturalist/icons/amplify_pain.tres" type="Texture" id=4] +[ext_resource path="res://modules/entity_classes/naturalist/spell_effects/nature/AmplifyPain.tscn" type="PackedScene" id=5] + +[sub_resource type="SpellEffectVisual" id=1] +script = ExtResource( 2 ) +spell_cast_effect_left_hand = ExtResource( 1 ) +spell_cast_effect_right_hand = ExtResource( 1 ) +torso_aura_effect_time = 0.0 +root_aura_effect_time = 0.0 +torso_spell_cast_finish_effect = ExtResource( 5 ) +torso_spell_cast_finish_effect_time = 0.4 +root_spell_cast_finish_effect_time = 1.0 + +[resource] +resource_name = "Amplify Pain" +id = 4 +spell_type = 8 +level = 10 +icon = ExtResource( 4 ) +needs_target = true +visual_spell_effects = SubResource( 1 ) +text_name = "Amplify Pain" +text_description = "Range: 26m. +Casttime: {3}. +Causes your damage over time effects to tick." +cooldown_cooldown = 16.0 +range_range = 26.0 +cast_cast_time = 1.5 +damage_type = 16 +damage_min = 130 +damage_max = 150 +aoe_targetType = -1910718371 +aoe_colliderType = 1065353216 +script = ExtResource( 3 ) diff --git a/game/modules/entity_classes/naturalist/spells/15_rejuvenation_rank_1.tres b/game/modules/entity_classes/naturalist/spells/15_rejuvenation_rank_1.tres new file mode 100644 index 0000000..e7fc2ce --- /dev/null +++ b/game/modules/entity_classes/naturalist/spells/15_rejuvenation_rank_1.tres @@ -0,0 +1,21 @@ +[gd_resource type="Spell" load_steps=4 format=2] + +[ext_resource path="res://modules/entity_classes/naturalist/auras/14_rejuvenation_rank_1.tres" type="Aura" id=1] +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=2] +[ext_resource path="res://modules/entity_classes/naturalist/icons/rejuvenation.tres" type="Texture" id=3] + +[resource] +resource_name = "Rejuvenation" +id = 5 +spell_type = 8 +target_type = 2 +target_relation_type = 4 +rank = 1 +icon = ExtResource( 3 ) +caster_aura_applys = [ ExtResource( 1 ) ] +text_name = "Rejuvenation" +text_description = "Instant. +Heals you for 400 to 450 every 3 sec for 30 sec." +aoe_targetType = 32758 +aoe_colliderType = -2147479552 +script = ExtResource( 2 ) diff --git a/game/modules/entity_classes/naturalist/spells/16_close_wounds_rank_1.tres b/game/modules/entity_classes/naturalist/spells/16_close_wounds_rank_1.tres new file mode 100644 index 0000000..39df46c --- /dev/null +++ b/game/modules/entity_classes/naturalist/spells/16_close_wounds_rank_1.tres @@ -0,0 +1,21 @@ +[gd_resource type="Spell" load_steps=4 format=2] + +[ext_resource path="res://modules/entity_classes/naturalist/auras/15_close_wounds_rank_1.tres" type="Aura" id=1] +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=2] +[ext_resource path="res://modules/entity_classes/naturalist/icons/close_wounds.tres" type="Texture" id=3] + +[resource] +resource_name = "Close Wounds" +id = 6 +spell_type = 8 +target_type = 2 +rank = 1 +icon = ExtResource( 3 ) +caster_aura_applys = [ ExtResource( 1 ) ] +text_name = "Close Wounds" +text_description = "Casttime: 2 sec. +Cooldown: %%cooldown_cooldown sec +Heals you for 720 to 780 every 3 sec for 21 sec." +cast_cast_time = 1.3 +aoe_colliderType = -2147479552 +script = ExtResource( 2 ) diff --git a/game/modules/entity_classes/naturalist/spells/17_ironbark_rank_1.tres b/game/modules/entity_classes/naturalist/spells/17_ironbark_rank_1.tres new file mode 100644 index 0000000..2038660 --- /dev/null +++ b/game/modules/entity_classes/naturalist/spells/17_ironbark_rank_1.tres @@ -0,0 +1,23 @@ +[gd_resource type="Spell" load_steps=4 format=2] + +[ext_resource path="res://modules/entity_classes/naturalist/auras/16_ironbark_rank_1.tres" type="Aura" id=1] +[ext_resource path="res://modules/entity_classes/naturalist/icons/ironbark.tres" type="Texture" id=2] +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=3] + +[resource] +resource_name = "Ironbark" +id = 7 +spell_type = 8 +target_type = 480 +target_relation_type = 914787760 +rank = 1 +icon = ExtResource( 2 ) +caster_aura_applys = [ ExtResource( 1 ) ] +text_name = "Ironbark" +text_description = "Instant. +Cooldown: {2} +Reduces damage taken by 70%. This spell is not on the global cooldown." +cooldown_cooldown = 60.0 +aoe_targetType = -1910718371 +aoe_colliderType = -298046312 +script = ExtResource( 3 ) diff --git a/game/modules/entity_classes/naturalist/spells/18_natures_swiftness_rank_1.tres b/game/modules/entity_classes/naturalist/spells/18_natures_swiftness_rank_1.tres new file mode 100644 index 0000000..6ef15ca --- /dev/null +++ b/game/modules/entity_classes/naturalist/spells/18_natures_swiftness_rank_1.tres @@ -0,0 +1,23 @@ +[gd_resource type="Spell" load_steps=4 format=2] + +[ext_resource path="res://modules/entity_classes/naturalist/auras/17_natures_swiftness_rank_1.tres" type="Aura" id=1] +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=2] +[ext_resource path="res://modules/entity_classes/naturalist/icons/natures_swiftness.tres" type="Texture" id=3] + +[resource] +resource_name = "Nature's Swiftness" +id = 8 +spell_type = 8 +target_type = 520 +target_relation_type = 393653346 +rank = 1 +icon = ExtResource( 3 ) +caster_aura_applys = [ ExtResource( 1 ) ] +text_name = "Nature's Swiftness" +text_description = "Instant. +Cooldown: %%cooldown_cooldown sec +Increases your movement speed by 60% for 6 sec. This spell is not on the global cooldown." +cooldown_cooldown = 20.0 +aoe_targetType = 520 +aoe_colliderType = 186459648 +script = ExtResource( 2 ) diff --git a/game/modules/entity_classes/naturalist/spells/19_uproot_rank_1.tres b/game/modules/entity_classes/naturalist/spells/19_uproot_rank_1.tres new file mode 100644 index 0000000..59a0b62 --- /dev/null +++ b/game/modules/entity_classes/naturalist/spells/19_uproot_rank_1.tres @@ -0,0 +1,22 @@ +[gd_resource type="Spell" load_steps=3 format=2] + +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=1] +[ext_resource path="res://modules/entity_classes/naturalist/icons/uproot.tres" type="Texture" id=2] + +[resource] +resource_name = "Uproot" +id = 9 +spell_type = 8 +target_type = -2147460864 +rank = 1 +icon = ExtResource( 2 ) +text_name = "Uproot" +text_description = "Instant. +Cooldown: {2} +Roots every enemy around you in a 15m radius for 8 sec. This spell doesn't have diminishing return." +cooldown_cooldown = 24.0 +range_range = 15.0 +aoe = true +aoe_targetType = -572653568 +aoe_colliderType = 537722880 +script = ExtResource( 1 ) diff --git a/game/modules/entity_classes/naturalist/spells/20_root_rank_1.tres b/game/modules/entity_classes/naturalist/spells/20_root_rank_1.tres new file mode 100644 index 0000000..b2c7bb7 --- /dev/null +++ b/game/modules/entity_classes/naturalist/spells/20_root_rank_1.tres @@ -0,0 +1,22 @@ +[gd_resource type="Spell" load_steps=4 format=2] + +[ext_resource path="res://modules/entity_classes/naturalist/auras/20_root_rank_1.tres" type="Aura" id=1] +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=2] +[ext_resource path="res://modules/entity_classes/naturalist/icons/root.tres" type="Texture" id=3] + +[resource] +resource_name = "Root" +id = 10 +spell_type = 8 +rank = 1 +icon = ExtResource( 3 ) +target_aura_applys = [ ExtResource( 1 ) ] +text_name = "Root" +text_description = "Range: 26m. +Casttime: 1.5 sec. +Cooldown: {2} +Roots the target for 8 sec." +cast_cast_time = 1.4 +aoe_targetType = 8 +aoe_colliderType = 537722880 +script = ExtResource( 2 ) diff --git a/game/modules/entity_classes/naturalist/spells/21_strength_of_nature_rank_1.tres b/game/modules/entity_classes/naturalist/spells/21_strength_of_nature_rank_1.tres new file mode 100644 index 0000000..76c1a1b --- /dev/null +++ b/game/modules/entity_classes/naturalist/spells/21_strength_of_nature_rank_1.tres @@ -0,0 +1,24 @@ +[gd_resource type="Spell" load_steps=3 format=2] + +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=1] +[ext_resource path="res://modules/entity_classes/naturalist/icons/strength_of_nature.tres" type="Texture" id=2] + +[resource] +resource_name = "Strength of Nature" +id = 11 +spell_type = 8 +target_type = -2147477248 +target_relation_type = 24 +level = 11 +rank = 1 +icon = ExtResource( 2 ) +text_name = "Strength of Nature" +text_description = "Instant. +Cooldown: {2} +Heals you for 6700 to 7000." +cooldown_cooldown = 150.0 +heal_min = 6700 +heal_max = 7000 +aoe_targetType = 5 +aoe_colliderType = 7602273 +script = ExtResource( 1 ) diff --git a/game/modules/entity_classes/naturalist/spells/22_shield_of_barbs_rank_1.tres b/game/modules/entity_classes/naturalist/spells/22_shield_of_barbs_rank_1.tres new file mode 100644 index 0000000..6173401 --- /dev/null +++ b/game/modules/entity_classes/naturalist/spells/22_shield_of_barbs_rank_1.tres @@ -0,0 +1,21 @@ +[gd_resource type="Spell" load_steps=3 format=2] + +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=1] +[ext_resource path="res://modules/entity_classes/naturalist/icons/shield_of_barbs.tres" type="Texture" id=2] + +[resource] +resource_name = "Shield of Barbs" +id = 12 +spell_type = 8 +target_type = -2147456768 +target_relation_type = 24 +rank = 1 +icon = ExtResource( 2 ) +text_name = "Shield of Barbs" +text_description = "Instant. +Cooldown: {2} +Absorbs 4200 to 4400 damage, also deals 340 to 380 damage to any attacker, for 30 sec." +cooldown_cooldown = 45.0 +aoe_targetType = 5 +aoe_colliderType = 7929968 +script = ExtResource( 1 ) diff --git a/game/modules/entity_classes/naturalist/spells/23_calm_rank_1.tres b/game/modules/entity_classes/naturalist/spells/23_calm_rank_1.tres new file mode 100644 index 0000000..038b3a5 --- /dev/null +++ b/game/modules/entity_classes/naturalist/spells/23_calm_rank_1.tres @@ -0,0 +1,20 @@ +[gd_resource type="Spell" load_steps=3 format=2] + +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=1] +[ext_resource path="res://modules/entity_classes/naturalist/icons/calm.tres" type="Texture" id=2] + +[resource] +resource_name = "Calm" +id = 13 +spell_type = 8 +rank = 1 +icon = ExtResource( 2 ) +text_name = "Calm" +text_description = "Range: 26m. +Instant. +Cooldown: {2} +Reduces the target's melee and spell damage by 50% for 10 sec." +cooldown_cooldown = 90.0 +aoe_targetType = -2147478784 +aoe_colliderType = 7602273 +script = ExtResource( 1 ) diff --git a/game/modules/entity_classes/naturalist/spells/24_attunement_rank_1.tres b/game/modules/entity_classes/naturalist/spells/24_attunement_rank_1.tres new file mode 100644 index 0000000..df9cd94 --- /dev/null +++ b/game/modules/entity_classes/naturalist/spells/24_attunement_rank_1.tres @@ -0,0 +1,21 @@ +[gd_resource type="Spell" load_steps=3 format=2] + +[ext_resource path="res://modules/entity_classes/naturalist/icons/attunement.tres" type="Texture" id=1] +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=2] + +[resource] +resource_name = "Attunement" +id = 14 +spell_type = 8 +target_type = -2147448576 +target_relation_type = 24 +rank = 1 +icon = ExtResource( 1 ) +text_name = "Attunement" +text_description = "Instant. +Cooldown: {2} +Increases your spell damage by 30% for 20 sec." +cooldown_cooldown = 180.0 +aoe_targetType = 2 +aoe_colliderType = 480 +script = ExtResource( 2 ) diff --git a/game/modules/entity_classes/naturalist/spells/25_inner_will.tres b/game/modules/entity_classes/naturalist/spells/25_inner_will.tres new file mode 100644 index 0000000..96475fb --- /dev/null +++ b/game/modules/entity_classes/naturalist/spells/25_inner_will.tres @@ -0,0 +1,19 @@ +[gd_resource type="Spell" load_steps=3 format=2] + +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=1] +[ext_resource path="res://modules/entity_classes/naturalist/icons/inner_will.tres" type="Texture" id=2] + +[resource] +resource_name = "Inner Will" +id = 15 +spell_type = 1 +target_type = 2 +target_relation_type = -11822355 +icon = ExtResource( 2 ) +text_name = "Inner Will" +text_description = "Cooldown: 1.5 min. +Removes any movement impairing effects, stuns, and effects which makes you lose control of your character. This spell is not on the global cooldown." +cooldown_cooldown = 90.0 +aoe_targetType = 7 +aoe_colliderType = 480 +script = ExtResource( 1 ) diff --git a/game/modules/entity_classes/naturalist/spells/26_rest.tres b/game/modules/entity_classes/naturalist/spells/26_rest.tres new file mode 100644 index 0000000..f4a317f --- /dev/null +++ b/game/modules/entity_classes/naturalist/spells/26_rest.tres @@ -0,0 +1,17 @@ +[gd_resource type="Spell" load_steps=3 format=2] + +[ext_resource path="res://modules/entity_classes/naturalist/icons/regenerate.tres" type="Texture" id=1] +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=2] + +[resource] +resource_name = "Rest" +id = 16 +spell_type = 1 +target_type = 2 +target_relation_type = 24 +icon = ExtResource( 1 ) +text_name = "Rest" +text_description = "Rest for 30 seconds, greatly increasing your regeneration." +aoe_targetType = 5 +aoe_colliderType = 1065353216 +script = ExtResource( 2 ) diff --git a/game/modules/entity_classes/naturalist/spells/27_aspect_of_scorpions.tres b/game/modules/entity_classes/naturalist/spells/27_aspect_of_scorpions.tres new file mode 100644 index 0000000..68c2418 --- /dev/null +++ b/game/modules/entity_classes/naturalist/spells/27_aspect_of_scorpions.tres @@ -0,0 +1,24 @@ +[gd_resource type="Spell" load_steps=5 format=2] + +[ext_resource path="res://modules/entity_classes/naturalist/icons/aspect_of_scorpions.tres" type="Texture" id=1] +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=2] +[ext_resource path="res://modules/entity_classes/naturalist/auras/21_aspect_of_scorpions.tres" type="Aura" id=3] +[ext_resource path="res://modules/entity_classes/naturalist/effect_data/aspect_of_scorpions.tres" type="SpellEffectVisual" id=4] + +[resource] +resource_name = "Aspect of Scorpions" +id = 17 +spell_type = 8 +rank = 1 +icon = ExtResource( 1 ) +visual_spell_effects = ExtResource( 4 ) +target_aura_applys = [ ExtResource( 3 ) ] +text_name = "Aspect of Scorpions" +text_description = "Range: 26m. +Casttime: {3}. +Deals 340 to 380 damage every 3 sec, and increases damage taken by 10% for 30 sec." +range_range = 26.0 +cast_enabled = true +cast_cast_time = 1.2 +spell_cooldown_mainpulation_data_count = -1 +script = ExtResource( 2 ) diff --git a/game/modules/entity_classes/naturalist/spells/28_aspectofwasps.tres b/game/modules/entity_classes/naturalist/spells/28_aspectofwasps.tres new file mode 100644 index 0000000..b5a3e85 --- /dev/null +++ b/game/modules/entity_classes/naturalist/spells/28_aspectofwasps.tres @@ -0,0 +1,21 @@ +[gd_resource type="Spell" load_steps=4 format=2] + +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=1] +[ext_resource path="res://modules/entity_classes/naturalist/auras/22_aspect_of_wasps.tres" type="Aura" id=2] +[ext_resource path="res://modules/entity_classes/naturalist/icons/aspect_of_wasps.tres" type="Texture" id=3] + +[resource] +resource_name = "Aspect of Wasps" +id = 18 +spell_type = 8 +rank = 1 +icon = ExtResource( 3 ) +target_aura_applys = [ ExtResource( 2 ) ] +text_name = "Aspect of Wasps" +text_description = "Range: 26m. +Instant. +Deals 230 to 270 damage every 3 sec, this damage increases over the duration, for 21 sec." +range_range = 26.0 +aoe_targetType = 541 +aoe_colliderType = 541 +script = ExtResource( 1 ) diff --git a/game/modules/entity_classes/naturalist/spells/29_aspect_of_wolves.tres b/game/modules/entity_classes/naturalist/spells/29_aspect_of_wolves.tres new file mode 100644 index 0000000..1c102ba --- /dev/null +++ b/game/modules/entity_classes/naturalist/spells/29_aspect_of_wolves.tres @@ -0,0 +1,21 @@ +[gd_resource type="Spell" load_steps=4 format=2] + +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=1] +[ext_resource path="res://modules/entity_classes/naturalist/auras/23_aspect_of_wolves.tres" type="Aura" id=2] +[ext_resource path="res://modules/entity_classes/naturalist/icons/aspect_of_wolves.tres" type="Texture" id=3] + +[resource] +resource_name = "Aspect of Wolves" +id = 19 +spell_type = 8 +rank = 1 +icon = ExtResource( 3 ) +needs_target = true +target_aura_applys = [ ExtResource( 2 ) ] +text_name = "Aspect of Wolves" +text_description = "Range: 26m. +Deals 280 to 330 damage every 2 sec, and reduces melee and spell damage by 10% for 22 sec." +range_range = 26.0 +aoe_targetType = 1129071960 +aoe_colliderType = 1058050193 +script = ExtResource( 1 ) diff --git a/game/modules/entity_classes/naturalist/spells/30_aspect_of_bees.tres b/game/modules/entity_classes/naturalist/spells/30_aspect_of_bees.tres new file mode 100644 index 0000000..f7de0e4 --- /dev/null +++ b/game/modules/entity_classes/naturalist/spells/30_aspect_of_bees.tres @@ -0,0 +1,25 @@ +[gd_resource type="Spell" load_steps=4 format=2] + +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=1] +[ext_resource path="res://modules/entity_classes/naturalist/auras/24_aspect_of_bees.tres" type="Aura" id=2] +[ext_resource path="res://modules/entity_classes/naturalist/icons/aspect_of_bees.tres" type="Texture" id=3] + +[resource] +resource_name = "Aspect of Bees" +id = 20 +spell_type = 8 +level = 10 +rank = 1 +icon = ExtResource( 3 ) +needs_target = true +target_aura_applys = [ ExtResource( 2 ) ] +text_name = "Aspect of Bees" +text_description = "Range: 26m. +Instant. +Cooldown: {2} +Deals 460 to 540 damage every 3 sec, healing you for 80% of the damage." +cooldown_cooldown = 21.0 +range_range = 26.0 +aoe_targetType = -1910718371 +aoe_colliderType = -298046312 +script = ExtResource( 1 ) diff --git a/game/modules/entity_classes/naturalist/spells/35_strike.tres b/game/modules/entity_classes/naturalist/spells/35_strike.tres new file mode 100644 index 0000000..7d69c11 --- /dev/null +++ b/game/modules/entity_classes/naturalist/spells/35_strike.tres @@ -0,0 +1,42 @@ +[gd_resource type="Spell" load_steps=7 format=2] + +[ext_resource path="res://scripts/resources/spell_effect_visual_basic.gd" type="Script" id=1] +[ext_resource path="res://modules/entity_classes/naturalist/spell_effects/nature/AmplifyPain.tscn" type="PackedScene" id=2] +[ext_resource path="res://modules/entity_classes/naturalist/spell_effects/nature/NatureCast.tscn" type="PackedScene" id=3] +[ext_resource path="res://scripts/spells/amplify_pain.gd" type="Script" id=4] +[ext_resource path="res://modules/entity_classes/naturalist/icons/amplify_pain.tres" type="Texture" id=5] + +[sub_resource type="SpellEffectVisual" id=1] +script = ExtResource( 1 ) +spell_cast_effect_left_hand = ExtResource( 3 ) +spell_cast_effect_right_hand = ExtResource( 3 ) +torso_aura_effect_time = 0.0 +root_aura_effect_time = 0.0 +torso_spell_cast_finish_effect = ExtResource( 2 ) +torso_spell_cast_finish_effect_time = 0.4 +root_spell_cast_finish_effect_time = 1.0 + +[resource] +resource_name = "Strike" +id = 35 +spell_type = 1 +rank = 1 +icon = ExtResource( 5 ) +needs_target = true +visual_spell_effects = SubResource( 1 ) +text_name = "Strike" +text_description = "Range: Melee +Strike the target with your weapon, dealing weapon damage, and an additional %%damage_min - %%damage_max ." +cooldown_cooldown = 3.0 +range_enabled = true +range_range = 3.0 +cast_cast_time = 1.5 +damage_enabled = true +damage_type = 1 +damage_min = 19 +damage_max = 25 +damage_scale_stat = 41 +damage_scale_coeff = 1.0 +aoe_targetType = -1910718371 +aoe_colliderType = 1065353216 +script = ExtResource( 4 ) diff --git a/game/modules/entity_classes/naturalist/spells/36_regrow.tres b/game/modules/entity_classes/naturalist/spells/36_regrow.tres new file mode 100644 index 0000000..ed16b1a --- /dev/null +++ b/game/modules/entity_classes/naturalist/spells/36_regrow.tres @@ -0,0 +1,30 @@ +[gd_resource type="Spell" load_steps=5 format=2] + +[ext_resource path="res://modules/core/entity_resources/1_mana_resource.tres" type="EntityResource" id=1] +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=2] +[ext_resource path="res://modules/entity_classes/naturalist/icons/root.tres" type="Texture" id=3] + +[sub_resource type="EntityResourceCostDataResource" id=1] +cost = 100 +entity_resource_data = ExtResource( 1 ) + +[resource] +resource_name = "Regrow" +id = 36 +spell_type = 8 +target_relation_type = 5 +rank = 1 +icon = ExtResource( 3 ) +text_name = "Regrow" +text_description = "Heals you for %%heal_min to %%heal_max ." +range_enabled = true +range_range = 30.0 +cast_enabled = true +cast_cast_time = 2.0 +heal_enabled = true +heal_min = 12 +heal_max = 18 +heal_scale_stat = 14 +heal_scale_coeff = 0.1 +resource_cost = SubResource( 1 ) +script = ExtResource( 2 ) diff --git a/game/modules/entity_classes/naturalist/stats/mob_statdata.tres b/game/modules/entity_classes/naturalist/stats/mob_statdata.tres new file mode 100644 index 0000000..7c38348 --- /dev/null +++ b/game/modules/entity_classes/naturalist/stats/mob_statdata.tres @@ -0,0 +1,19 @@ +[gd_resource type="StatData" load_steps=2 format=2] + +[sub_resource type="SimpleLevelStatData" id=1] +agility = 3 +strength = 2 +stamina = 3 +intellect = 4 +spirit = 5 + +[resource] +level_stat_data = SubResource( 1 ) +stat/agility = 14.0 +stat/strength = 15.0 +stat/stamina = 13.0 +stat/intellect = 13.0 +stat/spirit = 10.0 +stat/health = 20.0 +stat/mana = 20.0 +stat/global_cooldown = 1.5 diff --git a/game/modules/entity_classes/naturalist/stats/player_statdata.tres b/game/modules/entity_classes/naturalist/stats/player_statdata.tres new file mode 100644 index 0000000..4245838 --- /dev/null +++ b/game/modules/entity_classes/naturalist/stats/player_statdata.tres @@ -0,0 +1,19 @@ +[gd_resource type="StatData" load_steps=2 format=2] + +[sub_resource type="SimpleLevelStatData" id=1] +agility = 4 +strength = 3 +stamina = 6 +intellect = 5 +spirit = 3 + +[resource] +level_stat_data = SubResource( 1 ) +stat/agility = 23.0 +stat/strength = 14.0 +stat/stamina = 23.0 +stat/intellect = 19.0 +stat/spirit = 3.0 +stat/health = 100.0 +stat/mana = 100.0 +stat/global_cooldown = 1.5 diff --git a/game/modules/icons/ parts/circles.svg b/game/modules/icons/ parts/circles.svg new file mode 100644 index 0000000..9dc3f8a --- /dev/null +++ b/game/modules/icons/ parts/circles.svg @@ -0,0 +1,81 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/game/modules/icons/ parts/circles.svg.import b/game/modules/icons/ parts/circles.svg.import new file mode 100644 index 0000000..932b026 --- /dev/null +++ b/game/modules/icons/ parts/circles.svg.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/circles.svg-d79adc035d41c6e5748ab1ee734ddde8.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://modules/icons/ parts/circles.svg" +dest_files=[ "res://.import/circles.svg-d79adc035d41c6e5748ab1ee734ddde8.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=1 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/modules/icons/3_iron_bar.tres b/game/modules/icons/3_iron_bar.tres new file mode 100644 index 0000000..5893fc2 --- /dev/null +++ b/game/modules/icons/3_iron_bar.tres @@ -0,0 +1,9 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://modules/icons/icons-1/11.png" type="Texture" id=1] + + +[resource] +flags = 4 +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/modules/icons/4_chest_of_the_infinite_wisdom.tres b/game/modules/icons/4_chest_of_the_infinite_wisdom.tres new file mode 100644 index 0000000..ebbcdad --- /dev/null +++ b/game/modules/icons/4_chest_of_the_infinite_wisdom.tres @@ -0,0 +1,9 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://modules/icons/icons-1/43.png" type="Texture" id=1] + + +[resource] +flags = 4 +atlas = ExtResource( 1 ) +region = Rect2( 1, 0, 16, 16 ) diff --git a/game/modules/icons/Naturalist/AspectOfScorpions.png b/game/modules/icons/Naturalist/AspectOfScorpions.png new file mode 100644 index 0000000000000000000000000000000000000000..de41ad0dea8c217f89d3b30853c140b1427dce50 GIT binary patch literal 349 zcmV-j0iyniP)Px$7fD1xR49?9P_a$|K@^;2H*kk?*N~W)fZbk*1$X?9jV2Zpwi==pm5r^5Bz}ee z!6j4>TFoUI6KLE6jE^Bs}P^_`E#qKbdhDc9x>gJ@|tt4RExy}O3(X!b7}s<4d<2{z{hO%vrHa1 zb{qgwN{=zcf5W=N5&&?>n9c(Lv9FQ`-qZB7;&q2Zb5?iV_Ucd?>jjU^W|F4&qmgP- vcioH4x^@7-T@W0VN&v0~gQb*zG}!~+foe@1RJPs#00000NkvXXu0mjfKuneR literal 0 HcmV?d00001 diff --git a/game/modules/icons/Naturalist/AspectOfScorpions.png.import b/game/modules/icons/Naturalist/AspectOfScorpions.png.import new file mode 100644 index 0000000..5c753ea --- /dev/null +++ b/game/modules/icons/Naturalist/AspectOfScorpions.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/AspectOfScorpions.png-57bf81255e358a2289de8af818917a62.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://modules/icons/Naturalist/AspectOfScorpions.png" +dest_files=[ "res://.import/AspectOfScorpions.png-57bf81255e358a2289de8af818917a62.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=2 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/modules/icons/Naturalist/AspectOfScorpions.tscn b/game/modules/icons/Naturalist/AspectOfScorpions.tscn new file mode 100644 index 0000000..5a08150 --- /dev/null +++ b/game/modules/icons/Naturalist/AspectOfScorpions.tscn @@ -0,0 +1,104 @@ +[gd_scene load_steps=6 format=2] + +[ext_resource path="res://texture_tools/LayeredTextureMaker.gd" type="Script" id=1] +[ext_resource path="res://modules/icons/Naturalist/AspectOfScorpions.png" type="Texture" id=2] +[ext_resource path="res://modules/icons/ parts/circles.svg" type="Texture" id=3] +[ext_resource path="res://modules/icons/icons.png" type="Texture" id=4] + + +[sub_resource type="Gradient" id=1] +offsets = PoolRealArray( 0, 0.166667, 1 ) +colors = PoolColorArray( 0, 0, 0, 1, 0.871094, 0.871094, 0.871094, 1, 1, 1, 1, 1 ) + +[node name="LayeredTextureMaker" type="Node2D"] +script = ExtResource( 1 ) +__meta__ = { +"_edit_lock_": true +} +texture = ExtResource( 2 ) + +[node name="Sprite" type="Sprite" parent="."] +modulate = Color( 0, 0, 0, 1 ) +self_modulate = Color( 0, 0, 0, 1 ) +position = Vector2( 22.1815, 14.0857 ) +scale = Vector2( 0.85584, 0.746345 ) +texture = ExtResource( 4 ) + +[node name="circles" type="Sprite" parent="."] +visible = false +modulate = Color( 0.427451, 0.0588235, 0.0588235, 1 ) +self_modulate = Color( 0.772549, 0.458824, 0.458824, 1 ) +position = Vector2( 5.77751, 5.69682 ) +scale = Vector2( 0.0683068, 0.0707925 ) +texture = ExtResource( 3 ) + +[node name="CPUParticles2D" type="CPUParticles2D" parent="."] +modulate = Color( 0.662745, 0.207843, 0.207843, 1 ) +position = Vector2( 6.35167, 10.2869 ) +scale = Vector2( 0.05, 0.05 ) +amount = 24 +texture = ExtResource( 3 ) +direction = Vector2( 0.5, 0.5 ) +spread = 108.36 +gravity = Vector2( 0, 0 ) +initial_velocity = 40.0 +linear_accel = 3.2 +linear_accel_random = 0.21 +color_ramp = SubResource( 1 ) +hue_variation_random = 0.02 + +[node name="CPUParticles2D2" type="CPUParticles2D" parent="."] +modulate = Color( 0.662745, 0.207843, 0.207843, 1 ) +position = Vector2( 4.59298, 2.6762 ) +scale = Vector2( 0.02, 0.02 ) +amount = 20 +lifetime = 0.74 +explosiveness = 0.14 +randomness = 0.59 +lifetime_randomness = 0.38 +texture = ExtResource( 3 ) +direction = Vector2( 0.5, 0.5 ) +spread = 108.36 +gravity = Vector2( 0, 0 ) +initial_velocity = 40.0 +linear_accel = 3.2 +linear_accel_random = 0.21 +color_ramp = SubResource( 1 ) + +[node name="CPUParticles2D3" type="CPUParticles2D" parent="."] +modulate = Color( 0.662745, 0.207843, 0.207843, 1 ) +position = Vector2( 10.675, 2.7188 ) +scale = Vector2( 0.02, 0.02 ) +amount = 20 +lifetime = 0.74 +preprocess = 14.4 +explosiveness = 0.14 +randomness = 0.59 +lifetime_randomness = 0.38 +texture = ExtResource( 3 ) +direction = Vector2( 0.5, 0.5 ) +spread = 108.36 +gravity = Vector2( 0, 0 ) +initial_velocity = 40.0 +linear_accel = 3.2 +linear_accel_random = 0.21 +color_ramp = SubResource( 1 ) + +[node name="CPUParticles2D4" type="CPUParticles2D" parent="."] +modulate = Color( 0.662745, 0.207843, 0.207843, 1 ) +position = Vector2( 13.4834, 6.60399 ) +scale = Vector2( 0.02, 0.02 ) +amount = 20 +lifetime = 0.74 +preprocess = 9.6 +explosiveness = 0.14 +randomness = 0.59 +lifetime_randomness = 0.38 +texture = ExtResource( 3 ) +direction = Vector2( 0.5, 0.5 ) +spread = 108.36 +gravity = Vector2( 0, 0 ) +initial_velocity = 40.0 +linear_accel = 3.2 +linear_accel_random = 0.21 +color_ramp = SubResource( 1 ) diff --git a/game/modules/icons/icons-1/11.png b/game/modules/icons/icons-1/11.png new file mode 100644 index 0000000000000000000000000000000000000000..eeb29757de50914b74355cad52938d9cee9b0322 GIT binary patch literal 2827 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 mlanLDFeXZ}+b{ozQ}7Q~JX5g!!U&820000 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 literal 0 HcmV?d00001 diff --git a/game/modules/icons/icons-1/5.png.import b/game/modules/icons/icons-1/5.png.import new file mode 100644 index 0000000..c513217 --- /dev/null +++ b/game/modules/icons/icons-1/5.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/5.png-5ab45144da6dcf7f1946e8c3d281b2b1.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://modules/icons/icons-1/5.png" +dest_files=[ "res://.import/5.png-5ab45144da6dcf7f1946e8c3d281b2b1.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/modules/icons/icons-1/61.png b/game/modules/icons/icons-1/61.png new file mode 100644 index 0000000000000000000000000000000000000000..c24ff5f24bf3189c7a21374ba0b93a4d5e80a458 GIT binary patch literal 3024 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 S_S{+k0000 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 literal 0 HcmV?d00001 diff --git a/game/modules/icons/icons-2/enchant-blue-2.png.import b/game/modules/icons/icons-2/enchant-blue-2.png.import new file mode 100644 index 0000000..d10acaf --- /dev/null +++ b/game/modules/icons/icons-2/enchant-blue-2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/enchant-blue-2.png-62269ec03cda74c14260d8eec2def3e0.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://modules/icons/icons-2/enchant-blue-2.png" +dest_files=[ "res://.import/enchant-blue-2.png-62269ec03cda74c14260d8eec2def3e0.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/modules/icons/icons-2/heal-jade-2.png b/game/modules/icons/icons-2/heal-jade-2.png new file mode 100644 index 0000000000000000000000000000000000000000..84df53d7c8cd6c68eb0969b891b87cafd70cff40 GIT binary patch literal 3314 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 literal 0 HcmV?d00001 diff --git a/game/modules/icons/icons-2/heal-jade-2.png.import b/game/modules/icons/icons-2/heal-jade-2.png.import new file mode 100644 index 0000000..5b75d3c --- /dev/null +++ b/game/modules/icons/icons-2/heal-jade-2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/heal-jade-2.png-d014e1e194c6dc4bfb8e4d42e88bb5ce.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://modules/icons/icons-2/heal-jade-2.png" +dest_files=[ "res://.import/heal-jade-2.png-d014e1e194c6dc4bfb8e4d42e88bb5ce.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/modules/icons/icons-2/protect-acid-3.png b/game/modules/icons/icons-2/protect-acid-3.png new file mode 100644 index 0000000000000000000000000000000000000000..f4ce0d62e0fd0937927ba351cbd3f11512001eee GIT binary patch literal 3506 zcmV;j4NdZiP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1eyk|ZY#{O1%t0*IG%91sxU8~FH63Q;|?yM9G@ zYNw|PC?qnalzQF#F7jA6k_9s?>kg$xm`~Z9}qu+mtAA~9x%n!_r12*5!7Cnbg zY{iG?h;R=$`Oao3*im{NZ z#I$YWof@9Cl&R1jhBkqS980X=23ZEOQp$**niw(Ea?B~`Tyo9qvgB4`NhOz3YS|*! zYOJY3^=hqLr8bV7ICJ63%)(7bA~Y~dkt!@At&wXm)Ua2>`i7BCJ@(XdFTHl|(wicD zG-=kNRar&bpb-aTVw6z_4;gI+H=z_W%{{+&I@;EC8@ZNygQs!`06$q@3V}75Y#hIzT$#;Dk#*b|~E z&1zUAc+AsHbI1F+qRnB46gAqyULio{gNPy)`#Gv;l~h|9d&*_tUwcXipd1FLgAY#W z$FmjEVoFHI;v5m6(e-;+1)YW^O4S-R9PwYf44Wep8sIKQ0WNKx~;m zMOR7|a{`xH&QZ{4)y<6^ri4=R*-N46I*oqV)^*&0MW0qca-JQUuPLy&6NFl6hs2p0 zFeE$W3^p9sg9NjcWU4F}e;!x!G6>4@M0OU$e@iw6MG2pf^E|sD6L3bdgxTsQ76zHM z_v6t%U8>@3tE{!02u&evkucW^fV1dQWIFO*-ZXHcYP@tLq<-=zEs1gHho?5;%=RY8 zkeCm-v!HdHPCtHQV3`Fps^K{9vs{mgbb*>(S`=Dpyy&j9!O-u!r&YFfJD$QSbP$1= zEd=?%4>ech3fa;nvqNfa8$@Ue<3daU+Ev@KrRb_st9rF%Xz0?6V)S7I-8rmPPHA^+ zwyuY%H?;<C2{*qG}v4F^N@jV#okVPp(r^?DEEzoR4Ee>Xey01Ef`v*AX zM~@zX+LYgw&<0hR(@w4EFS|@KDURXa_#Acgty)5CmP`u;kiY*<@C(KUv|L|M2&~{bK0J| zn-vs+>m{RhR)3Zv+Y+ptg|ts2G@LEmwb~-kpVK7I$6(@uU2Y;$mDdwwtK4Kpf3!6P z*?v6%e6VOh4+LJTWIE6w%32IdXrUrx?Bo;Qj?$a>TPHo_-K-~wC?ZoYNQ8RREM^xK z^bWjsBMpPMA2++r8ciz?!wb)BI=%8~@_VL!mU8Prw*Lha|X$*8S zIeMnrE;)S9s0o^m&D&dB)4cTr6$Hg48V_X`+NYaB((Yn1EYo#&#xZ^hjf{0w5Q#qJ z%6Hn~rnj=7<~R?DxI*N&Eb3b$!$kLGr5VwT_ST|XcPMJGUFJ@#iT>!82z;lA7f&>= zpYUQx)oU%o685|qgD~VcPaN&`dD5-Os1Dt5!}$>$;g(mwc2pgW+>NxXn*pWr{%@b7 zP$${%RNCjXa?{bOR>K|NgN2gWN#){)Om+}P%UAJ;rCKaOr6647*7t@l6MD~sM*kW? zy+bRqqvDAp?LM|~d(?qG%6dFOmpMPx4!xIEQvg^#g^VEi?hRO^x)>1!z!wWn! zgtuiz0004mX+uL$Nkc;*aB^>EX>4Tx0C=2zkvmAkKpe)urb>NO9E>31kfAzRC@SKp zRVYG*P%E_RU>fkB}f)5ZES0_amDe-?vp+$@b$Nl*3 zzK^@_0IptEG^-;9Xu55t5^*7uT@^yF=mn2K#Lz7%mN6%aN%)Shdj!~e7iC%g=l&dh zYR*!CfIvK}7^Y3UK|H-_8;tjfd8H_+#OK80CS8#Dk?FF>Z;T5rb1aiL)2Vr4o>(Zf zvE0T=(bR~ih$E_|Q$CmRSY^D$SSweR<~`X9!#RCrndvk~kia6AAVPqQDoQBBMwC{a z6bmWZkNfzCUB5^!nOr3( z#t9I72Cnp$zfuQgK1r{&w8# zta-gP_i_3Fq^Yaq4RCM>j1?$*-RIq1?Y;ebrrF;QcvW(#_@7d%00006VoOIv0RI60 z0RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru;|mlOFcd4^u|NO-14~In zK~y-)CCmFuon-*P@$d6I?>XD1Ls(`9R922*n7Sc_oLg;+mS&?s2H zj8TEa`UC8T8bw4!Xmo*yAn5Ms?2;91PMyPfI_Wg;mvepJ_j#Xw==1wWv@}_U{T4bd zu$O#Pw#O0$ADp06VsN$}cs1c1XMU3iFoO&cjtrul3T%sxUw%kbjsDbn`WxW3P>^}{&A;lzi(Q8n$NB1i3k=6ya1V;FkH;Z`BZ&)v)L zXE#U>XShDKz>Nh>vQW?R@5_98W`$7i7#;B#dWVDDe$ioD&}UE5X1M@oKlT|}9ATxH zr(+P>UK8A`nPGJH58giQF!ARSPt_bJQjuUREs!{HVZx%xK8kA$@p{EZL?R=Gg*06M z#vp`YIiaZPQ}~u(B?QAFLtaWO9TLR088)p9svMx0H$=7J=Rud%O@k0{%XfkY-VK0b zsEkL+6fUuvRczG?q@44~kHcok(AmBdM;O+wY1Xz306{6(${9vZxkO`<*4`X{hsTI2 zL-nMGlvM(&U?>WYhExN=kfdDtKPw4k-(UnZA5$zApyoE8uqSXQeZn&uIsZ_Qjw6Pq zaFE8misFbz;x0x1n-V)92wU*NJ2Aq(p?uDxac`2(-?v$>PSFkG&_@a3qCdj-@$;o$$D`)n>k0vwB)%1W5OG#gW|}p8l6%KH}M@+gZJ+ zDY=I6Aw%|ipX^!y%0ACL-pXe6I^%JHKA;eJgOnMcsj}qkNvQV|bR0MI+}*XHUTRu0bd$9|~Y!)2wy{sc?PT`r(OP3C_H_h$up_K@pnK gFs5;~z;g}%0hBatxu2&LivR!s07*qoM6N<$g84+DDF6Tf literal 0 HcmV?d00001 diff --git a/game/modules/icons/icons-2/protect-acid-3.png.import b/game/modules/icons/icons-2/protect-acid-3.png.import new file mode 100644 index 0000000..be702d4 --- /dev/null +++ b/game/modules/icons/icons-2/protect-acid-3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/protect-acid-3.png-148f513b4d4101c7032bae49aae0efa1.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://modules/icons/icons-2/protect-acid-3.png" +dest_files=[ "res://.import/protect-acid-3.png-148f513b4d4101c7032bae49aae0efa1.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/modules/icons/icons-2/protect-eerie-2.png b/game/modules/icons/icons-2/protect-eerie-2.png new file mode 100644 index 0000000000000000000000000000000000000000..85cc9a4ca751202d9ca837ae5febf666952d7a72 GIT binary patch literal 3357 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 literal 0 HcmV?d00001 diff --git a/game/modules/icons/icons-2/protect-eerie-2.png.import b/game/modules/icons/icons-2/protect-eerie-2.png.import new file mode 100644 index 0000000..d7131c1 --- /dev/null +++ b/game/modules/icons/icons-2/protect-eerie-2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/protect-eerie-2.png-bccadc55b87aeb28c975ab0b4740570f.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://modules/icons/icons-2/protect-eerie-2.png" +dest_files=[ "res://.import/protect-eerie-2.png-bccadc55b87aeb28c975ab0b4740570f.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/modules/icons/icons-3/README.txt b/game/modules/icons/icons-3/README.txt new file mode 100644 index 0000000..d6ec7e1 --- /dev/null +++ b/game/modules/icons/icons-3/README.txt @@ -0,0 +1,11 @@ +From https://opengameart.org/content/painterly-spell-icons-part-2 + +License(s): +CC-BY 3.0 +CC-BY-SA 3.0 +GPL 2.0 + +Copyright/Attribution Notice: +J. W. Bjerk (eleazzaar) -- www.jwbjerk.com/art -- find this and other open art at: http://opengameart.org + +Thanks! diff --git a/game/modules/icons/icons-3/beam-jade-2.png b/game/modules/icons/icons-3/beam-jade-2.png new file mode 100644 index 0000000000000000000000000000000000000000..49fb7b0976796ee7791a90f98baa74c2c4865aac GIT binary patch literal 3220 zcmV;F3~Td=P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1bxvLvew{AU$j0*IGb4hV?w4!nFPAm~0bWBc9+ zpNi96Me~r9sg%l$fBkcsf8dWoAQNKdR8q3|3ndh)xM6$#%KmgV>`#5L_vXjAc|Q<_ zJih&T%vI-CjK|M{dxmR2#|`T*#JbVlSvU0SWWr7VHWK4>#$C{j$~ZTvaQ-&6(fJmg zxJ}W2pZC^pll5%A2SP@adc-VGG`#b6e}-d$hjqUAicg16Jg<4U)`&OwT4o+g5Rf14 zy#U(p0R0H^y)(Z?|K0r(e5yL`e~D$%7~$rRKe+hk;O`KB9qgY)^z(-p9>Tu`dCtyr zj^kYo2@y@oC~IzX)*4J~2)WC_&!rfQUZ%3~Z2P04szD{^Y>mP>nu@7-Nb#vWX?u{T(pVx&>?EwtED%Z*!U zRX`sJ5+z9%mLj!N_Z>3PQ_r1y>2)|WpcEsFIMT?2M;Ud3Ytzp#<4iM8o@LgDnxgvK z^*2y+iW+UC*1Y^s!>GymZsC@k#Dy6Uqu_veUI>8Dv@o;mP%Rd63o}~?Nf8M~#)XaP zZXpH;!*CR*d)R%D`%Ac)$bShp`d`SI1>OGxIRof^$L$ZO^;PF&BX+WI#ngIa-*mka zn@X*(f{^h5+faU*578kIP9%;!y4=!HcppMLw}cwDZd~LdhSS^+!3|$p+*7=lj^M8? zYW0N&@9ki_AC>z&XY#C(M&CQNfP))rF5G^KgUv;5dIp~=21b1eL@EkRQrue zP3fJG0ROyUVLzfhmJXKL%ExY^e%4qBzJ`KDTGpsz)M$J`#j;EPeh7Go;UGrbMX>_} zjn3w%{^4RE2>UemEcjN*X_;y{4`i?T0&L#q~j;_QBzIT*HWz<-yu@8*}r=L9~40IR=H7v%z zdJm#m`{pwoYR5LfH=A<`AyQVd`dnNZ=8lHeZ`57M#}_Dvy~E4JPW|Hj9*{{Prxvzr zSURyoIn$~esP?lf-WCU*y&x!7Bft0s=~JHx5_DW+J8e9k_3UT76k1hZKJg!#1DPO& zdykO4tD7?>!ep^YlTSb==+ZSB`#Jq#K&?Vnddx`Codm(8wC0%QOF_#ix>cvORk+wA z7fy1a(cCsH{qbMMJIz%SH9Q?e)dX=!wnz+G1kFL#?NV7{|j#{7mn5=w3rAtapdZw?reUEtOpk;g}vHcAR_cw>YOqjcTlzNFCnMn8IAz8VrRZ#0oz0sr9->h zWjXmK!ivg3IajHLPNeX(m38TQWjU51R7Eu-`#!aH1hABX^3tHpe>4&SJ9~(rdZhN$ zjdK3V>8=TfS)H8ldNQy%!R8`#Rw2%-P1tOPo%!Y{_EAEwj=~QObhG)aGwAPi2f94+ z^@>MWN_*>uLrV6pRcE9X)vZ~s4|E&ms!d5qQ1y#*17ptv5;1)OjwuA_wnd#5e=mRG9dJRMSj&Ija1f#*y@jDDDLb-4v%5b6m60tM-4c+`uZUU{zoB5SM9Mteg&v7#)gAGs)6F1WZAE;%;YdpB z(IDOG+l+zFV%u+WqHvNonlA{7iV@!RR8U~&&{e3E5`RE|Sm&3U@Y6JHM({p4Rfdr0 z=!W~Nm(|{!NGS7)y4SMPvA0zNA(OUU`h`lU+?qz1Dlueh!j(%alO? zqON0i0*1uWP63Uzc3Df;{iC&jNEr^qM|nmwdeIEkX?mf0X@}Zt?x_@2EP>V9N5GJ# zwFO7bu%#A#sC%tsyF95*i!9oFU7fBUc*VlIKr#OYVB)W~EX>4Tx0C=2zkv&MmKpe$iQ>CI62P=p;M5s;{L`5963Pq?8YK2xEOfLNpnlvOS zE{=k0!NHHks)LKOt`4q(Aou~|;_9U6A|?JWDYS_3;J6>}?mh0_0Ya_BG^=e4&~)2O zCE{WxyCQ~O(S->55XO+qEMr!ZlJFg0_XzOyF2=L`&;2>N)ttqEfJi*U4AUlFC!X50 z4bJ<-5muB{;&b9rlP*a7$aTfzH_io@1)do()2TV)2(egbVWovx(bR}1iKD8fQ@)V# zSmnIMSu0goAMvPXS6bmWZkNfxsT)#vvg`Uwzx2Cnp`zgz>RKS{4P zwdfJhvkhEaH#KDsxZDBypA6ZQT`5RY$mfCgGy0}1(0dDXu6n&S_Hp_Eq^Yaq4RCM> zj1(w)&F9@6t-bwwrqSOIS}}5+d$Mnx00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru;|mlO4FkgEd^rFB0@+DKK~y-)1;I~m8$}qv;omzm zYdf~%#Br*mNeHBATBsTcRBlN8IUv3OCysn3E?l{B;ex~g#H9+f9FPhU(5grtxq&|48EH%-)JKpsMQN}yFvNx7U7+3+|3(&>1uqzF1u_Z2z^fY zLyvKkiugd1dCa+oxrJpxwztXGyI>5rf%mn|5-qG)&KPs3=RA`VBQavCh)RM40juP1 zE>X4}=C5O9a><6ZtW*u;S~)I<9O)Uq$R)q2;>1VPJ7R7KjfCJWl})Igj<9WuHk<5V z=xU3}d`dqb@_RGqhoWHQJq{m1!Q@I+8G=jDvkKNMVZX=HVuQP~K+PpQmLm?zlwU9B z%(5J!$KfmF$|BBz3d{wJAR87%_@LKiPnUS41AeX-Je*zQkB6v6wDLGYKvf|stO#^K zy9Nq@y-hxJi=315b-ZGBol*REf*Fi4K0;pMl!z1=_I1QuHt;(wqy$;7^I&zEjo9ED z9dkIIAb%cV1{312#Fiy8^*A4AB%wpKnox8cQbgolLfqTnqs1f#J}^bE;8aU5X;GFH?IQ4P-TuT$Qv z6K*%q`#pF*X65cCpLcpZ%u`-G>BDJGEPkSh0(R;N_Zskam(Q9jyvpXhJUT`G$q@yno@AQR{5K_; zRbT{Cg)-u#h?qPAfgA7ba%oC_DzA{IBjja-mg4#;Nq&u+W{?H65~QvWB2KD+Urk`I zMSHEwx5p=p(>d}uBN@yQ<8kRVwbwaJ=7d5~Dom+p@ca*AB!G0)@MXjR0000 zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1bxk}RtY{AU$j0um322 zzXS9GBF0zOxp55HiU4I>Qx_<+)%!9Ngx+cMXM^#M%lguC(%!rK_y^Va-_m?fM(6k+H^y zsl84k9fW)`wa*9NBE z4m&lEHQ%e-Z#FRA&NFzv?wi;#TrXRxC7%rdUdPeTa3%md0sg*;l3nq4d5nJE1H{aC zqaN8D1HIQ*M)IFmfq0*>UYj#$cl91I7O2Se#pkUVdxbKnGY7$YmOGBHn%c44P?`NP zvD+H>;Nv|J)V@BjGn;3caf}DSxTDCviMdcW2yWjH0`=~Unltd;JuOE5?c51yD0RAnyrrs?w00uCKdqggL5QdpXQ$cd-CBOCU6 zfmGbB{LC+qeb+hfGz`uadcI+^Y74#l>$IoY)5S=@)I_y5jOQx-5eDh`#7DJ2Yo7b? z?*K4)Le#;2iVKlVFQPGT2Vk1|P?q8)5wiYnRv`dMEd>$q$0JIpvU0tisIiM}>!~`4 zUSfSA)S>tD1x!W;MK+AIFk22Fe+-t;Csff$7#PB;afaaOb_68Bit!u`!Q;JjKmob%r|>isR2)2Z+4F|*u}rRMZa!naM^&Q8=14y%+yRFGEjTR zMV~Fvn_7W*%gc!z^%g)LvnRXErCz*hhV(J40wY2g$v+?c$Yj~-L8b!{u6@Z)A zpoi)2^k`!`-hHXpg2A|d<5f#@bUd|M(sm$C$mje*aZxnU_BwmDYAW=q94efe)D*oZ zItsZX4O(Y?1SBh5kK)epYi2PjpEre21{v8Rq(XHeLZ|j4;!M|I38H0zIOeNrjIPZr zwxdf{uLKfuUsMMr>-ou5j4wDQq1EbE1)JY0mCcax8}aL?@ryB(jCDg{mkTkC zMIuS*m$&_^-pV+7I!jK_F%rA^d3CS9H!HGemtd-lpMLt)R?IQ&Tma&A0{iEBBR0;+1wFzM2wM~lf~Fd9R5 zVmXZe*C(L8eN7;vEx1;oDlY~Rv{fzV@I&_Ym53ueiuRhCRH8|YriZMrz2i@9s){Ot za62~%@t{`MdM~f{!S4cUR-<1jz{q;QC)~+Dbq1{WnL{Mk*LLQw4mVqHdoQL%l%B3U zt7JW7N4FvF5rxj<&PIJM5r>zqQP8p%_iye@kn9yBF^K>G0fcEoLr_UWLm+T+Z)Rz1 zWdHzpoPCi!NW(xJ#a~lJ(Tal=ia2DbP8LK(9JLBXs1Ry}Rvk<({emV9Ns5c3;979- zW3lSs;;gHKs~`w|fVj9iDY{6B|4RxjVmvtR$GdxvyLW(4FEh>R7zZ@nHdBeXn8~h+ zU9adx7=wr)AT!IDlcXek$Jadqe7%eDEdO(Vjy^SKF(4ok&oaZbi8qL+H*JISK5>{8 zWtI4xc+8{=58V^%aZ;wj>&s_B$3WIR?mZ*kVj zRo1*Ge_<%6uPk$&<}eai#1bTkP*6n)W!Q+(s*_?NMf-6d|B&mK$fc001V)YpRG>k2 z{osG_yIU(iIpHOR;y~w%<9v(&UAsV|<~ZNSj?*{+g3rK}-tt%Kz|1G;acMK;+4gP1%)#G=+Q~ct4|W$^rwoK+l@jTXP?$4?vo_O5Okmhrnoove$jy z-QC{Xzh|2L{QxM1a*0JsWnTaQ00v@9M??Vs0RI60puMM)00009a7bBm000XU000XU z0RWnu7ytkO2XskIMF-;x6crd3?}|=P0009RNklNS@gFt~&AyS1VJ=C<6NI*pu$t4vc1y>RgiNXQ}qF^HwTiA(@_1e4M zot@d)IUWVyU+{^loY%JYaR|{A*tmpt4UNXL9V}ZBCldzIh>3`Z^^lSRfRqS@7J$UU zrfP;2p4GSq&YY^-6@06uRX3aLUy=#eArkmJt^g z1lxxdszx2@SsqPga4>RM?LeB@{P1MRqACbHmqx`WI19M@$B6MHpc5(%B8#>!@U05c zbxb6JJNJ6%!lhX|!Z0$vet5`@HO0-hO}>4)MVyb(_A@3~&fP~5j^R?PdZ=MM<}d<7 z!Drv^@bUF?jFOap4o-Qn`xFgWc)V2auoyJ?;-_t9n;}Uq87B#9nq^oLY{Q}MYJT24 zbfoOf&uGCoTw0P~jL7LiZcTd^ajCpH$ zmKm?YSKpnI6**dK-hcIFR@*L{#|eLScaRA~vP{$TbM{UglCr?}Z1SRDZ(qs-(oS3bwj}r7&bZXpomCah7rrNxF&2#hDs)$K%b8jn*;i z8#b>jNPant5Hs?!ZdtQLX~KfP#Oq5f8cv0(>tacTr4noNhHnJemWeV9q?C-}7$KlL-N(cs;f#!gOicI>+74MKWHgsl00000 LNkvXXu0mjfA%-ro literal 0 HcmV?d00001 diff --git a/game/modules/icons/icons-3/haste-royal-2.png.import b/game/modules/icons/icons-3/haste-royal-2.png.import new file mode 100644 index 0000000..50c7fc6 --- /dev/null +++ b/game/modules/icons/icons-3/haste-royal-2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/haste-royal-2.png-cd163e8f72a686e7523535ebf65a25b6.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://modules/icons/icons-3/haste-royal-2.png" +dest_files=[ "res://.import/haste-royal-2.png-cd163e8f72a686e7523535ebf65a25b6.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/modules/icons/icons-3/lighting-acid-2.png b/game/modules/icons/icons-3/lighting-acid-2.png new file mode 100644 index 0000000000000000000000000000000000000000..6b47089ad9f00d3fd325fb80e032ae96e845dffb GIT binary patch literal 3404 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�!JWZ9-WT)KBXiel^8z+UBW+grn9OgU$h64k&$2Ig$}y ziNMq_7D{poR}k7fV5C)HGM(b2f5Jbe%QNHWn7cY4eR9afmL+Rf+25#PepO_NW1u|R zSpq_WndaDv&=FZ&@c6Z3cGf1Cywqd)O2OdR?O$eMU!9jE~SN#~g&Lei}1((eUagIWK)SU~EY+%pFeEkeE7JYV18j$8^bN z;p1CXrsfaG>nR>dqymmJ$+tIJj6R}KeMS0ThSG{K7YRa@u-AZxG;y!S@=``wQK%rM z7#O0&kmL~m60*12;DzfMC+`XF-_eBaY{0l{VttSChaF2F4LCX!eE;D&{9cL?n&7@? za2620Gi2*#z}9q?Xu&Xj%@b5bV?`TFwQhLyeaFPK=k8lII={tOXV9iZ4?Tzbg6G~Y z+4?4<`*%PyawNMUp{CEp#fZv`pw;x8oCyl88TtXPF9|~j3L0CE6B8iM3-tDov;B~< zQwU}*1S>*Fx|<~r);v?oA%_+wX6qDtnk2W3#De+j5&J&~{Ej1T3ikdrm?A`GotR|b zkSkAkSrWy9>bj$tR?IF+8c~RG5Yz?!cSmvTY2S0i5_(D_JB6m5TSmtP=idzZ>vl|U zyTt7n%q2mqStm1+2cKKwR{{#{5djnqthY#q0ig1H$lw6-JDPs($kr{Sj?$DE=jp6j i^pU4IC&5A_0pNcMpt1?W_p96h0000 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 literal 0 HcmV?d00001 diff --git a/game/modules/icons/icons-3/vines-plain-2.png.import b/game/modules/icons/icons-3/vines-plain-2.png.import new file mode 100644 index 0000000..1e6f0dc --- /dev/null +++ b/game/modules/icons/icons-3/vines-plain-2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/vines-plain-2.png-3d0c7bfa9b3bcb5be54c391ea218d48c.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://modules/icons/icons-3/vines-plain-2.png" +dest_files=[ "res://.import/vines-plain-2.png-3d0c7bfa9b3bcb5be54c391ea218d48c.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/modules/icons/icons-4/README.txt b/game/modules/icons/icons-4/README.txt new file mode 100644 index 0000000..fb7d29c --- /dev/null +++ b/game/modules/icons/icons-4/README.txt @@ -0,0 +1,24 @@ +Painterly Spell Icon set part 3 + +These icons are released by the artist under the following licenses: +GNU GPL 2.0 +GNU GPL 3.0 +CC-BY 3.0 +CC-BY-SA 3.0 + +Attribution: + +J. W. Bjerk (eleazzaar) -- www.jwbjerk.com/art -- find this and other open art at: http://opengameart.org + + +If you find these icons useful, I'd appreciate it if you send me a line, with a link to your project -- just to satisfy my curiosity. +Also I can probably be commissioned to extend or expand this set at a reasonable rate. + +Enjoy... + +J.W.Bjerk +me AT jwbjerk D0T com + +From https://opengameart.org/content/painterly-spell-icons-part-3 +Thanks! + diff --git a/game/modules/icons/icons-4/explosion-royal-2.png b/game/modules/icons/icons-4/explosion-royal-2.png new file mode 100644 index 0000000000000000000000000000000000000000..27f5a9a107d95e833152b95503f8635417f5ba2e GIT binary patch literal 3086 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 literal 0 HcmV?d00001 diff --git a/game/modules/icons/icons-4/explosion-royal-2.png.import b/game/modules/icons/icons-4/explosion-royal-2.png.import new file mode 100644 index 0000000..fd38f09 --- /dev/null +++ b/game/modules/icons/icons-4/explosion-royal-2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/explosion-royal-2.png-1916fa89496be67d5979356389761480.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://modules/icons/icons-4/explosion-royal-2.png" +dest_files=[ "res://.import/explosion-royal-2.png-1916fa89496be67d5979356389761480.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/modules/icons/icons-4/horror-acid-3.png b/game/modules/icons/icons-4/horror-acid-3.png new file mode 100644 index 0000000000000000000000000000000000000000..b83b74beb6d148bc63b4e397f8f6f426198cbd85 GIT binary patch literal 3133 zcmV-D48rq?P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1b@k|e7Q{Ld+T1P}tG%bS0a>xHS_7`6HafrEHa@1< ze=LvaSIEA1-xFNmrID~J63rN*f4=!x5Mf=^Sn(b3jr+Y1*B%##ACB29fkS>A?{%R6 zcF+$e-;w*(`|s!%=To)$_=_*I`3QqQE`;=F=RYp~QXF54=;s257vbNWyw;Gl<~d#E z43B1uDDSR!_A}VnASynOWn2aS3FGoyic5U;9pDV#eZ$p*1_CO}1r8(Bu)=(Pd+0Ec zX;Q&2QK$IKNi3w)ALMvnVNn5wBMLCgu3E0R(7mPs)AP91ZDdgY_Q3(Nl6aZ9VIYp)h1VTzQU?g#jnOq^E ztsBpj@a&~Tnf5fe2|%QnV*xhEGJwUL5I=l$$<-1I zmsD~oMT(XxQCN~>DI%g$l{A6_lV&X{s#+_#3PlyND)v{*G-|PNOD(t3q-m=i;nTUN zo_p!iwbwx-4$#ENqYN23>I`mzDJIV}^DI-Q&bkn5D=uDXj_C zjUJ@-zVf1mSy##x5jLHqjTsOl4nVwY1Q5`)G4m3bX(P8W^GZmHL@+XKY}^PNF+j*O zP+H-|?t|Q4!p$Z5OSsYhLe6dI{vXIWK=(Ute?V>QI@ce>P8M#T`iSgX#FfNVYJJ8W zlvBWQeXr|`M9TgJiS-trsmw$&_FQW4`+0(bW)cLX;QTBTL#g2R_N>MreNXJFc{SjO zCeEkyEH=KYaa&~Cdgk;wOSnreV3*_HN zxKTFg{8{I5CSl|BD3H(5sp3VQBIj{z?D9Dnh&w+If@88f`q0jl zvyA4ThV%T)HS4jr&%7CFZ^`j>WT@jAp)Pcn`P{G~oYR?)IA^iU>LSnEhEsuw3--lV~5z2MsA>C`>dKGV65D-6C1!7q_E!7M>dE05bXt z@acJMRgcsY+c$EY)t|s~usI8#GlA9n@rf$gToS*Y$21^QkN1iXlf$&YDjjTq9`Xb- z_6%P{k6+-FQsA_+lt6)5EV6FC*xTCUX$hxo90GHJ1@p$JN;G zI8WAHiuW$pQE$R9OR%uwEWsq!x)tzo4^sUCiTcy(aZ^umdvwxuHpa0FnMV&$C zY`k6v0*JXs06Z7{?Dhcp>3rODXc#p4B*z@l0vBjkuV<_wOl{_(u9LvK&z;**$wiv^ z0|YxbSO`hJ(D_fWhF;UMtc%*aC5&qbADrvxTLCnNz_yKzR|Y}dPEEp`7DbGyLkUTC}^u+F>I>OO?K8R`q1XOV|XKhXv74=ZZhW#C~a zxhV=>$h>vqrG`-oEwGKR5a7v|^*~8u7-K;Iw@hIK|j7&0!4qm?W1aIG}l(QuS zvebQ2vcAMdEwqSZPQ#(sq{M}ZAx7?q%(_!J6v(%cWR+UZdiYI;cr zfK;nQ9mL;kTaR&|88Ydk0JVt5?qw(NLb{p}SKU;%KKj@AQ&WnpET;o;sGMlrtz-vH z*?1L*Sdp&&1UMto4W+6%Ssb8MdioG|k`6{%abDDm`dc)52fdp_upwgkYVv@tH*;=n z(e?4>5qE|dtC8AQjbH5rUP%tg>{j*W4k4qhLvb<;PeqwDw<1%5QGYhp?Qd6uM!H(1 zMPY!~*?a^O;jd-x(-E5=c79>(w938OASvc7e)&dr8fWVvlfO>HdvlsMcDPvrjSoQzeAL`S_**Bl z@c}3{8(X47GL8+0Yt2!bCVF0M|BE>hzEl0u6Z503ls?%w0>9l+H}ie|Nq1DbA|$#_gi zXI6#KE4sj=4}%z%6w8jFh2gBevdnavLx^J$OAsMIMg>KbU?WPaPKt#j?Z|x<9r`GPW=Q3J_A>J(_gLuGoPean_A=u z=-CD?uA7>?2VCv|{ZEEuO0E>7$>nmu`x$*x2I##7I@i438v8hX08-Rd;s!W41V;0e zz3%hwj@I7(J=5s#2YRS-s%mDEI{*Lx32;bRa{vGf6951U69E94oEQKA00(qQO+^Re z3ltR_FYKkI4FCWFmq|oHR4C5{!OLr0Wf%wG-}}DbIdeHPb2>@eB+?iq)sWH~lvZI#mM_!IHL3sNvwPlPp#Gz{)xi8yyRoihC@hczUVIy;&O|Rrd4E8UZd2n| zAGS5_kQr}i`)9xKIiGzOU+0t@3Lh?Ci5_3{zQS-T>{}F>X|v?I zQ!}Sui#Lb<(~tSXg2wdF43hQD6S(GgrQEhg7tuaeWXCK$I1UujurtD@i5jlN{|z%CuYlWW9A;|UyL63}f@J7t%_NCaOYX;V2>eh$;u z^=C#hrJ;s9ev~N-Vh7V8F;E9%B2bN_PIg!2x}_%BLP?O1)Ot9tb9=?42o+3+e5U^c X2-ahJaRoC+00000NkvXXu0mjfo>$`& literal 0 HcmV?d00001 diff --git a/game/modules/icons/icons-4/horror-acid-3.png.import b/game/modules/icons/icons-4/horror-acid-3.png.import new file mode 100644 index 0000000..cf5e98b --- /dev/null +++ b/game/modules/icons/icons-4/horror-acid-3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/horror-acid-3.png-0f7b5e203b5c15197f56fb12245a0d30.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://modules/icons/icons-4/horror-acid-3.png" +dest_files=[ "res://.import/horror-acid-3.png-0f7b5e203b5c15197f56fb12245a0d30.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/modules/icons/icons-4/leaf-acid-1.png b/game/modules/icons/icons-4/leaf-acid-1.png new file mode 100644 index 0000000000000000000000000000000000000000..1547714cb933c066a55d842d9e1a1df189de9458 GIT binary patch literal 2695 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 N002ovPDHLkV1lID!CU|U literal 0 HcmV?d00001 diff --git a/game/modules/icons/icons-4/wild-orange-2.png.import b/game/modules/icons/icons-4/wild-orange-2.png.import new file mode 100644 index 0000000..4423eb0 --- /dev/null +++ b/game/modules/icons/icons-4/wild-orange-2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/wild-orange-2.png-a1c2f62becf274e77ab25df55fd4cd00.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://modules/icons/icons-4/wild-orange-2.png" +dest_files=[ "res://.import/wild-orange-2.png-a1c2f62becf274e77ab25df55fd4cd00.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/modules/icons/icons-4/wind-blue-1.png b/game/modules/icons/icons-4/wind-blue-1.png new file mode 100644 index 0000000000000000000000000000000000000000..18241372e18d6394166485fad0fd6e8d2b4c24ff GIT binary patch literal 2631 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 literal 0 HcmV?d00001 diff --git a/game/modules/icons/icons-4/wind-blue-1.png.import b/game/modules/icons/icons-4/wind-blue-1.png.import new file mode 100644 index 0000000..9ff21c2 --- /dev/null +++ b/game/modules/icons/icons-4/wind-blue-1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/wind-blue-1.png-071ec0121c0ad31079f6275496dc9113.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://modules/icons/icons-4/wind-blue-1.png" +dest_files=[ "res://.import/wind-blue-1.png-071ec0121c0ad31079f6275496dc9113.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/game/modules/icons/icons-5/README.txt b/game/modules/icons/icons-5/README.txt new file mode 100644 index 0000000..dc2d436 --- /dev/null +++ b/game/modules/icons/icons-5/README.txt @@ -0,0 +1,23 @@ +Painterly Spell Icon set part 4 + +These icons are released by the artist under the following licenses: +GNU GPL 2.0 +GNU GPL 3.0 +CC-BY 3.0 +CC-BY-SA 3.0 + +Attribution: + +J. W. Bjerk (eleazzaar) -- www.jwbjerk.com/art -- find this and other open art at: http://opengameart.org + + +If you find these icons useful, I'd appreciate it if you send me a line, with a link to your project -- just to satisfy my curiosity. +Also I can probably be commissioned to extend or expand this set at a reasonable rate. + +Enjoy... + +J.W.Bjerk +me AT jwbjerk D0T com + +From https://opengameart.org/content/painterly-spell-icons-part-4 +Thanks! diff --git a/game/modules/icons/icons-5/wind-grasp-acid-2.png b/game/modules/icons/icons-5/wind-grasp-acid-2.png new file mode 100644 index 0000000000000000000000000000000000000000..b7da5295afcd7abe9c76b066ab86993b8c829d20 GIT binary patch literal 2917 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 M07*qoM6N<$f&xsfo&W#< literal 0 HcmV?d00001 diff --git a/game/modules/icons/icons-5/wind-grasp-eerie-2.png.import b/game/modules/icons/icons-5/wind-grasp-eerie-2.png.import new file mode 100644 index 0000000..2d1dd5e --- /dev/null +++ b/game/modules/icons/icons-5/wind-grasp-eerie-2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/wind-grasp-eerie-2.png-9a2ed92dad2306877d6739a288d98058.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://modules/icons/icons-5/wind-grasp-eerie-2.png" +dest_files=[ "res://.import/wind-grasp-eerie-2.png-9a2ed92dad2306877d6739a288d98058.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/modules/icons/icons.png b/game/modules/icons/icons.png new file mode 100644 index 0000000000000000000000000000000000000000..115185bf864c36a381df43ce333d45591cd61648 GIT binary patch literal 1438 zcmeAS@N?(olHy`uVBq!ia0vp^DIm5>XPASgue|l%JNFld4cs zS&*ubT9KK?z)*4P?ey45Z`62N??<{$Yfx!9Qe*eCBP{yVBK8?k#=qz3SE! zMsA%apE;}4diMXD^N>F##HfAAvzc3o?%ecX=g3m#vU`y-XOUnZ7$yK|(rvDIHoj~hR?To(1vc+9nPhi!Y+hnw51 zlm746`zB)A=3NZ9TikB-{};7F^IxY<_m6t!tz5ECR^e~lAKj0a4}I$Bh-df73y*i5xB2&+ z$A5OsG7>o(?sl|b_2zpAk1$UTPJRJ}(03e@ zCUcxqPJX`C?4IGR;z-NSMvrrtIHu~bncYZjm^w+RUdOU%#j1>;t813YZOJ%0Dfrr) z%}+~DgbI5vn|Aih+KAGRPhQ9kBS?Jqg-k)_Lna-imzwXg@05QecBQ^U`oH+j4Hy3M6*0cpSM<9rDt>=)uCR6a z!%HSyW%AELzBO38h3vnzPj)X7{QF<_lIl$A| z8J6&Y$$d`kL|c!;4l+mMgO@J4%9kckcp_kKlz?dA6)lm4PAf#CN)6=yHmUJ?c6Bd) z5LNIYdE=`GkJhYiUai1U*RW%UmF6yw&i~$Ax=A(`?~d=T?%!R`aD9cwtgEJc8M|_q zP3Bab9WCm#{snVCql>^~k<&ATkBZbBzi!Kvv$uP*&i~^2zBQ(UDkW!IaJ(vKINmO1_8tWVXv8R}wPvO47(f{aWbX+B!9 z>gAO4skUK~`G(iDOqZ7We>+qV7ay5sbyiSiV~1*ofWqQ7BdraB%R|+VI?ehfZ1*qm zy8a|@wQxx;OR<1fwv%6*{~mmwxAxGJmgypX40rYWJ{xkilr^T^E!@{HyS$Q#Wqzaf z-nZ+`8fN-mdY!9V#p1H9vHSHlwfBtEtq)w7tT=O$Hfv^4E7ONMxBF9=+439jnXcb{ z&CXB0fv0rpE=E4S#*Ip;>woXry?pcb`tw_U{btN=D_YWZae+OsJYq}oc6R~NK=9Lf zcRi5eEbxddW?oK7@^oe*#A7ad4k`eTb@Bymm?Tl92z({1Q;2W6dYLS$!6(**?T{lBZ1|}zOUWvK-V&O My85}Sb4q9e0H|7IQvd(} literal 0 HcmV?d00001 diff --git a/game/modules/icons/icons.png.import b/game/modules/icons/icons.png.import new file mode 100644 index 0000000..536a662 --- /dev/null +++ b/game/modules/icons/icons.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/icons.png-3101ee0e9ec50bf5f6d426a6b0a534ad.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://modules/icons/icons.png" +dest_files=[ "res://.import/icons.png-3101ee0e9ec50bf5f6d426a6b0a534ad.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=2 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/modules/icons/items/gold.tres b/game/modules/icons/items/gold.tres new file mode 100644 index 0000000..a485146 --- /dev/null +++ b/game/modules/icons/items/gold.tres @@ -0,0 +1,9 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://modules/icons/icons-1/5.png" type="Texture" id=1] + + +[resource] +flags = 4 +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/modules/species/Human/Body.tscn b/game/modules/species/Human/Body.tscn new file mode 100644 index 0000000..5715a55 --- /dev/null +++ b/game/modules/species/Human/Body.tscn @@ -0,0 +1,59 @@ +[gd_scene load_steps=10 format=2] + +[ext_resource path="res://characters/Character.tscn" type="PackedScene" id=1] +[ext_resource path="res://scripts/item_visuals/CharacterAtlasEntry2D.gd" type="Script" id=2] +[ext_resource path="res://scripts/item_visuals/CharacterAtlas2D.gd" type="Script" id=3] +[ext_resource path="res://characters/char_t1_outline_split.png" type="Texture" id=5] +[ext_resource path="res://player/Body.gd" type="Script" id=6] + +[sub_resource type="CharacterAtlasEntry" id=1] +script = ExtResource( 2 ) +front_rect = Rect2( 101, 15, 9, 12 ) +back_rect = Rect2( 74, 18, 9, 12 ) +right_rect = Rect2( 8, 13, 9, 12 ) +left_rect = Rect2( 8, 13, 9, 12 ) + +[sub_resource type="CharacterAtlasEntry" id=2] +script = ExtResource( 2 ) +front_rect = Rect2( 102, 2, 7, 8 ) +back_rect = Rect2( 75, 5, 7, 8 ) +right_rect = Rect2( 9, 0, 7, 8 ) +left_rect = Rect2( 9, 0, 7, 8 ) + +[sub_resource type="CharacterAtlas" id=3] +script = ExtResource( 3 ) +comments = "HUMANOID_BONE_HIP = 0, +HUMANOID_BONE_TORSO = 1, +HUMANOID_BONE_LEG_R = 2, +HUMANOID_BONE_FOOT_R = 3, +HUMANOID_BONE_TOE_R = 4, +HUMANOID_BONE_LEG_L = 5, +HUMANOID_BONE_FOOT_L = 6, +HUMANOID_BONE_TOE_L = 7, +HUMANOID_BONE_ARM_R = 8, +#HUMANOID_BONE_SHOULDER_GUARD_R = 0, +HUMANOID_BONE_HAND_R = 9, +HUMANOID_BONE_FINGERS_R = 10, +HUMANOID_BONE_ARM_L = 11, +#HUMANOID_BONE_SHOULDER_GUARD_L = 0, +HUMANOID_BONE_HAND_L = 12, +HUMANOID_BONE_FINGERS_L = 13, +HUMANOID_BONE_HEAD = 14, +HUMANOID_BONE_HEAD_TOP = 15, +HUMANOID_BONES_MAX = 16," +texture = ExtResource( 5 ) +slots = [ null, SubResource( 1 ), null, null, null, null, null, null, null, null, null, null, null, null, SubResource( 2 ), null ] + +[sub_resource type="CircleShape2D" id=4] +radius = 8.0 + +[node name="Body" type="KinematicBody2D"] +script = ExtResource( 6 ) + +[node name="Character" parent="." instance=ExtResource( 1 )] +front_node_path = NodePath("../../Body/Character/CharacterFrontModel") +side_node_path = NodePath("../../Body/Character/CharacterSideModel") +character_atlas = SubResource( 3 ) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource( 4 ) diff --git a/game/modules/species/species_human.tres b/game/modules/species/species_human.tres new file mode 100644 index 0000000..eac3deb --- /dev/null +++ b/game/modules/species/species_human.tres @@ -0,0 +1,14 @@ +[gd_resource type="EntitySpeciesData" load_steps=3 format=2] + +[ext_resource path="res://modules/species/Human/Body.tscn" type="PackedScene" id=1] + +[sub_resource type="SpeciesModelData" id=1] +bone_structure = 4 +body = ExtResource( 1 ) + +[resource] +resource_name = "Human" +id = 1 +type = 4 +text_name = "Human" +model_datas = [ SubResource( 1 ) ] diff --git a/game/modules/spell_effects/enchanter/Arrow.tscn b/game/modules/spell_effects/enchanter/Arrow.tscn new file mode 100644 index 0000000..865a901 --- /dev/null +++ b/game/modules/spell_effects/enchanter/Arrow.tscn @@ -0,0 +1,3 @@ +[gd_scene format=2] + +[node name="Arrow" type="Spatial"] diff --git a/game/player/Body.gd b/game/player/Body.gd new file mode 100644 index 0000000..b6996f9 --- /dev/null +++ b/game/player/Body.gd @@ -0,0 +1,511 @@ +# Copyright Péter Magyar relintai@gmail.com +# MIT License, functionality from this class needs to be protable to the entity spell system + +# Copyright (c) 2019-2020 Péter Magyar + +# 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. + +extends KinematicBody2D + +export(float) var MOUSE_SENSITIVITY : float = 0.05 +export(String) var world_path : String = "../.." +export(NodePath) var model_path : NodePath = "Rotation_Helper/Model" +export(NodePath) var character_skeleton_path : NodePath = "Character" + +const BASE_SPEED = 60.0 + +const ray_length = 1000 +const ACCEL : float = 100.0 +const DEACCEL : float = 100.0 + +const MOUSE_TARGET_MAX_OFFSET : int = 10 + +var _on : bool = true + +var y_rot : float = 0.0 + +var vel : Vector2 = Vector2() +var dir : Vector2 = Vector2() + +var input_dir : Vector2 = Vector2() +var mouse_dir : Vector2 = Vector2() +var mouse_move_dir : Vector2 = Vector2() +var mouse_left_down : bool = false +var mouse_right_down : bool = false +var touchpad_dir : Vector2 = Vector2() +var mouse_down_delta : Vector2 = Vector2() + +var key_left : bool = false +var key_right : bool = false +var key_up : bool = false +var key_down : bool = false + +var cursor_grabbed : bool = false +var last_cursor_pos : Vector2 = Vector2() +var mouse_down_pos : Vector2 = Vector2() +var total_down_mouse_delta : Vector2 = Vector2() +var target_movement_direction : Vector2 = Vector2() + +var camera : Camera2D + +var animation_run : bool = false + +var moving : bool = false +var casting_anim : bool = false + +var last_mouse_over : Entity = null + +var world : Node2D = null + +var _controlled : bool = false + +var sleep : bool = false +var sleep_recheck_timer : float = 0 +var dead : bool = false +var death_timer : float = 0 + +var entity : Entity +var character_skeleton : CharacterSkeleton2D + +var visibility_update_timer : float = 0 + +func _enter_tree() -> void: + world = get_node(world_path) as Node2D + camera = get_node_or_null("Camera") as Camera2D + + character_skeleton = get_node(character_skeleton_path) + entity = get_node("..") + entity.set_character_skeleton(character_skeleton) +# entity.connect("notification_ccast", self, "on_notification_ccast") + entity.connect("diesd", self, "on_diesd") + entity.connect("isc_controlled_changed", self, "on_c_controlled_changed") + owner = entity + + on_c_controlled_changed(entity.c_is_controlled) + + transform = entity.get_transform_2d(true) + + set_physics_process(true) + +func _process(delta : float) -> void: + if entity.ai_state == EntityEnums.AI_STATE_OFF: + return + + visibility_update_timer += delta + + if visibility_update_timer < 1: + return + + visibility_update_timer = 0 + + var vpos : Vector2 = -get_tree().root.canvas_transform.get_origin() + (get_tree().root.get_visible_rect().size / 2) - position + var l : float = vpos.length_squared() + var rs : float = get_tree().root.size.x * get_tree().root.size.x + rs *= 0.3 + + if l < rs: + if not visible: + show() + set_physics_process(true) + else: + if visible: + hide() + set_physics_process(false) + + +func _physics_process(delta : float) -> void: + if not _on: + return + + if world.initial_generation: + return + + if entity.sentity_data == null: + return + + if dead: + return + + if entity.c_is_controlled: + process_input(delta) + process_movement_player(delta) + else: + if sleep: + sleep_recheck_timer += delta + + if sleep_recheck_timer < 0.5: + return + + sleep_recheck_timer = 0 + +# if world != null: +# if not world.is_position_walkable(transform.origin): +# return + + process_movement_mob(delta) + +func process_input(delta: float) -> void: + var key_dir : Vector2 = Vector2() + + if key_up: + key_dir.y -= 1 + if key_down: + key_dir.y += 1 + if key_left: + key_dir.x -= 1 + if key_right: + key_dir.x += 1 + + input_dir = key_dir + mouse_dir + touchpad_dir + mouse_move_dir + + var state : int = entity.getc_state() + + if state & EntityEnums.ENTITY_STATE_TYPE_FLAG_ROOT != 0 or state & EntityEnums.ENTITY_STATE_TYPE_FLAG_STUN != 0: + input_dir = Vector2() + return + + var input_length : float = input_dir.length_squared() + + if input_length > 0.1: + #handle_graphic_facing(abs(dir.dot(Vector2(0, 1))) > 0.9) + character_skeleton.update_facing(input_dir) + + character_skeleton.get_animation_tree().set("parameters/walking/blend_amount", input_dir.length()) + + +func process_movement(delta : float) -> void: + var state : int = entity.getc_state() + + if state & EntityEnums.ENTITY_STATE_TYPE_FLAG_ROOT != 0 or state & EntityEnums.ENTITY_STATE_TYPE_FLAG_STUN != 0: + moving = false + return + + if (input_dir.length_squared() > 0.1): + moving = true +# entity.moved() + else: + moving = false + + var hvel = vel + + var target = dir + target *= entity.get_speed().ccurrent + + var accel + if dir.dot(hvel) > 0: + accel = ACCEL + else: + accel = DEACCEL + + hvel = hvel.linear_interpolate(target, accel*delta) + vel = hvel + vel = move_and_slide(vel) + + if multiplayer.has_network_peer(): + if not multiplayer.is_network_server(): + rpc_id(1, "sset_position", position) + else: + sset_position(position) + + +func process_movement_player(delta : float) -> void: + var state : int = entity.getc_state() + + if state & EntityEnums.ENTITY_STATE_TYPE_FLAG_ROOT != 0 or state & EntityEnums.ENTITY_STATE_TYPE_FLAG_STUN != 0: + moving = false + return + + if (input_dir.length_squared() > 0.1): + moving = true +# moved() + else: + moving = false + + var hvel = vel + + var target = input_dir.normalized() + +# target *= 100 + target *= entity.getc_speed().current_value / 100.0 * BASE_SPEED + var accel + if dir.dot(hvel) > 0: + accel = ACCEL + else: + accel = DEACCEL + + hvel = hvel.linear_interpolate(target, accel*delta) + vel = hvel + vel = move_and_slide(vel) + + if multiplayer.has_network_peer(): + if not multiplayer.is_network_server(): + rpc_id(1, "sset_position", position) + else: + sset_position(position) + + +func process_movement_mob(delta : float) -> void: + var state : int = entity.getc_state() + + if state & EntityEnums.ENTITY_STATE_TYPE_FLAG_ROOT != 0 or state & EntityEnums.ENTITY_STATE_TYPE_FLAG_STUN != 0: + moving = false + return + + if (target_movement_direction.length_squared() > 0.1): + moving = true +# moved() + else: + moving = false + + if not moving and sleep: + return + + if moving and sleep: + sleep = false + + var hvel = vel + + var target = dir.normalized() + target *= entity.getc_speed().current_value / 100.0 * BASE_SPEED + + var accel + if dir.dot(hvel) > 0: + accel = ACCEL + else: + accel = DEACCEL + + hvel = hvel.linear_interpolate(target, accel*delta) + vel = hvel + vel = move_and_slide(vel) + + sset_position(position) + + if vel.length_squared() < 0.12: + sleep = true + + +func _input(event: InputEvent) -> void: + if not cursor_grabbed: + set_process_input(false) + return + + if event is InputEventMouseMotion and event.device != -1: + var s : float = ProjectSettings.get("display/mouse_cursor/sensitivity") + + var relx : float = event.relative.x * s + var rely : float = event.relative.y * s + + mouse_down_delta.x += relx + mouse_down_delta.y += rely + + total_down_mouse_delta.x += relx + total_down_mouse_delta.y += rely + + get_tree().set_input_as_handled() + +func _unhandled_input(event: InputEvent) -> void: + if event is InputEventKey: + var ievkey : InputEventKey = event as InputEventKey + + if ievkey.scancode == KEY_W: + key_up = ievkey.pressed + if ievkey.scancode == KEY_S: + key_down = ievkey.pressed + if ievkey.scancode == KEY_A: + key_left = ievkey.pressed + if ievkey.scancode == KEY_D: + key_right = ievkey.pressed + + if event is InputEventMouseMotion and not (mouse_right_down or mouse_left_down) and event.device != -1: + cmouseover(event) + + if event is InputEventMouseButton: + if event.button_index == BUTTON_LEFT and event.device != -1: + mouse_left_down = event.pressed + + if mouse_left_down: + mouse_dir = (event.position - get_viewport_rect().size / 2).normalized() + else: + mouse_dir = Vector2() + +# if event.is_pressed() and event.device != -1: +# if event.button_index == BUTTON_WHEEL_UP: +# camera_pivot.camera_distance_set_delta(-0.2) +# if event.button_index == BUTTON_WHEEL_DOWN: +# camera_pivot.camera_distance_set_delta(0.2) + +# if not event.pressed and event.button_index == BUTTON_LEFT and event.device != -1: +# if mouse_down_delta.length() < MOUSE_TARGET_MAX_OFFSET: +# target(event.position) + + if event.pressed and event.button_index == BUTTON_RIGHT and event.device != -1: + target(event.position) + + + if event is InputEventScreenTouch and event.pressed: + target(event.position) + + if event is InputEventMouseMotion and mouse_left_down and event.device != -1: + mouse_dir = (event.position - get_viewport_rect().size / 2).normalized() + + #update_cursor_mode() + + +func update_cursor_mode(): + if mouse_left_down or mouse_right_down: + if not cursor_grabbed: + set_process_input(true) + total_down_mouse_delta = Vector2() + + cursor_grabbed = true + last_cursor_pos = get_viewport().get_mouse_position() + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) + else: + if cursor_grabbed: + set_process_input(false) + cursor_grabbed = false + Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) + get_viewport().warp_mouse(last_cursor_pos) + + if total_down_mouse_delta.length_squared() < 8: + target(last_cursor_pos) + + +func target(position : Vector2): + var space_state = get_world_2d().direct_space_state + var results = space_state.intersect_point(world.make_canvas_position_local(position), 32, [], get_collision_layer()) + #var results = space_state.intersect_point(position, 32, [], 2) + + if results: + for result in results: + if result.collider and result.collider.owner is Entity: + entity.target_crequest_change((result.collider.owner as Node).get_path()) + return + + entity.target_crequest_change(NodePath()) + else: + entity.target_crequest_change(NodePath()) + +func cmouseover(event): + var space_state = get_world_2d().direct_space_state + var results = space_state.intersect_point(world.make_canvas_position_local(position), 32, [], get_collision_layer()) + #var results = space_state.intersect_point(position, 32, [], 2) + + if results: + for result in results: + if result.collider and result.collider.owner is Entity: + var mo : Entity = result.collider.owner as Entity + + if last_mouse_over != null and last_mouse_over != mo: + if is_instance_valid(last_mouse_over): + last_mouse_over.notification_cmouse_exit() + + last_mouse_over = null + + if last_mouse_over == null: + mo.notification_cmouse_enter() + last_mouse_over = mo + + return + + if last_mouse_over != null: + last_mouse_over.notification_cmouse_exit() + last_mouse_over = null + + +func analog_force_change(vector, touchpad): + if touchpad.padname == "TouchPad": + touchpad_dir = vector + touchpad_dir.y *= -1 + elif touchpad.padname == "TargetPad": + #try to target + return + +# +#func on_notification_ccast(what : int, info : SpellCastInfo) -> void: +# if what == SpellEnums.NOTIFICATION_CAST_STARTED: +# if anim_node_state_machine != null and not casting_anim: +# anim_node_state_machine.travel("casting-loop") +# casting_anim = true +# animation_run = false +# elif what == SpellEnums.NOTIFICATION_CAST_FAILED: +# if anim_node_state_machine != null and casting_anim: +# anim_node_state_machine.travel("idle-loop") +# casting_anim = false +# +# if animation_run: +# anim_node_state_machine.travel("run-loop") +# elif what == SpellEnums.NOTIFICATION_CAST_FINISHED: +# if anim_node_state_machine != null: +# anim_node_state_machine.travel("cast-end") +# casting_anim = false +# +# if animation_run: +# anim_node_state_machine.travel("run-loop") +# elif what == SpellEnums.NOTIFICATION_CAST_SUCCESS: +# if anim_node_state_machine != null: +# anim_node_state_machine.travel("cast-end") +# casting_anim = false +# +# if animation_run: +# anim_node_state_machine.travel("run-loop") + + +func on_c_controlled_changed(val): + #create camera and pivot if true + _controlled = val + + if val: + camera = Camera2D.new() + camera.zoom = Vector2(0.8, 0.8) + add_child(camera) + camera.current = true + + #var uiscn : PackedScene = ResourceLoader.load("res://ui/player_ui/player_ui.tscn") + #var ui = uiscn.instance() + #add_child(ui) + var ui = DataManager.request_instance(DataManager.PLAYER_UI_INSTANCE) + add_child(ui) + + set_process_input(true) + set_process_unhandled_input(true) + else: + if camera: + camera.queue_free() + camera = null + + set_process_input(false) + set_process_unhandled_input(false) + var nameplatescn : PackedScene = ResourceLoader.load("res://ui/nameplates/NamePlate.tscn") + var nameplate = nameplatescn.instance() + get_parent().add_child(nameplate) + + + +remote func sset_position(pposition : Vector2) -> void: + if multiplayer.network_peer and multiplayer.is_network_server(): + entity.vrpc("cset_position", position) + + if _controlled: + cset_position(position) + +remote func cset_position(pposition : Vector2) -> void: + pposition = pposition + + diff --git a/game/player/CharacterSkeleton2DGD.gd b/game/player/CharacterSkeleton2DGD.gd new file mode 100644 index 0000000..9836cca --- /dev/null +++ b/game/player/CharacterSkeleton2DGD.gd @@ -0,0 +1,144 @@ +extends CharacterSkeleton2D +class_name CharacterSkeleton2DGD + +# Copyright Péter Magyar relintai@gmail.com +# MIT License, functionality from this class needs to be protable to the entity spell system + +# Copyright (c) 2019 Péter Magyar + +# 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. + +export (NodePath) var front_node_path : NodePath = "" +export (NodePath) var front_animation_player_path : NodePath = "" +export (NodePath) var front_animation_tree_path : NodePath = "" + +export (NodePath) var side_node_path : NodePath = "" +export (NodePath) var side_animation_player_path : NodePath = "" +export (NodePath) var side_animation_tree_path : NodePath = "" + +export(CharacterAtlas) var character_atlas : CharacterAtlas setget set_character_atlas + +var _atlas : CharacterAtlas2D + +enum CharacterFacing { + FACING_FRONT = 0, + FACING_BACK = 1, + FACING_RIGHT = 2, + FACING_LEFT = 3, +} + +var _facing : int = 0 + +var _front_node : CharacterBones = null +var _front_animation_player : AnimationPlayer = null +var _front_animation_tree : AnimationTree = null + +var _side_node : CharacterBones = null +var _side_animation_player : AnimationPlayer = null +var _side_animation_tree : AnimationTree = null + +var _active_node : CharacterBones = null +var _active_animation_player : AnimationPlayer = null +var _active_animation_tree : AnimationTree = null + +var _is_front_side : bool = false + +var effects : Array + +func _ready() -> void: + _front_node = get_node(front_node_path) as CharacterBones + _front_animation_player = get_node(front_animation_player_path) as AnimationPlayer + _front_animation_tree = get_node(front_animation_tree_path) as AnimationTree + + _side_node = get_node(side_node_path) as CharacterBones + _side_animation_player = get_node(side_animation_player_path) as AnimationPlayer + _side_animation_tree = get_node(side_animation_tree_path) as AnimationTree + + set_character_atlas(character_atlas) + + _front_node.hide() + _side_node.show() + _active_node = _side_node + _active_animation_player = _side_animation_player + _active_animation_tree = _side_animation_tree + _is_front_side = false + +func update_facing(input_direction : Vector2) -> void: + var front : bool = abs(input_direction.dot(Vector2(0, 1))) > 0.9 + + if front: + if not _is_front_side: + _is_front_side = true + + _side_node.hide() + _front_node.show() + + _active_node = _front_node + _active_animation_tree = _front_animation_tree + + if input_direction.y > 0: + set_facing(CharacterFacing.FACING_FRONT) + else: + set_facing(CharacterFacing.FACING_BACK) + + else: + if _is_front_side: + _is_front_side = false + + _side_node.show() + _front_node.hide() + + _active_node = _side_node + _active_animation_tree = _side_animation_tree + + if input_direction.x > 0.01 and _facing != CharacterFacing.FACING_RIGHT: + set_facing(CharacterFacing.FACING_RIGHT) + _active_node.transform.x.x = -1 + elif input_direction.x < -0.01 and _facing != CharacterFacing.FACING_LEFT: + set_facing(CharacterFacing.FACING_LEFT) + _active_node.transform.x.x = 1 + +func add_effect(bone_id : int, effect : PackedScene) -> void: + pass + +func remove_effect(bone_id : int, effect : PackedScene) -> void: + pass + +func get_animation_player() -> AnimationPlayer: + return _active_animation_player + +func get_animation_tree() -> AnimationTree: + return _active_animation_tree + +func set_character_atlas(atlas : CharacterAtlas) -> void: + character_atlas = atlas + + _atlas = atlas as CharacterAtlas2D + + if _front_node != null: + _front_node.set_atlas(_atlas) + + if _front_node != null: + _side_node.set_atlas(_atlas) + +func set_facing(facing : int) -> void: + _facing = facing + + _active_node.set_facing(facing) + diff --git a/game/player/CharacterSkeletonAttachPoint.gd b/game/player/CharacterSkeletonAttachPoint.gd new file mode 100644 index 0000000..178058f --- /dev/null +++ b/game/player/CharacterSkeletonAttachPoint.gd @@ -0,0 +1,75 @@ +extends Spatial +class_name CharacterSkeketonAttachPoint + +# Copyright Péter Magyar relintai@gmail.com +# MIT License, functionality from this class needs to be protable to the entity spell system + +# Copyright (c) 2019 Péter Magyar + +# 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. + +var effects : Dictionary +var timed_effects : Dictionary + +func add_effect(effect : PackedScene) -> void: + if effects.has(effect): + effects[effect][0] = effects[effect][0] + 1 + else: + var eff : Node = effect.instance() + + add_child(eff) + eff.owner = self + + var data : Array = [ 1, eff ] + effects[effect] = data + +func add_effect_timed(effect : PackedScene, time : float) -> void: + if timed_effects.has(effect): + timed_effects[effect][0] = timed_effects[effect][0] + 1 + else: + var eff : Node = effect.instance() + + add_child(eff) + eff.owner = self + + var data : Array = [ 1, eff, time ] + timed_effects[effect] = data + +func remove_effect(effect : PackedScene) -> void: + if effects.has(effect): + var data : Array = effects[effect] + + data[0] = data[0] - 1 + + if data[0] <= 0: + data[1].queue_free() + + effects.erase(effect) + + +func _process(delta : float) -> void: + for k in timed_effects.keys(): + var data : Array = timed_effects[k] + + data[2] -= delta + + if data[2] <= 0: + data[1].queue_free() + + timed_effects.erase(k) diff --git a/game/player/CharacterSkeletonGD.gd b/game/player/CharacterSkeletonGD.gd new file mode 100644 index 0000000..49a7a52 --- /dev/null +++ b/game/player/CharacterSkeletonGD.gd @@ -0,0 +1,26 @@ +tool +extends CharacterSkeleton3D + +# Copyright Péter Magyar relintai@gmail.com +# MIT License, functionality from this class needs to be protable to the entity spell system + +# Copyright (c) 2019 Péter Magyar + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + diff --git a/game/player/DisplayPlayer.gd b/game/player/DisplayPlayer.gd new file mode 100644 index 0000000..e8efe1f --- /dev/null +++ b/game/player/DisplayPlayer.gd @@ -0,0 +1,53 @@ +extends Entity +class_name DisplayPlayerGD + +# Copyright Péter Magyar relintai@gmail.com +# MIT License, functionality from this class needs to be protable to the entity spell system + +# Copyright (c) 2019 Péter Magyar + +# 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. +# +#func _setup(): +# setup_actionbars() + + +#func _son_level_up(level: int) -> void: +# if sentity_data == null: +# return +# +# var ecd : EntityClassData = sentity_data.entity_class_data +# +# if ecd == null: +# return +# +# sfree_spell_points += ecd.spell_points_per_level * level +# sfree_talent_points += level +# +# for i in range(Stat.MAIN_STAT_ID_COUNT): +# var st : int = sentity_data.entity_class_data.get_stat_data().get_level_stat_data().get_stat_diff(i, slevel - level, slevel) +# +# var statid : int = i + Stat.MAIN_STAT_ID_START +# +# var stat : Stat = get_stat_int(statid) +# +# var sm : StatModifier = stat.get_modifier(0) +# sm.base_mod += st +# +# diff --git a/game/player/DisplayPlayer.tscn b/game/player/DisplayPlayer.tscn new file mode 100644 index 0000000..a99ddf4 --- /dev/null +++ b/game/player/DisplayPlayer.tscn @@ -0,0 +1,26 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://player/DisplayPlayer.gd" type="Script" id=1] + +[node name="DisplayPlayer" type="Entity" groups=[ +"players", +]] +body_path = NodePath("KinematicBody2D") +character_skeleton_path = NodePath("KinematicBody2D/Rotation_Helper/Model") +sseed = 9240987 +cseed = 9240987 +script = ExtResource( 1 ) + +[node name="KinematicBody2D" type="KinematicBody2D" parent="."] + +[node name="Rotation_Helper" type="Spatial" parent="KinematicBody2D"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.960532, 0 ) +__meta__ = { +"_editor_description_": "" +} + +[node name="Model" type="Spatial" parent="KinematicBody2D/Rotation_Helper"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.875205, 0 ) +__meta__ = { +"_editor_description_": "" +} diff --git a/game/player/GUI.gd b/game/player/GUI.gd new file mode 100644 index 0000000..9d4a993 --- /dev/null +++ b/game/player/GUI.gd @@ -0,0 +1,38 @@ +extends Control + +# Copyright (c) 2019 Péter Magyar +# +# 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. + +export (String) var player_path : String = "../../.." +export (Array, NodePath) var child_controls : Array + +func _ready() -> void: + if player_path != null: + var player : Entity = get_node(player_path) as Entity + + if (player == null): + print("Player is null!") + return + + for child_path in child_controls: + var child = get_node(child_path) + + child.set_player(player) + diff --git a/game/player/HumanoidCharacterBones2D.gd b/game/player/HumanoidCharacterBones2D.gd new file mode 100644 index 0000000..32c0f2c --- /dev/null +++ b/game/player/HumanoidCharacterBones2D.gd @@ -0,0 +1,76 @@ +extends CharacterBones +class_name HumanoidCharacterBones2D + +# Copyright Péter Magyar relintai@gmail.com +# MIT License, functionality from this class needs to be protable to the entity spell system + +# Copyright (c) 2019 Péter Magyar + +# 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. + +enum HumanoidBones { + HUMANOID_BONE_HIP = 0, + HUMANOID_BONE_TORSO = 1, + HUMANOID_BONE_LEG_R = 2, + HUMANOID_BONE_FOOT_R = 3, + HUMANOID_BONE_TOE_R = 4, + HUMANOID_BONE_LEG_L = 5, + HUMANOID_BONE_FOOT_L = 6, + HUMANOID_BONE_TOE_L = 7, + HUMANOID_BONE_ARM_R = 8, + #HUMANOID_BONE_SHOULDER_GUARD_R = 0, + HUMANOID_BONE_HAND_R = 9, + HUMANOID_BONE_FINGERS_R = 10, + HUMANOID_BONE_ARM_L = 11, + #HUMANOID_BONE_SHOULDER_GUARD_L = 0, + HUMANOID_BONE_HAND_L = 12, + HUMANOID_BONE_FINGERS_L = 13, + HUMANOID_BONE_HEAD = 14, + HUMANOID_BONE_HEAD_TOP = 15, + + HUMANOID_BONES_MAX = 16, +} + +export (String, MULTILINE) var help : String +export (Array, NodePath) var bones : Array + +var _atlas : CharacterAtlas2D + +func set_facing(facing : int) -> void: + if _atlas == null: + return + + for i in range(len(_atlas.slots)): + var entry : CharacterAtlasEntry2D = _atlas.slots[i] as CharacterAtlasEntry2D + + if entry == null: + continue + + var r : Rect2 = entry.get_index(facing) as Rect2 + + var bone : Sprite = get_node(bones[i]) as Sprite + + if bone == null: + continue + + bone.region_rect = r + + +func set_atlas(atlas : CharacterAtlas2D) -> void: + _atlas = atlas diff --git a/game/player/Mob.gd b/game/player/Mob.gd new file mode 100644 index 0000000..5f17558 --- /dev/null +++ b/game/player/Mob.gd @@ -0,0 +1,172 @@ +extends Entity +class_name MobGD + +# Copyright Péter Magyar relintai@gmail.com +# MIT License, functionality from this class needs to be protable to the entity spell system + +# Copyright (c) 2019 Péter Magyar + +# 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. + +var dead : bool = false +var death_timer : float = 0 + +func _ready() -> void: + ai_state = EntityEnums.AI_STATE_PATROL + +func _enter_tree(): + set_process(true) + +func _process(delta : float) -> void: + if dead: + death_timer += delta + + if death_timer > 60: + queue_free() + + return + + + +func sstart_attack(entity : Entity) -> void: + ai_state = EntityEnums.AI_STATE_ATTACK + + starget = entity + +func _notification_cmouse_enter() -> void: + if centity_interaction_type == EntityEnums.ENITIY_INTERACTION_TYPE_LOOT: + Input.set_default_cursor_shape(Input.CURSOR_CROSS) + elif centity_interaction_type == EntityEnums.ENITIY_INTERACTION_TYPE_NONE: + Input.set_default_cursor_shape(Input.CURSOR_ARROW) + elif centity_interaction_type == EntityEnums.ENITIY_INTERACTION_TYPE_TRAIN: + Input.set_default_cursor_shape(Input.CURSOR_HELP) + elif centity_interaction_type == EntityEnums.ENITIY_INTERACTION_TYPE_VENDOR: + Input.set_default_cursor_shape(Input.CURSOR_HELP) + else: + Input.set_default_cursor_shape(Input.CURSOR_MOVE) + +func _notification_cmouse_exit() -> void: + Input.set_default_cursor_shape(Input.CURSOR_ARROW) + +func _notification_sdeath(): + if dead: + return + + if starget == null: + queue_free() + return + + #warning-ignore:unused_variable + for i in range(aura_gets_count()): + aura_removes(aura_gets(0)) + + dead = true + + var ldiff : float = slevel - starget.slevel + 10.0 + + if ldiff < 0: + ldiff = 0 + + if ldiff > 15: + ldiff = 15 + + ldiff /= 10.0 + + starget.xp_adds(int(5.0 * slevel * ldiff)) + + starget = null + + if sentity_data.loot_db != null: + sentity_interaction_type = EntityEnums.ENITIY_INTERACTION_TYPE_LOOT + else: + sentity_interaction_type = EntityEnums.ENITIY_INTERACTION_TYPE_NONE + + ai_state = EntityEnums.AI_STATE_OFF + + +func set_position(position : Vector3, rotation : Vector3) -> void: + get_body().set_position(position, rotation) + +func _notification_sdamage(what, info): + if what == SpellEnums.NOTIFICATION_DAMAGE_DAMAGE_DEALT: + if ai_state != EntityEnums.AI_STATE_ATTACK and info.dealer != self: + sstart_attack(info.dealer) + +func _notification_cdamage(what, info): + if what == SpellEnums.NOTIFICATION_DAMAGE_DAMAGE_DEALT: + WorldNumbers.damage(get_body().position, 1.6, info.damage, info.crit) + +func _notification_cheal(what, info): + if what == SpellEnums.NOTIFICATION_DAMAGE_DAMAGE_DEALT: + WorldNumbers.heal(get_body().position, 1.6, info.heal, info.crit) + +func _notification_sxp_gained(value : int) -> void: + if not ESS.can_character_level_up(slevel): + return + + var xpr : int = ESS.get_character_xp(slevel); + + if xpr <= sxp: + levelups(1) + sxp = 0 + +func _notification_sclass_level_up(value: int): + ._notification_sclass_level_up(value) + refresh_spells(value) + +func _notification_scharacter_level_up(value: int) -> void: + ._notification_scharacter_level_up(value) + refresh_spells(value) + +func refresh_spells(value: int): + if gets_free_spell_points() == 0 and gets_free_class_talent_points() == 0: + return + + var ecd : EntityClassData = sentity_data.entity_class_data + + if ecd == null: + return + + var arr : Array = Array() + + for i in range(ecd.get_num_spells()): + arr.append(ecd.get_spell(i)) + + randomize() + arr.shuffle() + + for _v in range(value): + for i in range(arr.size()): + var spell : Spell = arr[i] + + if not spell_hass(spell): + var spnum :int = spell_gets_count() + + spell_learn_requestc(spell.id) + + if spnum != spell_gets_count(): + break + + if sfree_spell_points == 0: + break + + + if sfree_spell_points == 0: + break + diff --git a/game/player/Mob.tscn b/game/player/Mob.tscn new file mode 100644 index 0000000..c407b76 --- /dev/null +++ b/game/player/Mob.tscn @@ -0,0 +1,24 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://ui/nameplates/NamePlate.tscn" type="PackedScene" id=1] +[ext_resource path="res://characters/Character.tscn" type="PackedScene" id=2] +[ext_resource path="res://player/Mob.gd" type="Script" id=3] + +[sub_resource type="CircleShape2D" id=1] +radius = 20.0 + +[node name="Mob" type="Entity" groups=[ +"mobs", +]] +body_path = NodePath("KinematicBody2D") +character_skeleton_path = NodePath("KinematicBody2D/Character") +script = ExtResource( 3 ) + +[node name="NamePlate" parent="." instance=ExtResource( 1 )] + +[node name="KinematicBody2D" type="KinematicBody2D" parent="."] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="KinematicBody2D"] +shape = SubResource( 1 ) + +[node name="Character" parent="KinematicBody2D" instance=ExtResource( 2 )] diff --git a/game/player/MobTest.gd b/game/player/MobTest.gd new file mode 100644 index 0000000..de16874 --- /dev/null +++ b/game/player/MobTest.gd @@ -0,0 +1,46 @@ +extends Entity +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" + +# Called when the node enters the scene tree for the first time. +func _ready(): + connect("con_damage_taken", self, "c_on_damage_taken") + connect("son_damage_taken", self, "s_on_damage_taken") + #c_on_damage_taken( Entity Entity, DamagePipelineData damage_pipeline_data ) + + pass # Replace with function body. + +# Called every frame. 'delta' is the elapsed time since the previous frame. +#func _process(delta): +# pass + +func c_on_damage_taken(entity, dpd): + print("c " + str(dpd.damage)) +# print("ch " + str(heal_getth().ccurrent) + "/" + str(heal_getth().cmax)) + pass + +func s_on_damage_taken(entity, dpd): + print("s " + str(dpd.damage)) + #print("ch " + str(heal_getth().scurrent) + "/" + str(heal_getth().smax)) + pass diff --git a/game/player/NamePlate.gd b/game/player/NamePlate.gd new file mode 100644 index 0000000..799c20d --- /dev/null +++ b/game/player/NamePlate.gd @@ -0,0 +1,150 @@ +extends VBoxContainer + +# Copyright (c) 2019 Péter Magyar +# +# 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. + +export(float) var max_distance : float = 70 setget set_max_distance +var max_distance_squared : float = max_distance * max_distance + +export(NodePath) var name_label_path : NodePath = "Name" +export(NodePath) var health_bar_path : NodePath = "HealthBar" +export(NodePath) var health_bar_label_path : NodePath = "HealthBar" + +export(Color) var normal_color : Color = Color("#e7e7e7") +export(Vector2) var normal_scale : Vector2 = Vector2(0.75, 0.75) +export(Color) var mouseover_color : Color = Color("#ffffff") +export(Vector2) var mouseover_scale : Vector2 = Vector2(0.85, 0.85) +export(Color) var targeted_color : Color = Color("#ffffff") +export(Vector2) var targeted_scale : Vector2 = Vector2(0.85, 0.85) + +var target_scale : Vector2 +var interpolating : bool + +var targeted : bool = false + +var name_label : Label = null +var health_bar : TextureProgress = null +var health_bar_label : Label = null + +var entity : Entity = null +var health : EntityResource = null + +var _health : EntityResource + +func _enter_tree(): + name_label = get_node(name_label_path) as Label + health_bar = get_node(health_bar_path) as TextureProgress + health_bar_label = get_node(health_bar_label_path) as Label + + entity = get_node("..") as Entity + entity.connect("centity_resource_added", self, "on_centity_resource_added") + + name_label.text = entity.centity_name + + entity.connect("cname_changed", self, "cname_changed") + entity.connect("notification_cmouse_entered", self, "onc_entity_mouse_entered") + entity.connect("notification_cmouse_exited", self, "onc_entity_mouse_exited") + entity.connect("notification_ctargeted", self, "notification_ctargeted") + entity.connect("notification_cuntargeted", self, "notification_cuntargeted") + + modulate = normal_color + set_scale(normal_scale) + + target_scale = normal_scale + interpolating = false + + set_process(true) + +func _process(delta): + if interpolating: + var d : Vector2 = ((target_scale - get_scale()).normalized() * delta) + get_scale() + + set_scale(d) + + if (get_scale() - target_scale).length() < 0.04: + interpolating = false + + var position : Vector2 = entity.get_body().position + + position.x -= (rect_size.x / 2.0) * rect_scale.x + position.y -= 60 + + set_position(position) + + +func set_max_distance(var value : float) -> void: + max_distance_squared = value * value + + max_distance = value + +func c_health_changed() -> void: + if _health.max_value == 0: + health_bar.max_value = 1 + health_bar.value = 0 + return + + health_bar.max_value = _health.max_value + health_bar.value = _health.current_value + +# if stat.cmax != 0: +# health_bar_label.text = str(int(stat.ccurrent / stat.cmax * 100)) + + +func cname_changed(ent : Entity) -> void: + name_label.text = ent.centity_name + +func onc_entity_mouse_entered() -> void: + if targeted: + return + + modulate = mouseover_color + interpolate_scale(mouseover_scale) + +func onc_entity_mouse_exited() -> void: + if targeted: + return + + modulate = normal_color + interpolate_scale(normal_scale) + + +func notification_ctargeted() -> void: + targeted = true + + modulate = targeted_color + interpolate_scale(targeted_scale) + +func notification_cuntargeted() -> void: + targeted = false + + modulate = normal_color + interpolate_scale(normal_scale) + +func interpolate_scale(target : Vector2) -> void: + target_scale = target + interpolating = true + +func on_centity_resource_added(resorce) -> void: + if health != null: + return + + _health = entity.getc_health() + _health.connect("changed", self, "c_health_changed") + c_health_changed() diff --git a/game/player/NetworkedPlayer.gd b/game/player/NetworkedPlayer.gd new file mode 100644 index 0000000..33775d3 --- /dev/null +++ b/game/player/NetworkedPlayer.gd @@ -0,0 +1,120 @@ +extends "PlayerGDBase.gd" +class_name NetworkedPlayerGD + +# Copyright Péter Magyar relintai@gmail.com +# MIT License, functionality from this class needs to be protable to the entity spell system + +# Copyright (c) 2019 Péter Magyar + +# 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. + +#export (float) var MOUSE_SENSITIVITY : float = 0.05 +#export (String) var map_path : String + +#const ray_length = 1000 +#const ACCEL : float = 100.0 +#const DEACCEL : float = 100.0 +#const GRAVITY : float = -24.8 +#const JUMP_SPEED : float = 3.8 +#const MAX_SLOPE_ANGLE : float = 40.0 +#const MOUSE_TARGET_MAX_OFFSET : int = 10 +# +##var _on : bool = true +# +#var y_rot : float = 0.0 +# +##var vel : Vector3 = Vector3() +##var dir : Vector3 = Vector3() +# +#var animation_tree : AnimationTree +#var anim_node_state_machine : AnimationNodeStateMachinePlayback = null +##var animation_run : bool = false +# +#func _ready() -> void: +# animation_tree = get_character_skeleton().get_animation_tree() +# +# if animation_tree != null: +# anim_node_state_machine = animation_tree["parameters/playback"] + + +#func _physics_process(delta : float) -> void: +# if not _on: +# return +# + #process_movement(delta) + +#func process_movement(delta : float) -> void: +# if input_dir.x > 0.1 or input_dir.y > 0.1 or input_dir.x < -0.1 or input_dir.y < -0.1: +# var forward : Vector3 = Vector3(0, 0, 1).rotated(Vector3(0, 1, 0), deg2rad(y_rot)) +# var right : Vector3 = forward.cross(Vector3(0, 1, 0)) * -input_dir.x +# forward *= input_dir.y #only potentially make it zero after getting the right vector +# +# dir = forward +# dir += right +# +# if dir.length_squared() > 0.1: +# dir = dir.normalized() +# else: +# dir = Vector3() +# +# vel.y += delta * GRAVITY +# +# var hvel : Vector3 = vel +# hvel.y = 0 +# +# var target : Vector3 = dir +# target *= get_speed().ccurrent +# +# var accel +# if dir.dot(hvel) > 0: +# accel = ACCEL +# else: +# accel = DEACCEL +# +# hvel = hvel.linear_interpolate(target, accel * delta) as Vector3 +# vel.x = hvel.x +# vel.z = hvel.z +# vel = move_and_slide(vel, Vector3(0,1,0), false, 4, deg2rad(MAX_SLOPE_ANGLE)) + + +#remote func set_position(position : Vector3, rot : Vector3) -> void: +# translation = position +# rotation = rot +# +#remote func sset_position(pposition : Vector2, protation : float) -> void: +# +## if get_network_master() != 1: +## print(str(get_network_master()) + "npsset") +# +# if multiplayer.network_peer and multiplayer.is_network_server(): +# cset_position(pposition, protation) +# vrpc("cset_position", pposition, protation) +# +#remote func cset_position(pposition : Vector2, protation : float) -> void: +## if get_network_master() != 1: +## print(str(get_network_master()) + "npcset") +# +# get_body().position = pposition +# get_body().rotation = protation +# +#func _moved() -> void: +# +# if sis_casting(): +# sfail_cast() +# diff --git a/game/player/NetworkedPlayer.tscn b/game/player/NetworkedPlayer.tscn new file mode 100644 index 0000000..81f6386 --- /dev/null +++ b/game/player/NetworkedPlayer.tscn @@ -0,0 +1,27 @@ +[gd_scene load_steps=7 format=2] + +[ext_resource path="res://player/NetworkedPlayer.gd" type="Script" id=1] +[ext_resource path="res://ui/nameplates/NamePlate.tscn" type="PackedScene" id=2] +[ext_resource path="res://characters/Character.tscn" type="PackedScene" id=3] + +[sub_resource type="EntityResourceHealth" id=1] + +[sub_resource type="EntityResourceSpeed" id=2] + +[sub_resource type="CircleShape2D" id=3] +radius = 20.0 + +[node name="NetworkedPlayer" type="Entity"] +body_path = NodePath("KinematicBody2D") +character_skeleton_path = NodePath("KinematicBody2D/Character") +sresources = [ SubResource( 1 ), SubResource( 2 ) ] +script = ExtResource( 1 ) + +[node name="NamePlate" parent="." instance=ExtResource( 2 )] + +[node name="KinematicBody2D" type="KinematicBody2D" parent="."] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="KinematicBody2D"] +shape = SubResource( 3 ) + +[node name="Character" parent="KinematicBody2D" instance=ExtResource( 3 )] diff --git a/game/player/Player.gd b/game/player/Player.gd new file mode 100644 index 0000000..3ae599f --- /dev/null +++ b/game/player/Player.gd @@ -0,0 +1,32 @@ +extends "PlayerGDBase.gd" +class_name PlayerGD + +# Copyright Péter Magyar relintai@gmail.com +# MIT License, functionality from this class needs to be protable to the entity spell system + +# Copyright (c) 2019 Péter Magyar + +# 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. + +func _from_dict(dict): + ._from_dict(dict) + + randomize() + sseed = randi() + diff --git a/game/player/Player.tscn b/game/player/Player.tscn new file mode 100644 index 0000000..e00d396 --- /dev/null +++ b/game/player/Player.tscn @@ -0,0 +1,13 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://player/Player.gd" type="Script" id=2] + +[sub_resource type="EntityResourceHealth" id=1] + +[sub_resource type="EntityResourceSpeed" id=2] + +[node name="Player" type="Entity" groups=[ +"players", +]] +sresources = [ SubResource( 1 ), SubResource( 2 ) ] +script = ExtResource( 2 ) diff --git a/game/player/PlayerGDBase.gd b/game/player/PlayerGDBase.gd new file mode 100644 index 0000000..b828206 --- /dev/null +++ b/game/player/PlayerGDBase.gd @@ -0,0 +1,109 @@ +extends Entity + +# Copyright Péter Magyar relintai@gmail.com +# MIT License, functionality from this class needs to be protable to the entity spell system + +# Copyright (c) 2019 Péter Magyar + +# 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. + +var _timer : float = randf() * 2.0 + +var _query : Physics2DShapeQueryParameters +var _shape : SphereShape + +func _ready(): + _shape = SphereShape.new() + _shape.radius = 50 + + _query = Physics2DShapeQueryParameters.new() + _query.exclude = [ self ] + _query.shape_rid = _shape.get_rid() + + set_physics_process(true) + +func _physics_process(delta): +# if (multiplayer.has_network_peer() and multiplayer.is_network_server()) or not multiplayer.has_network_peer(): + if multiplayer.has_network_peer() and multiplayer.is_network_server(): + _timer += delta + + if _timer > 3: + _timer -= 3 + + update_visibility() + +func update_visibility() -> void: + _query.collision_layer = get_body().get_collision_layer() + + _query.transform = Transform2D(0, get_body().position) + var res : Array = get_body().get_world_2d().direct_space_state.intersect_shape(_query) + + #warning-ignore:unassigned_variable + var currenty_sees : Array = Array() + + for collision in res: + var collider = collision["collider"] + + if collider is Entity and not currenty_sees.has(collider): + currenty_sees.append(collider) + + + #warning-ignore:unassigned_variable + var used_to_see : Array = Array() + + for i in range(sees_gets_count()): + var ent : Entity = sees_gets(i) + + used_to_see.append(ent) + + + #warning-ignore:unassigned_variable + var currenty_sees_filtered : Array = Array() + + for e in currenty_sees: + currenty_sees_filtered.append(e) + + for e in currenty_sees: + if used_to_see.has(e): + used_to_see.erase(e) + currenty_sees_filtered.erase(e) + + for e in used_to_see: + var ent : Entity = e as Entity + + if self.get_network_master() != 1: + ESS.entity_spawner.despawn_for(self, ent) + + sees_removes(ent) + + for e in currenty_sees_filtered: + var ent : Entity = e as Entity + + if self.get_network_master() != 1: + ESS.entity_spawner.spawn_for(self, ent) + + sees_adds(ent) + + +remote func set_position_remote(pos : Vector2) -> void: + if get_tree().is_network_server(): + rpc("set_position_remote", pos) + #print(position) + get_body().position = pos + diff --git a/game/player/Unitframes.gd b/game/player/Unitframes.gd new file mode 100644 index 0000000..8d3d9d4 --- /dev/null +++ b/game/player/Unitframes.gd @@ -0,0 +1,51 @@ +extends Control + +# Copyright (c) 2019 Péter Magyar +# +# 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. + +export (NodePath) var player_unit_frame_path : NodePath +export (NodePath) var target_unit_frame_path : NodePath + +var target_unit_frame : Node +var player_unit_frame : Node + +#func _ready() -> void: +# target_unit_frame = get_node(target_unit_frame_path) as Node +# player_unit_frame = get_node(player_unit_frame_path) as Node + +func set_player(player : Entity) -> void: + target_unit_frame = get_node(target_unit_frame_path) as Node + player_unit_frame = get_node(player_unit_frame_path) as Node + + player_unit_frame.set_player(player) + + _ctarget_changed(player, null) + + player.connect("ctarget_changed", self, "_ctarget_changed") + + +func _ctarget_changed(entity : Entity, old_target : Entity) -> void: + if entity.ctarget == null: + target_unit_frame.hide() + else: + target_unit_frame.show() + + target_unit_frame.set_player(entity.ctarget) + diff --git a/game/player/bs_entity_spawner.gd b/game/player/bs_entity_spawner.gd new file mode 100644 index 0000000..157a9b0 --- /dev/null +++ b/game/player/bs_entity_spawner.gd @@ -0,0 +1,338 @@ +extends ESSEntitySpawner + +# Copyright Péter Magyar relintai@gmail.com +# MIT License, functionality from this class needs to be protable to the entity spell system + +# Copyright (c) 2019-2020 Péter Magyar + +# 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. + +export(PackedScene) var player_display_scene : PackedScene +export(String) var spawn_parent_path : String = "/root/Main" +export(int) var default_level_override : int = 0 + +var _spawn_parent : Node = null + +var _next_entity_guid : int = 0 + +func _ready(): +# get_scene_tree().multiplayer.connect("network_peer_packet", self, "on_network_peer_packet") + +# ProfileManager.load() +# ESS.load_resource_db() +# ESS.get_resource_db().load_all() +# ESS.connect("on_entity_spawn_requested", self, "on_entity_spawn_requested") + +# get_tree().connect("network_peer_connected", self, "_player_connected") +# get_tree().connect("network_peer_disconnected", self, "_player_disconnected") +# get_tree().connect("connected_to_server", self, "_connected_ok") +# get_tree().connect("connection_failed", self, "_connected_fail") +# get_tree().connect("server_disconnected", self, "_server_disconnected") + pass + +func on_network_peer_packet(id : int, packet : PoolByteArray) ->void: + #todo + pass + +func spawn_for(player : Entity, target: Entity) -> void: + print("spawnfor " + target.name) +# rpc_id(player.get_network_master(), "creceive_spawn_for", to_json(target.to_dict()), target.name, target.translation) + +func despawn_for(player : Entity, target: Entity) -> void: + print("despawnfor " + target.name) +# rpc_id(player.get_network_master(), "creceive_despawn_for", target.get_path()) + +remote func creceive_spawn_for(data: String, global_name : String, position: Vector3) -> Entity: + var createinfo : EntityCreateInfo = EntityCreateInfo.new() + + createinfo.player_name = global_name + createinfo.entity_controller = EntityEnums.ENITIY_CONTROLLER_PLAYER + createinfo.entity_player_type = EntityEnums.ENTITY_PLAYER_TYPE_NETWORKED + createinfo.serialized_data = parse_json(data) + createinfo.transform.origin = position + + ESS.request_entity_spawn(createinfo) + +# print("Player spawned ") + + return createinfo.created_entity + +remote func creceive_despawn_for(path : NodePath) -> void: +# print("recdespawnfor " + path) + var ent = get_tree().root.get_node_or_null(path) + + if ent: + ent.queue_free() + +puppet func spawn_owned_player(data : String, position : Vector3) -> Entity: + var createinfo : EntityCreateInfo = EntityCreateInfo.new() + + createinfo.guid = get_tree().multiplayer.get_network_unique_id() +# createinfo.player_name = "" + createinfo.entity_controller = EntityEnums.ENITIY_CONTROLLER_PLAYER + createinfo.entity_player_type = EntityEnums.ENTITY_PLAYER_TYPE_PLAYER + createinfo.serialized_data = parse_json(data) + createinfo.transform.origin = position + + ESS.request_entity_spawn(createinfo) + +# print("Player spawned ") + + return createinfo.created_entity + +func load_player(file_name : String, position : Vector3, network_owner : int) -> Entity: + var createinfo : EntityCreateInfo = EntityCreateInfo.new() + + createinfo.guid = _next_entity_guid + _next_entity_guid += 1 +# createinfo.player_name = name + createinfo.entity_controller = EntityEnums.ENITIY_CONTROLLER_PLAYER + createinfo.entity_player_type = EntityEnums.ENTITY_PLAYER_TYPE_PLAYER + createinfo.serialized_data = load_file(file_name) + createinfo.transform.origin = position + createinfo.networked = false +# print("Player spawned ") + ESS.request_entity_spawn(createinfo) + + return createinfo.created_entity + +func spawn_player_for_menu(class_id : int, name : String, parent : Node) -> Entity: + var createinfo : EntityCreateInfo = EntityCreateInfo.new() + var cls : EntityData = ESS.resource_db.get_entity_data(class_id) + var class_profile : ClassProfile = ProfileManager.getc_player_profile().get_class_profile(cls.resource_path) + + var level : int = 1 + + if default_level_override > 0: + level = default_level_override + + createinfo.class_id = class_id + createinfo.entity_data = cls + createinfo.player_name = name + createinfo.level = level +# createinfo.class_level = class_profile.level + createinfo.xp = 0 +# createinfo.class_xp = class_profile.xp + createinfo.entity_controller = EntityEnums.ENITIY_CONTROLLER_PLAYER + createinfo.entity_player_type = EntityEnums.ENTITY_PLAYER_TYPE_DISPLAY + createinfo.networked = false + createinfo.parent_path = parent.get_path() + + ESS.request_entity_spawn(createinfo) + +# print("Player spawned " + str(createinfo)) + + return createinfo.created_entity + +func spawn_display_player(file_name : String, node_path : NodePath) -> Entity: + var createinfo : EntityCreateInfo = EntityCreateInfo.new() + + createinfo.guid = _next_entity_guid + _next_entity_guid += 1 +# createinfo.player_name = name + createinfo.entity_controller = EntityEnums.ENITIY_CONTROLLER_PLAYER + createinfo.entity_player_type = EntityEnums.ENTITY_PLAYER_TYPE_DISPLAY + createinfo.serialized_data = load_file(file_name) + createinfo.parent_path = node_path + +# print("Player spawned ") + + ESS.request_entity_spawn(createinfo) + + return createinfo.created_entity + +func spawn_networked_player(class_id : int, position : Vector3, name : String, node_name : String, sid : int) -> Entity: + var createinfo : EntityCreateInfo = EntityCreateInfo.new() + var cls : EntityData = ESS.resource_db.get_player_character_data(class_id) + var class_profile : ClassProfile = ProfileManager.get_class_profile(class_id) + + var level : int = class_profile.level + + if default_level_override > 0: + level = default_level_override + + createinfo.class_id = class_id + createinfo.entity_data = cls + createinfo.player_name = name + createinfo.character_level = 1 +# createinfo.level = level + createinfo.xp = 0 +# createinfo.class_xp = class_profile.xp + createinfo.entity_controller = EntityEnums.ENITIY_CONTROLLER_PLAYER + createinfo.entity_player_type = EntityEnums.ENTITY_PLAYER_TYPE_NETWORKED + createinfo.network_owner = sid + createinfo.transform.origin = position + createinfo.networked = false + createinfo.transform.origin = position + + ESS.request_entity_spawn(createinfo) + +# print("Player spawned " + str(createinfo)) + + return createinfo.created_entity + +func spawn_player(class_id : int, position : Vector3, name : String, node_name : String, network_owner : int) -> Entity: + var createinfo : EntityCreateInfo = EntityCreateInfo.new() + var cls : EntityData = ESS.resource_db.get_player_character_data(class_id) + var class_profile : ClassProfile = ProfileManager.get_class_profile(class_id) + + var level : int = class_profile.level + + if default_level_override > 0: + level = default_level_override + + createinfo.class_id = class_id + createinfo.entity_data = cls + createinfo.player_name = name + createinfo.character_level = 1 + createinfo.class_level = level + createinfo.character_xp = 0 +# createinfo.class_xp = class_profile.xp + createinfo.entity_controller = EntityEnums.ENITIY_CONTROLLER_PLAYER + createinfo.entity_player_type = EntityEnums.ENTITY_PLAYER_TYPE_PLAYER + createinfo.network_owner = network_owner + createinfo.transform.origin = position + createinfo.networked = false + + ESS.request_entity_spawn(createinfo) + +# print("Player spawned " + str(createinfo)) + + return createinfo.created_entity + + +func spawn_mob(class_id : int, level : int, position : Vector3) -> void: + var createinfo : EntityCreateInfo = EntityCreateInfo.new() + + var cls : EntityData = ESS.get_resource_db().get_entity_data(class_id) + + createinfo.class_id = class_id + createinfo.entity_data = cls + createinfo.player_name = "Mob" + createinfo.level = level + createinfo.entity_controller = EntityEnums.ENITIY_CONTROLLER_AI + createinfo.entity_player_type = EntityEnums.ENTITY_PLAYER_TYPE_AI + createinfo.transform2d.origin = Vector2(position.x, position.y) + + ESS.request_entity_spawn_deferred(createinfo) + +# print("Mob spawned " + str(createinfo)) + + #return createinfo.created_entity + + +func _request_entity_spawn(createinfo : EntityCreateInfo): + var entity_node : Entity = null + + if createinfo.entity_player_type == EntityEnums.ENTITY_PLAYER_TYPE_DISPLAY: + entity_node = player_display_scene.instance() + else: + if not createinfo.networked: + if createinfo.entity_controller == EntityEnums.ENITIY_CONTROLLER_PLAYER: + entity_node = PlayerGD.new() + else: + entity_node = MobGD.new() + else: + entity_node = NetworkedPlayerGD.new() + + if entity_node == null: + print("EntityManager: entity node is null") + return null + + entity_node.set_transform_2d(createinfo.transform2d) + + if (createinfo.parent_path == ""): + if _spawn_parent == null: + _spawn_parent = get_tree().root.get_node(spawn_parent_path) + + if _spawn_parent.current_scene != null: + var spawn_parent = _spawn_parent.current_scene + + spawn_parent.add_child(entity_node) + else: + get_tree().root.get_node(createinfo.parent_path).add_child(entity_node) + + entity_node.setup(createinfo) + + createinfo.created_entity = entity_node + +func _player_connected(id): + pass # Will go unused; not useful here. + +func _player_disconnected(id): + #player_info.erase(id) # Erase player from info. + pass + +func _connected_ok(): + # Only called on clients, not server. Send my ID and info to all the other peers. + #rpc("register_player", get_tree().get_network_unique_id(), my_info) + pass + +func _server_disconnected(): + pass # Server kicked us; show error and abort. + +func _connected_fail(): + pass # Could not even connect to server; abort. + +remote func register_player(id, info): + # Store the info +# player_info[id] = info + # If I'm the server, let the new guy know about existing players. +# if get_tree().is_network_server(): +# # Send my info to new player +# rpc_id(id, "register_player", 1, my_info) +# # Send the info of existing players +# for peer_id in player_info: +# rpc_id(id, "register_player", peer_id, player_info[peer_id]) + + # Call function to update lobby UI here + pass + +func load_file(file_name : String) -> Dictionary: + + var f : File = File.new() + + if f.open("user://characters/" + file_name, File.READ) == OK: + var st : String = f.get_as_text() + f.close() + + var json_err : String = validate_json(st) + + if json_err != "": + print("Save corrupted! " + file_name) + print(json_err) + return Dictionary() + + var p = parse_json(st) + + if typeof(p) != TYPE_DICTIONARY: + print("Save corrupted! Not Dict! " + file_name) + return Dictionary() + + if p is Dictionary: + return p as Dictionary + + return Dictionary() + +func save_player(player: Entity, file_name : String) -> void: + var f : File = File.new() + + if f.open("user://characters/" + file_name, File.WRITE) == OK: + f.store_string(to_json(player.to_dict())) + f.close() diff --git a/game/player/bs_entity_spawner.tscn b/game/player/bs_entity_spawner.tscn new file mode 100644 index 0000000..2c1ee59 --- /dev/null +++ b/game/player/bs_entity_spawner.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://player/bs_entity_spawner.gd" type="Script" id=1] +[ext_resource path="res://player/DisplayPlayer.tscn" type="PackedScene" id=2] + +[node name="ESSEntitySpawner" type="ESSEntitySpawner"] +script = ExtResource( 1 ) +player_display_scene = ExtResource( 2 ) diff --git a/game/project.godot b/game/project.godot new file mode 100644 index 0000000..42a1f0a --- /dev/null +++ b/game/project.godot @@ -0,0 +1,644 @@ +; 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=4 + +_global_script_classes=[ { +"base": "Aura", +"class": "AuraGD", +"language": "GDScript", +"path": "res://scripts/auras/aura_script.gd" +}, { +"base": "Reference", +"class": "BrushPrefabs", +"language": "GDScript", +"path": "res://addons/Godoxel/BrushPrefabs.gd" +}, { +"base": "CharacterAtlas", +"class": "CharacterAtlas2D", +"language": "GDScript", +"path": "res://scripts/item_visuals/CharacterAtlas2D.gd" +}, { +"base": "CharacterAtlasEntry", +"class": "CharacterAtlasEntry2D", +"language": "GDScript", +"path": "res://scripts/item_visuals/CharacterAtlasEntry2D.gd" +}, { +"base": "Spatial", +"class": "CharacterSkeketonAttachPoint", +"language": "GDScript", +"path": "res://player/CharacterSkeletonAttachPoint.gd" +}, { +"base": "CharacterSkeleton2D", +"class": "CharacterSkeleton2DGD", +"language": "GDScript", +"path": "res://player/CharacterSkeleton2DGD.gd" +}, { +"base": "Entity", +"class": "DisplayPlayerGD", +"language": "GDScript", +"path": "res://player/DisplayPlayer.gd" +}, { +"base": "EntityAI", +"class": "EntityAIGD", +"language": "GDScript", +"path": "res://scripts/ai/EntityAIGD.gd" +}, { +"base": "EntityData", +"class": "EntityDataGD", +"language": "GDScript", +"path": "res://scripts/entities/EntityDataGD.gd" +}, { +"base": "Node", +"class": "GEAction", +"language": "GDScript", +"path": "res://addons/Godoxel/actions/Action.gd" +}, { +"base": "GEAction", +"class": "GEBrighten", +"language": "GDScript", +"path": "res://addons/Godoxel/actions/Brighten.gd" +}, { +"base": "GEAction", +"class": "GEBrush", +"language": "GDScript", +"path": "res://addons/Godoxel/actions/Brush.gd" +}, { +"base": "GEAction", +"class": "GEBucket", +"language": "GDScript", +"path": "res://addons/Godoxel/actions/Bucket.gd" +}, { +"base": "Control", +"class": "GECanvas", +"language": "GDScript", +"path": "res://addons/Godoxel/Canvas.gd" +}, { +"base": "GEAction", +"class": "GECut", +"language": "GDScript", +"path": "res://addons/Godoxel/actions/Cut.gd" +}, { +"base": "GEAction", +"class": "GEDarken", +"language": "GDScript", +"path": "res://addons/Godoxel/actions/Darken.gd" +}, { +"base": "Reference", +"class": "GELayer", +"language": "GDScript", +"path": "res://addons/Godoxel/Layer.gd" +}, { +"base": "GEAction", +"class": "GELine", +"language": "GDScript", +"path": "res://addons/Godoxel/actions/Line.gd" +}, { +"base": "GEAction", +"class": "GEMultiLine", +"language": "GDScript", +"path": "res://addons/Godoxel/actions/MultiLine.gd" +}, { +"base": "GEAction", +"class": "GEPasteCut", +"language": "GDScript", +"path": "res://addons/Godoxel/actions/PasteCut.gd" +}, { +"base": "GEAction", +"class": "GEPencil", +"language": "GDScript", +"path": "res://addons/Godoxel/actions/Pencil.gd" +}, { +"base": "GEAction", +"class": "GERainbow", +"language": "GDScript", +"path": "res://addons/Godoxel/actions/Rainbow.gd" +}, { +"base": "GEAction", +"class": "GERect", +"language": "GDScript", +"path": "res://addons/Godoxel/actions/Rect.gd" +}, { +"base": "Node", +"class": "GEUtils", +"language": "GDScript", +"path": "res://addons/Godoxel/Util.gd" +}, { +"base": "Reference", +"class": "GSAIAgentLocation", +"language": "GDScript", +"path": "res://steering_ai_framework/GSAIAgentLocation.gd" +}, { +"base": "GSAISteeringBehavior", +"class": "GSAIArrive", +"language": "GDScript", +"path": "res://steering_ai_framework/Behaviors/GSAIArrive.gd" +}, { +"base": "GSAIGroupBehavior", +"class": "GSAIAvoidCollisions", +"language": "GDScript", +"path": "res://steering_ai_framework/Behaviors/GSAIAvoidCollisions.gd" +}, { +"base": "GSAISteeringBehavior", +"class": "GSAIBlend", +"language": "GDScript", +"path": "res://steering_ai_framework/Behaviors/GSAIBlend.gd" +}, { +"base": "GSAIGroupBehavior", +"class": "GSAICohesion", +"language": "GDScript", +"path": "res://steering_ai_framework/Behaviors/GSAICohesion.gd" +}, { +"base": "GSAIPursue", +"class": "GSAIEvade", +"language": "GDScript", +"path": "res://steering_ai_framework/Behaviors/GSAIEvade.gd" +}, { +"base": "GSAIMatchOrientation", +"class": "GSAIFace", +"language": "GDScript", +"path": "res://steering_ai_framework/Behaviors/GSAIFace.gd" +}, { +"base": "GSAISeek", +"class": "GSAIFlee", +"language": "GDScript", +"path": "res://steering_ai_framework/Behaviors/GSAIFlee.gd" +}, { +"base": "GSAIArrive", +"class": "GSAIFollowPath", +"language": "GDScript", +"path": "res://steering_ai_framework/Behaviors/GSAIFollowPath.gd" +}, { +"base": "GSAISteeringBehavior", +"class": "GSAIGroupBehavior", +"language": "GDScript", +"path": "res://steering_ai_framework/GSAIGroupBehavior.gd" +}, { +"base": "GSAIProximity", +"class": "GSAIInfiniteProximity", +"language": "GDScript", +"path": "res://steering_ai_framework/Proximities/GSAIInfiniteProximity.gd" +}, { +"base": "GSAISpecializedAgent", +"class": "GSAIKinematicBody2DAgent", +"language": "GDScript", +"path": "res://steering_ai_framework/Agents/GSAIKinematicBody2DAgent.gd" +}, { +"base": "GSAISpecializedAgent", +"class": "GSAIKinematicBody3DAgent", +"language": "GDScript", +"path": "res://steering_ai_framework/Agents/GSAIKinematicBody3DAgent.gd" +}, { +"base": "GSAIMatchOrientation", +"class": "GSAILookWhereYouGo", +"language": "GDScript", +"path": "res://steering_ai_framework/Behaviors/GSAILookWhereYouGo.gd" +}, { +"base": "GSAISteeringBehavior", +"class": "GSAIMatchOrientation", +"language": "GDScript", +"path": "res://steering_ai_framework/Behaviors/GSAIMatchOrientation.gd" +}, { +"base": "Reference", +"class": "GSAIPath", +"language": "GDScript", +"path": "res://steering_ai_framework/GSAIPath.gd" +}, { +"base": "GSAISteeringBehavior", +"class": "GSAIPriority", +"language": "GDScript", +"path": "res://steering_ai_framework/Behaviors/GSAIPriority.gd" +}, { +"base": "Reference", +"class": "GSAIProximity", +"language": "GDScript", +"path": "res://steering_ai_framework/Proximities/GSAIProximity.gd" +}, { +"base": "GSAISteeringBehavior", +"class": "GSAIPursue", +"language": "GDScript", +"path": "res://steering_ai_framework/Behaviors/GSAIPursue.gd" +}, { +"base": "GSAIProximity", +"class": "GSAIRadiusProximity", +"language": "GDScript", +"path": "res://steering_ai_framework/Proximities/GSAIRadiusProximity.gd" +}, { +"base": "GSAISpecializedAgent", +"class": "GSAIRigidBody2DAgent", +"language": "GDScript", +"path": "res://steering_ai_framework/Agents/GSAIRigidBody2DAgent.gd" +}, { +"base": "GSAISpecializedAgent", +"class": "GSAIRigidBody3DAgent", +"language": "GDScript", +"path": "res://steering_ai_framework/Agents/GSAIRigidBody3DAgent.gd" +}, { +"base": "GSAISteeringBehavior", +"class": "GSAISeek", +"language": "GDScript", +"path": "res://steering_ai_framework/Behaviors/GSAISeek.gd" +}, { +"base": "GSAIGroupBehavior", +"class": "GSAISeparation", +"language": "GDScript", +"path": "res://steering_ai_framework/Behaviors/GSAISeparation.gd" +}, { +"base": "GSAISteeringAgent", +"class": "GSAISpecializedAgent", +"language": "GDScript", +"path": "res://steering_ai_framework/Agents/GSAISpecializedAgent.gd" +}, { +"base": "GSAIAgentLocation", +"class": "GSAISteeringAgent", +"language": "GDScript", +"path": "res://steering_ai_framework/GSAISteeringAgent.gd" +}, { +"base": "Reference", +"class": "GSAISteeringBehavior", +"language": "GDScript", +"path": "res://steering_ai_framework/GSAISteeringBehavior.gd" +}, { +"base": "Reference", +"class": "GSAITargetAcceleration", +"language": "GDScript", +"path": "res://steering_ai_framework/GSAITargetAcceleration.gd" +}, { +"base": "Reference", +"class": "GSAIUtils", +"language": "GDScript", +"path": "res://steering_ai_framework/GSAIUtils.gd" +}, { +"base": "Resource", +"class": "GameModule", +"language": "GDScript", +"path": "res://scripts/game_modules/GameModule.gd" +}, { +"base": "EntityResource", +"class": "HealthResource", +"language": "GDScript", +"path": "res://scripts/resources/HealthResource.gd" +}, { +"base": "CharacterBones", +"class": "HumanoidCharacterBones2D", +"language": "GDScript", +"path": "res://player/HumanoidCharacterBones2D.gd" +}, { +"base": "ItemTemplate", +"class": "ItemTemplateGD", +"language": "GDScript", +"path": "res://scripts/items/ItemTemplateGD.gd" +}, { +"base": "SkeletonModelEntry", +"class": "ItemVisual2D", +"language": "GDScript", +"path": "res://scripts/item_visuals/ItemVisual2D.gd" +}, { +"base": "SkeletonModelEntry", +"class": "ItemVisualEntry2D", +"language": "GDScript", +"path": "res://scripts/item_visuals/ItemVisualEntry2D.gd" +}, { +"base": "Node2D", +"class": "LayeredTextureMaker", +"language": "GDScript", +"path": "res://texture_tools/LayeredTextureMaker.gd" +}, { +"base": "Node", +"class": "Main", +"language": "GDScript", +"path": "res://scenes/MainScene.gd" +}, { +"base": "Resource", +"class": "MainPlanetGenerator", +"language": "GDScript", +"path": "res://scripts/world_generators/MainPlanetGenerator.gd" +}, { +"base": "EntityResource", +"class": "ManaResource", +"language": "GDScript", +"path": "res://scripts/resources/ManaResource.gd" +}, { +"base": "Control", +"class": "Menu", +"language": "GDScript", +"path": "res://scenes/Menu.gd" +}, { +"base": "Entity", +"class": "MobGD", +"language": "GDScript", +"path": "res://player/Mob.gd" +}, { +"base": "", +"class": "NetworkedPlayerGD", +"language": "GDScript", +"path": "res://player/NetworkedPlayer.gd" +}, { +"base": "", +"class": "PlayerGD", +"language": "GDScript", +"path": "res://player/Player.gd" +}, { +"base": "Resource", +"class": "PlayerMaster", +"language": "GDScript", +"path": "res://scripts/networking/PlayerMaster.gd" +}, { +"base": "EntityResource", +"class": "SpeedResource", +"language": "GDScript", +"path": "res://scripts/resources/SpeedResource.gd" +}, { +"base": "SpellEffectVisual", +"class": "SpellEffectVisualBasic", +"language": "GDScript", +"path": "res://scripts/resources/spell_effect_visual_basic.gd" +}, { +"base": "Spell", +"class": "SpellGD", +"language": "GDScript", +"path": "res://scripts/spells/gd_spell_script.gd" +}, { +"base": "GameModule", +"class": "UIGuiChildModule", +"language": "GDScript", +"path": "res://scripts/game_modules/ui_gui_child_module.gd" +}, { +"base": "GameModule", +"class": "UIWindowModule", +"language": "GDScript", +"path": "res://scripts/game_modules/ui_window_module.gd" +} ] +_global_script_class_icons={ +"AuraGD": "", +"BrushPrefabs": "", +"CharacterAtlas2D": "", +"CharacterAtlasEntry2D": "", +"CharacterSkeketonAttachPoint": "", +"CharacterSkeleton2DGD": "", +"DisplayPlayerGD": "", +"EntityAIGD": "", +"EntityDataGD": "", +"GEAction": "", +"GEBrighten": "", +"GEBrush": "", +"GEBucket": "", +"GECanvas": "", +"GECut": "", +"GEDarken": "", +"GELayer": "", +"GELine": "", +"GEMultiLine": "", +"GEPasteCut": "", +"GEPencil": "", +"GERainbow": "", +"GERect": "", +"GEUtils": "", +"GSAIAgentLocation": "", +"GSAIArrive": "", +"GSAIAvoidCollisions": "", +"GSAIBlend": "", +"GSAICohesion": "", +"GSAIEvade": "", +"GSAIFace": "", +"GSAIFlee": "", +"GSAIFollowPath": "", +"GSAIGroupBehavior": "", +"GSAIInfiniteProximity": "", +"GSAIKinematicBody2DAgent": "", +"GSAIKinematicBody3DAgent": "", +"GSAILookWhereYouGo": "", +"GSAIMatchOrientation": "", +"GSAIPath": "", +"GSAIPriority": "", +"GSAIProximity": "", +"GSAIPursue": "", +"GSAIRadiusProximity": "", +"GSAIRigidBody2DAgent": "", +"GSAIRigidBody3DAgent": "", +"GSAISeek": "", +"GSAISeparation": "", +"GSAISpecializedAgent": "", +"GSAISteeringAgent": "", +"GSAISteeringBehavior": "", +"GSAITargetAcceleration": "", +"GSAIUtils": "", +"GameModule": "", +"HealthResource": "", +"HumanoidCharacterBones2D": "", +"ItemTemplateGD": "", +"ItemVisual2D": "", +"ItemVisualEntry2D": "", +"LayeredTextureMaker": "", +"Main": "", +"MainPlanetGenerator": "", +"ManaResource": "", +"Menu": "", +"MobGD": "", +"NetworkedPlayerGD": "", +"PlayerGD": "", +"PlayerMaster": "", +"SpeedResource": "", +"SpellEffectVisualBasic": "", +"SpellGD": "", +"UIGuiChildModule": "", +"UIWindowModule": "" +} +Node="input/actionbar_5_11" + +[application] + +config/name="Broken Seals 2D" +config/description="An open source third person RPG " +run/main_scene="res://scenes/Main.tscn" +config/icon="res://icon.png" +config/version="0.2" + +[autoload] + +Server="*res://autoload/Server.tscn" +ThemeAtlas="*res://ui/autoload/ThemeAtlas.tscn" +WorldNumbers="*res://ui/world_numbers_2d/WorldNumbers.tscn" +CursorManager="*res://cursors/autoload/CursorManager.tscn" +Settings="*res://ui/autoload/SettingsManager.tscn" +Logger="*res://autoload/Logger.tscn" +DataManager="*res://scripts/game_modules/DataManager.tscn" +EntitySpawner="*res://player/bs_entity_spawner.tscn" + +[debug] + +gdscript/completion/autocomplete_setters_and_getters=true +gdscript/warnings/unused_argument=false +gdscript/warnings/unused_signal=false +gdscript/warnings/return_value_discarded=false +gdscript/warnings/integer_division=false + +[display] + +window/dpi/allow_hidpi=true +window/handheld/orientation="sensor_landscape" +window/stretch/mode="2d" +window/stretch/aspect="expand" +mouse_cursor/sensitivity=0.9 +window/size/viewport_scale=100 +window/size/ui_scale=1.2 +window/size/ui_scale_touch=1.0 + +[editor_plugins] + +enabled=PoolStringArray( "res://addons/Godoxel/plugin.cfg" ) + +[ess] + +data/ess_resource_db_path="res://data/resource_db.tres" +enums/stats="Agility,Strength,Stamina,Intellect,Spirit,Health,Mana,Speed,Global Cooldown,Haste,Haste Rating,Resilience,Armor,Attack Power,Spell Power,Melee Crit,Melee Crit Bonus,Spell Crit,Spell Crit Bonus,Block,Parry,Damage Reduction,Melee Damage Reduction,Spell Damage Reduction,Damage Taken,Heal Taken,Melee Damage,Spell Damage,Holy Resist,Shadow Resist,Nature Resist,Fire Resist,Frost Resist,Lightning Resist,Chaos Resist,Silence Resist,Fear Resist,Stun Resist,Energy,Rage,XP Rate,Weapon Damage Min,Weapon Damage Max" +enums/skeletons_bones=PoolStringArray( "", "root,pelvis,spine,spine_1,spine_2,neck,head,left_clavicle,left_upper_arm,left_forearm,left_hand,left_thumb_base,left_thumb_end,left_fingers_base,left_fingers_end,right_clavicle,right_upper_arm,right_forearm,right_hand,right_thumb_base,right_thumb_end,right_fingers_base,right_fingers_end,left_thigh,left_calf,left_foot,right_thigh,right_calf,right_foot" ) +enums/skeletons_bone_attachment_points=PoolStringArray( "", "left_hand,right_hand,torso,root,right_hip,left_hip,spine_2,weapon_left,weapon_right,weapon_left_back,weapon_right_back,weapon_shield_left" ) +xp/class_xps=PoolIntArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) +xp/character_xps=PoolIntArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) +profiles/automatic_save=true +data/ess_entity_spawner_path="res://player/bs_entity_spawner.tres" +level/max_character_level=60 +level/max_class_level=60 + +[importer_defaults] + +texture_array={ +"compress/mode": 0, +"compress/no_bptc_if_rgb": false, +"flags/filter": false, +"flags/mipmaps": false, +"flags/repeat": 0, +"flags/srgb": 0, +"slices/horizontal": 8, +"slices/vertical": 8 +} +texture={ +"compress/bptc_ldr": 0, +"compress/hdr_mode": 0, +"compress/lossy_quality": 0.7, +"compress/mode": 0, +"compress/normal_map": 0, +"detect_3d": false, +"flags/anisotropic": false, +"flags/filter": false, +"flags/mipmaps": false, +"flags/repeat": 1, +"flags/srgb": 2, +"process/HDR_as_SRGB": false, +"process/fix_alpha_border": false, +"process/invert_color": false, +"process/premult_alpha": false, +"size_limit": 0, +"stream": false, +"svg/scale": 1.0 +} + +[input] + +ui_accept={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777221,"unicode":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777222,"unicode":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":32,"unicode":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":0,"pressure":0.0,"pressed":false,"script":null) + ] +} +actionbar_1_0={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":82,"unicode":0,"echo":false,"script":null) + ] +} +actionbar_1_1={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":70,"unicode":0,"echo":false,"script":null) + ] +} +actionbar_1_2={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":67,"unicode":0,"echo":false,"script":null) + ] +} +actionbar_1_3={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":84,"unicode":0,"echo":false,"script":null) + ] +} +actionbar_1_4={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":71,"unicode":0,"echo":false,"script":null) + ] +} +actionbar_1_5={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":49,"unicode":0,"echo":false,"script":null) + ] +} +actionbar_1_6={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":50,"unicode":0,"echo":false,"script":null) + ] +} +actionbar_1_7={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":51,"unicode":0,"echo":false,"script":null) + ] +} +actionbar_1_8={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":52,"unicode":0,"echo":false,"script":null) + ] +} +actionbar_1_9={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":true,"control":false,"meta":false,"command":false,"pressed":false,"scancode":82,"unicode":0,"echo":false,"script":null) + ] +} +actionbar_1_10={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":true,"control":false,"meta":false,"command":false,"pressed":false,"scancode":70,"unicode":0,"echo":false,"script":null) + ] +} +actionbar_1_11={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":true,"control":false,"meta":false,"command":false,"pressed":false,"scancode":84,"unicode":0,"echo":false,"script":null) + ] +} +actionbar_1_12={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":true,"control":false,"meta":false,"command":false,"pressed":false,"scancode":39,"unicode":0,"echo":false,"script":null) + ] +} +sheath={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":80,"unicode":0,"echo":false,"script":null) + ] +} + +[layer_names] + +3d_physics/layer_1="World" +3d_physics/layer_2="Entities" + +[memory] + +limits/message_queue/max_size_kb=2048 + +[physics] + +2d/default_gravity=0 + +[rendering] + +quality/driver/driver_name="GLES2" +quality/driver/fallback_to_gles2=true +vram_compression/import_etc=true +quality/directional_shadow/size.mobile=1024 +quality/shading/force_vertex_shading=true +quality/2d/use_batching=true +quality/shadows/enabled=false diff --git a/game/scenes/BrokenSeals.tscn b/game/scenes/BrokenSeals.tscn new file mode 100644 index 0000000..ceeda28 --- /dev/null +++ b/game/scenes/BrokenSeals.tscn @@ -0,0 +1,3 @@ +[gd_scene format=2] + +[node name="BrokenSeals" type="Node"] diff --git a/game/scenes/CharacterCreationMenu.gd b/game/scenes/CharacterCreationMenu.gd new file mode 100644 index 0000000..ae86280 --- /dev/null +++ b/game/scenes/CharacterCreationMenu.gd @@ -0,0 +1,86 @@ +extends Control + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(PackedScene) var character_entry : PackedScene +export(NodePath) var menu_path : NodePath +export(NodePath) var name_imput_path : NodePath +export(NodePath) var container_path : NodePath +export(ButtonGroup) var character_creation_button_group : ButtonGroup +export(String) var character_folder : String + +var container : Node +var name_line_edit : LineEdit + +func _ready(): + name_line_edit = get_node(name_imput_path) + container = get_node(container_path) + + var profile : PlayerProfile = ProfileManager.getc_player_profile() + + var fb : Button = null + + for i in range(ESS.get_resource_db().get_entity_data_count()): + var d : EntityData = ESS.get_resource_db().get_entity_data_index(i) + + if not d.is_playable: + continue + + var ce : Button = character_entry.instance() as Button + + if fb == null: + fb = ce + + container.add_child(ce) + ce.owner = container + + ce.id = d.id + var class_profile : ClassProfile = profile.get_class_profile(d.resource_path) + ce.set_class_name(d.entity_class_data.text_name, class_profile.level, class_profile) + ce.group = character_creation_button_group + + if fb != null: + fb.pressed = true + +func create() -> void: + if name_line_edit.text == "": + return + + var file_name : String = "user://" + character_folder + "/" + name_line_edit.text + + var f : File = File.new() + + if f.file_exists(file_name): + return + + var active : BaseButton = character_creation_button_group.get_pressed_button() + + var id : int = active.id + + var ent : Entity = ESS.entity_spawner.spawn_player_for_menu(id, name_line_edit.text, self) + if f.open(file_name, File.WRITE) == OK: + f.store_string(to_json(ent.to_dict())) + f.close() + + ent.queue_free() + + get_node(menu_path).switch_to_menu(Menu.StartMenuTypes.CHARACTER_SELECT) + diff --git a/game/scenes/CharacterSelector.gd b/game/scenes/CharacterSelector.gd new file mode 100644 index 0000000..884bebd --- /dev/null +++ b/game/scenes/CharacterSelector.gd @@ -0,0 +1,52 @@ +extends MarginContainer + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(NodePath) var container_path : NodePath +var container : Node + +export(String) var character_folder : String + +func _ready(): + container = get_node(container_path) + + if container == null: + Logger.error("CharacterSelector not set up properly!") + + refresh() + +func refresh(): + var dir : Directory = Directory.new() + + if dir.open("user://" + character_folder) == OK: + dir.list_dir_begin() + + var file_name = dir.get_next() + + while (file_name != ""): + if dir.current_is_dir(): + file_name = dir.get_next() + + + + else: + dir.make_dir("user://" + character_folder) + diff --git a/game/scenes/CharacterSelectorMenu.gd b/game/scenes/CharacterSelectorMenu.gd new file mode 100644 index 0000000..0edb052 --- /dev/null +++ b/game/scenes/CharacterSelectorMenu.gd @@ -0,0 +1,220 @@ +extends Control + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(NodePath) var menu_path : NodePath +export(NodePath) var container_path : NodePath +export(NodePath) var player_display_container_path : NodePath +export(ButtonGroup) var character_button_group : ButtonGroup +export(PackedScene) var character_entry : PackedScene +export(String) var character_folder : String + +export(NodePath) var load_button_path : NodePath +export(NodePath) var renounce_button_path : NodePath +export(NodePath) var create_button_path : NodePath + +export(bool) var automatic_character_load : bool = false +export(bool) var only_one_character : bool = false + +var container : Node +var player_display_container_node : Node + +func _ready(): + container = get_node(container_path) + player_display_container_node = get_node(player_display_container_path) + + if container == null: + Logger.error("CharacterSelector not set up properly!") + + connect("visibility_changed", self, "visibility_changed") + + refresh() + +func refresh(): + clear() +# Entities.list_spells() + var dir : Directory = Directory.new() + + var first_entry : Button = null + + if dir.open("user://" + character_folder) == OK: + dir.list_dir_begin() + + var file_name = "." + + while (file_name != ""): + file_name = dir.get_next() + + if dir.current_is_dir(): + continue + + var f : File = File.new() + + if f.open("user://" + character_folder + "/" + file_name, File.READ) == OK: + var st : String = f.get_as_text() + f.close() + + var json_err : String = validate_json(st) + + if json_err != "": + Logger.error("Save corrupted! " + file_name) + Logger.error(json_err) + continue + + var p = parse_json(st) + + if typeof(p) != TYPE_DICTIONARY: + Logger.error("Save corrupted! Not Dict! " + file_name) + continue + + var display : Entity = ESS.entity_spawner.spawn_display_player(file_name, player_display_container_node.get_path()) + + var entity_data : EntityData = ESS.get_resource_db().get_entity_data(display.characterclass_id) + + if entity_data == null: + print("EntityData not found!") + display.queue_free() + continue + + #player_display_container_node.add_child(display) + #display.owner = player_display_container_node + + #display.from_dict(p as Dictionary) + + var centry : Button = character_entry.instance() as Button + container.add_child(centry) + centry.owner = container + centry.group = character_button_group + centry.pressed = true + centry.connect("pressed", self, "character_selection_changed") + + centry.setup(file_name, display.sentity_name, ESS.get_resource_db().get_entity_data(display.characterclass_id).text_name, display.slevel, display.slevel, display) + + if first_entry == null: + first_entry = centry + + if first_entry != null: + first_entry.pressed = true + + if first_entry != null: + #note that this just disables the create button, and + #will still allow character creation otherwise + if only_one_character: + get_node(create_button_path).hide() + get_node(container_path).show() + + get_node(load_button_path).show() + get_node(renounce_button_path).show() + + if (automatic_character_load): + load_character() + else: + if only_one_character: + get_node(create_button_path).show() + get_node(container_path).hide() + + get_node(load_button_path).hide() + get_node(renounce_button_path).hide() + else: + dir.make_dir("user://" + character_folder) + if only_one_character: + get_node(container_path).hide() + get_node(create_button_path).show() + + get_node(load_button_path).hide() + get_node(renounce_button_path).hide() + +func clear() -> void: + for c in container.get_children(): + c.disconnect("pressed", self, "character_selection_changed") + c.queue_free() + + for e in player_display_container_node.get_children(): + e.queue_free() + +func renounce_character() -> void: + var b : BaseButton = character_button_group.get_pressed_button() + + if b == null: + return + + if ESS.use_class_xp: + var class_profile : ClassProfile = ProfileManager.getc_player_profile().get_class_profile(b.entity.sentity_data.resource_path) + + if ESS.can_class_level_up(class_profile.level): + class_profile.xp += b.entity.sclass_xp + + + var xpr : int = ESS.get_class_xp(class_profile.level) + + while ESS.can_class_level_up(class_profile.level) and class_profile.xp >= xpr: + class_profile.level += 1 + class_profile.xp -= xpr + + xpr = ESS.get_class_xp(class_profile.level) + + ProfileManager.save() + + var file_name : String = "user://" + character_folder + "/" + b.file_name + + var f : File = File.new() + + if f.file_exists(file_name): + var d : Directory = Directory.new() + if d.remove(file_name) == OK: + refresh() + +func load_character() -> void: + var b : BaseButton = character_button_group.get_pressed_button() + + if b == null: + return + +# if multiplayer.has_network_peer(): +# var file_name : String = "user://" + character_folder + "/" + b.file_name +# +# var f : File = File.new() +# +# if f.open(file_name, File.READ) == OK: +# var data : String = f.get_as_text() +# +# f.close() +# +# Server.upload_character(data) +# +# get_node("/root/Main").load_character(b.file_name) +# else: + get_node("/root/Main").load_character(b.file_name) + +func visibility_changed() -> void: + if visible: + refresh() + +func character_selection_changed() -> void: + var b : BaseButton = character_button_group.get_pressed_button() + + if b == null: + return + + for e in player_display_container_node.get_children(): + e.get_body().hide() + + b.entity.get_body().show() diff --git a/game/scenes/ConnectButton.gd b/game/scenes/ConnectButton.gd new file mode 100644 index 0000000..f44a661 --- /dev/null +++ b/game/scenes/ConnectButton.gd @@ -0,0 +1,35 @@ +extends Button + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +func _ready(): + get_tree().connect("connected_to_server", self, "connected_to_server") + get_tree().connect("server_disconnected", self, "server_disconnected") + +func _exit_tree(): + get_tree().disconnect("connected_to_server", self, "connected_to_server") + get_tree().disconnect("server_disconnected", self, "server_disconnected") + +func connected_to_server(): + hide() + +func server_disconnected(): + show() diff --git a/game/scenes/ConnectServerButton.gd b/game/scenes/ConnectServerButton.gd new file mode 100644 index 0000000..de4b73e --- /dev/null +++ b/game/scenes/ConnectServerButton.gd @@ -0,0 +1,73 @@ +extends Button + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(NodePath) var container_path : NodePath +export(NodePath) var status_label_path : NodePath + +export(NodePath) var use_websockets_checkbox_path : NodePath + +export(NodePath) var ip_line_edit_path : NodePath +export(NodePath) var port_line_edit_path : NodePath + +var _container : Control +var _status : Label + +var _use_websockets_checkbox : CheckBox + +var _ip_line_edit : LineEdit +var _port_line_edit : LineEdit + +func _ready(): + _container = get_node(container_path) as Control + get_tree().connect("connected_to_server", self, "connected_to_server") + + _status = get_node(status_label_path) as Label + _status.text = "" + + _use_websockets_checkbox = get_node(use_websockets_checkbox_path) as CheckBox + + _ip_line_edit = get_node(ip_line_edit_path) as LineEdit + _port_line_edit = get_node(port_line_edit_path) as LineEdit + +func _exit_tree(): + get_tree().disconnect("connected_to_server", self, "connected_to_server") + +func _pressed(): + var ip : String = _ip_line_edit.text + var port : String = _port_line_edit.text + + var portint : int = int(port) + + _status.text = "Connecting..." + var err : int = 0 + + if _use_websockets_checkbox.pressed: + err = Server.connect_to_server_websocket(ip, portint) + else: + err = Server.connect_to_server(ip, portint) + + if err != OK: + _status.text = "Error: " + str(err) + + +func connected_to_server(): + _container.hide() diff --git a/game/scenes/DisconnectButton.gd b/game/scenes/DisconnectButton.gd new file mode 100644 index 0000000..431ce17 --- /dev/null +++ b/game/scenes/DisconnectButton.gd @@ -0,0 +1,35 @@ +extends Button + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +func _ready(): + get_tree().connect("connected_to_server", self, "connected_to_server") + get_tree().connect("server_disconnected", self, "server_disconnected") + +func _exit_tree(): + get_tree().disconnect("connected_to_server", self, "connected_to_server") + get_tree().disconnect("server_disconnected", self, "server_disconnected") + +func connected_to_server(): + show() + +func server_disconnected(): + hide() diff --git a/game/scenes/GameScene.gd b/game/scenes/GameScene.gd new file mode 100644 index 0000000..b580707 --- /dev/null +++ b/game/scenes/GameScene.gd @@ -0,0 +1,25 @@ +extends Node + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +func _ready(): + VisualServer.set_default_clear_color(Color(0, 0, 0)) + diff --git a/game/scenes/HostButton.gd b/game/scenes/HostButton.gd new file mode 100644 index 0000000..6def017 --- /dev/null +++ b/game/scenes/HostButton.gd @@ -0,0 +1,30 @@ +extends Button + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" + +# Called when the node enters the scene tree for the first time. + +#func _pressed(): +# Server.start_hosting() diff --git a/game/scenes/HostGameButton.gd b/game/scenes/HostGameButton.gd new file mode 100644 index 0000000..81ea165 --- /dev/null +++ b/game/scenes/HostGameButton.gd @@ -0,0 +1,71 @@ +extends Button + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(NodePath) var container_path : NodePath +export(NodePath) var status_label_path : NodePath + +export(NodePath) var use_websockets_checkbox_path : NodePath + +export(NodePath) var port_line_edit_path : NodePath + +var _container : Control +var _status : Label + +var _use_websockets_checkbox : CheckBox + +var _port_line_edit : LineEdit + +func _ready(): + _container = get_node(container_path) as Control +# get_tree().connect("connected_to_server", self, "connected_to_server") + + _status = get_node(status_label_path) as Label + _status.text = "" + + _use_websockets_checkbox = get_node(use_websockets_checkbox_path) as CheckBox + + _port_line_edit = get_node(port_line_edit_path) as LineEdit + +#func _exit_tree(): +# get_tree().disconnect("connected_to_server", self, "connected_to_server") + +func _pressed(): + var port : String = _port_line_edit.text + + var portint : int = int(port) + + _status.text = "Connecting..." + var err : int = 0 + + if _use_websockets_checkbox.pressed: + err = Server.start_hosting_websocket(portint) + else: + err = Server.start_hosting(portint) + + if err != OK: + _status.text = "Error: " + str(err) + else: + _container.hide() + + +#func connected_to_server(): +# _container.hide() diff --git a/game/scenes/Main.tscn b/game/scenes/Main.tscn new file mode 100644 index 0000000..43dcdb4 --- /dev/null +++ b/game/scenes/Main.tscn @@ -0,0 +1,96 @@ +[gd_scene load_steps=7 format=2] + +[ext_resource path="res://scenes/MainScene.gd" type="Script" id=1] +[ext_resource path="res://scenes/World.tscn" type="PackedScene" id=2] +[ext_resource path="res://scenes/Menu.tscn" type="PackedScene" id=3] +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=4] +[ext_resource path="res://ui/debug/DebugInfo.tscn" type="PackedScene" id=5] +[ext_resource path="res://debug/FreeLookCam.tscn" type="PackedScene" id=6] + +[node name="Main" type="Node"] +script = ExtResource( 1 ) +menu_scene = ExtResource( 3 ) +world_scene = ExtResource( 2 ) +debug_camera_scene = ExtResource( 6 ) +loading_screen_path = NodePath("LoadingScreen/PanelContainer") + +[node name="LoadingScreen" type="CanvasLayer" parent="."] +layer = 100 + +[node name="PanelContainer" type="PanelContainer" parent="LoadingScreen"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +theme = ExtResource( 4 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="RichTextLabel" type="RichTextLabel" parent="LoadingScreen/PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 1020.0 +margin_bottom = 596.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +bbcode_enabled = true +bbcode_text = "[center] + + + + + + +Broken Seals + + + + + + + + + + + + + + + + + + + +[wave]LOADING[/wave] +[/center]" +text = " + + + + + + +Broken Seals + + + + + + + + + + + + + + + + + + + +LOADING +" + +[node name="DebugInfo" parent="." instance=ExtResource( 5 )] diff --git a/game/scenes/MainScene.gd b/game/scenes/MainScene.gd new file mode 100644 index 0000000..2f38b7d --- /dev/null +++ b/game/scenes/MainScene.gd @@ -0,0 +1,110 @@ +extends Node +class_name Main + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(int, "None", "Menu", "World") var start_scene = 1 +export(PackedScene) var menu_scene : PackedScene +export(PackedScene) var world_scene : PackedScene +export(PackedScene) var debug_camera_scene : PackedScene +export(NodePath) var loading_screen_path : NodePath + +enum StartSceneTypes { + NONE, MENU, WORLD +} + +var _loading_screen : Node + +var current_scene : Node +var current_character_file_name : String = "" + +func _ready() -> void: + _loading_screen = get_node(loading_screen_path) + + switch_scene(start_scene) + +func switch_scene(scene : int) -> void: + if current_scene != null: + for s in get_tree().get_nodes_in_group("save"): + if not s.has_method("save"): + print(str(s) + " is in group save, but doesn't have save()!") + continue + + s.save() + + current_scene.queue_free() + remove_child(current_scene) + + WorldNumbers.clear() + + if scene == StartSceneTypes.MENU: + var gs : Node = menu_scene.instance() + add_child(gs) + gs.owner = self + + current_scene = gs + + elif scene == StartSceneTypes.WORLD: + var gs : Node = world_scene.instance() + add_child(gs) + gs.owner = self + + current_scene = gs + + if multiplayer.has_network_peer():# and get_tree().network_peer.get_connection_status() == NetworkedMultiplayerPeer.CONNECTION_CONNECTED: + if multiplayer.is_network_server(): + gs.load_character(current_character_file_name) + else: +# var dc = debug_camera_scene.instance() +# +# gs.add_child(dc) +# dc.owner = gs +# + gs.setup_client_seed(Server._cseed) + + var file_name : String = "user://characters/" + current_character_file_name + + var f : File = File.new() + + if f.open(file_name, File.READ) == OK: + var data : String = f.get_as_text() + + f.close() + + Server.upload_character(data) + else: + gs.load_character(current_character_file_name) + + if current_scene.has_method("needs_loading_screen"): + if current_scene.needs_loading_screen(): + show_loading_screen() + +func load_character(file_name : String) -> void: + current_character_file_name = file_name + + switch_scene(StartSceneTypes.WORLD) + +func show_loading_screen() -> void: + _loading_screen.show() + +func hide_loading_screen() -> void: + _loading_screen.hide() + diff --git a/game/scenes/Menu.gd b/game/scenes/Menu.gd new file mode 100644 index 0000000..e19e688 --- /dev/null +++ b/game/scenes/Menu.gd @@ -0,0 +1,51 @@ + +extends Control +class_name Menu + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(int, "Character Select", "Character Create") var start_menu : int = 0 +export (NodePath) var character_selector_scene : NodePath +export (NodePath) var charcer_creation_scenes : NodePath + +enum StartMenuTypes { + CHARACTER_SELECT, CHARACTER_CREATE +} + +func _ready(): + switch_to_menu(start_menu) + +func switch_to_menu(menu : int) -> void: + + if menu == StartMenuTypes.CHARACTER_SELECT: + get_node(character_selector_scene).show() + else: + get_node(character_selector_scene).hide() + + if menu == StartMenuTypes.CHARACTER_CREATE: + get_node(charcer_creation_scenes).show() + else: + get_node(charcer_creation_scenes).hide() + + + +func _on_About_pressed(): + pass # Replace with function body. diff --git a/game/scenes/Menu.tscn b/game/scenes/Menu.tscn new file mode 100644 index 0000000..537857a --- /dev/null +++ b/game/scenes/Menu.tscn @@ -0,0 +1,538 @@ +[gd_scene load_steps=17 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] +[ext_resource path="res://ui/menu/CharacterEntry.tscn" type="PackedScene" id=2] +[ext_resource path="res://scenes/Menu.gd" type="Script" id=3] +[ext_resource path="res://ui/menu/menu_character_button_group.tres" type="ButtonGroup" id=4] +[ext_resource path="res://scenes/CharacterSelectorMenu.gd" type="Script" id=5] +[ext_resource path="res://scenes/CharacterCreationMenu.gd" type="Script" id=6] +[ext_resource path="res://ui/menu/character_creation_button_group.tres" type="ButtonGroup" id=7] +[ext_resource path="res://ui/options/Options.tscn" type="PackedScene" id=8] +[ext_resource path="res://ui/register/Register.tscn" type="PackedScene" id=9] +[ext_resource path="res://ui/login/Login.tscn" type="PackedScene" id=10] +[ext_resource path="res://scenes/ConnectButton.gd" type="Script" id=11] +[ext_resource path="res://scenes/HostButton.gd" type="Script" id=12] +[ext_resource path="res://scenes/DisconnectButton.gd" type="Script" id=13] +[ext_resource path="res://scenes/ConnectServerButton.gd" type="Script" id=14] +[ext_resource path="res://scenes/HostGameButton.gd" type="Script" id=15] +[ext_resource path="res://ui/about/About.tscn" type="PackedScene" id=20] + +[node name="Menu" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +theme = ExtResource( 1 ) +script = ExtResource( 3 ) +__meta__ = { +"_edit_use_anchors_": false +} +character_selector_scene = NodePath("CharacterSelectorMenu") +charcer_creation_scenes = NodePath("CharacterCreationMenu") + +[node name="GameName" type="PanelContainer" parent="."] +anchor_left = 0.5 +anchor_right = 0.5 +margin_left = -61.0 +margin_right = 61.0 +margin_bottom = 26.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label" type="Label" parent="GameName"] +margin_left = 4.0 +margin_top = 5.0 +margin_right = 118.0 +margin_bottom = 20.0 +text = "Borken Seals" +align = 1 +valign = 1 + +[node name="CharacterSelectorMenu" type="Control" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +theme = ExtResource( 1 ) +script = ExtResource( 5 ) +__meta__ = { +"_edit_use_anchors_": false, +"_editor_description_": "" +} +menu_path = NodePath("..") +container_path = NodePath("CharacterSelector/VBoxContainer/CharacterSelector/VBoxContainer/ScrollContainer/Container") +player_display_container_path = NodePath("../Char/CharacterDisplay") +character_button_group = ExtResource( 4 ) +character_entry = ExtResource( 2 ) +character_folder = "characters" +load_button_path = NodePath("CharacterSelector/VBoxContainer/CharacterSelector/VBoxContainer/Load") +renounce_button_path = NodePath("CharacterSelector/VBoxContainer/CharacterSelector/VBoxContainer/Delete") +create_button_path = NodePath("CharacterSelector/VBoxContainer/CharacterSelector/VBoxContainer/New") + +[node name="CharacterSelector" type="MarginContainer" parent="CharacterSelectorMenu"] +anchor_left = 1.0 +anchor_top = 0.5 +anchor_right = 1.0 +anchor_bottom = 0.5 +margin_left = -289.0 +margin_top = -300.0 +margin_bottom = 300.0 +custom_constants/margin_right = 20 +custom_constants/margin_top = 20 +custom_constants/margin_bottom = 20 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="CharacterSelectorMenu/CharacterSelector"] +margin_top = 20.0 +margin_right = 269.0 +margin_bottom = 580.0 +alignment = 2 + +[node name="CharacterSelector" type="PanelContainer" parent="CharacterSelectorMenu/CharacterSelector/VBoxContainer"] +margin_right = 269.0 +margin_bottom = 560.0 +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="CharacterSelectorMenu/CharacterSelector/VBoxContainer/CharacterSelector"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 265.0 +margin_bottom = 556.0 + +[node name="ScrollContainer" type="ScrollContainer" parent="CharacterSelectorMenu/CharacterSelector/VBoxContainer/CharacterSelector/VBoxContainer"] +margin_right = 261.0 +margin_bottom = 450.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Container" type="VBoxContainer" parent="CharacterSelectorMenu/CharacterSelector/VBoxContainer/CharacterSelector/VBoxContainer/ScrollContainer"] +margin_right = 261.0 +size_flags_horizontal = 3 + +[node name="Load" type="Button" parent="CharacterSelectorMenu/CharacterSelector/VBoxContainer/CharacterSelector/VBoxContainer"] +margin_top = 458.0 +margin_right = 261.0 +margin_bottom = 484.57 +text = "Load" + +[node name="New" type="Button" parent="CharacterSelectorMenu/CharacterSelector/VBoxContainer/CharacterSelector/VBoxContainer"] +margin_top = 492.0 +margin_right = 261.0 +margin_bottom = 518.57 +text = "New" + +[node name="Delete" type="Button" parent="CharacterSelectorMenu/CharacterSelector/VBoxContainer/CharacterSelector/VBoxContainer"] +margin_top = 526.0 +margin_right = 261.0 +margin_bottom = 552.57 +text = "Delete" + +[node name="PlayerDisplays" type="Node" parent="CharacterSelectorMenu"] + +[node name="CharacterCreationMenu" type="Control" parent="."] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +script = ExtResource( 6 ) +__meta__ = { +"_edit_use_anchors_": false +} +character_entry = ExtResource( 2 ) +menu_path = NodePath("..") +name_imput_path = NodePath("CharacterSelector2/CharacterSelector/VBoxContainer/PanelContainer/VBoxContainer/LineEdit") +container_path = NodePath("CharacterSelector2/CharacterSelector/VBoxContainer/ScrollContainer/Container") +character_creation_button_group = ExtResource( 7 ) +character_folder = "characters" + +[node name="CharacterSelector2" type="MarginContainer" parent="CharacterCreationMenu"] +anchor_left = 1.0 +anchor_top = 0.5 +anchor_right = 1.0 +anchor_bottom = 0.5 +margin_left = -289.0 +margin_top = -300.0 +margin_bottom = 300.0 +custom_constants/margin_right = 20 +custom_constants/margin_top = 20 +custom_constants/margin_bottom = 20 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="CharacterSelector" type="PanelContainer" parent="CharacterCreationMenu/CharacterSelector2"] +margin_top = 20.0 +margin_right = 269.0 +margin_bottom = 580.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="CharacterCreationMenu/CharacterSelector2/CharacterSelector"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 265.0 +margin_bottom = 556.0 + +[node name="ScrollContainer" type="ScrollContainer" parent="CharacterCreationMenu/CharacterSelector2/CharacterSelector/VBoxContainer"] +margin_right = 261.0 +margin_bottom = 421.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Container" type="VBoxContainer" parent="CharacterCreationMenu/CharacterSelector2/CharacterSelector/VBoxContainer/ScrollContainer"] +margin_right = 261.0 +size_flags_horizontal = 3 + +[node name="PanelContainer" type="PanelContainer" parent="CharacterCreationMenu/CharacterSelector2/CharacterSelector/VBoxContainer"] +margin_top = 429.0 +margin_right = 261.0 +margin_bottom = 552.0 + +[node name="VBoxContainer" type="VBoxContainer" parent="CharacterCreationMenu/CharacterSelector2/CharacterSelector/VBoxContainer/PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 257.0 +margin_bottom = 119.0 + +[node name="Label" type="Label" parent="CharacterCreationMenu/CharacterSelector2/CharacterSelector/VBoxContainer/PanelContainer/VBoxContainer"] +margin_right = 253.0 +margin_bottom = 15.0 +text = "Character name" + +[node name="LineEdit" type="LineEdit" parent="CharacterCreationMenu/CharacterSelector2/CharacterSelector/VBoxContainer/PanelContainer/VBoxContainer"] +margin_top = 23.0 +margin_right = 253.0 +margin_bottom = 47.3413 + +[node name="Create" type="Button" parent="CharacterCreationMenu/CharacterSelector2/CharacterSelector/VBoxContainer/PanelContainer/VBoxContainer"] +margin_top = 55.0 +margin_right = 253.0 +margin_bottom = 81.5702 +size_flags_horizontal = 3 +text = "Create" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Back" type="Button" parent="CharacterCreationMenu/CharacterSelector2/CharacterSelector/VBoxContainer/PanelContainer/VBoxContainer"] +margin_top = 89.0 +margin_right = 253.0 +margin_bottom = 115.57 +text = "Back" + +[node name="ConnectMenu" type="Control" parent="."] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="PanelContainer" type="PanelContainer" parent="ConnectMenu"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -126.0 +margin_top = -89.0 +margin_right = 126.0 +margin_bottom = 89.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="ConnectMenu/PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 248.0 +margin_bottom = 254.0 + +[node name="Label3" type="Label" parent="ConnectMenu/PanelContainer/VBoxContainer"] +margin_right = 244.0 +margin_bottom = 15.0 +text = "Connect" +align = 1 +valign = 1 + +[node name="Label" type="Label" parent="ConnectMenu/PanelContainer/VBoxContainer"] +margin_top = 23.0 +margin_right = 244.0 +margin_bottom = 38.0 +text = "Hostname / IP" + +[node name="LineEdit" type="LineEdit" parent="ConnectMenu/PanelContainer/VBoxContainer"] +margin_top = 46.0 +margin_right = 244.0 +margin_bottom = 70.3413 +text = "127.0.0.1" + +[node name="Label2" type="Label" parent="ConnectMenu/PanelContainer/VBoxContainer"] +margin_top = 78.0 +margin_right = 244.0 +margin_bottom = 93.0 +text = "Port" + +[node name="LineEdit2" type="LineEdit" parent="ConnectMenu/PanelContainer/VBoxContainer"] +margin_top = 101.0 +margin_right = 244.0 +margin_bottom = 125.341 +text = "23223" + +[node name="CheckBox" type="CheckBox" parent="ConnectMenu/PanelContainer/VBoxContainer"] +margin_top = 133.0 +margin_right = 244.0 +margin_bottom = 159.57 +text = "Use WebSockets" + +[node name="Status" type="Label" parent="ConnectMenu/PanelContainer/VBoxContainer"] +margin_top = 167.0 +margin_right = 244.0 +margin_bottom = 182.0 +align = 1 +valign = 1 + +[node name="ConnectButton" type="Button" parent="ConnectMenu/PanelContainer/VBoxContainer"] +margin_top = 190.0 +margin_right = 244.0 +margin_bottom = 216.57 +text = "Connect" +script = ExtResource( 14 ) +container_path = NodePath("../../..") +status_label_path = NodePath("../Status") +use_websockets_checkbox_path = NodePath("../CheckBox") +ip_line_edit_path = NodePath("../LineEdit") +port_line_edit_path = NodePath("../LineEdit2") + +[node name="Button2" type="Button" parent="ConnectMenu/PanelContainer/VBoxContainer"] +margin_top = 224.0 +margin_right = 244.0 +margin_bottom = 250.57 +text = "Cancel" + +[node name="HostMenu" type="Control" parent="."] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="PanelContainer" type="PanelContainer" parent="HostMenu"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -126.0 +margin_top = -101.5 +margin_right = 126.0 +margin_bottom = 101.5 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="HostMenu/PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 248.0 +margin_bottom = 199.0 + +[node name="Label3" type="Label" parent="HostMenu/PanelContainer/VBoxContainer"] +margin_right = 244.0 +margin_bottom = 15.0 +text = "Host" +align = 1 +valign = 1 + +[node name="Label2" type="Label" parent="HostMenu/PanelContainer/VBoxContainer"] +margin_top = 23.0 +margin_right = 244.0 +margin_bottom = 38.0 +text = "Port" + +[node name="LineEdit2" type="LineEdit" parent="HostMenu/PanelContainer/VBoxContainer"] +margin_top = 46.0 +margin_right = 244.0 +margin_bottom = 70.3413 +text = "23223" + +[node name="CheckBox" type="CheckBox" parent="HostMenu/PanelContainer/VBoxContainer"] +margin_top = 78.0 +margin_right = 244.0 +margin_bottom = 104.57 +text = "Use WebSockets" + +[node name="Status" type="Label" parent="HostMenu/PanelContainer/VBoxContainer"] +margin_top = 112.0 +margin_right = 244.0 +margin_bottom = 127.0 +align = 1 +valign = 1 + +[node name="HostButton" type="Button" parent="HostMenu/PanelContainer/VBoxContainer"] +margin_top = 135.0 +margin_right = 244.0 +margin_bottom = 161.57 +text = "Host" +script = ExtResource( 15 ) +container_path = NodePath("../../..") +status_label_path = NodePath("../Status") +use_websockets_checkbox_path = NodePath("../CheckBox") +port_line_edit_path = NodePath("../LineEdit2") + +[node name="Button2" type="Button" parent="HostMenu/PanelContainer/VBoxContainer"] +margin_top = 169.0 +margin_right = 244.0 +margin_bottom = 195.57 +text = "Cancel" + +[node name="OptionsButton" type="MarginContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +custom_constants/margin_right = 20 +custom_constants/margin_top = 20 +custom_constants/margin_left = 20 +custom_constants/margin_bottom = 20 +__meta__ = { +"_edit_lock_": true, +"_edit_use_anchors_": false +} + +[node name="Control" type="Control" parent="OptionsButton"] +margin_left = 20.0 +margin_top = 20.0 +margin_right = 1004.0 +margin_bottom = 580.0 +mouse_filter = 2 +__meta__ = { +"_edit_lock_": true +} + +[node name="VBoxContainer" type="VBoxContainer" parent="OptionsButton/Control"] +anchor_top = 1.0 +anchor_bottom = 1.0 +margin_top = -175.0 +margin_right = 111.0 +mouse_filter = 2 +alignment = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Disconnect" type="Button" parent="OptionsButton/Control/VBoxContainer"] +visible = false +margin_right = 120.0 +margin_bottom = 26.269 +rect_min_size = Vector2( 120, 0 ) +text = "Disconnect" +script = ExtResource( 13 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Connect" type="Button" parent="OptionsButton/Control/VBoxContainer"] +margin_top = 47.0 +margin_right = 120.0 +margin_bottom = 73.5702 +rect_min_size = Vector2( 120, 0 ) +text = "Connect" +script = ExtResource( 11 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Host" type="Button" parent="OptionsButton/Control/VBoxContainer"] +margin_top = 81.0 +margin_right = 120.0 +margin_bottom = 107.57 +rect_min_size = Vector2( 120, 0 ) +text = "Host" +script = ExtResource( 12 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Button2" type="Button" parent="OptionsButton/Control/VBoxContainer"] +visible = false +margin_top = 115.0 +margin_right = 120.0 +margin_bottom = 141.57 +rect_min_size = Vector2( 120, 0 ) +text = "Login" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Button3" type="Button" parent="OptionsButton/Control/VBoxContainer"] +visible = false +margin_top = 115.0 +margin_right = 120.0 +margin_bottom = 141.57 +rect_min_size = Vector2( 120, 0 ) +text = "Register" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="About" type="Button" parent="OptionsButton/Control/VBoxContainer"] +margin_top = 115.0 +margin_right = 120.0 +margin_bottom = 141.57 +rect_min_size = Vector2( 120, 0 ) +text = "About" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Button" type="Button" parent="OptionsButton/Control/VBoxContainer"] +margin_top = 149.0 +margin_right = 120.0 +margin_bottom = 175.57 +rect_min_size = Vector2( 120, 0 ) +text = "Options" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Options" parent="." instance=ExtResource( 8 )] +visible = false + +[node name="About" parent="." instance=ExtResource( 20 )] +visible = false + +[node name="Login" parent="." instance=ExtResource( 10 )] +visible = false +margin_left = -107.5 +margin_top = -127.5 +margin_right = 107.5 +margin_bottom = 127.5 + +[node name="Register" parent="." instance=ExtResource( 9 )] +visible = false + +[node name="Char" type="Spatial" parent="."] +transform = Transform( 0.359313, 0, 0.933217, 0, 1, 0, -0.933217, 0, 0.359313, -2.44425, 0.926699, 0 ) + +[node name="CharacterDisplay" type="Spatial" parent="Char"] +transform = Transform( 1, 1.49012e-08, 0, 0, 0.990268, -0.139173, -2.98023e-08, 0.139173, 0.990268, -5.96046e-08, 0.578123, 0.08125 ) + +[node name="Camera" type="Camera" parent="Char"] +transform = Transform( 0.907555, -0.0761572, 0.41297, 0.0262364, 0.99178, 0.12524, -0.419113, -0.102827, 0.902093, 0.752064, 1.69463, 3.15021 ) +current = true +[connection signal="pressed" from="CharacterSelectorMenu/CharacterSelector/VBoxContainer/CharacterSelector/VBoxContainer/Load" to="CharacterSelectorMenu" method="load_character"] +[connection signal="pressed" from="CharacterSelectorMenu/CharacterSelector/VBoxContainer/CharacterSelector/VBoxContainer/New" to="." method="switch_to_menu" binds= [ 1 ]] +[connection signal="pressed" from="CharacterSelectorMenu/CharacterSelector/VBoxContainer/CharacterSelector/VBoxContainer/Delete" to="CharacterSelectorMenu" method="renounce_character"] +[connection signal="pressed" from="CharacterCreationMenu/CharacterSelector2/CharacterSelector/VBoxContainer/PanelContainer/VBoxContainer/Create" to="CharacterCreationMenu" method="create"] +[connection signal="pressed" from="CharacterCreationMenu/CharacterSelector2/CharacterSelector/VBoxContainer/PanelContainer/VBoxContainer/Back" to="." method="switch_to_menu" binds= [ 0 ]] +[connection signal="pressed" from="ConnectMenu/PanelContainer/VBoxContainer/Button2" to="ConnectMenu" method="hide"] +[connection signal="pressed" from="HostMenu/PanelContainer/VBoxContainer/Button2" to="HostMenu" method="hide"] +[connection signal="pressed" from="OptionsButton/Control/VBoxContainer/Connect" to="ConnectMenu" method="show"] +[connection signal="pressed" from="OptionsButton/Control/VBoxContainer/Host" to="HostMenu" method="show"] +[connection signal="pressed" from="OptionsButton/Control/VBoxContainer/Button2" to="Login" method="show"] +[connection signal="pressed" from="OptionsButton/Control/VBoxContainer/Button3" to="Register" method="show"] +[connection signal="pressed" from="OptionsButton/Control/VBoxContainer/About" to="About" method="show"] +[connection signal="pressed" from="OptionsButton/Control/VBoxContainer/Button" to="Options" method="show"] diff --git a/game/scenes/Shared.tscn b/game/scenes/Shared.tscn new file mode 100644 index 0000000..942f716 --- /dev/null +++ b/game/scenes/Shared.tscn @@ -0,0 +1,11 @@ +[gd_scene format=2] + +[node name="SharedScene" type="Node"] + +[node name="Options" type="Control" parent="."] +margin_right = 806.0 +margin_bottom = 557.0 + +[node name="Keybindings" type="Control" parent="."] +margin_right = 746.0 +margin_bottom = 531.0 diff --git a/game/scenes/World.gd b/game/scenes/World.gd new file mode 100644 index 0000000..8deb6dc --- /dev/null +++ b/game/scenes/World.gd @@ -0,0 +1,100 @@ +extends Node2D + +# Copyright (c) 2019 Péter Magyar +# +# 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. + +export(PackedScene) var world_layer : PackedScene + +export(bool) var spawn_mobs : bool = true +export(bool) var editor_generate : bool = false setget set_editor_generate, get_editor_generate +export(bool) var show_loading_screen : bool = true +export(bool) var generate_on_ready : bool = false + +var initial_generation : bool = false + +var _editor_generate : bool + +var _player_file_name : String +var _player : Entity + +func _ready(): +# print(get_layer(2)) + pass # Replace with function body. + +func get_layer(index : int) -> Navigation2D: + for ch in get_children(): + if ch.has_method('collision_layer') and ch.collision_layer() == index: + return ch + + var wl : Navigation2D = world_layer.instance() as Navigation2D + add_child(wl) + wl.collision_layer = index + + return wl + +func load_character(file_name: String) -> void: + _player_file_name = file_name + _player = ESS.entity_spawner.load_player(file_name, Vector3(5, 5, 0), 1) as Entity + #TODO hack, do this properly +# _player.set_physics_process(false) + + Server.sset_seed(_player.sseed) + + if spawn_mobs: + generate() + + + + +func generate() -> void: + for x in range(-5, 5): + for y in range(-5, 5): + ESS.entity_spawner.spawn_mob(1, 50, Vector3(x * 200, y * 200, 0)) + +func save() -> void: + if _player == null or _player_file_name == "": + return + + ESS.entity_spawner.save_player(_player, _player_file_name) + +func _generation_finished(): + + if show_loading_screen and not Engine.editor_hint: + get_node("..").hide_loading_screen() + +# if _player: +# _player.set_physics_process(true) + +func get_editor_generate() -> bool: + return _editor_generate + +func set_editor_generate(value : bool) -> void: + if value: + #library.refresh_rects() + + #level_generator.setup(self, current_seed, false, library) + #spawn() + pass + else: + #spawned = false + #clear() + pass + + _editor_generate = value diff --git a/game/scenes/World.tscn b/game/scenes/World.tscn new file mode 100644 index 0000000..dfbdf35 --- /dev/null +++ b/game/scenes/World.tscn @@ -0,0 +1,13 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://scenes/World.gd" type="Script" id=1] +[ext_resource path="res://world/WorldLayer.tscn" type="PackedScene" id=2] +[ext_resource path="res://test_iso_tileset/TileMap44x24.tscn" type="PackedScene" id=3] + +[node name="World" type="Node2D" groups=[ +"save", +]] +script = ExtResource( 1 ) +world_layer = ExtResource( 2 ) + +[node name="TileMap" parent="." instance=ExtResource( 3 )] diff --git a/game/scenes/World3d.tscn b/game/scenes/World3d.tscn new file mode 100644 index 0000000..ebbf4e1 --- /dev/null +++ b/game/scenes/World3d.tscn @@ -0,0 +1,63 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://scripts/settings/DirectionalLightSettings.gd" type="Script" id=3] + +[sub_resource type="ProceduralSky" id=1] +sky_top_color = Color( 0.435294, 0.423529, 0.313726, 1 ) +sky_horizon_color = Color( 0.309804, 0.317647, 0.219608, 1 ) +sky_curve = 0.263535 +sky_energy = 0.3 +ground_bottom_color = Color( 0.196078, 0.152941, 0.152941, 1 ) +ground_horizon_color = Color( 0.223529, 0.192157, 0.164706, 1 ) +ground_curve = 0.101965 +ground_energy = 0.4 +sun_color = Color( 0.356863, 0.313726, 0.219608, 1 ) +sun_latitude = 39.71 +sun_longitude = -8.09 +sun_angle_min = 0.0 +sun_angle_max = 23.15 +sun_energy = 9.29 +texture_size = 0 + +[sub_resource type="Environment" id=2] +background_mode = 2 +background_sky = SubResource( 1 ) +ambient_light_color = Color( 0.870588, 0.870588, 0.870588, 1 ) +ambient_light_energy = 1.67 +ambient_light_sky_contribution = 0.09 +fog_enabled = true +fog_color = Color( 0.184314, 0.207843, 0.156863, 1 ) +fog_sun_color = Color( 0.196078, 0.266667, 0.309804, 1 ) +fog_sun_amount = 0.53 +fog_depth_begin = 155.9 +fog_depth_end = 379.9 +fog_depth_curve = 1.18921 +tonemap_mode = 2 +tonemap_exposure = 0.83 +auto_exposure_max_luma = 7.33 +ss_reflections_enabled = true +ssao_enabled = true +glow_levels/3 = false +glow_intensity = 1.6 +glow_strength = 1.1 +glow_bloom = 0.1 +glow_hdr_luminance_cap = 1.0 + +[node name="World" type="Spatial" groups=[ +"save", +]] + +[node name="WorldEnvironment" type="WorldEnvironment" parent="."] +environment = SubResource( 2 ) +__meta__ = { +"_editor_description_": "" +} + +[node name="DirectionalLight" type="DirectionalLight" parent="."] +transform = Transform( -0.797163, 0.45442, 0.397535, 0.124932, -0.520028, 0.844963, 0.590697, 0.723238, 0.357776, 0, 18.834, 0 ) +layers = 3 +light_color = Color( 1, 0.878431, 0.878431, 1 ) +light_energy = 0.87 +light_specular = 0.65 +shadow_bias = 0.07 +script = ExtResource( 3 ) diff --git a/game/scripts/ai/EntityAIGD.gd b/game/scripts/ai/EntityAIGD.gd new file mode 100644 index 0000000..fed167a --- /dev/null +++ b/game/scripts/ai/EntityAIGD.gd @@ -0,0 +1,142 @@ +extends EntityAI +class_name EntityAIGD + +# Copyright Péter Magyar relintai@gmail.com +# MIT License, functionality from this class needs to be protable to the entity spell system + +# Copyright (c) 2019-2020 Péter Magyar + +# 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. + +var _data : Dictionary = { + "target_aura_spells": {}, + "spells": [] +} + +func _ready(): + pass + +func _on_set_owner(): + if not is_instance_valid(owner): + return + + #owner.connect("starget_changed", self, "starget_changed") + + if not owner.sentity_data: + return + + var ent_data : EntityData = owner.sentity_data + + if not ent_data.entity_class_data: + return + + var class_data : EntityClassData = ent_data.entity_class_data + + for i in range(class_data.get_num_spells()): + var spell : Spell = class_data.get_spell(i) + + if spell.get_num_target_aura_applys() > 0: + var aura : Aura = spell.get_target_aura_apply(0) + + if not _data["target_aura_spells"].has(aura.aura_group): + _data["target_aura_spells"][aura.aura_group] = [] + + _data["target_aura_spells"][aura.aura_group].append({ "aura_id": aura.id, "spell_id": spell.id, "rank": spell.rank }) + + continue + + _data["spells"].append(spell.id) + + for key in _data["target_aura_spells"]: + var arr : Array = _data["target_aura_spells"][key] + + arr.sort_custom(self, "sort_spells_by_rank") + + +func _update(delta): + if owner.ai_state == EntityEnums.AI_STATE_ATTACK: + attack(delta) + +func attack(delta): + var target : Entity = owner.starget + + if target == null: + owner.ai_state = EntityEnums.AI_STATE_REGENERATE + owner.get_body().target_movement_direction = Vector2() + return + + var cast : bool = false + if not owner.gcd_hass(): + var taspellsdict : Dictionary = _data["target_aura_spells"] + + for taskey in taspellsdict.keys(): + for tas in taspellsdict[taskey]: + var spell_id : int = tas["spell_id"] + + if not owner.spell_hass_id(spell_id): + continue + + if taskey == null: + if target.aura_gets_by(owner, tas["aura_id"]) == null and not owner.cooldown_hass(spell_id): + owner.spell_crequest_cast(spell_id) + cast = true + break + else: + if target.aura_gets_with_group_by(owner, taskey) == null and not owner.cooldown_hass(spell_id): + owner.spell_crequest_cast(spell_id) + cast = true + break + if cast: + break + + if not cast: + var sps : Array = _data["spells"] + + for spell_id in sps: + if not owner.spell_hass_id(spell_id): + continue + + if not owner.cooldown_hass(spell_id): + owner.spell_crequest_cast(spell_id) + cast = true + break + + if owner.cast_is_castings(): + owner.get_body().target_movement_direction = Vector2() + return + + owner.get_body().target_movement_direction = Vector2() + + var dir : Vector2 = target.get_body().position - owner.get_body().position + var l = dir.length() + + if l > 2.5: + owner.get_body().target_movement_direction = Vector2(dir.x, dir.y) + +func sort_spells_by_rank(a, b): + if a == null or b == null: + return true + + return a["rank"] > b["rank"] + +func starget_changed(entity: Entity, old_target: Entity): + if entity: + owner.ai_state = EntityEnums.AI_STATE_ATTACK + else: + owner.ai_state = EntityEnums.AI_STATE_OFF diff --git a/game/scripts/auras/CastTimeReductionAura.gd b/game/scripts/auras/CastTimeReductionAura.gd new file mode 100644 index 0000000..a6cf947 --- /dev/null +++ b/game/scripts/auras/CastTimeReductionAura.gd @@ -0,0 +1,9 @@ +extends Aura + +export(String) var spell_name : String +export(float) var reduction_value : float + +func _notification_ccast(what : int, data : AuraData, info: SpellCastInfo): + if SpellEnums.NOTIFICATION_CAST_STARTED: + if info.spell.get_name() == spell_name: + info.cast_time -= reduction_value diff --git a/game/scripts/auras/SpeedModAura.gd b/game/scripts/auras/SpeedModAura.gd new file mode 100644 index 0000000..c233d9d --- /dev/null +++ b/game/scripts/auras/SpeedModAura.gd @@ -0,0 +1,26 @@ +extends "aura_script.gd" + +export(bool) var does_stack : bool = true +export(float) var mod_speed : float = 0 + +func apply_mods(ad : AuraData): + #slows never stack + if mod_speed < 0: + ad.owner.gets_speed().add_non_stacking_mod(mod_speed) + return + + if does_stack: + ad.owner.gets_speed().add_stacking_mod(mod_speed) + else: + ad.owner.gets_speed().add_non_stacking_mod(mod_speed) + +func deapply_mods(ad : AuraData): + #slows never stack + if mod_speed < 0: + ad.owner.gets_speed().remove_non_stacking_mod(mod_speed) + return + + if does_stack: + ad.owner.gets_speed().remove_stacking_mod(mod_speed) + else: + ad.owner.gets_speed().remove_non_stacking_mod(mod_speed) diff --git a/game/scripts/auras/SpellDamageModAura.gd b/game/scripts/auras/SpellDamageModAura.gd new file mode 100644 index 0000000..58b917b --- /dev/null +++ b/game/scripts/auras/SpellDamageModAura.gd @@ -0,0 +1,14 @@ +extends "aura_script.gd" + +export(String) var spell_name : String +export(float) var mod_value : float + +func _sapply_passives_damage_deal(data : SpellDamageInfo): + var spell : Spell = data.spell_source_get() + + if !spell: + return + + if spell.get_name() == spell_name: + data.damage *= (100.0 + mod_value) / 100.0 + diff --git a/game/scripts/auras/aura_script.gd b/game/scripts/auras/aura_script.gd new file mode 100644 index 0000000..583a2ad --- /dev/null +++ b/game/scripts/auras/aura_script.gd @@ -0,0 +1,101 @@ +extends Aura +class_name AuraGD + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + + +func _sapply(info : AuraApplyInfo) -> void: +# var add : bool = false + var ad : AuraData = info.target.aura_gets_by(info.caster, info.aura.id) + + if ad == null: +# add = true + ad = AuraData.new() + + setup_aura_data(ad, info); + + for i in range(stat_attribute_get_count()): + info.target.stat_mod(stat_attribute_get_stat(id), stat_attribute_get_base_mod(i), stat_attribute_get_bonus_mod(i), stat_attribute_get_percent_mod(i)) + + if states_add != 0: + for i in range(EntityEnums.ENTITY_STATE_TYPE_INDEX_MAX): + var t : int = 1 << i + + if states_add & t != 0: + info.target.adds_state_ref(i) + + + info.target.aura_adds(ad); + + apply_mods(ad) + else: + ad.remaining_time = time + + +func _sdeapply(data : AuraData) -> void: + for i in range(stat_attribute_get_count()): + data.owner.stat_mod(stat_attribute_get_stat(id), -stat_attribute_get_base_mod(i), -stat_attribute_get_bonus_mod(i), -stat_attribute_get_percent_mod(i)) + + if states_add != 0: + for i in range(EntityEnums.ENTITY_STATE_TYPE_INDEX_MAX): + var t : int = 1 << i + + if states_add & t != 0: + data.owner.removes_state_ref(i) + + deapply_mods(data) + +func apply_mods(ad : AuraData): + pass + +func deapply_mods(ad : AuraData): + pass + + +func _con_aura_added(data : AuraData) -> void: + if data.owner.get_character_skeleton() == null or data.owner.get_character_skeleton().root_attach_point == null: + return + + var bse : SpellEffectVisualBasic = visual_spell_effects as SpellEffectVisualBasic + + if bse != null: + if bse.root_aura_effect != null: + if bse.root_aura_effect_time < 0.00001: + data.owner.get_character_skeleton().root_attach_point.add_effect(bse.root_aura_effect) + else: + data.owner.get_character_skeleton().root_attach_point.add_effect_timed(bse.root_aura_effect, bse.root_aura_effect_time) + + if bse.torso_aura_effect != null: + if bse.torso_aura_effect_time < 0.00001: + data.owner.get_character_skeleton().torso_attach_point.add_effect(bse.torso_aura_effect) + else: + data.owner.get_character_skeleton().torso_attach_point.add_effect_timed(bse.torso_aura_effect, bse.torso_aura_effect_time) + +func _con_aura_removed(data : AuraData) -> void: + var bse : SpellEffectVisualBasic = visual_spell_effects as SpellEffectVisualBasic + + if bse != null: + if bse.root_aura_effect != null and bse.root_aura_effect_time < 0.00001: + data.owner.get_character_skeleton().root_attach_point.remove_effect(bse.root_aura_effect) + + if bse.torso_aura_effect != null and bse.torso_aura_effect_time < 0.00001: + data.owner.get_character_skeleton().torso_attach_point.remove_effect(bse.torso_aura_effect) + diff --git a/game/scripts/entities/EntityClassDataGD.gd b/game/scripts/entities/EntityClassDataGD.gd new file mode 100644 index 0000000..c2eafc6 --- /dev/null +++ b/game/scripts/entities/EntityClassDataGD.gd @@ -0,0 +1,117 @@ +extends EntityClassData + +# Copyright Péter Magyar relintai@gmail.com +# MIT License, functionality from this class needs to be protable to the entity spell system + +# Copyright (c) 2019-2020 Péter Magyar + +# 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. + +var _data : Dictionary = { + "target_aura_spells": {}, + "spells": [] +} + +func _init(): + for i in range(get_num_spells()): + var spell : Spell = get_spell(i) + + if spell.get_num_target_aura_applys() > 0: + var aura : Aura = spell.get_target_aura_apply(0) + + if not _data["target_aura_spells"].has(aura.aura_group): + _data["target_aura_spells"][aura.aura_group] = [] + + _data["target_aura_spells"][aura.aura_group].append({ "aura_id": aura.id, "spell_id": spell.id, "rank": spell.rank }) + + continue + + _data["spells"].append(spell.id) + + for key in _data["target_aura_spells"]: + var arr : Array = _data["target_aura_spells"][key] + + arr.sort_custom(self, "sort_spells_by_rank") + + +func _sai_attack(entity): + var mob : Entity = entity as Entity + + var target : Entity = entity.starget + + if mob != null and target == null: + mob.ai_state = EntityEnums.AI_STATE_REGENERATE + mob.target_movement_direction = Vector2() + return + + var cast : bool = false + if not entity.gcd_hass(): + var taspellsdict : Dictionary = _data["target_aura_spells"] + + for taskey in taspellsdict.keys(): + for tas in taspellsdict[taskey]: + var spell_id : int = tas["spell_id"] + + if not entity.spell_hass_id(spell_id): + continue + + if taskey == null: + if target.aura_gets_by(entity, tas["aura_id"]) == null and not entity.cooldown_hass(spell_id): + entity.spell_crequest_cast(spell_id) + cast = true + break + else: + if target.aura_gets_with_group_by(entity, taskey) == null and not entity.cooldown_hass(spell_id): + entity.spell_crequest_cast(spell_id) + cast = true + break + if cast: + break + + if not cast: + var sps : Array = _data["spells"] + + for spell_id in sps: + if not entity.spell_hass_id(spell_id): + continue + + if not entity.cooldown_hass(spell_id): + entity.spell_crequest_cast(spell_id) + cast = true + break + + + if entity.cast_is_castings(): + mob.target_movement_direction = Vector2() + return + + var dir : Vector3 = target.translation - entity.translation + + mob.target_movement_direction = Vector2(dir.x, dir.z) + +#func _setup_resources(entity): +# var p : EntityResource = ManaResource.new() +# +# entity.resource_adds(p) + +func sort_spells_by_rank(a, b): + if a == null or b == null: + return true + + return a["rank"] > b["rank"] diff --git a/game/scripts/entities/EntityDataGD.gd b/game/scripts/entities/EntityDataGD.gd new file mode 100644 index 0000000..6a1c16d --- /dev/null +++ b/game/scripts/entities/EntityDataGD.gd @@ -0,0 +1,65 @@ +extends EntityData +class_name EntityDataGD + +# Copyright Péter Magyar relintai@gmail.com +# MIT License, functionality from this class needs to be protable to the entity spell system + +# Copyright (c) 2019-2020 Péter Magyar + +# 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. + +func _sinteract(entity: Entity) -> void: + var target : Entity = entity.gets_target() + + if target == null or not is_instance_valid(target): + return + + if target.sentity_interaction_type == EntityEnums.ENITIY_INTERACTION_TYPE_LOOT: + if target.gets_entity_data().loot_db != null and target.sbag == null: + var ldb : LootDataBase = target.gets_entity_data().loot_db + + var loot : Array = Array() + + ldb.get_loot() + + var bag : Bag = Bag.new() + bag.set_size(loot.size()) + + for item in loot: + var it : ItemTemplate = item as ItemTemplate + + bag.add_item(it.create_item_instance()) + + target.sbag = bag + + entity.starget_bag = target.sbag + + entity.ssend_open_window(EntityEnums.ENTITY_WINDOW_LOOT) + elif target.sentity_interaction_type == EntityEnums.ENITIY_INTERACTION_TYPE_TRAIN: + entity.ssend_open_window(EntityEnums.ENTITY_WINDOW_TRAINER) + elif target.sentity_interaction_type == EntityEnums.ENITIY_INTERACTION_TYPE_VENDOR: + entity.ssend_open_window(EntityEnums.ENTITY_WINDOW_VENDOR) + +func _cans_interact(entity): + var target : Entity = entity.gets_target() + + if target == null or not is_instance_valid(target): + return false + + return true diff --git a/game/scripts/game_modules/DataManager.gd b/game/scripts/game_modules/DataManager.gd new file mode 100644 index 0000000..ff6f7f7 --- /dev/null +++ b/game/scripts/game_modules/DataManager.gd @@ -0,0 +1,78 @@ +extends Node + +const PLAYER_UI_INSTANCE : int = 0 + +export(PackedScene) var player_ui : PackedScene + +var _modules : Array + +func _ready() -> void: + ProfileManager.load() +# ESS.resource_db = ESSResourceDBMap.new() + ESS.resource_db = ESSResourceDBStatic.new() + ESS.resource_db.remap_ids = true +# ESS.load_all() + + initialize_modules() + +func initialize_modules() -> void: + _modules.clear() + + load_modules_at("res://") + + _modules.sort_custom(ModulePathSorter, "sort_ascending") + + for module in _modules: + if module.has_method("load_module"): + module.load_module() + +func load_modules_at(path : String) -> void: + var dir = Directory.new() + if dir.open(path) == OK: + dir.list_dir_begin() + var file_name = dir.get_next() + while file_name != "": + if file_name == "." or file_name == "..": + file_name = dir.get_next() + continue + + if dir.current_is_dir(): + if path == "res://": + load_modules_at(path + file_name) + else: + load_modules_at(path + "/" + file_name) + else: + if file_name == "game_module.tres": + var res : Resource = null + + if path == "res://": + res = ResourceLoader.load(path + file_name) + else: + res = ResourceLoader.load(path + "/" + file_name) + + if res.enabled: + _modules.append(res) + + file_name = dir.get_next() + else: + print("An error occurred when trying to access the path: " + path) + + +func request_instance(what : int) -> Node: + var inst : Node = null + + if what == PLAYER_UI_INSTANCE: + inst = player_ui.instance() + inst.initialize() + + for module in _modules: +# if module.has_method("on_request_instance"): + module.on_request_instance(what, inst) + + return inst + +class ModulePathSorter: + static func sort_ascending(a, b): + if a.resource_path < b.resource_path: + return true + return false diff --git a/game/scripts/game_modules/DataManager.tscn b/game/scripts/game_modules/DataManager.tscn new file mode 100644 index 0000000..bd79578 --- /dev/null +++ b/game/scripts/game_modules/DataManager.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://scripts/game_modules/DataManager.gd" type="Script" id=1] +[ext_resource path="res://ui/player_ui/player_ui.tscn" type="PackedScene" id=2] + +[node name="DataManager" type="Node"] +script = ExtResource( 1 ) +player_ui = ExtResource( 2 ) diff --git a/game/scripts/game_modules/GameModule.gd b/game/scripts/game_modules/GameModule.gd new file mode 100644 index 0000000..d6b0629 --- /dev/null +++ b/game/scripts/game_modules/GameModule.gd @@ -0,0 +1,25 @@ +extends Resource +class_name GameModule + +export(bool) var enabled : bool = true + +export(ESSResourceDB) var resource_db : ESSResourceDB + +func load_module(): + if resource_db != null: + resource_db.initialize() + + ESS.resource_db.add_entity_resource_db(resource_db) + +# var r : ESSResourceDB = ESS.resource_db +# +# for e in r.get_entity_datas(): +# print(e.resource_path) +# print(e.get_id()) + +# for s in r.get_spells(): +# print(s.resource_name) +# print(s.get_id()) + +func on_request_instance(what : int, node : Node) -> void: + return diff --git a/game/scripts/game_modules/ui_gui_child_module.gd b/game/scripts/game_modules/ui_gui_child_module.gd new file mode 100644 index 0000000..4bb3d33 --- /dev/null +++ b/game/scripts/game_modules/ui_gui_child_module.gd @@ -0,0 +1,15 @@ +extends GameModule +class_name UIGuiChildModule + +export(PackedScene) var scene : PackedScene +export(bool) var hide : bool = false + +func on_request_instance(what : int, node : Node) -> void: + if what == DataManager.PLAYER_UI_INSTANCE: + var sc = scene.instance() + + node.gui_base.add_child(sc) + + if hide: + sc.hide() + diff --git a/game/scripts/game_modules/ui_window_module.gd b/game/scripts/game_modules/ui_window_module.gd new file mode 100644 index 0000000..43a7e66 --- /dev/null +++ b/game/scripts/game_modules/ui_window_module.gd @@ -0,0 +1,22 @@ +extends GameModule +class_name UIWindowModule + +export(PackedScene) var scene : PackedScene +export(Texture) var opener_button_texture : Texture +export(int) var index : int = -1 +export(bool) var add_button : bool = true + +func on_request_instance(what : int, node : Node) -> void: + if what == DataManager.PLAYER_UI_INSTANCE: + var sc = scene.instance() + + node.windows.add_child(sc) + + if add_button: + var b = node.buttons.add_image_button(opener_button_texture, index) + + b.connect("toggled", sc, "_on_button_toggled") + sc.opener_button = b + + sc.hide() + diff --git a/game/scripts/item_visuals/CharacterAtlas2D.gd b/game/scripts/item_visuals/CharacterAtlas2D.gd new file mode 100644 index 0000000..8479f2d --- /dev/null +++ b/game/scripts/item_visuals/CharacterAtlas2D.gd @@ -0,0 +1,27 @@ +extends CharacterAtlas +class_name CharacterAtlas2D + +# Copyright (c) 2019 Péter Magyar +# +# 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. + +export(String, MULTILINE) var comments : String + +export(Texture) var texture : Texture +export(Array, CharacterAtlasEntry) var slots : Array diff --git a/game/scripts/item_visuals/CharacterAtlasEntry2D.gd b/game/scripts/item_visuals/CharacterAtlasEntry2D.gd new file mode 100644 index 0000000..cd0cf99 --- /dev/null +++ b/game/scripts/item_visuals/CharacterAtlasEntry2D.gd @@ -0,0 +1,39 @@ +extends CharacterAtlasEntry +class_name CharacterAtlasEntry2D + +# Copyright (c) 2019 Péter Magyar +# +# 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. + +export(Rect2) var front_rect : Rect2 +export(Rect2) var back_rect : Rect2 +export(Rect2) var right_rect : Rect2 +export(Rect2) var left_rect : Rect2 + +func get_index(facing : int) -> Rect2: + if facing == CharacterSkeleton2DGD.CharacterFacing.FACING_FRONT: + return front_rect + if facing == CharacterSkeleton2DGD.CharacterFacing.FACING_BACK: + return back_rect + if facing == CharacterSkeleton2DGD.CharacterFacing.FACING_RIGHT: + return right_rect + if facing == CharacterSkeleton2DGD.CharacterFacing.FACING_LEFT: + return left_rect + + return front_rect diff --git a/game/scripts/item_visuals/ItemVisual2D.gd b/game/scripts/item_visuals/ItemVisual2D.gd new file mode 100644 index 0000000..8c79d0f --- /dev/null +++ b/game/scripts/item_visuals/ItemVisual2D.gd @@ -0,0 +1,24 @@ +extends SkeletonModelEntry +class_name ItemVisual2D + +# Copyright (c) 2019 Péter Magyar +# +# 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. + +export(Array, ItemVisualEntry) var entries : Array diff --git a/game/scripts/item_visuals/ItemVisualEntry2D.gd b/game/scripts/item_visuals/ItemVisualEntry2D.gd new file mode 100644 index 0000000..5c7af61 --- /dev/null +++ b/game/scripts/item_visuals/ItemVisualEntry2D.gd @@ -0,0 +1,28 @@ +tool +extends SkeletonModelEntry +class_name ItemVisualEntry2D + +# Copyright (c) 2019 Péter Magyar +# +# 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. + +export (Texture) var front_texture : Texture +export (Texture) var back_texture : Texture +export (Texture) var left_texture : Texture +export (Texture) var right_texture : Texture diff --git a/game/scripts/items/ItemTemplateGD.gd b/game/scripts/items/ItemTemplateGD.gd new file mode 100644 index 0000000..e96fb07 --- /dev/null +++ b/game/scripts/items/ItemTemplateGD.gd @@ -0,0 +1,29 @@ +extends ItemTemplate +class_name ItemTemplateGD + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +func _create_item_instance(): + var ii : ItemInstance = ItemInstance.new() + + ii.item_template = self + + return ii diff --git a/game/scripts/networking/PlayerMaster.gd b/game/scripts/networking/PlayerMaster.gd new file mode 100644 index 0000000..e23069a --- /dev/null +++ b/game/scripts/networking/PlayerMaster.gd @@ -0,0 +1,40 @@ +extends Resource +class_name PlayerMaster + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +# Player info, associate ID to data +var player_info = {} +# Info we send to other players +var my_info = { name = "Testname", selected_class = 1 } +var sid : int + +var player : Entity + +func _init(): + pass + +func _notification(what : int) -> void: + if what == NOTIFICATION_PREDELETE: + #save + #cleanup + pass + diff --git a/game/scripts/networking/SpawnPoint.gd b/game/scripts/networking/SpawnPoint.gd new file mode 100644 index 0000000..7dc512d --- /dev/null +++ b/game/scripts/networking/SpawnPoint.gd @@ -0,0 +1,135 @@ +extends Spatial + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export (bool) var use_gui : bool = false +export (bool) var multi_player : bool = false +export (NodePath) var gui_path : NodePath +export (NodePath) var host_button_path : NodePath + +export (NodePath) var address_line_edit_path : NodePath +export (NodePath) var port_line_edit_path : NodePath + +export (NodePath) var connect_button_path : NodePath +export (NodePath) var naturalist_button_path : NodePath + +export (NodePath) var terrarin_path : NodePath + +var gui : Node +var host_button : Button +var address_line_edit : LineEdit +var port_line_edit : LineEdit +var connect_button : Button +var naturalist_button : Button + +var player : Entity +#var terrarin : VoxelWorld + +var spawned : bool = false + +var player_master : PlayerMaster + +func _ready(): + gui = get_node(gui_path) + host_button = get_node(host_button_path) + host_button.connect("pressed", self, "_on_host_button_clicked") + + address_line_edit = get_node(address_line_edit_path) + port_line_edit = get_node(port_line_edit_path) + + connect_button = get_node(connect_button_path) + connect_button.connect("pressed", self, "_on_client_button_clicked") + + naturalist_button = get_node(naturalist_button_path) + naturalist_button.connect("pressed", self, "_on_client_naturalist_button_clicked") + +# terrarin = get_node(terrarin_path) as VoxelWorld + + Server.connect("cplayer_master_created", self, "_cplayer_master_created") + + if not multi_player: + set_process(true) + else: + set_process(false) + + if use_gui: + gui.visible = true + +func _process(delta): + set_process(false) + + spawn() + +func spawn(): + if not spawned: + spawned = true + + if get_tree().network_peer == null: + player = ESS.entity_spawner.spawn_player(1, Vector3(10, 20, 10), "Player", "1", 1) + call_deferred("set_terrarin_player") +# +# ESS.entity_spawner.spawn_mob(1, 50, Vector3(20, 6, 20)) +# ESS.entity_spawner.spawn_mob(1, 50, Vector3(54, 6, 22)) +# ESS.entity_spawner.spawn_mob(1, 50, Vector3(76, 6, 54)) + +func set_terrarin_player(): + pass +# terrarin.set_player(player.get_body() as Spatial) + +func _on_host_button_clicked(): + get_tree().connect("network_peer_connected", self, "_network_peer_connected") + get_tree().connect("network_peer_disconnected", self, "_network_peer_disconnected") + + Server.start_hosting() + + spawn() + +func _on_client_button_clicked(): + + var addr : String = "127.0.0.1" if address_line_edit.text == "" else address_line_edit.text + var port : int = 0 if port_line_edit.text == "" else int(port_line_edit.text) + + Server.connect_to_server(addr, port) + + + +func _network_peer_connected(id : int): + print(id) + +func _network_peer_disconnected(id : int): + print(id) + +func _cplayer_master_created(pplayer_master): + player_master = pplayer_master as PlayerMaster + +func _on_client_naturalist_button_clicked(): + #Network.is + #set_class + + gui.visible = false + + if get_tree().network_peer != null: + Server.set_class() + else: + spawn() + + + diff --git a/game/scripts/resources/HealthResource.gd b/game/scripts/resources/HealthResource.gd new file mode 100644 index 0000000..20b2479 --- /dev/null +++ b/game/scripts/resources/HealthResource.gd @@ -0,0 +1,47 @@ +extends EntityResource +class_name HealthResource + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +var stamina_stat_id : int = 0 +var health_stat_id = 0 + +func _init(): + current_value = 100 + stamina_stat_id = ESS.stat_get_id("Stamina") + health_stat_id = ESS.stat_get_id("Health") + +func _ons_added(entity): + refresh() + +func _notification_sstat_changed(stat_id : int, value : float): + if stat_id == stamina_stat_id || stat_id == health_stat_id: + refresh() + +func refresh(): + var stamina : int = owner.stat_gets_current(stamina_stat_id) + var health : int = owner.stat_gets_current(health_stat_id) + + max_value = int(stamina) * 10 + int(health) + #todo fix this if this solution works well + current_value = max_value + + diff --git a/game/scripts/resources/ManaResource.gd b/game/scripts/resources/ManaResource.gd new file mode 100644 index 0000000..383f6f8 --- /dev/null +++ b/game/scripts/resources/ManaResource.gd @@ -0,0 +1,71 @@ +extends EntityResource +class_name ManaResource + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +var mana_regen : int = 10 +var tickrate : float = 2 +var timer : float = 0 + +var int_id : int = 0 +var spirit_id = 0 + +func _init(): + should_process = true + int_id = ESS.stat_get_id("Intellect") + spirit_id = ESS.stat_get_id("Spirit") + +func _ons_added(entity): + refresh() + +func _notification_sstat_changed(stat_id : int, value : float): + if stat_id == int_id || stat_id == spirit_id: + refresh() + +func refresh(): + var intellect : int = owner.stat_gets_current(int_id) + var spirit : int = owner.stat_gets_current(spirit_id) + + var m : bool = false + + if max_value == current_value: + m = true + + var nv : int = int(intellect) * 10 + + max_value = nv + + if m: + current_value = nv + + mana_regen = int(spirit) + +func _process_server(delta): + timer += delta + + if timer > tickrate: + timer -= tickrate + + if current_value < max_value: + current_value += mana_regen + + if current_value > max_value: + current_value = max_value diff --git a/game/scripts/resources/SpeedResource.gd b/game/scripts/resources/SpeedResource.gd new file mode 100644 index 0000000..6cecc29 --- /dev/null +++ b/game/scripts/resources/SpeedResource.gd @@ -0,0 +1,44 @@ +extends EntityResource +class_name SpeedResource + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + + +var speed_stat_id : int = 0 + +var base_value = 100 + +func _init(): + current_value = base_value + speed_stat_id = ESS.stat_get_id("Speed") + +func _ons_added(entity): + refresh() + +func _notification_sstat_changed(stat_id : int, value : float): + if stat_id == speed_stat_id: + refresh() + +func refresh(): + var speed_stat : int = owner.stat_gets_current(speed_stat_id) + + current_value = base_value + speed_stat * 0.01 + diff --git a/game/scripts/resources/spell_effect_visual_basic.gd b/game/scripts/resources/spell_effect_visual_basic.gd new file mode 100644 index 0000000..da00e7f --- /dev/null +++ b/game/scripts/resources/spell_effect_visual_basic.gd @@ -0,0 +1,37 @@ +extends SpellEffectVisual +class_name SpellEffectVisualBasic + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export (PackedScene) var spell_cast_effect_left_hand : PackedScene +export (PackedScene) var spell_cast_effect_right_hand : PackedScene + +export (PackedScene) var torso_aura_effect : PackedScene +export (float) var torso_aura_effect_time : float + +export (PackedScene) var root_aura_effect : PackedScene +export (float) var root_aura_effect_time : float + +export (PackedScene) var torso_spell_cast_finish_effect : PackedScene +export (float) var torso_spell_cast_finish_effect_time : float = 1 + +export (PackedScene) var root_spell_cast_finish_effect : PackedScene +export (float) var root_spell_cast_finish_effect_time : float = 1 diff --git a/game/scripts/settings/DirectionalLightSettings.gd b/game/scripts/settings/DirectionalLightSettings.gd new file mode 100644 index 0000000..078ccb7 --- /dev/null +++ b/game/scripts/settings/DirectionalLightSettings.gd @@ -0,0 +1,25 @@ +extends DirectionalLight + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +func _ready(): + shadow_enabled = ProjectSettings.get("rendering/quality/shadows/enabled") + diff --git a/game/scripts/spells/amplify_pain.gd b/game/scripts/spells/amplify_pain.gd new file mode 100644 index 0000000..ebda927 --- /dev/null +++ b/game/scripts/spells/amplify_pain.gd @@ -0,0 +1,37 @@ +extends SpellGD + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +func _cast_finishs(info : SpellCastInfo) -> void: + var target : Entity = info.target + + if not is_instance_valid(target): + return + + for i in range(target.aura_gets_count()): + + var ad : AuraData = target.aura_gets(i) + + if ad.caster == info.caster: + var aura : Aura = ad.aura + + if aura.aura_type & SpellEnums.AURA_TYPE_MAGIC != 0: + ad.time_since_last_tick += ad.tick diff --git a/game/scripts/spells/gd_spell_script.gd b/game/scripts/spells/gd_spell_script.gd new file mode 100644 index 0000000..bf4d572 --- /dev/null +++ b/game/scripts/spells/gd_spell_script.gd @@ -0,0 +1,263 @@ +extends Spell +class_name SpellGD + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +var gcd_id : int = 0 + +func _init(): + gcd_id = ESS.stat_get_id("Global Cooldown") + +func _cast_starts(info : SpellCastInfo) -> void: + if needs_target and info.target == null: + return + + if info.caster.cast_is_castings(): + return + + if cooldown_global_cooldown_enabled and info.caster.gcd_hass() or info.caster.category_cooldown_hass(spell_type) or info.caster.cooldown_hass(id): + return + + if !info.caster.spell_hass_id(id): + return + + var entity_relation_type = info.caster.gets_relation_to(info.target) + + var ok = false + + if target_relation_type & TARGET_FRIENDLY or target_relation_type & TARGET_SELF: + if entity_relation_type == EntityEnums.ENTITY_RELATION_TYPE_FRIENDLY or entity_relation_type == EntityEnums.ENTITY_RELATION_TYPE_NEUTRAL: + ok = true + else: + if entity_relation_type == EntityEnums.ENTITY_RELATION_TYPE_HOSTILE: + info.target = info.caster + ok = true + + if target_relation_type & TARGET_ENEMY: + if entity_relation_type == EntityEnums.ENTITY_RELATION_TYPE_HOSTILE: + ok = true + + if !ok: + return + + if range_enabled: + if info.caster != info.target: + var c : Vector2 = info.caster.get_body().position + var t : Vector2 = info.target.get_body().position + + if (c - t).length() > range_range: + return + + if resource_cost != null and resource_cost.entity_resource_data != null: + var r : EntityResource = info.caster.resource_gets_id(resource_cost.entity_resource_data.id) + + if r == null: + return + + if r.current_value < resource_cost.cost: + return + + if cast_enabled: + info.caster.cast_starts(info) + return + + if resource_cost != null and resource_cost.entity_resource_data != null: + var r : EntityResource = info.caster.resource_gets_id(resource_cost.entity_resource_data.id) + + r.current_value -= resource_cost.cost + + info.caster.notification_scast(SpellEnums.NOTIFICATION_CAST_FINISHED, info) + info.caster.notification_scast(SpellEnums.NOTIFICATION_CAST_SUCCESS, info) + + info.caster.notification_ccast(SpellEnums.NOTIFICATION_CAST_FINISHED, info) + + if info.target: + info.target.notification_scast(SpellEnums.NOTIFICATION_CAST_FINISHED_TARGET, info) + + handle_cooldown(info) + +# if projectile != null: +# handle_projectile(info) +# else: + handle_effect(info) + + handle_gcd(info) + +func _cast_finishs(info : SpellCastInfo) -> void: + if resource_cost != null and resource_cost.entity_resource_data != null: + var r : EntityResource = info.caster.resource_gets_id(resource_cost.entity_resource_data.id) + + if r.current_value < resource_cost.cost: + info.caster.son_cast_failed(info) + return + + r.current_value -= resource_cost.cost + + info.caster.notification_scast(SpellEnums.NOTIFICATION_CAST_FINISHED, info) + info.caster.notification_scast(SpellEnums.NOTIFICATION_CAST_SUCCESS, info) + + info.caster.notification_ccast(SpellEnums.NOTIFICATION_CAST_FINISHED, info) + + if is_instance_valid(info.target): + info.target.notification_scast(SpellEnums.NOTIFICATION_CAST_FINISHED_TARGET, info) + + if projectile_scene != null: + handle_projectile(info) + else: + handle_effect(info) + + handle_cooldown(info) + handle_gcd(info) + + +func _son_cast_player_moved(info): + if !cast_can_move_while_casting: + info.caster.cast_fails() + + +func handle_effect(info : SpellCastInfo) -> void: + if target_type == SPELL_TARGET_TYPE_TARGET: + if info.target == null: + return + +# var ok : bool = false + +# if (target_relation_type & TARGET_SELF): +# ok = true + +# if not ok and (target_relation_type & TARGET_ENEMY and info.target is Entity): +# ok = true +# +# if not ok and (target_relation_type & TARGET_FRIENDLY and info.target is Player): +# ok = true + +# if not ok: +# return + + elif target_type == SPELL_TARGET_TYPE_SELF: + info.target = info.caster + + if damage_enabled and info.target: + var sdi : SpellDamageInfo = SpellDamageInfo.new() + + sdi.spell_source = self + sdi.dealer = info.caster + sdi.receiver = info.target + + handle_spell_damage(sdi) + + if heal_enabled and info.target: + var shi : SpellHealInfo = SpellHealInfo.new() + + shi.spell_source = self + shi.dealer = info.caster + shi.receiver = info.target + + handle_spell_heal(shi) + + for aura in caster_aura_applys: + var ainfo : AuraApplyInfo = AuraApplyInfo.new() + + ainfo.caster = info.caster + ainfo.target = info.caster + ainfo.spell_scale = 1 + ainfo.aura = aura + + aura.sapply(ainfo) + + if info.target != null: + for aura in target_aura_applys: + var ad : AuraData = null + + if aura.aura_group != null: + ad = info.target.aura_gets_with_group_by(info.caster, aura.aura_group) + else: + ad = info.target.aura_gets_by(info.caster, aura.get_id()) + + if ad != null: + info.target.aura_removes_exact(ad) + + var ainfo : AuraApplyInfo = AuraApplyInfo.new() + + ainfo.caster = info.caster + ainfo.target = info.target + ainfo.spell_scale = 1 + ainfo.aura = aura + + aura.sapply(ainfo) + + + +func handle_cooldown(info : SpellCastInfo) -> void: + if cooldown_cooldown > 0: + info.caster.cooldown_adds(id, cooldown_cooldown) + +func handle_gcd(info : SpellCastInfo) -> void: + if cooldown_global_cooldown_enabled and not cast_enabled: + info.caster.gcd_starts(info.caster.stat_gets_current(gcd_id)) + +func add_spell_cast_effect(info : SpellCastInfo) -> void: + var basic_spell_effect : SpellEffectVisualBasic = visual_spell_effects as SpellEffectVisualBasic + + if basic_spell_effect != null: + if basic_spell_effect.spell_cast_effect_left_hand != null: + info.caster.get_character_skeleton().common_attach_point_add(EntityEnums.COMMON_SKELETON_POINT_LEFT_HAND, basic_spell_effect.spell_cast_effect_left_hand) + + if basic_spell_effect.spell_cast_effect_right_hand != null: + info.caster.get_character_skeleton().common_attach_point_add(EntityEnums.COMMON_SKELETON_POINT_RIGHT_HAND, basic_spell_effect.spell_cast_effect_right_hand) + +func remove_spell_cast_effect(info : SpellCastInfo) -> void: + var basic_spell_effect : SpellEffectVisualBasic = visual_spell_effects as SpellEffectVisualBasic + + if basic_spell_effect != null: + if basic_spell_effect.spell_cast_effect_left_hand != null: + info.caster.get_character_skeleton().common_attach_point_remove(EntityEnums.COMMON_SKELETON_POINT_LEFT_HAND, basic_spell_effect.spell_cast_effect_left_hand) + + if basic_spell_effect.spell_cast_effect_right_hand != null: + info.caster.get_character_skeleton().common_attach_point_remove(EntityEnums.COMMON_SKELETON_POINT_RIGHT_HAND, basic_spell_effect.spell_cast_effect_right_hand) + +func _notification_ccast(what, info): + if what == SpellEnums.NOTIFICATION_CAST_STARTED: + add_spell_cast_effect(info) + elif what == SpellEnums.NOTIFICATION_CAST_FAILED: + remove_spell_cast_effect(info) + elif what == SpellEnums.NOTIFICATION_CAST_FINISHED: + remove_spell_cast_effect(info) + elif what == SpellEnums.NOTIFICATION_CAST_INTERRUPTED: + remove_spell_cast_effect(info) + elif what == SpellEnums.NOTIFICATION_CAST_SUCCESS: + remove_spell_cast_effect(info) + + if not is_instance_valid(info.target): + return + + var bse : SpellEffectVisualBasic = visual_spell_effects as SpellEffectVisualBasic + + if bse != null: + if bse.torso_spell_cast_finish_effect != null: + info.target.get_character_skeleton().common_attach_point_add_timed(EntityEnums.COMMON_SKELETON_POINT_TORSO, bse.torso_spell_cast_finish_effect_time) + + if bse.root_spell_cast_finish_effect != null: + info.target.get_character_skeleton().common_attach_point_add_timed(EntityEnums.COMMON_SKELETON_POINT_ROOT, bse.root_spell_cast_finish_effect_time) + + +func _son_spell_hit(info): + handle_effect(info) diff --git a/game/scripts/ui/AdaptiveTheme.gd b/game/scripts/ui/AdaptiveTheme.gd new file mode 100644 index 0000000..c7665c1 --- /dev/null +++ b/game/scripts/ui/AdaptiveTheme.gd @@ -0,0 +1,50 @@ +extends Theme + +export(float) var content_margin_vertical_normal : float = 6 +export(float) var content_margin_vertical_touch : float = 10 + +export(float) var content_margin_horizontal_normal : float = 5 +export(float) var content_margin_horizontal_touch : float = 20 + +func _init(): + Settings.connect("setting_changed", self, "setting_changed") + Settings.connect("settings_loaded", self, "settings_loaded") + + if Settings.loaded: + adapt(Settings.get_value("ui", "touchscreen_mode")) + + +func setting_changed(section, key, value): + if section == "ui" and key == "touchscreen_mode": + adapt(value) + +func settings_loaded(): + adapt(Settings.get_value("ui", "touchscreen_mode")) + +func adapt(touchscreen_mode : bool) -> void: + var content_martgin_vert : float = 0 + var content_margin_horiz : float = 0 + + if touchscreen_mode: + content_martgin_vert = content_margin_vertical_touch + content_margin_horiz = content_margin_horizontal_touch + else: + content_martgin_vert = content_margin_vertical_normal + content_margin_horiz = content_margin_horizontal_normal + + for sbs in get_stylebox_list("Button"): + var sb : StyleBoxTexture = get_stylebox(sbs, "Button") as StyleBoxTexture + + if sb == null: + continue + + sb.content_margin_top = content_martgin_vert + sb.content_margin_bottom = content_martgin_vert + + sb.content_margin_left = content_margin_horiz + sb.content_margin_right = content_margin_horiz + + + + + diff --git a/game/scripts/world_generators/MainPlanetGenerator.gd b/game/scripts/world_generators/MainPlanetGenerator.gd new file mode 100644 index 0000000..c39e9be --- /dev/null +++ b/game/scripts/world_generators/MainPlanetGenerator.gd @@ -0,0 +1,110 @@ +tool +#extends VoxelmanLevelGenerator +extends Resource +class_name MainPlanetGenerator + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +const planet_folder : String = "res://modules/planets" + +export(int) var _force_planet : int = -1 +export(int) var _level_seed : int +export(bool) var _spawn_mobs : bool + +#var _world : VoxelWorld +var _planet : Planet +#var _library : VoxelmanLibrary + +#func setup(world : VoxelWorld, level_seed : int, spawn_mobs : bool, library: VoxelmanLibrary) -> void: +# _level_seed = level_seed +# _world = world +# _spawn_mobs = spawn_mobs +# _library = library +# +# create_planet() + +#func _generate_chunk(chunk : VoxelChunk) -> void: +# if _planet == null: +# return +# +# _planet.generate_chunk(chunk, _spawn_mobs) + +func create_planet(): + var planet_files : Array = get_planets(planet_folder) + + if planet_files.size() == 0: + return + + var ind : int + if _force_planet == -1: + seed(_level_seed) + ind = randi() % planet_files.size() + else: + ind = _force_planet + + var planet_data : Planet = ResourceLoader.load(planet_files[ind], "Planet") + + if planet_data == null: + print("planet_data is null!") + return + + print("planet loaded: " + planet_data.resource_path) + + if planet_data.target_script != null: + _planet = planet_data.target_script.new() + + if _planet == null: + print("_planet is null. wrong type? " + planet_data.resource_path) + return + elif planet_data.target_class_name != "": + if not ClassDB.class_exists(planet_data.target_class_name): + print("class doesnt exists" + planet_data.resource_path) + return + + _planet = ClassDB.instance(planet_data.target_class_name) + else: + _planet = Planet.new() + + _planet.current_seed = _level_seed + _planet.data = planet_data + _planet.setup() +# _planet.setup_library(_library) + +func get_planets(path : String, root : bool = true) -> Array: + var planet_files : Array = Array() + + var dir = Directory.new() + if dir.open(path) == OK: + dir.list_dir_begin(true) + var file_name = dir.get_next() + while (file_name != ""): + if not dir.current_is_dir(): + planet_files.append(path + "/" + file_name) + else: + if root: + var l : Array = get_planets(path + "/" + file_name, false) + + for i in l: + planet_files.append(i) + + file_name = dir.get_next() + + return planet_files diff --git a/game/steering_ai_framework/Agents/GSAIKinematicBody2DAgent.gd b/game/steering_ai_framework/Agents/GSAIKinematicBody2DAgent.gd new file mode 100644 index 0000000..006fb8e --- /dev/null +++ b/game/steering_ai_framework/Agents/GSAIKinematicBody2DAgent.gd @@ -0,0 +1,120 @@ +# A specialized steering agent that updates itself every frame so the user does +# not have to using a KinematicBody2D +extends GSAISpecializedAgent +class_name GSAIKinematicBody2DAgent + +# SLIDE uses `move_and_slide` +# COLLIDE uses `move_and_collide` +# POSITION changes the `global_position` directly +enum MovementType { SLIDE, COLLIDE, POSITION } + +# The KinematicBody2D to keep track of +var body: KinematicBody2D setget _set_body + +# The type of movement the body executes +var movement_type: int + +var _last_position: Vector2 + + +func _init(_body: KinematicBody2D, _movement_type: int = MovementType.SLIDE) -> void: + if not _body.is_inside_tree(): + yield(_body, "ready") + + self.body = _body + self.movement_type = _movement_type + + # warning-ignore:return_value_discarded + body.get_tree().connect("physics_frame", self, "_on_SceneTree_physics_frame") + + +# Moves the agent's `body` by target `acceleration`. +# tags: virtual +func _apply_steering(acceleration: GSAITargetAcceleration, delta: float) -> void: + _applied_steering = true + match movement_type: + MovementType.COLLIDE: + _apply_collide_steering(acceleration.linear, delta) + MovementType.SLIDE: + _apply_sliding_steering(acceleration.linear) + _: + _apply_position_steering(acceleration.linear, delta) + + _apply_orientation_steering(acceleration.angular, delta) + + +func _apply_sliding_steering(accel: Vector3) -> void: + var velocity := GSAIUtils.to_vector2(linear_velocity + accel).clamped(linear_speed_max) + if apply_linear_drag: + velocity = velocity.linear_interpolate(Vector2.ZERO, linear_drag_percentage) + velocity = body.move_and_slide(velocity) + if calculate_velocities: + linear_velocity = GSAIUtils.to_vector3(velocity) + + +func _apply_collide_steering(accel: Vector3, delta: float) -> void: + var velocity := GSAIUtils.clampedv3(linear_velocity + accel, linear_speed_max) + if apply_linear_drag: + velocity = velocity.linear_interpolate(Vector3.ZERO, linear_drag_percentage) + # warning-ignore:return_value_discarded + body.move_and_collide(GSAIUtils.to_vector2(velocity) * delta) + if calculate_velocities: + linear_velocity = velocity + + +func _apply_position_steering(accel: Vector3, delta: float) -> void: + var velocity := GSAIUtils.clampedv3(linear_velocity + accel, linear_speed_max) + if apply_linear_drag: + velocity = velocity.linear_interpolate(Vector3.ZERO, linear_drag_percentage) + body.global_position += GSAIUtils.to_vector2(velocity) * delta + if calculate_velocities: + linear_velocity = velocity + + +func _apply_orientation_steering(angular_acceleration: float, delta: float) -> void: + var velocity = angular_velocity + angular_acceleration + if apply_angular_drag: + velocity = lerp(velocity, 0, angular_drag_percentage) + body.rotation += velocity * delta + if calculate_velocities: + angular_velocity = velocity + + +func _set_body(value: KinematicBody2D) -> void: + body = value + + _last_position = body.global_position + _last_orientation = body.rotation + + position = GSAIUtils.to_vector3(_last_position) + orientation = _last_orientation + + +func _on_SceneTree_physics_frame() -> void: + var current_position := body.global_position + var current_orientation := body.rotation + + position = GSAIUtils.to_vector3(current_position) + orientation = current_orientation + + if calculate_velocities: + if _applied_steering: + _applied_steering = false + else: + linear_velocity = GSAIUtils.clampedv3( + GSAIUtils.to_vector3(_last_position - current_position), linear_speed_max + ) + if apply_linear_drag: + linear_velocity = linear_velocity.linear_interpolate( + Vector3.ZERO, linear_drag_percentage + ) + + angular_velocity = clamp( + _last_orientation - current_orientation, -angular_speed_max, angular_speed_max + ) + + if apply_angular_drag: + angular_velocity = lerp(angular_velocity, 0, angular_drag_percentage) + + _last_position = current_position + _last_orientation = current_orientation diff --git a/game/steering_ai_framework/Agents/GSAIKinematicBody3DAgent.gd b/game/steering_ai_framework/Agents/GSAIKinematicBody3DAgent.gd new file mode 100644 index 0000000..d12f9e8 --- /dev/null +++ b/game/steering_ai_framework/Agents/GSAIKinematicBody3DAgent.gd @@ -0,0 +1,120 @@ +# A specialized steering agent that updates itself every frame so the user does +# not have to using a KinematicBody +extends GSAISpecializedAgent +class_name GSAIKinematicBody3DAgent + +# SLIDE uses `move_and_slide` +# COLLIDE uses `move_and_collide` +# POSITION changes the global_position directly +enum MovementType { SLIDE, COLLIDE, POSITION } + +# The KinematicBody to keep track of +var body: KinematicBody setget _set_body + +# The type of movement the body executes +var movement_type: int + +var _last_position: Vector3 + + +func _init(_body: KinematicBody, _movement_type: int = MovementType.SLIDE) -> void: + if not _body.is_inside_tree(): + yield(_body, "ready") + + self.body = _body + self.movement_type = _movement_type + + # warning-ignore:return_value_discarded + self.body.get_tree().connect("physics_frame", self, "_on_SceneTree_physics_frame") + + +# Moves the agent's `body` by target `acceleration`. +# tags: virtual +func _apply_steering(acceleration: GSAITargetAcceleration, delta: float) -> void: + _applied_steering = true + match movement_type: + MovementType.COLLIDE: + _apply_collide_steering(acceleration.linear, delta) + MovementType.SLIDE: + _apply_sliding_steering(acceleration.linear) + _: + _apply_position_steering(acceleration.linear, delta) + + _apply_orientation_steering(acceleration.angular, delta) + + +func _apply_sliding_steering(accel: Vector3) -> void: + var velocity := GSAIUtils.clampedv3(linear_velocity + accel, linear_speed_max) + if apply_linear_drag: + velocity = velocity.linear_interpolate(Vector3.ZERO, linear_drag_percentage) + velocity = body.move_and_slide(velocity) + if calculate_velocities: + linear_velocity = velocity + + +func _apply_collide_steering(accel: Vector3, delta: float) -> void: + var velocity := GSAIUtils.clampedv3(linear_velocity + accel, linear_speed_max) + if apply_linear_drag: + velocity = velocity.linear_interpolate(Vector3.ZERO, linear_drag_percentage) + # warning-ignore:return_value_discarded + body.move_and_collide(velocity * delta) + if calculate_velocities: + linear_velocity = velocity + + +func _apply_position_steering(accel: Vector3, delta: float) -> void: + var velocity := GSAIUtils.clampedv3(linear_velocity + accel, linear_speed_max) + if apply_linear_drag: + velocity = velocity.linear_interpolate(Vector3.ZERO, linear_drag_percentage) + body.global_position += velocity * delta + if calculate_velocities: + linear_velocity = velocity + + +func _apply_orientation_steering(angular_acceleration: float, delta: float) -> void: + var velocity = angular_velocity + angular_acceleration + if apply_angular_drag: + velocity = lerp(velocity, 0, angular_drag_percentage) + body.rotation.y += velocity * delta + if calculate_velocities: + angular_velocity = velocity + + +func _set_body(value: KinematicBody) -> void: + body = value + + _last_position = body.transform.origin + _last_orientation = body.rotation.y + + position = _last_position + orientation = _last_orientation + + +func _on_SceneTree_physics_frame() -> void: + var current_position := body.transform.origin + var current_orientation := body.rotation.y + + position = current_position + orientation = current_orientation + + if calculate_velocities: + if _applied_steering: + _applied_steering = false + else: + linear_velocity = GSAIUtils.clampedv3( + _last_position - current_position, linear_speed_max + ) + if apply_linear_drag: + linear_velocity = linear_velocity.linear_interpolate( + Vector3.ZERO, linear_drag_percentage + ) + + angular_velocity = clamp( + _last_orientation - current_orientation, -angular_speed_max, angular_speed_max + ) + + if apply_angular_drag: + angular_velocity = lerp(angular_velocity, 0, angular_drag_percentage) + + _last_position = current_position + _last_orientation = current_orientation diff --git a/game/steering_ai_framework/Agents/GSAIRigidBody2DAgent.gd b/game/steering_ai_framework/Agents/GSAIRigidBody2DAgent.gd new file mode 100644 index 0000000..f8d814f --- /dev/null +++ b/game/steering_ai_framework/Agents/GSAIRigidBody2DAgent.gd @@ -0,0 +1,58 @@ +# A specialized steering agent that updates itself every frame so the user does +# not have to using a RigidBody2D +extends GSAISpecializedAgent +class_name GSAIRigidBody2DAgent + +# The RigidBody2D to keep track of +var body: RigidBody2D setget _set_body + +var _last_position: Vector2 + + +func _init(_body: RigidBody2D) -> void: + if not _body.is_inside_tree(): + yield(_body, "ready") + + self.body = _body + + +# Moves the agent's `body` by target `acceleration`. +# tags: virtual +func _apply_steering(acceleration: GSAITargetAcceleration, _delta: float) -> void: + _applied_steering = true + body.apply_central_impulse(GSAIUtils.to_vector2(acceleration.linear)) + body.apply_torque_impulse(acceleration.angular) + if calculate_velocities: + linear_velocity = GSAIUtils.to_vector3(body.linear_velocity) + angular_velocity = body.angular_velocity + + +func _set_body(value: RigidBody2D) -> void: + body = value + + _last_position = body.global_position + _last_orientation = body.rotation + + position = GSAIUtils.to_vector3(_last_position) + orientation = _last_orientation + + +func _on_body_ready() -> void: + # warning-ignore:return_value_discarded + body.get_tree().connect("physics_frame", self, "_on_SceneTree_frame") + _set_body(body) + + +func _on_SceneTree_frame() -> void: + var current_position := body.global_position + var current_orientation := body.rotation + + position = GSAIUtils.to_vector3(current_position) + orientation = current_orientation + + if calculate_velocities: + if _applied_steering: + _applied_steering = false + else: + linear_velocity = GSAIUtils.to_vector3(body.linear_velocity) + angular_velocity = body.angular_velocity diff --git a/game/steering_ai_framework/Agents/GSAIRigidBody3DAgent.gd b/game/steering_ai_framework/Agents/GSAIRigidBody3DAgent.gd new file mode 100644 index 0000000..78bc462 --- /dev/null +++ b/game/steering_ai_framework/Agents/GSAIRigidBody3DAgent.gd @@ -0,0 +1,60 @@ +# A specialized steering agent that updates itself every frame so the user does +# not have to using a RigidBody +extends GSAISpecializedAgent +class_name GSAIRigidBody3DAgent + +# The RigidBody to keep track of +var body: RigidBody setget _set_body + +var _last_position: Vector3 + + +func _init(_body: RigidBody) -> void: + if not _body.is_inside_tree(): + yield(_body, "ready") + + self.body = _body + # warning-ignore:return_value_discarded + self.body.get_tree().connect("physics_frame", self, "_on_SceneTree_frame") + + +# Moves the agent's `body` by target `acceleration`. +# tags: virtual +func _apply_steering(acceleration: GSAITargetAcceleration, _delta: float) -> void: + _applied_steering = true + body.apply_central_impulse(acceleration.linear) + body.apply_torque_impulse(Vector3.UP * acceleration.angular) + if calculate_velocities: + linear_velocity = body.linear_velocity + angular_velocity = body.angular_velocity.y + + +func _set_body(value: RigidBody) -> void: + body = value + + _last_position = body.transform.origin + _last_orientation = body.rotation.y + + position = _last_position + orientation = _last_orientation + + +func _on_body_ready() -> void: + # warning-ignore:return_value_discarded + body.get_tree().connect("physics_frame", self, "_on_SceneTree_frame") + _set_body(body) + + +func _on_SceneTree_frame() -> void: + var current_position := body.transform.origin + var current_orientation := body.rotation.y + + position = current_position + orientation = current_orientation + + if calculate_velocities: + if _applied_steering: + _applied_steering = false + else: + linear_velocity = body.linear_velocity + angular_velocity = body.angular_velocity.y diff --git a/game/steering_ai_framework/Agents/GSAISpecializedAgent.gd b/game/steering_ai_framework/Agents/GSAISpecializedAgent.gd new file mode 100644 index 0000000..18be399 --- /dev/null +++ b/game/steering_ai_framework/Agents/GSAISpecializedAgent.gd @@ -0,0 +1,39 @@ +# A base class for a specialized steering agent that updates itself every frame +# so the user does not have to. All other specialized agents derive from this. +# tags: abstract +extends GSAISteeringAgent +class_name GSAISpecializedAgent + +# If `true`, calculates linear and angular velocities based on the previous +# frame. When `false`, the user must keep those values updated. +var calculate_velocities := true + +# If `true`, interpolates the current linear velocity towards 0 by the +# `linear_drag_percentage` value. +# Does not apply to `RigidBody` and `RigidBody2D` nodes. +var apply_linear_drag := true + +# If `true`, interpolates the current angular velocity towards 0 by the +# `angular_drag_percentage` value. +# Does not apply to `RigidBody` and `RigidBody2D` nodes. +var apply_angular_drag := true + +# The percentage between the current linear velocity and 0 to interpolate by if +# `apply_linear_drag` is true. +# Does not apply to `RigidBody` and `RigidBody2D` nodes. +var linear_drag_percentage := 0.0 + +# The percentage between the current angular velocity and 0 to interpolate by if +# `apply_angular_drag` is true. +# Does not apply to `RigidBody` and `RigidBody2D` nodes. +var angular_drag_percentage := 0.0 + +var _last_orientation: float +var _body_type: int +var _applied_steering := false + + +# Moves the agent's body by target `acceleration`. +# tags: virtual +func _apply_steering(_acceleration: GSAITargetAcceleration, _delta: float) -> void: + pass diff --git a/game/steering_ai_framework/Behaviors/GSAIArrive.gd b/game/steering_ai_framework/Behaviors/GSAIArrive.gd new file mode 100644 index 0000000..972cea1 --- /dev/null +++ b/game/steering_ai_framework/Behaviors/GSAIArrive.gd @@ -0,0 +1,42 @@ +# Calculates acceleration to take an agent to its target's location. The +# calculation attempts to arrive with zero remaining velocity. +class_name GSAIArrive +extends GSAISteeringBehavior + +# Target agent to arrive to. +var target: GSAIAgentLocation +# Distance from the target for the agent to be considered successfully +# arrived. +var arrival_tolerance: float +# Distance from the target for the agent to begin slowing down. +var deceleration_radius: float +# Represents the time it takes to change acceleration. +var time_to_reach := 0.1 + + +func _init(agent: GSAISteeringAgent, _target: GSAIAgentLocation).(agent) -> void: + self.target = _target + + +func _arrive(acceleration: GSAITargetAcceleration, target_position: Vector3) -> void: + var to_target := target_position - agent.position + var distance := to_target.length() + + if distance <= arrival_tolerance: + acceleration.set_zero() + else: + var desired_speed := agent.linear_speed_max + + if distance <= deceleration_radius: + desired_speed *= distance / deceleration_radius + + var desired_velocity := to_target * desired_speed / distance + + desired_velocity = ((desired_velocity - agent.linear_velocity) * 1.0 / time_to_reach) + + acceleration.linear = GSAIUtils.clampedv3(desired_velocity, agent.linear_acceleration_max) + acceleration.angular = 0 + + +func _calculate_steering(acceleration: GSAITargetAcceleration) -> void: + _arrive(acceleration, target.position) diff --git a/game/steering_ai_framework/Behaviors/GSAIAvoidCollisions.gd b/game/steering_ai_framework/Behaviors/GSAIAvoidCollisions.gd new file mode 100644 index 0000000..613f5c8 --- /dev/null +++ b/game/steering_ai_framework/Behaviors/GSAIAvoidCollisions.gd @@ -0,0 +1,74 @@ +# Steers the agent to avoid obstacles in its path. Approximates obstacles as +# spheres. +class_name GSAIAvoidCollisions +extends GSAIGroupBehavior + +var _first_neighbor: GSAISteeringAgent +var _shortest_time: float +var _first_minimum_separation: float +var _first_distance: float +var _first_relative_position: Vector3 +var _first_relative_velocity: Vector3 + + +func _init(agent: GSAISteeringAgent, proximity: GSAIProximity).(agent, proximity) -> void: + pass + + +func _calculate_steering(acceleration: GSAITargetAcceleration) -> void: + _shortest_time = INF + _first_neighbor = null + _first_minimum_separation = 0 + _first_distance = 0 + + var neighbor_count := proximity._find_neighbors(_callback) + + if neighbor_count == 0 or not _first_neighbor: + acceleration.set_zero() + else: + if ( + _first_minimum_separation <= 0 + or _first_distance < agent.bounding_radius + _first_neighbor.bounding_radius + ): + acceleration.linear = _first_neighbor.position - agent.position + else: + acceleration.linear = ( + _first_relative_position + + (_first_relative_velocity * _shortest_time) + ) + + acceleration.linear = (acceleration.linear.normalized() * -agent.linear_acceleration_max) + acceleration.angular = 0 + + +# Callback for the proximity to call when finding neighbors. Keeps track of every `neighbor` +# that was found but only keeps the one the owning agent will most likely collide with. +# tags: virtual +func _report_neighbor(neighbor: GSAISteeringAgent) -> bool: + var relative_position := neighbor.position - agent.position + var relative_velocity := neighbor.linear_velocity - agent.linear_velocity + var relative_speed_squared := relative_velocity.length_squared() + + if relative_speed_squared == 0: + return false + else: + var time_to_collision = -relative_position.dot(relative_velocity) / relative_speed_squared + + if time_to_collision <= 0 or time_to_collision >= _shortest_time: + return false + else: + var distance = relative_position.length() + var minimum_separation: float = ( + distance + - sqrt(relative_speed_squared) * time_to_collision + ) + if minimum_separation > agent.bounding_radius + neighbor.bounding_radius: + return false + else: + _shortest_time = time_to_collision + _first_neighbor = neighbor + _first_minimum_separation = minimum_separation + _first_distance = distance + _first_relative_position = relative_position + _first_relative_velocity = relative_velocity + return true diff --git a/game/steering_ai_framework/Behaviors/GSAIBlend.gd b/game/steering_ai_framework/Behaviors/GSAIBlend.gd new file mode 100644 index 0000000..0bfbfff --- /dev/null +++ b/game/steering_ai_framework/Behaviors/GSAIBlend.gd @@ -0,0 +1,47 @@ +# Blends multiple steering behaviors into one, and returns a weighted +# acceleration from their calculations. +# +# Stores the behaviors internally as dictionaries of the form +# { +# behavior : GSAISteeringBehavior, +# weight : float +# } +class_name GSAIBlend +extends GSAISteeringBehavior + +var _behaviors := [] +var _accel := GSAITargetAcceleration.new() + + +func _init(agent: GSAISteeringAgent).(agent) -> void: + pass + + +# Appends a behavior to the internal array along with its `weight`. +func add(behavior: GSAISteeringBehavior, weight: float) -> void: + behavior.agent = agent + _behaviors.append({behavior = behavior, weight = weight}) + + +# Returns the behavior at the specified `index`, or an empty `Dictionary` if +# none was found. +func get_behavior_at(index: int) -> Dictionary: + if _behaviors.size() > index: + return _behaviors[index] + printerr("Tried to get index " + str(index) + " in array of size " + str(_behaviors.size())) + return {} + + +func _calculate_steering(blended_accel: GSAITargetAcceleration) -> void: + blended_accel.set_zero() + + for i in range(_behaviors.size()): + var bw: Dictionary = _behaviors[i] + bw.behavior.calculate_steering(_accel) + + blended_accel.add_scaled_accel(_accel, bw.weight) + + blended_accel.linear = GSAIUtils.clampedv3(blended_accel.linear, agent.linear_acceleration_max) + blended_accel.angular = clamp( + blended_accel.angular, -agent.angular_acceleration_max, agent.angular_acceleration_max + ) diff --git a/game/steering_ai_framework/Behaviors/GSAICohesion.gd b/game/steering_ai_framework/Behaviors/GSAICohesion.gd new file mode 100644 index 0000000..c3202ad --- /dev/null +++ b/game/steering_ai_framework/Behaviors/GSAICohesion.gd @@ -0,0 +1,30 @@ +# Calculates an acceleration that attempts to move the agent towards the center +# of mass of the agents in the area defined by the `GSAIProximity`. +class_name GSAICohesion +extends GSAIGroupBehavior + +var _center_of_mass: Vector3 + + +func _init(agent: GSAISteeringAgent, proximity: GSAIProximity).(agent, proximity) -> void: + pass + + +func _calculate_steering(acceleration: GSAITargetAcceleration) -> void: + acceleration.set_zero() + _center_of_mass = Vector3.ZERO + var neighbor_count = proximity._find_neighbors(_callback) + if neighbor_count > 0: + _center_of_mass *= 1.0 / neighbor_count + acceleration.linear = ( + (_center_of_mass - agent.position).normalized() + * agent.linear_acceleration_max + ) + + +# Callback for the proximity to call when finding neighbors. Adds `neighbor`'s position +# to the center of mass of the group. +# tags: virtual +func _report_neighbor(neighbor: GSAISteeringAgent) -> bool: + _center_of_mass += neighbor.position + return true diff --git a/game/steering_ai_framework/Behaviors/GSAIEvade.gd b/game/steering_ai_framework/Behaviors/GSAIEvade.gd new file mode 100644 index 0000000..61c9551 --- /dev/null +++ b/game/steering_ai_framework/Behaviors/GSAIEvade.gd @@ -0,0 +1,14 @@ +# Calculates acceleration to take an agent away from where a target agent is +# moving. +class_name GSAIEvade +extends GSAIPursue + + +func _init(agent: GSAISteeringAgent, target: GSAISteeringAgent, predict_time_max := 1.0).( + agent, target, predict_time_max +): + pass + + +func _get_modified_acceleration() -> float: + return -agent.linear_acceleration_max diff --git a/game/steering_ai_framework/Behaviors/GSAIFace.gd b/game/steering_ai_framework/Behaviors/GSAIFace.gd new file mode 100644 index 0000000..9b5d908 --- /dev/null +++ b/game/steering_ai_framework/Behaviors/GSAIFace.gd @@ -0,0 +1,29 @@ +# Calculates angular acceleration to rotate a target to face its target's +# position. The behavior attemps to arrive with zero remaining angular velocity. +class_name GSAIFace +extends GSAIMatchOrientation + + +func _init(agent: GSAISteeringAgent, target: GSAIAgentLocation, use_z := false).( + agent, target, use_z +) -> void: + pass + + +func _face(acceleration: GSAITargetAcceleration, target_position: Vector3) -> void: + var to_target := target_position - agent.position + var distance_squared := to_target.length_squared() + + if distance_squared < agent.zero_linear_speed_threshold: + acceleration.set_zero() + else: + var orientation = ( + GSAIUtils.vector3_to_angle(to_target) + if use_z + else GSAIUtils.vector2_to_angle(GSAIUtils.to_vector2(to_target)) + ) + _match_orientation(acceleration, orientation) + + +func _calculate_steering(acceleration: GSAITargetAcceleration) -> void: + _face(acceleration, target.position) diff --git a/game/steering_ai_framework/Behaviors/GSAIFlee.gd b/game/steering_ai_framework/Behaviors/GSAIFlee.gd new file mode 100644 index 0000000..765448b --- /dev/null +++ b/game/steering_ai_framework/Behaviors/GSAIFlee.gd @@ -0,0 +1,15 @@ +# Calculates acceleration to take an agent directly away from a target agent. +class_name GSAIFlee +extends GSAISeek + + +func _init(agent: GSAISteeringAgent, target: GSAIAgentLocation).(agent, target) -> void: + pass + + +func _calculate_steering(acceleration: GSAITargetAcceleration) -> void: + acceleration.linear = ( + (agent.position - target.position).normalized() + * agent.linear_acceleration_max + ) + acceleration.angular = 0 diff --git a/game/steering_ai_framework/Behaviors/GSAIFollowPath.gd b/game/steering_ai_framework/Behaviors/GSAIFollowPath.gd new file mode 100644 index 0000000..42c0e66 --- /dev/null +++ b/game/steering_ai_framework/Behaviors/GSAIFollowPath.gd @@ -0,0 +1,53 @@ +# Produces a linear acceleration that moves the agent along the specified path. +class_name GSAIFollowPath +extends GSAIArrive + +# The path to follow and travel along. +var path: GSAIPath +# The distance along the path to generate the next target position. +var path_offset := 0.0 + +# Whether to use `GSAIArrive` behavior on an open path. +var is_arrive_enabled := true +# The amount of time in the future to predict the owning agent's position along +# the path. Setting it to 0.0 will force non-predictive path following. +var prediction_time := 0.0 + + +func _init(agent: GSAISteeringAgent, _path: GSAIPath, _path_offset := 0.0, _prediction_time := 0.0).( + agent, null +) -> void: + self.path = _path + self.path_offset = _path_offset + self.prediction_time = _prediction_time + + +func _calculate_steering(acceleration: GSAITargetAcceleration) -> void: + var location := ( + agent.position + if prediction_time == 0 + else agent.position + (agent.linear_velocity * prediction_time) + ) + + var distance := path.calculate_distance(location) + var target_distance := distance + path_offset + + if prediction_time > 0 and path.is_open: + if target_distance < path.calculate_distance(agent.position): + target_distance = path.length + + var target_position := path.calculate_target_position(target_distance) + + if is_arrive_enabled and path.is_open: + if path_offset >= 0: + if target_distance > path.length - deceleration_radius: + _arrive(acceleration, target_position) + return + else: + if target_distance < deceleration_radius: + _arrive(acceleration, target_position) + return + + acceleration.linear = (target_position - agent.position).normalized() + acceleration.linear *= agent.linear_acceleration_max + acceleration.angular = 0 diff --git a/game/steering_ai_framework/Behaviors/GSAILookWhereYouGo.gd b/game/steering_ai_framework/Behaviors/GSAILookWhereYouGo.gd new file mode 100644 index 0000000..e0ed6fd --- /dev/null +++ b/game/steering_ai_framework/Behaviors/GSAILookWhereYouGo.gd @@ -0,0 +1,20 @@ +# Calculates an angular acceleration to match an agent's orientation to its +# direction of travel. +class_name GSAILookWhereYouGo +extends GSAIMatchOrientation + + +func _init(agent: GSAISteeringAgent, use_z := false).(agent, null, use_z) -> void: + pass + + +func _calculate_steering(accel: GSAITargetAcceleration) -> void: + if agent.linear_velocity.length_squared() < agent.zero_linear_speed_threshold: + accel.set_zero() + else: + var orientation := ( + GSAIUtils.vector3_to_angle(agent.linear_velocity) + if use_z + else GSAIUtils.vector2_to_angle(GSAIUtils.to_vector2(agent.linear_velocity)) + ) + _match_orientation(accel, orientation) diff --git a/game/steering_ai_framework/Behaviors/GSAIMatchOrientation.gd b/game/steering_ai_framework/Behaviors/GSAIMatchOrientation.gd new file mode 100644 index 0000000..3b8c97d --- /dev/null +++ b/game/steering_ai_framework/Behaviors/GSAIMatchOrientation.gd @@ -0,0 +1,51 @@ +# Calculates an angular acceleration to match an agent's orientation to that of +# its target. Attempts to make the agent arrive with zero remaining angular +# velocity. +class_name GSAIMatchOrientation +extends GSAISteeringBehavior + +# The target orientation for the behavior to try and match rotations to. +var target: GSAIAgentLocation +# The amount of distance in radians for the behavior to consider itself close +# enough to be matching the target agent's rotation. +var alignment_tolerance: float +# The amount of distance in radians from the goal to start slowing down. +var deceleration_radius: float +# The amount of time to reach the target velocity +var time_to_reach: float = 0.1 +# Whether to use the X and Z components instead of X and Y components when +# determining angles. X and Z should be used in 3D. +var use_z: bool + + +func _init(agent: GSAISteeringAgent, _target: GSAIAgentLocation, _use_z := false).(agent) -> void: + self.use_z = _use_z + self.target = _target + + +func _match_orientation(acceleration: GSAITargetAcceleration, desired_orientation: float) -> void: + var rotation := wrapf(desired_orientation - agent.orientation, -PI, PI) + + var rotation_size := abs(rotation) + + if rotation_size <= alignment_tolerance: + acceleration.set_zero() + else: + var desired_rotation := agent.angular_speed_max + + if rotation_size <= deceleration_radius: + desired_rotation *= rotation_size / deceleration_radius + + desired_rotation *= rotation / rotation_size + + acceleration.angular = ((desired_rotation - agent.angular_velocity) / time_to_reach) + + var limited_acceleration := abs(acceleration.angular) + if limited_acceleration > agent.angular_acceleration_max: + acceleration.angular *= (agent.angular_acceleration_max / limited_acceleration) + + acceleration.linear = Vector3.ZERO + + +func _calculate_steering(acceleration: GSAITargetAcceleration) -> void: + _match_orientation(acceleration, target.orientation) diff --git a/game/steering_ai_framework/Behaviors/GSAIPriority.gd b/game/steering_ai_framework/Behaviors/GSAIPriority.gd new file mode 100644 index 0000000..55df59a --- /dev/null +++ b/game/steering_ai_framework/Behaviors/GSAIPriority.gd @@ -0,0 +1,49 @@ +# Container for multiple behaviors that returns the result of the first child +# behavior with non-zero acceleration. +class_name GSAIPriority +extends GSAISteeringBehavior + +var _behaviors := [] + +# The index of the last behavior the container prioritized. +var last_selected_index: int +# If a behavior's acceleration is lower than this threshold, the container +# considers it has an acceleration of zero. +var zero_threshold: float + + +func _init(agent: GSAISteeringAgent, _zero_threshold := 0.001).(agent) -> void: + self.zero_threshold = _zero_threshold + + +# Appends a steering behavior as a child of this container. +func add(behavior: GSAISteeringBehavior) -> void: + _behaviors.append(behavior) + + +# Returns the behavior at the position in the pool referred to by `index`, or +# `null` if no behavior was found. +func get_behavior_at(index: int) -> GSAISteeringBehavior: + if _behaviors.size() > index: + return _behaviors[index] + printerr("Tried to get index " + str(index) + " in array of size " + str(_behaviors.size())) + return null + + +func _calculate_steering(accel: GSAITargetAcceleration) -> void: + var threshold_squared := zero_threshold * zero_threshold + + last_selected_index = -1 + + var size := _behaviors.size() + + if size > 0: + for i in range(size): + last_selected_index = i + var behavior: GSAISteeringBehavior = _behaviors[i] + behavior.calculate_steering(accel) + + if accel.get_magnitude_squared() > threshold_squared: + break + else: + accel.set_zero() diff --git a/game/steering_ai_framework/Behaviors/GSAIPursue.gd b/game/steering_ai_framework/Behaviors/GSAIPursue.gd new file mode 100644 index 0000000..de685c3 --- /dev/null +++ b/game/steering_ai_framework/Behaviors/GSAIPursue.gd @@ -0,0 +1,37 @@ +# Calculates an acceleration to make an agent intercept another based on the +# target agent's movement. +class_name GSAIPursue +extends GSAISteeringBehavior + +# The target agent that the behavior is trying to intercept. +var target: GSAISteeringAgent +# The maximum amount of time in the future the behavior predicts the target's +# location. +var predict_time_max: float + + +func _init(agent: GSAISteeringAgent, _target: GSAISteeringAgent, _predict_time_max := 1.0).(agent) -> void: + self.target = _target + self.predict_time_max = _predict_time_max + + +func _calculate_steering(acceleration: GSAITargetAcceleration) -> void: + var target_position := target.position + var distance_squared := (target_position - agent.position).length_squared() + + var speed_squared := agent.linear_velocity.length_squared() + var predict_time := predict_time_max + + if speed_squared > 0: + var predict_time_squared := distance_squared / speed_squared + if predict_time_squared < predict_time_max * predict_time_max: + predict_time = sqrt(predict_time_squared) + + acceleration.linear = ((target_position + (target.linear_velocity * predict_time)) - agent.position).normalized() + acceleration.linear *= _get_modified_acceleration() + + acceleration.angular = 0 + + +func _get_modified_acceleration() -> float: + return agent.linear_acceleration_max diff --git a/game/steering_ai_framework/Behaviors/GSAISeek.gd b/game/steering_ai_framework/Behaviors/GSAISeek.gd new file mode 100644 index 0000000..f5c85f5 --- /dev/null +++ b/game/steering_ai_framework/Behaviors/GSAISeek.gd @@ -0,0 +1,19 @@ +# Calculates an acceleration to take an agent to a target agent's position +# directly. +class_name GSAISeek +extends GSAISteeringBehavior + +# The target that the behavior aims to move the agent to. +var target: GSAIAgentLocation + + +func _init(agent: GSAISteeringAgent, _target: GSAIAgentLocation).(agent) -> void: + self.target = _target + + +func _calculate_steering(acceleration: GSAITargetAcceleration) -> void: + acceleration.linear = ( + (target.position - agent.position).normalized() + * agent.linear_acceleration_max + ) + acceleration.angular = 0 diff --git a/game/steering_ai_framework/Behaviors/GSAISeparation.gd b/game/steering_ai_framework/Behaviors/GSAISeparation.gd new file mode 100644 index 0000000..4b532f3 --- /dev/null +++ b/game/steering_ai_framework/Behaviors/GSAISeparation.gd @@ -0,0 +1,42 @@ +# Calculates an acceleration that repels the agent from its neighbors in the +# given `GSAIProximity`. +# +# The acceleration is an average based on all neighbors, multiplied by a +# strength decreasing by the inverse square law in relation to distance, and it +# accumulates. +class_name GSAISeparation +extends GSAIGroupBehavior + +# The coefficient to calculate how fast the separation strength decays with distance. +var decay_coefficient := 1.0 + +var _acceleration: GSAITargetAcceleration + + +func _init(agent: GSAISteeringAgent, proximity: GSAIProximity).(agent, proximity) -> void: + pass + + +func _calculate_steering(acceleration: GSAITargetAcceleration) -> void: + acceleration.set_zero() + self._acceleration = acceleration + # warning-ignore:return_value_discarded + proximity._find_neighbors(_callback) + + +# Callback for the proximity to call when finding neighbors. Determines the amount of +# acceleration that `neighbor` imposes based on its distance from the owner agent. +# tags: virtual +func _report_neighbor(neighbor: GSAISteeringAgent) -> bool: + var to_agent := agent.position - neighbor.position + + var distance_squared := to_agent.length_squared() + var acceleration_max := agent.linear_acceleration_max + + var strength := decay_coefficient / distance_squared + if strength > acceleration_max: + strength = acceleration_max + + _acceleration.linear += to_agent * (strength / sqrt(distance_squared)) + + return true diff --git a/game/steering_ai_framework/CHANGELOG.md b/game/steering_ai_framework/CHANGELOG.md new file mode 100644 index 0000000..4124ad6 --- /dev/null +++ b/game/steering_ai_framework/CHANGELOG.md @@ -0,0 +1,80 @@ +# Changelog # + +This document lists new features, improvements, changes, and bug fixes in every release of the add-on. + +## Godot Steering AI Framework 2.1.0 ## + +### Features ### + +- There is now an `Arrive3d` demo to showcase 3D movement. + +### Improvements ### + +- All the demos got a bit of attention to improve their feel. + +### Changes ### + +- `GSAIUtils.vector3_to_angle` now uses the vector's X and Z components to determine angle. Use `GSAIUtils.vector2_to_angle` for 2D use cases. +- `GSAIMatchOrientation` and its subclasses like `GSAIFace` and `GSAILookWhereYouGo` now include a `use_z` property. It should be `true` when using 3D so that facing will be done with the X and Z components. +- The README now mentions a simple way to install the framework. +- Exposed `agent_count` inside the `AvoidCollisionsDemo`. + +### Bug fixes ### + +- Fixed `GSAIKinematicBody3DAgent` and `GSAIRigidBody3DAgent` trying to use `global_position` instead of `transform.origin`. +- The `SeekFleeDemo`'s boundaries will now match the size of the screen. +- Fixed error when double clicking an item in the DemoPicker. +- Fixed the background sometimes not covering the entire viewport in demos. + +## Godot Steering AI Framework 2.0.0 ## + +This release brings one new feature and bug fix, and breaking changes to the framework as we renamed all the classes. + +**Important**: we renamed all classes from GST\* to GSAI\* (Godot Steering AI). When you upgrade the framework in your project, use the project search and replace feature in Godot (Ctrl Shift F) to find and replace `GST` with `GSAI`. + +If you were using `GSTKinematicBodyAgent` or `GSTRigidBodyAgent`, search and replace them respectively with `GSAIKinematicBody3DAgent` and `GSAIRigidBody3DAgent`. + +We decided to make this change as soon as possible, as the framework was released a few days ago. + +### Features ### + +- There is now a main scene with a demo picker, so you can select and play any demo on the fly. +- The demo projects now support resizing and toggling fullscreen with F11. + +### Improvements ### + +- We handled all warnings in the framework, so using it won't add warnings to your projects. + +### Changes ### + +- Renamed all classes from `GST*` (Godot Steering Toolkit) to `GSAI*` (Godot Steering AI). +- Removed `GSTNode2DAgent`, `GSTNodeAgent`, and `GSTSpatialAgent` classes. + - For specialized steering agents, `GSAIKinematicBody2DAgent`, `GSAIRigidBody2DAgent`, or their 3D equivalent. + - If you intend to write your own movement system instead of using Godot's, the base class `GSTSpecializedAgent` is there to help you. +- Renamed `GSAIRigidBodyAgent` and `GSAIRigidBodyAgent` to `GSAIRigidBody3DAgent` and `GSAIRigidBody3DAgent` respectively. + - 3D nodes like `Sprite`, `KinematicBody`, etc. are being renamed to `Sprite3D`, `KinematicBody3D`, etc. in the upcoming Godot 4.0 release, to be consistent with 2D nodes. We decided to rename them now instead of breaking compatibility in a future release. + +### Bug fixes ### + +- GSTFollowPath no longer loops back around itself on open paths when `predict_time` is non-zero. + +## Godot Steering AI Framework 1.0.0 ## + +This is the first major release of the framework. It comes with: + +- All the essential steering behaviors: `Arrive`, `AvoidCollisions`, `Blend`, `Cohesion`, `Evade`, `Face`, `Flee`, `FollowPath`, `LookWhereYouGo`, `MatchOrientation`, `Priority`, `Pursue`, `Seek`, `Separation`. +- Group behaviors and detecting neighbors. +- Blending and prioritized behaviors. +- Specialized types to code agents based on physics bodies: + - For 2D games, `KinematicBody2DAgent` and `RigidBody2DAgent`. + - For 3D games, `KinematicBody3DAgent` and `RigidBody3DAgent`. +- 9 Godot demos to learn straight from the code. + +### Manual ### + +To get started, check out the framework's [manual](https://www.gdquest.com/docs/godot-steering-toolkit/). + +There, you can also find the full [code reference](https://www.gdquest.com/docs/godot-steering-toolkit/reference/). + +*Note*: we generate the code reference from docstrings in the source code with [GDScript Docs Maker](https://github.com/GDQuest/gdscript-docs-maker). + diff --git a/game/steering_ai_framework/GSAIAgentLocation.gd b/game/steering_ai_framework/GSAIAgentLocation.gd new file mode 100644 index 0000000..b772020 --- /dev/null +++ b/game/steering_ai_framework/GSAIAgentLocation.gd @@ -0,0 +1,7 @@ +# Represents an agent with only a location and an orientation. +class_name GSAIAgentLocation + +# The agent's position in space. +var position := Vector3.ZERO +# The agent's orientation on its Y axis rotation. +var orientation := 0.0 diff --git a/game/steering_ai_framework/GSAIGroupBehavior.gd b/game/steering_ai_framework/GSAIGroupBehavior.gd new file mode 100644 index 0000000..6c58708 --- /dev/null +++ b/game/steering_ai_framework/GSAIGroupBehavior.gd @@ -0,0 +1,19 @@ +# Base type for group-based steering behaviors. +class_name GSAIGroupBehavior +extends GSAISteeringBehavior + +# Container to find neighbors of the agent and calculate group behavior. +var proximity: GSAIProximity + +var _callback := funcref(self, "_report_neighbor") + + +func _init(agent: GSAISteeringAgent, _proximity: GSAIProximity).(agent) -> void: + self.proximity = _proximity + + +# Internal callback for the behavior to define whether or not a member is +# relevant +# tags: virtual +func _report_neighbor(_neighbor: GSAISteeringAgent) -> bool: + return false diff --git a/game/steering_ai_framework/GSAIPath.gd b/game/steering_ai_framework/GSAIPath.gd new file mode 100644 index 0000000..b8f0f6a --- /dev/null +++ b/game/steering_ai_framework/GSAIPath.gd @@ -0,0 +1,132 @@ +# Represents a path made up of Vector3 waypoints, split into segments path +# follow behaviors can use. +class_name GSAIPath +extends Reference + +# If `false`, the path loops. +var is_open: bool +# Total length of the path. +var length: float + +var _segments: Array + +var _nearest_point_on_segment: Vector3 +var _nearest_point_on_path: Vector3 + + +func _init(waypoints: Array, _is_open := false) -> void: + self.is_open = _is_open + create_path(waypoints) + _nearest_point_on_segment = waypoints[0] + _nearest_point_on_path = waypoints[0] + + +# Creates a path from a list of waypoints. +func create_path(waypoints: Array) -> void: + if not waypoints or waypoints.size() < 2: + printerr("Waypoints cannot be null and must contain at least two (2) waypoints.") + return + + _segments = [] + length = 0 + var current: Vector3 = waypoints.front() + var previous: Vector3 + + for i in range(1, waypoints.size(), 1): + previous = current + if i < waypoints.size(): + current = waypoints[i] + elif is_open: + break + else: + current = waypoints[0] + var segment := GSAISegment.new(previous, current) + length += segment.length + segment.cumulative_length = length + _segments.append(segment) + + +# Returns the distance from `agent_current_position` to the next waypoint. +func calculate_distance(agent_current_position: Vector3) -> float: + if _segments.size() == 0: + return 0.0 + var smallest_distance_squared: float = INF + var nearest_segment: GSAISegment + for i in range(_segments.size()): + var segment: GSAISegment = _segments[i] + var distance_squared := _calculate_point_segment_distance_squared( + segment.begin, segment.end, agent_current_position + ) + + if distance_squared < smallest_distance_squared: + _nearest_point_on_path = _nearest_point_on_segment + smallest_distance_squared = distance_squared + nearest_segment = segment + + var length_on_path := ( + nearest_segment.cumulative_length + - _nearest_point_on_path.distance_to(nearest_segment.end) + ) + + return length_on_path + + +# Calculates a target position from the path's starting point based on the `target_distance`. +func calculate_target_position(target_distance: float) -> Vector3: + if is_open: + target_distance = clamp(target_distance, 0, length) + else: + if target_distance < 0: + target_distance = length + fmod(target_distance, length) + elif target_distance > length: + target_distance = fmod(target_distance, length) + + var desired_segment: GSAISegment + for i in range(_segments.size()): + var segment: GSAISegment = _segments[i] + if segment.cumulative_length >= target_distance: + desired_segment = segment + break + + if not desired_segment: + desired_segment = _segments.back() + + var distance := desired_segment.cumulative_length - target_distance + + return ( + ((desired_segment.begin - desired_segment.end) * (distance / desired_segment.length)) + + desired_segment.end + ) + + +# Returns the position of the first point on the path. +func get_start_point() -> Vector3: + return _segments.front().begin + + +# Returns the position of the last point on the path. +func get_end_point() -> Vector3: + return _segments.back().end + + +func _calculate_point_segment_distance_squared(start: Vector3, end: Vector3, position: Vector3) -> float: + _nearest_point_on_segment = start + var start_end := end - start + var start_end_length_squared := start_end.length_squared() + if start_end_length_squared != 0: + var t = (position - start).dot(start_end) / start_end_length_squared + _nearest_point_on_segment += start_end * clamp(t, 0, 1) + + return _nearest_point_on_segment.distance_squared_to(position) + + +class GSAISegment: + var begin: Vector3 + var end: Vector3 + var length: float + var cumulative_length: float + + func _init(_begin: Vector3, _end: Vector3) -> void: + self.begin = _begin + self.end = _end + length = _begin.distance_to(_end) diff --git a/game/steering_ai_framework/GSAISteeringAgent.gd b/game/steering_ai_framework/GSAISteeringAgent.gd new file mode 100644 index 0000000..0fc7f6f --- /dev/null +++ b/game/steering_ai_framework/GSAISteeringAgent.gd @@ -0,0 +1,27 @@ +# Adds velocity, speed, and size data to `GSAIAgentLocation`. +# +# It is the character's responsibility to keep this information up to date for +# the steering toolkit to work correctly. +extends GSAIAgentLocation +class_name GSAISteeringAgent + +# The amount of velocity to be considered effectively not moving. +var zero_linear_speed_threshold := 0.01 +# The maximum speed at which the agent can move. +var linear_speed_max := 0.0 +# The maximum amount of acceleration that any behavior can apply to the agent. +var linear_acceleration_max := 0.0 +# The maximum amount of angular speed at which the agent can rotate. +var angular_speed_max := 0.0 +# The maximum amount of angular acceleration that any behavior can apply to an +# agent. +var angular_acceleration_max := 0.0 +# Current velocity of the agent. +var linear_velocity := Vector3.ZERO +# Current angular velocity of the agent. +var angular_velocity := 0.0 +# The radius of the sphere that approximates the agent's size in space. +var bounding_radius := 0.0 +# Used internally by group behaviors and proximities to mark the agent as already +# considered. +var is_tagged := false diff --git a/game/steering_ai_framework/GSAISteeringBehavior.gd b/game/steering_ai_framework/GSAISteeringBehavior.gd new file mode 100644 index 0000000..675cf58 --- /dev/null +++ b/game/steering_ai_framework/GSAISteeringBehavior.gd @@ -0,0 +1,29 @@ +# Base class for all steering behaviors. +# +# Steering behaviors calculate the linear and the angular acceleration to be +# to the agent that owns them. +# +# The `calculate_steering` function is the entry point for all behaviors. +# Individual steering behaviors encapsulate the steering logic. +class_name GSAISteeringBehavior + +# If `false`, all calculations return zero amounts of acceleration. +var is_enabled := true +# The AI agent on which the steering behavior bases its calculations. +var agent: GSAISteeringAgent + + +func _init(_agent: GSAISteeringAgent) -> void: + self.agent = _agent + + +# Sets the `acceleration` with the behavior's desired amount of acceleration. +func calculate_steering(acceleration: GSAITargetAcceleration) -> void: + if is_enabled: + _calculate_steering(acceleration) + else: + acceleration.set_zero() + + +func _calculate_steering(acceleration: GSAITargetAcceleration) -> void: + acceleration.set_zero() diff --git a/game/steering_ai_framework/GSAITargetAcceleration.gd b/game/steering_ai_framework/GSAITargetAcceleration.gd new file mode 100644 index 0000000..a32d3ee --- /dev/null +++ b/game/steering_ai_framework/GSAITargetAcceleration.gd @@ -0,0 +1,32 @@ +# A desired linear and angular amount of acceleration requested by the steering +# system. +class_name GSAITargetAcceleration + +# Linear acceleration +var linear := Vector3.ZERO +# Angular acceleration +var angular := 0.0 + + +# Sets the linear and angular components to 0. +func set_zero() -> void: + linear.x = 0.0 + linear.y = 0.0 + linear.z = 0.0 + angular = 0.0 + + +# Adds `accel`'s components, multiplied by `scalar`, to this one. +func add_scaled_accel(accel: GSAITargetAcceleration, scalar: float) -> void: + linear += accel.linear * scalar + angular += accel.angular * scalar + + +# Returns the squared magnitude of the linear and angular components. +func get_magnitude_squared() -> float: + return linear.length_squared() + angular * angular + + +# Returns the magnitude of the linear and angular components. +func get_magnitude() -> float: + return sqrt(get_magnitude_squared()) diff --git a/game/steering_ai_framework/GSAIUtils.gd b/game/steering_ai_framework/GSAIUtils.gd new file mode 100644 index 0000000..a5ab38b --- /dev/null +++ b/game/steering_ai_framework/GSAIUtils.gd @@ -0,0 +1,36 @@ +# Math and vector utility functions. +class_name GSAIUtils + +# Returns the `vector` with its length capped to `limit`. +static func clampedv3(vector: Vector3, limit: float) -> Vector3: + var length_squared := vector.length_squared() + var limit_squared := limit * limit + if length_squared > limit_squared: + vector *= sqrt(limit_squared / length_squared) + return vector + +# Returns an angle in radians between the positive X axis and the `vector`. +# +# This assumes orientation for 3D agents that are upright and rotate +# around the Y axis. +static func vector3_to_angle(vector: Vector3) -> float: + return atan2(vector.x, vector.z) + +# Returns an angle in radians between the positive X axis and the `vector`. +static func vector2_to_angle(vector: Vector2) -> float: + return atan2(vector.x, -vector.y) + +# Returns a directional vector from the given orientation angle. +# +# This assumes orientation for 2D agents or 3D agents that are upright and +# rotate around the Y axis. +static func angle_to_vector2(angle: float) -> Vector2: + return Vector2(sin(-angle), cos(angle)) + +# Returns a vector2 with `vector`'s x and y components. +static func to_vector2(vector: Vector3) -> Vector2: + return Vector2(vector.x, vector.y) + +# Returns a vector3 with `vector`'s x and y components and 0 in z. +static func to_vector3(vector: Vector2) -> Vector3: + return Vector3(vector.x, vector.y, 0) diff --git a/game/steering_ai_framework/LICENSE b/game/steering_ai_framework/LICENSE new file mode 100644 index 0000000..f3e861c --- /dev/null +++ b/game/steering_ai_framework/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 GDQuest + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/game/steering_ai_framework/Proximities/GSAIInfiniteProximity.gd b/game/steering_ai_framework/Proximities/GSAIInfiniteProximity.gd new file mode 100644 index 0000000..5c93bf2 --- /dev/null +++ b/game/steering_ai_framework/Proximities/GSAIInfiniteProximity.gd @@ -0,0 +1,26 @@ +# Determines any agent that is in the specified list as being neighbors with the +# owner agent, regardless of distance. +extends GSAIProximity +class_name GSAIInfiniteProximity + + +func _init(agent: GSAISteeringAgent, agents: Array).(agent, agents) -> void: + pass + + +# Returns a number of neighbors based on a `callback` function. +# +# `_find_neighbors` calls `callback` for each agent in the `agents` array and +# adds one to the count if its `callback` returns true. +# tags: virtual +func _find_neighbors(callback: FuncRef) -> int: + var neighbor_count := 0 + var agent_count := agents.size() + for i in range(agent_count): + var current_agent := agents[i] as GSAISteeringAgent + + if current_agent != agent: + if callback.call_func(current_agent): + neighbor_count += 1 + + return neighbor_count diff --git a/game/steering_ai_framework/Proximities/GSAIProximity.gd b/game/steering_ai_framework/Proximities/GSAIProximity.gd new file mode 100644 index 0000000..69e6541 --- /dev/null +++ b/game/steering_ai_framework/Proximities/GSAIProximity.gd @@ -0,0 +1,22 @@ +# Base container type that stores data to find the neighbors of an agent. +extends Reference +class_name GSAIProximity + +# The owning agent whose neighbors are found in the group +var agent: GSAISteeringAgent +# The agents who are part of this group and could be potential neighbors +var agents := [] + + +func _init(_agent: GSAISteeringAgent, _agents: Array) -> void: + self.agent = _agent + self.agents = _agents + + +# Returns a number of neighbors based on a `callback` function. +# +# `_find_neighbors` calls `callback` for each agent in the `agents` array and +# adds one to the count if its `callback` returns true. +# tags: virtual +func _find_neighbors(_callback: FuncRef) -> int: + return 0 diff --git a/game/steering_ai_framework/Proximities/GSAIRadiusProximity.gd b/game/steering_ai_framework/Proximities/GSAIRadiusProximity.gd new file mode 100644 index 0000000..bfce22c --- /dev/null +++ b/game/steering_ai_framework/Proximities/GSAIRadiusProximity.gd @@ -0,0 +1,56 @@ +# Determines any agent that is in the specified list as being neighbors with the owner agent if +# they lie within the specified radius. +extends GSAIProximity +class_name GSAIRadiusProximity + +# The radius around the owning agent to find neighbors in +var radius := 0.0 + +var _last_frame := 0 +var _scene_tree: SceneTree + + +func _init(agent: GSAISteeringAgent, agents: Array, _radius: float).(agent, agents) -> void: + self.radius = _radius + _scene_tree = Engine.get_main_loop() + + +# Returns a number of neighbors based on a `callback` function. +# +# `_find_neighbors` calls `callback` for each agent in the `agents` array that lie within +# the radius around the owning agent and adds one to the count if its `callback` returns true. +# tags: virtual +func _find_neighbors(callback: FuncRef) -> int: + var agent_count := agents.size() + var neighbor_count := 0 + + var current_frame := _scene_tree.get_frame() if _scene_tree else -_last_frame + if current_frame != _last_frame: + _last_frame = current_frame + + var owner_position := agent.position + + for i in range(agent_count): + var current_agent := agents[i] as GSAISteeringAgent + + if current_agent != agent: + var distance_squared := owner_position.distance_squared_to(current_agent.position) + + var range_to := radius + current_agent.bounding_radius + + if distance_squared < range_to * range_to: + if callback.call_func(current_agent): + current_agent.is_tagged = true + neighbor_count += 1 + continue + + current_agent.is_tagged = false + else: + for i in range(agent_count): + var current_agent = agents[i] as GSAISteeringAgent + + if current_agent != agent and current_agent.is_tagged: + if callback.call_func(current_agent): + neighbor_count += 1 + + return neighbor_count diff --git a/game/steering_ai_framework/README.md b/game/steering_ai_framework/README.md new file mode 100644 index 0000000..1ba8149 --- /dev/null +++ b/game/steering_ai_framework/README.md @@ -0,0 +1,69 @@ +# Godot Steering AI Framework # + +![Project banner](./assets/banner.svg) + +This project is a framework to code complex and smooth AI movement in GDScript, using steering behaviors. It works in both 2D and 3D games. + +It supports all essential steering behaviors like flee, follow, look at, but also blended behaviors, group behaviors, avoiding neighbors, following a path, following the leader, and much more. + + +**Table of Contents** +- [Introduction](#introduction) +- [The framework](#the-framework) +- [Installation](#installation) +- [Getting Started](#getting-started) + - [More information and resources](#more-information-and-resources) +- [Example usage](#example-usage) + + + +## Introduction ## + +In the 1990s, [Craig Reynolds](http://www.red3d.com/cwr/) developed algorithms for common AI behaviors. They allowed AI agents to seek out or flee from a target, follow a pre-defined path, or face in a particular direction. They were simple, repeatable tasks that could be broken down into programming algorithms, which made them easy to reuse, maintain, combine, and extend. + +While an AI agent's next action is based on decision making and planning algorithms, steering behaviors dictate how it will move from one frame to the next. They use available information and calculate where to move at that moment. + +Joining these systems together can give sophisticated and graceful movement while also being more efficient than complex pathfinding algorithms like A\*. + +## The framework ## + +This project is a framework for the [Godot game engine](https://godotengine.org/). It takes inspiration from the excellent [GDX-AI](https://github.com/libgdx/gdx-ai) framework for the [LibGDX](https://libgdx.badlogicgames.com/) java-based framework. + +Every class in the framework extends Godot's [Reference](https://docs.godotengine.org/en/latest/classes/class_reference.html) type. There is no need to have a complex scene tree; you can contain that has to do with the AI's movement inside GDScript classes. + +### How it works ### + +In GSAI, a steering agent represents a character or a vehicle. The agent stores its position, orientation, maximum speeds, and current velocity. The agent stores a steering behavior that calculates a linear or angular change in velocity based on its information. + +The coder then applies that acceleration in whatever ways is appropriate to the character to change its velocities, like RigidBody's `apply_impulse`, or a KinematicBody's `move_and_slide`. + +## Documentation ## + +The framework's documentation and code reference are both available on the [GDQuest](https://www.gdquest.com/docs/godot-steering-ai-framework/getting-started) website. + +Here are some guides to get you started: + +1. [How to install the framework](https://www.gdquest.com/docs/godot-steering-ai-framework/how-to-install/) +1. [Getting Started](https://www.gdquest.com/docs/godot-steering-ai-framework/getting-started/) +1. [Code reference](https://www.gdquest.com/docs/godot-steering-ai-framework/reference/) + +## Contributing ## + +If you encounter a bug or you have an idea to improve the tool, please [open an issue](https://github.com/GDQuest/gdscript-docs-maker/issues/new). + +If you want to contribute to the project, for instance by fixing a bug or adding a feature, check out our: + +1. [Contributor's guidelines](https://www.gdquest.com/docs/guidelines/contributing-to/gdquest-projects/). +1. [GDScript style guide](https://www.gdquest.com/docs/guidelines/best-practices/godot-gdscript/) + +## Support us ## + +Our work on Free Software is sponsored by our [Godot game creation courses](https://gdquest.mavenseed.com/). Consider getting one to support us! + +*If you like our work, please star the repository! This helps more people find it.* + +## Join the community ## + +- You can join the GDQuest community and come chat with us on [Discord](https://discord.gg/CHYVgar) +- For quick news, follow us on [Twitter](https://twitter.com/nathangdquest) +- We release video tutorials and major updates on [YouTube](https://youtube.com/c/gdquest) diff --git a/game/test_iso_tileset/TileMap32x16.tscn b/game/test_iso_tileset/TileMap32x16.tscn new file mode 100644 index 0000000..214a7fa --- /dev/null +++ b/game/test_iso_tileset/TileMap32x16.tscn @@ -0,0 +1,11 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://test_iso_tileset/new_tileset.tres" type="TileSet" id=1] + +[node name="TileMap" type="TileMap"] +mode = 1 +tile_set = ExtResource( 1 ) +cell_size = Vector2( 32, 16 ) +cell_y_sort = true +format = 1 +tile_data = PoolIntArray( -3801106, 2, 0, -3670043, 2, 0, -3473452, 2, 0, -3473451, 2, 0, -3473450, 2, 0, -3407917, 2, 0, -3407916, 2, 0, -3407915, 2, 0, -3407914, 2, 0, -3407913, 2, 0, -3407912, 2, 0, -3407911, 2, 0, -3407910, 2, 0, -3407909, 2, 0, -3342381, 2, 0, -3342380, 2, 0, -3342379, 2, 0, -3342378, 2, 0, -3342377, 2, 0, -3342376, 2, 0, -3342375, 2, 0, -3342374, 2, 0, -3342373, 2, 0, -3342372, 2, 0, -3342371, 2, 0, -3342370, 2, 0, -3342369, 2, 0, -3342368, 2, 0, -3342367, 2, 0, -3342366, 2, 0, -3276845, 2, 0, -3276844, 2, 0, -3276843, 2, 0, -3276842, 2, 0, -3276841, 2, 0, -3276840, 2, 0, -3276839, 2, 0, -3276838, 2, 0, -3276837, 2, 0, -3276836, 2, 0, -3276835, 2, 0, -3276834, 2, 0, -3276833, 2, 0, -3276832, 2, 0, -3276831, 2, 0, -3276830, 2, 0, -3276829, 2, 0, -3276828, 2, 0, -3276827, 2, 0, -3276826, 2, 0, -3211309, 2, 0, -3211308, 2, 0, -3211307, 2, 0, -3211306, 2, 0, -3211305, 2, 0, -3211304, 2, 0, -3211303, 2, 0, -3211302, 2, 0, -3211301, 2, 0, -3211300, 2, 0, -3211299, 2, 0, -3211298, 2, 0, -3211297, 2, 0, -3211296, 2, 0, -3211295, 2, 0, -3211294, 2, 0, -3211293, 2, 0, -3211292, 2, 0, -3211291, 2, 0, -3211290, 2, 0, -3211289, 2, 0, -3211288, 2, 0, -3211287, 2, 0, -3211286, 2, 0, -3211285, 2, 0, -3211284, 2, 0, -3211283, 2, 0, -3211282, 2, 0, -3145773, 2, 0, -3145772, 2, 0, -3145771, 2, 0, -3145770, 2, 0, -3145769, 2, 0, -3145768, 2, 0, -3145767, 2, 0, -3145766, 2, 0, -3145765, 2, 0, -3145764, 2, 0, -3145763, 2, 0, -3145762, 2, 0, -3145761, 2, 0, -3145760, 2, 0, -3145759, 2, 0, -3145758, 2, 0, -3145757, 2, 0, -3145756, 2, 0, -3145755, 2, 0, -3145754, 2, 0, -3145753, 2, 0, -3145752, 2, 0, -3145751, 2, 0, -3145750, 2, 0, -3145749, 2, 0, -3145748, 2, 0, -3145747, 2, 0, -3145746, 2, 0, -3145745, 2, 0, -3145744, 2, 0, -3145743, 2, 0, -3145742, 2, 0, -3145741, 2, 0, -3145740, 2, 0, -3145739, 2, 0, -3145738, 2, 0, -3145737, 2, 0, -3080237, 2, 0, -3080236, 2, 0, -3080235, 2, 0, -3080234, 2, 0, -3080233, 2, 0, -3080232, 2, 0, -3080231, 2, 0, -3080230, 2, 0, -3080229, 2, 0, -3080228, 2, 0, -3080227, 2, 0, -3080226, 2, 0, -3080225, 2, 0, -3080224, 2, 0, -3080223, 2, 0, -3080222, 2, 0, -3080221, 2, 0, -3080220, 2, 0, -3080219, 2, 0, -3080218, 2, 0, -3080217, 2, 0, -3080216, 2, 0, -3080215, 2, 0, -3080214, 2, 0, -3080213, 2, 0, -3080212, 2, 0, -3080211, 2, 0, -3080210, 2, 0, -3080209, 2, 0, -3080208, 2, 0, -3080207, 2, 0, -3080206, 2, 0, -3080205, 2, 0, -3080204, 2, 0, -3080203, 2, 0, -3080202, 2, 0, -3080201, 2, 0, -3080200, 2, 0, -3080199, 2, 0, -3080198, 2, 0, -3014701, 2, 0, -3014700, 2, 0, -3014699, 2, 0, -3014698, 2, 0, -3014697, 2, 0, -3014696, 2, 0, -3014695, 2, 0, -3014694, 2, 0, -3014693, 2, 0, -3014692, 2, 0, -3014691, 2, 0, -3014690, 2, 0, -3014689, 2, 0, -3014688, 2, 0, -3014687, 2, 0, -3014686, 2, 0, -3014685, 2, 0, -3014684, 2, 0, -3014683, 2, 0, -3014682, 2, 0, -3014681, 2, 0, -3014680, 2, 0, -3014679, 2, 0, -3014678, 2, 0, -3014677, 2, 0, -3014676, 2, 0, -3014675, 2, 0, -3014674, 2, 0, -3014673, 2, 0, -3014672, 2, 0, -3014671, 2, 0, -3014670, 2, 0, -3014669, 2, 0, -3014668, 2, 0, -3014667, 2, 0, -3014666, 2, 0, -3014665, 2, 0, -3014664, 2, 0, -3014663, 2, 0, -3014662, 2, 0, -3014661, 2, 0, -3014660, 2, 0, -3014659, 2, 0, -3014658, 2, 0, -2949165, 2, 0, -2949164, 2, 0, -2949163, 2, 0, -2949162, 2, 0, -2949161, 2, 0, -2949160, 2, 0, -2949159, 2, 0, -2949158, 2, 0, -2949157, 2, 0, -2949156, 2, 0, -2949155, 2, 0, -2949154, 2, 0, -2949153, 2, 0, -2949152, 2, 0, -2949151, 2, 0, -2949150, 2, 0, -2949149, 2, 0, -2949148, 2, 0, -2949147, 2, 0, -2949146, 2, 0, -2949145, 2, 0, -2949144, 2, 0, -2949143, 2, 0, -2949142, 2, 0, -2949141, 2, 0, -2949140, 2, 0, -2949139, 2, 0, -2949138, 2, 0, -2949137, 2, 0, -2949136, 2, 0, -2949135, 2, 0, -2949134, 2, 0, -2949133, 2, 0, -2949132, 2, 0, -2949131, 2, 0, -2949130, 2, 0, -2949129, 2, 0, -2949128, 2, 0, -2949127, 2, 0, -2949126, 2, 0, -2949125, 2, 0, -2949124, 2, 0, -2949123, 2, 0, -2949122, 2, 0, -2949121, 2, 0, -3014656, 2, 0, -3014655, 2, 0, -3014654, 2, 0, -2883628, 2, 0, -2883627, 2, 0, -2883626, 2, 0, -2883625, 2, 0, -2883624, 2, 0, -2883623, 2, 0, -2883622, 2, 0, -2883621, 2, 0, -2883620, 2, 0, -2883619, 2, 0, -2883618, 2, 0, -2883617, 2, 0, -2883616, 2, 0, -2883615, 2, 0, -2883614, 2, 0, -2883613, 2, 0, -2883612, 2, 0, -2883611, 2, 0, -2883610, 2, 0, -2883609, 2, 0, -2883608, 2, 0, -2883607, 2, 0, -2883606, 2, 0, -2883605, 2, 0, -2883604, 2, 0, -2883603, 2, 0, -2883602, 2, 0, -2883601, 2, 0, -2883600, 2, 0, -2883599, 2, 0, -2883598, 2, 0, -2883597, 2, 0, -2883596, 2, 0, -2883595, 2, 0, -2883594, 2, 0, -2883593, 2, 0, -2883592, 2, 0, -2883591, 2, 0, -2883590, 2, 0, -2883589, 2, 0, -2883588, 2, 0, -2883587, 2, 0, -2883586, 2, 0, -2883585, 2, 0, -2949120, 2, 0, -2949119, 2, 0, -2949118, 2, 0, -2949117, 2, 0, -2949116, 2, 0, -2949115, 2, 0, -2949114, 2, 0, -2818092, 2, 0, -2818091, 2, 0, -2818090, 2, 0, -2818089, 2, 0, -2818088, 2, 0, -2818087, 2, 0, -2818086, 2, 0, -2818085, 2, 0, -2818084, 2, 0, -2818083, 2, 0, -2818082, 2, 0, -2818081, 2, 0, -2818080, 2, 0, -2818079, 2, 0, -2818078, 2, 0, -2818077, 2, 0, -2818076, 2, 0, -2818075, 2, 0, -2818074, 2, 0, -2818073, 2, 0, -2818072, 2, 0, -2818071, 2, 0, -2818070, 2, 0, -2818069, 2, 0, -2818068, 2, 0, -2818067, 2, 0, -2818066, 2, 0, -2818065, 2, 0, -2818064, 2, 0, -2818063, 2, 0, -2818062, 2, 0, -2818061, 2, 0, -2818060, 2, 0, -2818059, 2, 0, -2818058, 2, 0, -2818057, 2, 0, -2818056, 2, 0, -2818055, 2, 0, -2818054, 2, 0, -2818053, 2, 0, -2818052, 2, 0, -2818051, 2, 0, -2818050, 2, 0, -2818049, 2, 0, -2883584, 2, 0, -2883583, 2, 0, -2883582, 2, 0, -2883581, 2, 0, -2883580, 2, 0, -2883579, 2, 0, -2883578, 2, 0, -2883577, 2, 0, -2883576, 2, 0, -2752556, 2, 0, -2752555, 2, 0, -2752554, 2, 0, -2752553, 2, 0, -2752552, 2, 0, -2752551, 2, 0, -2752550, 2, 0, -2752549, 2, 0, -2752548, 2, 0, -2752547, 2, 0, -2752546, 2, 0, -2752545, 2, 0, -2752544, 2, 0, -2752543, 2, 0, -2752542, 2, 0, -2752541, 2, 0, -2752540, 2, 0, -2752539, 2, 0, -2752538, 2, 0, -2752537, 2, 0, -2752536, 2, 0, -2752535, 2, 0, -2752534, 2, 0, -2752533, 2, 0, -2752532, 2, 0, -2752531, 2, 0, -2752530, 2, 0, -2752529, 2, 0, -2752528, 2, 0, -2752527, 2, 0, -2752526, 2, 0, -2752525, 2, 0, -2752524, 2, 0, -2752523, 2, 0, -2752522, 2, 0, -2752521, 2, 0, -2752520, 2, 0, -2752519, 2, 0, -2752518, 2, 0, -2752517, 2, 0, -2752516, 2, 0, -2752515, 2, 0, -2752514, 2, 0, -2752513, 2, 0, -2818048, 2, 0, -2818047, 2, 0, -2818046, 2, 0, -2818045, 2, 0, -2818044, 2, 0, -2818043, 2, 0, -2818042, 2, 0, -2818041, 2, 0, -2818040, 2, 0, -2818039, 2, 0, -2818038, 2, 0, -2818037, 2, 0, -2818036, 2, 0, -2687020, 2, 0, -2687019, 2, 0, -2687018, 2, 0, -2687017, 2, 0, -2687016, 2, 0, -2687015, 2, 0, -2687014, 2, 0, -2687013, 2, 0, -2687012, 2, 0, -2687011, 2, 0, -2687010, 2, 0, -2687009, 2, 0, -2687008, 2, 0, -2687007, 2, 0, -2687006, 2, 0, -2687005, 2, 0, -2687004, 2, 0, -2687003, 2, 0, -2687002, 2, 0, -2687001, 2, 0, -2687000, 2, 0, -2686999, 2, 0, -2686998, 2, 0, -2686997, 2, 0, -2686996, 2, 0, -2686995, 2, 0, -2686994, 2, 0, -2686993, 2, 0, -2686992, 2, 0, -2686991, 2, 0, -2686990, 2, 0, -2686989, 2, 0, -2686988, 2, 0, -2686987, 2, 0, -2686986, 2, 0, -2686985, 2, 0, -2686984, 2, 0, -2686983, 2, 0, -2686982, 2, 0, -2686981, 2, 0, -2686980, 2, 0, -2686979, 2, 0, -2686978, 2, 0, -2686977, 2, 0, -2752512, 2, 0, -2752511, 2, 0, -2752510, 2, 0, -2752509, 2, 0, -2752508, 2, 0, -2752507, 2, 0, -2752506, 2, 0, -2752505, 2, 0, -2752504, 2, 0, -2752503, 2, 0, -2752502, 2, 0, -2752501, 2, 0, -2752500, 2, 0, -2752499, 2, 0, -2752498, 2, 0, -2752497, 2, 0, -2621484, 2, 0, -2621483, 2, 0, -2621482, 2, 0, -2621481, 2, 0, -2621480, 2, 0, -2621479, 2, 0, -2621478, 2, 0, -2621477, 2, 0, -2621476, 2, 0, -2621475, 2, 0, -2621474, 2, 0, -2621473, 2, 0, -2621472, 2, 0, -2621471, 2, 0, -2621470, 2, 0, -2621469, 2, 0, -2621468, 2, 0, -2621467, 2, 0, -2621466, 2, 0, -2621465, 2, 0, -2621464, 2, 0, -2621463, 2, 0, -2621462, 2, 0, -2621461, 2, 0, -2621460, 2, 0, -2621459, 2, 0, -2621458, 2, 0, -2621457, 2, 0, -2621456, 2, 0, -2621455, 2, 0, -2621454, 2, 0, -2621453, 2, 0, -2621452, 2, 0, -2621451, 2, 0, -2621450, 2, 0, -2621449, 2, 0, -2621448, 2, 0, -2621447, 2, 0, -2621446, 2, 0, -2621445, 2, 0, -2621444, 2, 0, -2621443, 2, 0, -2621442, 2, 0, -2621441, 2, 0, -2686976, 2, 0, -2686975, 2, 0, -2686974, 2, 0, -2686973, 2, 0, -2686972, 2, 0, -2686971, 2, 0, -2686970, 2, 0, -2686969, 2, 0, -2686968, 2, 0, -2686967, 2, 0, -2686966, 2, 0, -2686965, 2, 0, -2686964, 2, 0, -2686963, 2, 0, -2686962, 2, 0, -2686961, 2, 0, -2686960, 2, 0, -2686959, 2, 0, -2555948, 2, 0, -2555947, 2, 0, -2555946, 2, 0, -2555945, 2, 0, -2555944, 2, 0, -2555943, 2, 0, -2555942, 2, 0, -2555941, 2, 0, -2555940, 2, 0, -2555939, 2, 0, -2555938, 2, 0, -2555937, 2, 0, -2555936, 2, 0, -2555935, 2, 0, -2555934, 2, 0, -2555933, 2, 0, -2555932, 2, 0, -2555931, 2, 0, -2555930, 2, 0, -2555929, 2, 0, -2555928, 2, 0, -2555927, 2, 0, -2555926, 2, 0, -2555925, 2, 0, -2555924, 2, 0, -2555923, 2, 0, -2555922, 2, 0, -2555921, 2, 0, -2555920, 2, 0, -2555919, 2, 0, -2555918, 2, 0, -2555917, 2, 0, -2555916, 2, 0, -2555915, 2, 0, -2555914, 2, 0, -2555913, 2, 0, -2555912, 2, 0, -2555911, 2, 0, -2555910, 2, 0, -2555909, 2, 0, -2555908, 2, 0, -2555907, 2, 0, -2555906, 2, 0, -2555905, 2, 0, -2621440, 2, 0, -2621439, 2, 0, -2621438, 2, 0, -2621437, 2, 0, -2621436, 2, 0, -2621435, 2, 0, -2621434, 2, 0, -2621433, 2, 0, -2621432, 2, 0, -2621431, 2, 0, -2621430, 2, 0, -2621429, 2, 0, -2621428, 2, 0, -2621427, 2, 0, -2621426, 2, 0, -2621425, 2, 0, -2621424, 2, 0, -2621423, 2, 0, -2621422, 2, 0, -2621421, 2, 0, -2490412, 2, 0, -2490411, 2, 0, -2490410, 2, 0, -2490409, 2, 0, -2490408, 2, 0, -2490407, 2, 0, -2490406, 2, 0, -2490405, 2, 0, -2490404, 2, 0, -2490403, 2, 0, -2490402, 2, 0, -2490401, 2, 0, -2490400, 2, 0, -2490399, 2, 0, -2490398, 2, 0, -2490397, 2, 0, -2490396, 2, 0, -2490395, 2, 0, -2490394, 2, 0, -2490393, 2, 0, -2490392, 2, 0, -2490391, 2, 0, -2490390, 2, 0, -2490389, 2, 0, -2490388, 2, 0, -2490387, 2, 0, -2490386, 2, 0, -2490385, 2, 0, -2490384, 2, 0, -2490383, 2, 0, -2490382, 2, 0, -2490381, 2, 0, -2490380, 2, 0, -2490379, 2, 0, -2490378, 2, 0, -2490377, 2, 0, -2490376, 2, 0, -2490375, 2, 0, -2490374, 2, 0, -2490373, 2, 0, -2490372, 2, 0, -2490371, 2, 0, -2490370, 2, 0, -2490369, 2, 0, -2555904, 2, 0, -2555903, 2, 0, -2555902, 2, 0, -2555901, 2, 0, -2555900, 2, 0, -2555899, 2, 0, -2555898, 2, 0, -2555897, 2, 0, -2555896, 2, 0, -2555895, 2, 0, -2555894, 2, 0, -2555893, 2, 0, -2555892, 2, 0, -2555891, 2, 0, -2555890, 2, 0, -2555889, 2, 0, -2555888, 2, 0, -2555887, 2, 0, -2555886, 2, 0, -2555885, 2, 0, -2555884, 2, 0, -2555883, 2, 0, -2424876, 2, 0, -2424875, 2, 0, -2424874, 2, 0, -2424873, 2, 0, -2424872, 2, 0, -2424871, 2, 0, -2424870, 2, 0, -2424869, 2, 0, -2424868, 2, 0, -2424867, 2, 0, -2424866, 2, 0, -2424865, 2, 0, -2424864, 2, 0, -2424863, 2, 0, -2424862, 2, 0, -2424861, 2, 0, -2424860, 2, 0, -2424859, 2, 0, -2424858, 2, 0, -2424857, 2, 0, -2424856, 2, 0, -2424855, 2, 0, -2424854, 2, 0, -2424853, 2, 0, -2424852, 2, 0, -2424851, 2, 0, -2424850, 2, 0, -2424849, 2, 0, -2424848, 2, 0, -2424847, 2, 0, -2424846, 2, 0, -2424845, 2, 0, -2424844, 2, 0, -2424843, 2, 0, -2424842, 2, 0, -2424841, 2, 0, -2424840, 2, 0, -2424839, 2, 0, -2424838, 2, 0, -2424837, 2, 0, -2424836, 2, 0, -2424835, 2, 0, -2424834, 2, 0, -2424833, 2, 0, -2490368, 2, 0, -2490367, 2, 0, -2490366, 2, 0, -2490365, 2, 0, -2490364, 2, 0, -2490363, 2, 0, -2490362, 2, 0, -2490361, 2, 0, -2490360, 2, 0, -2490359, 2, 0, -2490358, 2, 0, -2490357, 2, 0, -2490356, 2, 0, -2490355, 2, 0, -2490354, 2, 0, -2490353, 2, 0, -2490352, 2, 0, -2490351, 2, 0, -2490350, 2, 0, -2490349, 2, 0, -2490348, 2, 0, -2490347, 2, 0, -2490346, 2, 0, -2490345, 2, 0, -2359339, 2, 0, -2359338, 2, 0, -2359337, 2, 0, -2359336, 2, 0, -2359335, 2, 0, -2359334, 2, 0, -2359333, 2, 0, -2359332, 2, 0, -2359331, 2, 0, -2359330, 2, 0, -2359329, 2, 0, -2359328, 2, 0, -2359327, 2, 0, -2359326, 2, 0, -2359325, 2, 0, -2359324, 2, 0, -2359323, 2, 0, -2359322, 2, 0, -2359321, 2, 0, -2359320, 2, 0, -2359319, 2, 0, -2359318, 2, 0, -2359317, 2, 0, -2359316, 2, 0, -2359315, 2, 0, -2359314, 2, 0, -2359313, 2, 0, -2359312, 2, 0, -2359311, 2, 0, -2359310, 2, 0, -2359309, 2, 0, -2359308, 2, 0, -2359307, 2, 0, -2359306, 2, 0, -2359305, 2, 0, -2359304, 2, 0, -2359303, 2, 0, -2359302, 2, 0, -2359301, 2, 0, -2359300, 2, 0, -2359299, 2, 0, -2359298, 2, 0, -2359297, 2, 0, -2424832, 2, 0, -2424831, 2, 0, -2424830, 2, 0, -2424829, 2, 0, -2424828, 2, 0, -2424827, 2, 0, -2424826, 2, 0, -2424825, 2, 0, -2424824, 2, 0, -2424823, 2, 0, -2424822, 2, 0, -2424821, 2, 0, -2424820, 2, 0, -2424819, 2, 0, -2424818, 2, 0, -2424817, 2, 0, -2424816, 2, 0, -2424815, 2, 0, -2424814, 2, 0, -2424813, 2, 0, -2424812, 2, 0, -2424811, 2, 0, -2424810, 2, 0, -2424809, 2, 0, -2424808, 2, 0, -2424807, 2, 0, -2424806, 2, 0, -2293803, 2, 0, -2293802, 2, 0, -2293801, 2, 0, -2293800, 2, 0, -2293799, 2, 0, -2293798, 2, 0, -2293797, 2, 0, -2293796, 2, 0, -2293795, 2, 0, -2293794, 2, 0, -2293793, 2, 0, -2293792, 2, 0, -2293791, 2, 0, -2293790, 2, 0, -2293789, 2, 0, -2293788, 2, 0, -2293787, 2, 0, -2293786, 2, 0, -2293785, 2, 0, -2293784, 2, 0, -2293783, 2, 0, -2293782, 2, 0, -2293781, 2, 0, -2293780, 2, 0, -2293779, 2, 0, -2293778, 2, 0, -2293777, 2, 0, -2293776, 2, 0, -2293775, 2, 0, -2293774, 2, 0, -2293773, 2, 0, -2293772, 2, 0, -2293771, 2, 0, -2293770, 2, 0, -2293769, 2, 0, -2293768, 2, 0, -2293767, 2, 0, -2293766, 2, 0, -2293765, 2, 0, -2293764, 2, 0, -2293763, 2, 0, -2293762, 2, 0, -2293761, 2, 0, -2359296, 2, 0, -2359295, 2, 0, -2359294, 2, 0, -2359293, 2, 0, -2359292, 2, 0, -2359291, 2, 0, -2359290, 2, 0, -2359289, 2, 0, -2359288, 2, 0, -2359287, 2, 0, -2359286, 2, 0, -2359285, 2, 0, -2359284, 2, 0, -2359283, 2, 0, -2359282, 2, 0, -2359281, 2, 0, -2359280, 2, 0, -2359279, 2, 0, -2359278, 2, 0, -2359277, 2, 0, -2359276, 2, 0, -2359275, 2, 0, -2359274, 2, 0, -2359273, 2, 0, -2359272, 2, 0, -2359271, 2, 0, -2359270, 2, 0, -2359269, 2, 0, -2359268, 2, 0, -2228267, 2, 0, -2228266, 2, 0, -2228265, 2, 0, -2228264, 2, 0, -2228263, 2, 0, -2228262, 2, 0, -2228261, 2, 0, -2228260, 2, 0, -2228259, 2, 0, -2228258, 2, 0, -2228257, 2, 0, -2228256, 2, 0, -2228255, 2, 0, -2228254, 2, 0, -2228253, 2, 0, -2228252, 2, 0, -2228251, 2, 0, -2228250, 2, 0, -2228249, 2, 0, -2228248, 2, 0, -2228247, 2, 0, -2228246, 2, 0, -2228245, 2, 0, -2228244, 2, 0, -2228243, 2, 0, -2228242, 2, 0, -2228241, 2, 0, -2228240, 2, 0, -2228239, 2, 0, -2228238, 2, 0, -2228237, 2, 0, -2228236, 2, 0, -2228235, 2, 0, -2228234, 2, 0, -2228233, 2, 0, -2228232, 2, 0, -2228231, 2, 0, -2228230, 2, 0, -2228229, 2, 0, -2228228, 2, 0, -2228227, 2, 0, -2228226, 2, 0, -2228225, 2, 0, -2293760, 2, 0, -2293759, 2, 0, -2293758, 2, 0, -2293757, 2, 0, -2293756, 2, 0, -2293755, 2, 0, -2293754, 2, 0, -2293753, 2, 0, -2293752, 2, 0, -2293751, 2, 0, -2293750, 2, 0, -2293749, 2, 0, -2293748, 2, 0, -2293747, 2, 0, -2293746, 2, 0, -2293745, 2, 0, -2293744, 2, 0, -2293743, 2, 0, -2293742, 2, 0, -2293741, 2, 0, -2293740, 2, 0, -2293739, 2, 0, -2293738, 2, 0, -2293737, 2, 0, -2293736, 2, 0, -2293735, 2, 0, -2293734, 2, 0, -2293733, 2, 0, -2293732, 2, 0, -2293731, 2, 0, -2293730, 2, 0, -2162731, 2, 0, -2162730, 2, 0, -2162729, 2, 0, -2162728, 2, 0, -2162727, 2, 0, -2162726, 2, 0, -2162725, 2, 0, -2162724, 2, 0, -2162723, 2, 0, -2162722, 2, 0, -2162721, 2, 0, -2162720, 2, 0, -2162719, 2, 0, -2162718, 2, 0, -2162717, 2, 0, -2162716, 2, 0, -2162715, 2, 0, -2162714, 2, 0, -2162713, 2, 0, -2162712, 2, 0, -2162711, 2, 0, -2162710, 2, 0, -2162709, 2, 0, -2162708, 2, 0, -2162707, 2, 0, -2162706, 2, 0, -2162705, 2, 0, -2162704, 2, 0, -2162703, 2, 0, -2162702, 2, 0, -2162701, 2, 0, -2162700, 2, 0, -2162699, 2, 0, -2162698, 2, 0, -2162697, 2, 0, -2162696, 2, 0, -2162695, 2, 0, -2162694, 2, 0, -2162693, 2, 0, -2162692, 2, 0, -2162691, 2, 0, -2162690, 2, 0, -2162689, 2, 0, -2228224, 2, 0, -2228223, 2, 0, -2228222, 2, 0, -2228221, 2, 0, -2228220, 2, 0, -2228219, 2, 0, -2228218, 2, 0, -2228217, 2, 0, -2228216, 2, 0, -2228215, 2, 0, -2228214, 2, 0, -2228213, 2, 0, -2228212, 2, 0, -2228211, 2, 0, -2228210, 2, 0, -2228209, 2, 0, -2228208, 2, 0, -2228207, 2, 0, -2228206, 2, 0, -2228205, 2, 0, -2228204, 2, 0, -2228203, 2, 0, -2228202, 2, 0, -2228201, 2, 0, -2228200, 2, 0, -2228199, 2, 0, -2228198, 2, 0, -2228197, 2, 0, -2228196, 2, 0, -2228195, 2, 0, -2228194, 2, 0, -2228193, 2, 0, -2228192, 2, 0, -2097194, 2, 0, -2097193, 2, 0, -2097192, 2, 0, -2097191, 2, 0, -2097190, 2, 0, -2097189, 2, 0, -2097188, 2, 0, -2097187, 2, 0, -2097186, 2, 0, -2097185, 2, 0, -2097184, 2, 0, -2097183, 2, 0, -2097182, 2, 0, -2097181, 2, 0, -2097180, 2, 0, -2097179, 2, 0, -2097178, 2, 0, -2097177, 2, 0, -2097176, 2, 0, -2097175, 2, 0, -2097174, 2, 0, -2097173, 2, 0, -2097172, 2, 0, -2097171, 2, 0, -2097170, 2, 0, -2097169, 2, 0, -2097168, 2, 0, -2097167, 2, 0, -2097166, 2, 0, -2097165, 2, 0, -2097164, 2, 0, -2097163, 2, 0, -2097162, 2, 0, -2097161, 2, 0, -2097160, 2, 0, -2097159, 2, 0, -2097158, 2, 0, -2097157, 2, 0, -2097156, 2, 0, -2097155, 2, 0, -2097154, 2, 0, -2097153, 2, 0, -2162688, 2, 0, -2162687, 2, 0, -2162686, 2, 0, -2162685, 2, 0, -2162684, 2, 0, -2162683, 2, 0, -2162682, 2, 0, -2162681, 2, 0, -2162680, 2, 0, -2162679, 2, 0, -2162678, 2, 0, -2162677, 2, 0, -2162676, 2, 0, -2162675, 2, 0, -2162674, 2, 0, -2162673, 2, 0, -2162672, 2, 0, -2162671, 2, 0, -2162670, 2, 0, -2162669, 2, 0, -2162668, 2, 0, -2162667, 2, 0, -2162666, 2, 0, -2162665, 2, 0, -2162664, 2, 0, -2162663, 2, 0, -2162662, 2, 0, -2162661, 2, 0, -2162660, 2, 0, -2162659, 2, 0, -2162658, 2, 0, -2162657, 2, 0, -2162656, 2, 0, -2162655, 2, 0, -2162654, 2, 0, -2031658, 2, 0, -2031657, 2, 0, -2031656, 2, 0, -2031655, 2, 0, -2031654, 2, 0, -2031653, 2, 0, -2031652, 2, 0, -2031651, 2, 0, -2031650, 2, 0, -2031649, 2, 0, -2031648, 2, 0, -2031647, 2, 0, -2031646, 2, 0, -2031645, 2, 0, -2031644, 2, 0, -2031643, 2, 0, -2031642, 2, 0, -2031641, 2, 0, -2031640, 2, 0, -2031639, 2, 0, -2031638, 2, 0, -2031637, 2, 0, -2031636, 2, 0, -2031635, 2, 0, -2031634, 2, 0, -2031633, 2, 0, -2031632, 2, 0, -2031631, 2, 0, -2031630, 2, 0, -2031629, 2, 0, -2031628, 2, 0, -2031627, 2, 0, -2031626, 2, 0, -2031625, 2, 0, -2031624, 2, 0, -2031623, 2, 0, -2031622, 2, 0, -2031621, 2, 0, -2031620, 2, 0, -2031619, 2, 0, -2031618, 2, 0, -2031617, 2, 0, -2097152, 2, 0, -2097151, 2, 0, -2097150, 2, 0, -2097149, 2, 0, -2097148, 2, 0, -2097147, 2, 0, -2097146, 2, 0, -2097145, 2, 0, -2097144, 2, 0, -2097143, 2, 0, -2097142, 2, 0, -2097141, 2, 0, -2097140, 2, 0, -2097139, 2, 0, -2097138, 2, 0, -2097137, 2, 0, -2097136, 2, 0, -2097135, 2, 0, -2097134, 2, 0, -2097133, 2, 0, -2097132, 2, 0, -2097131, 2, 0, -2097130, 2, 0, -2097129, 2, 0, -2097128, 2, 0, -2097127, 2, 0, -2097126, 2, 0, -2097125, 2, 0, -2097124, 2, 0, -2097123, 2, 0, -2097122, 2, 0, -2097121, 2, 0, -2097120, 2, 0, -2097119, 2, 0, -2097118, 2, 0, -2097117, 2, 0, -2097116, 2, 0, -1966122, 2, 0, -1966121, 2, 0, -1966120, 2, 0, -1966119, 2, 0, -1966118, 2, 0, -1966117, 2, 0, -1966116, 2, 0, -1966115, 2, 0, -1966114, 2, 0, -1966113, 2, 0, -1966112, 2, 0, -1966111, 2, 0, -1966110, 2, 0, -1966109, 2, 0, -1966108, 2, 0, -1966107, 2, 0, -1966106, 2, 0, -1966105, 2, 0, -1966104, 2, 0, -1966103, 2, 0, -1966102, 2, 0, -1966101, 2, 0, -1966100, 2, 0, -1966099, 2, 0, -1966098, 2, 0, -1966097, 2, 0, -1966096, 2, 0, -1966095, 2, 0, -1966094, 2, 0, -1966093, 2, 0, -1966092, 2, 0, -1966091, 2, 0, -1966090, 2, 0, -1966089, 2, 0, -1966088, 2, 0, -1966087, 2, 0, -1966086, 2, 0, -1966085, 2, 0, -1966084, 2, 0, -1966083, 2, 0, -1966082, 2, 0, -1966081, 2, 0, -2031616, 2, 0, -2031615, 2, 0, -2031614, 2, 0, -2031613, 2, 0, -2031612, 2, 0, -2031611, 2, 0, -2031610, 2, 0, -2031609, 2, 0, -2031608, 2, 0, -2031607, 2, 0, -2031606, 2, 0, -2031605, 2, 0, -2031604, 2, 0, -2031603, 2, 0, -2031602, 2, 0, -2031601, 2, 0, -2031600, 2, 0, -2031599, 2, 0, -2031598, 2, 0, -2031597, 2, 0, -2031596, 2, 0, -2031595, 2, 0, -2031594, 2, 0, -2031593, 2, 0, -2031592, 2, 0, -2031591, 2, 0, -2031590, 2, 0, -2031589, 2, 0, -2031588, 2, 0, -2031587, 2, 0, -2031586, 2, 0, -2031585, 2, 0, -2031584, 2, 0, -2031583, 2, 0, -2031582, 2, 0, -2031581, 2, 0, -2031580, 2, 0, -2031579, 2, 0, -2031578, 2, 0, -1900586, 2, 0, -1900585, 2, 0, -1900584, 2, 0, -1900583, 2, 0, -1900582, 2, 0, -1900581, 2, 0, -1900580, 2, 0, -1900579, 2, 0, -1900578, 2, 0, -1900577, 2, 0, -1900576, 2, 0, -1900575, 2, 0, -1900574, 2, 0, -1900573, 2, 0, -1900572, 2, 0, -1900571, 2, 0, -1900570, 2, 0, -1900569, 2, 0, -1900568, 2, 0, -1900567, 2, 0, -1900566, 2, 0, -1900565, 2, 0, -1900564, 2, 0, -1900563, 2, 0, -1900562, 2, 0, -1900561, 2, 0, -1900560, 2, 0, -1900559, 2, 0, -1900558, 2, 0, -1900557, 2, 0, -1900556, 2, 0, -1900555, 2, 0, -1900554, 2, 0, -1900553, 2, 0, -1900552, 2, 0, -1900551, 2, 0, -1900550, 2, 0, -1900549, 2, 0, -1900548, 2, 0, -1900547, 2, 0, -1900546, 2, 0, -1900545, 2, 0, -1966080, 2, 0, -1966079, 2, 0, -1966078, 2, 0, -1966077, 2, 0, -1966076, 2, 0, -1966075, 2, 0, -1966074, 2, 0, -1966073, 2, 0, -1966072, 2, 0, -1966071, 2, 0, -1966070, 2, 0, -1966069, 2, 0, -1966068, 2, 0, -1966067, 2, 0, -1966066, 2, 0, -1966065, 2, 0, -1966064, 2, 0, -1966063, 2, 0, -1966062, 2, 0, -1966061, 2, 0, -1966060, 2, 0, -1966059, 2, 0, -1966058, 2, 0, -1966057, 2, 0, -1966056, 2, 0, -1966055, 2, 0, -1966054, 2, 0, -1966053, 2, 0, -1966052, 2, 0, -1966051, 2, 0, -1966050, 2, 0, -1966049, 2, 0, -1966048, 2, 0, -1966047, 2, 0, -1966046, 2, 0, -1966045, 2, 0, -1966044, 2, 0, -1966043, 2, 0, -1966042, 2, 0, -1966041, 2, 0, -1966040, 2, 0, -1835050, 2, 0, -1835049, 2, 0, -1835048, 2, 0, -1835047, 2, 0, -1835046, 2, 0, -1835045, 2, 0, -1835044, 2, 0, -1835043, 2, 0, -1835042, 2, 0, -1835041, 2, 0, -1835040, 2, 0, -1835039, 2, 0, -1835038, 2, 0, -1835037, 2, 0, -1835036, 2, 0, -1835035, 2, 0, -1835034, 2, 0, -1835033, 2, 0, -1835032, 2, 0, -1835031, 2, 0, -1835030, 2, 0, -1835029, 2, 0, -1835028, 2, 0, -1835027, 2, 0, -1835026, 2, 0, -1835025, 2, 0, -1835024, 2, 0, -1835023, 2, 0, -1835022, 2, 0, -1835021, 2, 0, -1835020, 2, 0, -1835019, 2, 0, -1835018, 2, 0, -1835017, 2, 0, -1835016, 2, 0, -1835015, 2, 0, -1835014, 2, 0, -1835013, 2, 0, -1835012, 2, 0, -1835011, 2, 0, -1835010, 2, 0, -1835009, 2, 0, -1900544, 2, 0, -1900543, 2, 0, -1900542, 2, 0, -1900541, 2, 0, -1900540, 2, 0, -1900539, 2, 0, -1900538, 2, 0, -1900537, 2, 0, -1900536, 2, 0, -1900535, 2, 0, -1900534, 2, 0, -1900533, 2, 0, -1900532, 2, 0, -1900531, 2, 0, -1900530, 2, 0, -1900529, 2, 0, -1900528, 2, 0, -1900527, 2, 0, -1900526, 2, 0, -1900525, 2, 0, -1900524, 2, 0, -1900523, 2, 0, -1900522, 2, 0, -1900521, 2, 0, -1900520, 2, 0, -1900519, 2, 0, -1900518, 2, 0, -1900517, 2, 0, -1900516, 2, 0, -1900515, 2, 0, -1900514, 2, 0, -1900513, 2, 0, -1900512, 2, 0, -1900511, 2, 0, -1900510, 2, 0, -1900509, 2, 0, -1900508, 2, 0, -1900507, 2, 0, -1900506, 2, 0, -1900505, 2, 0, -1900504, 2, 0, -1900503, 2, 0, -1769514, 2, 0, -1769513, 2, 0, -1769512, 2, 0, -1769511, 2, 0, -1769510, 2, 0, -1769509, 2, 0, -1769508, 2, 0, -1769507, 2, 0, -1769506, 2, 0, -1769505, 2, 0, -1769504, 2, 0, -1769503, 2, 0, -1769502, 2, 0, -1769501, 2, 0, -1769500, 2, 0, -1769499, 2, 0, -1769498, 2, 0, -1769497, 2, 0, -1769496, 2, 0, -1769495, 2, 0, -1769494, 2, 0, -1769493, 2, 0, -1769492, 2, 0, -1769491, 2, 0, -1769490, 2, 0, -1769489, 2, 0, -1769488, 2, 0, -1769487, 2, 0, -1769486, 2, 0, -1769485, 2, 0, -1769484, 2, 0, -1769483, 2, 0, -1769482, 2, 0, -1769481, 2, 0, -1769480, 2, 0, -1769479, 2, 0, -1769478, 2, 0, -1769477, 2, 0, -1769476, 2, 0, -1769475, 2, 0, -1769474, 2, 0, -1769473, 2, 0, -1835008, 2, 0, -1835007, 2, 0, -1835006, 2, 0, -1835005, 2, 0, -1835004, 2, 0, -1835003, 2, 0, -1835002, 2, 0, -1835001, 2, 0, -1835000, 2, 0, -1834999, 2, 0, -1834998, 2, 0, -1834997, 2, 0, -1834996, 2, 0, -1834995, 2, 0, -1834994, 2, 0, -1834993, 2, 0, -1834992, 2, 0, -1834991, 2, 0, -1834990, 2, 0, -1834989, 2, 0, -1834988, 2, 0, -1834987, 2, 0, -1834986, 2, 0, -1834985, 2, 0, -1834984, 2, 0, -1834983, 2, 0, -1834982, 2, 0, -1834981, 2, 0, -1834980, 2, 0, -1834979, 2, 0, -1834978, 2, 0, -1834977, 2, 0, -1834976, 2, 0, -1834975, 2, 0, -1834974, 2, 0, -1834973, 2, 0, -1834972, 2, 0, -1834971, 2, 0, -1834970, 2, 0, -1834969, 2, 0, -1834968, 2, 0, -1834967, 2, 0, -1834966, 2, 0, -1703977, 2, 0, -1703976, 2, 0, -1703975, 2, 0, -1703974, 2, 0, -1703973, 2, 0, -1703972, 2, 0, -1703971, 2, 0, -1703970, 2, 0, -1703969, 2, 0, -1703968, 2, 0, -1703967, 2, 0, -1703966, 2, 0, -1703965, 2, 0, -1703964, 2, 0, -1703963, 2, 0, -1703962, 2, 0, -1703961, 2, 0, -1703960, 2, 0, -1703959, 2, 0, -1703958, 2, 0, -1703957, 2, 0, -1703956, 2, 0, -1703955, 2, 0, -1703954, 2, 0, -1703953, 2, 0, -1703952, 2, 0, -1703951, 2, 0, -1703950, 2, 0, -1703949, 2, 0, -1703948, 2, 0, -1703947, 2, 0, -1703946, 2, 0, -1703945, 2, 0, -1703944, 2, 0, -1703943, 2, 0, -1703942, 2, 0, -1703941, 2, 0, -1703940, 2, 0, -1703939, 2, 0, -1703938, 2, 0, -1703937, 2, 0, -1769472, 2, 0, -1769471, 2, 0, -1769470, 2, 0, -1769469, 2, 0, -1769468, 2, 0, -1769467, 2, 0, -1769466, 2, 0, -1769465, 2, 0, -1769464, 2, 0, -1769463, 2, 0, -1769462, 2, 0, -1769461, 2, 0, -1769460, 2, 0, -1769459, 2, 0, -1769458, 2, 0, -1769457, 2, 0, -1769456, 2, 0, -1769455, 2, 0, -1769454, 2, 0, -1769453, 2, 0, -1769452, 2, 0, -1769451, 2, 0, -1769450, 2, 0, -1769449, 2, 0, -1769448, 2, 0, -1769447, 2, 0, -1769446, 2, 0, -1769445, 2, 0, -1769444, 2, 0, -1769443, 2, 0, -1769442, 2, 0, -1769441, 2, 0, -1769440, 2, 0, -1769439, 2, 0, -1769438, 2, 0, -1769437, 2, 0, -1769436, 2, 0, -1769435, 2, 0, -1769434, 2, 0, -1769433, 2, 0, -1769432, 2, 0, -1769431, 2, 0, -1769430, 2, 0, -1769429, 2, 0, -1769428, 2, 0, -1638441, 2, 0, -1638440, 2, 0, -1638439, 2, 0, -1638438, 2, 0, -1638437, 2, 0, -1638436, 2, 0, -1638435, 2, 0, -1638434, 2, 0, -1638433, 2, 0, -1638432, 2, 0, -1638431, 2, 0, -1638430, 2, 0, -1638429, 2, 0, -1638428, 2, 0, -1638427, 2, 0, -1638426, 2, 0, -1638425, 2, 0, -1638424, 2, 0, -1638423, 2, 0, -1638422, 2, 0, -1638421, 2, 0, -1638420, 2, 0, -1638419, 2, 0, -1638418, 2, 0, -1638417, 2, 0, -1638416, 2, 0, -1638415, 2, 0, -1638414, 2, 0, -1638413, 2, 0, -1638412, 2, 0, -1638411, 2, 0, -1638410, 2, 0, -1638409, 2, 0, -1638408, 2, 0, -1638407, 2, 0, -1638406, 2, 0, -1638405, 2, 0, -1638404, 2, 0, -1638403, 2, 0, -1638402, 2, 0, -1638401, 2, 0, -1703936, 2, 0, -1703935, 2, 0, -1703934, 2, 0, -1703933, 2, 0, -1703932, 2, 0, -1703931, 2, 0, -1703930, 2, 0, -1703929, 2, 0, -1703928, 2, 0, -1703927, 2, 0, -1703926, 2, 0, -1703925, 2, 0, -1703924, 2, 0, -1703923, 2, 0, -1703922, 2, 0, -1703921, 2, 0, -1703920, 2, 0, -1703919, 2, 0, -1703918, 2, 0, -1703917, 2, 0, -1703916, 2, 0, -1703915, 2, 0, -1703914, 2, 0, -1703913, 2, 0, -1703912, 2, 0, -1703911, 2, 0, -1703910, 2, 0, -1703909, 2, 0, -1703908, 2, 0, -1703907, 2, 0, -1703906, 2, 0, -1703905, 2, 0, -1703904, 2, 0, -1703903, 2, 0, -1703902, 2, 0, -1703901, 2, 0, -1703900, 2, 0, -1703899, 2, 0, -1703898, 2, 0, -1703897, 2, 0, -1703896, 2, 0, -1703895, 2, 0, -1703894, 2, 0, -1703893, 2, 0, -1703892, 2, 0, -1703891, 2, 0, -1572905, 2, 0, -1572904, 2, 0, -1572903, 2, 0, -1572902, 2, 0, -1572901, 2, 0, -1572900, 2, 0, -1572899, 2, 0, -1572898, 2, 0, -1572897, 2, 0, -1572896, 2, 0, -1572895, 2, 0, -1572894, 2, 0, -1572893, 2, 0, -1572892, 2, 0, -1572891, 2, 0, -1572890, 2, 0, -1572889, 2, 0, -1572888, 2, 0, -1572887, 2, 0, -1572886, 2, 0, -1572885, 2, 0, -1572884, 2, 0, -1572883, 2, 0, -1572882, 2, 0, -1572881, 2, 0, -1572880, 2, 0, -1572879, 2, 0, -1572878, 2, 0, -1572877, 2, 0, -1572876, 2, 0, -1572875, 2, 0, -1572874, 2, 0, -1572873, 2, 0, -1572872, 2, 0, -1572871, 2, 0, -1572870, 2, 0, -1572869, 2, 0, -1572868, 2, 0, -1572867, 2, 0, -1572866, 2, 0, -1572865, 2, 0, -1638400, 2, 0, -1638399, 2, 0, -1638398, 2, 0, -1638397, 2, 0, -1638396, 2, 0, -1638395, 2, 0, -1638394, 2, 0, -1638393, 2, 0, -1638392, 2, 0, -1638391, 2, 0, -1638390, 2, 0, -1638389, 2, 0, -1638388, 2, 0, -1638387, 2, 0, -1638386, 2, 0, -1638385, 2, 0, -1638384, 2, 0, -1638383, 2, 0, -1638382, 2, 0, -1638381, 2, 0, -1638380, 2, 0, -1638379, 2, 0, -1638378, 2, 0, -1638377, 2, 0, -1638376, 2, 0, -1638375, 2, 0, -1638374, 2, 0, -1638373, 2, 0, -1638372, 2, 0, -1638371, 2, 0, -1638370, 2, 0, -1638369, 2, 0, -1638368, 2, 0, -1638367, 2, 0, -1638366, 2, 0, -1638365, 2, 0, -1638364, 2, 0, -1638363, 2, 0, -1638362, 2, 0, -1638361, 2, 0, -1638360, 2, 0, -1638359, 2, 0, -1638358, 2, 0, -1638357, 2, 0, -1638356, 2, 0, -1638355, 2, 0, -1638354, 2, 0, -1507369, 2, 0, -1507368, 2, 0, -1507367, 2, 0, -1507366, 2, 0, -1507365, 2, 0, -1507364, 2, 0, -1507363, 2, 0, -1507362, 2, 0, -1507361, 2, 0, -1507360, 2, 0, -1507359, 2, 0, -1507358, 2, 0, -1507357, 2, 0, -1507356, 2, 0, -1507355, 2, 0, -1507354, 2, 0, -1507353, 2, 0, -1507352, 2, 0, -1507351, 2, 0, -1507350, 2, 0, -1507349, 2, 0, -1507348, 2, 0, -1507347, 2, 0, -1507346, 2, 0, -1507345, 2, 0, -1507344, 2, 0, -1507343, 2, 0, -1507342, 2, 0, -1507341, 2, 0, -1507340, 2, 0, -1507339, 2, 0, -1507338, 2, 0, -1507337, 2, 0, -1507336, 2, 0, -1507335, 2, 0, -1507334, 2, 0, -1507333, 2, 0, -1507332, 2, 0, -1507331, 2, 0, -1507330, 2, 0, -1507329, 2, 0, -1572864, 2, 0, -1572863, 2, 0, -1572862, 2, 0, -1572861, 2, 0, -1572860, 2, 0, -1572859, 2, 0, -1572858, 2, 0, -1572857, 2, 0, -1572856, 2, 0, -1572855, 2, 0, -1572854, 2, 0, -1572853, 2, 0, -1572852, 2, 0, -1572851, 2, 0, -1572850, 2, 0, -1572849, 2, 0, -1572848, 2, 0, -1572847, 2, 0, -1572846, 2, 0, -1572845, 2, 0, -1572844, 2, 0, -1572843, 2, 0, -1572842, 2, 0, -1572841, 2, 0, -1572840, 2, 0, -1572839, 2, 0, -1572838, 2, 0, -1572837, 2, 0, -1572836, 2, 0, -1572835, 2, 0, -1572834, 2, 0, -1572833, 2, 0, -1572832, 2, 0, -1572831, 2, 0, -1572830, 2, 0, -1572829, 2, 0, -1572828, 2, 0, -1572827, 2, 0, -1572826, 2, 0, -1572825, 2, 0, -1572824, 2, 0, -1572823, 2, 0, -1572822, 2, 0, -1572821, 2, 0, -1572820, 2, 0, -1572819, 2, 0, -1572818, 2, 0, -1572817, 2, 0, -1441833, 2, 0, -1441832, 2, 0, -1441831, 2, 0, -1441830, 2, 0, -1441829, 2, 0, -1441828, 2, 0, -1441827, 2, 0, -1441826, 2, 0, -1441825, 2, 0, -1441824, 2, 0, -1441823, 2, 0, -1441822, 2, 0, -1441821, 2, 0, -1441820, 2, 0, -1441819, 2, 0, -1441818, 2, 0, -1441817, 2, 0, -1441816, 2, 0, -1441815, 2, 0, -1441814, 2, 0, -1441813, 2, 0, -1441812, 2, 0, -1441811, 2, 0, -1441810, 2, 0, -1441809, 2, 0, -1441808, 2, 0, -1441807, 2, 0, -1441806, 2, 0, -1441805, 2, 0, -1441804, 2, 0, -1441803, 2, 0, -1441802, 2, 0, -1441801, 2, 0, -1441800, 2, 0, -1441799, 2, 0, -1441798, 2, 0, -1441797, 2, 0, -1441796, 2, 0, -1441795, 2, 0, -1441794, 2, 0, -1441793, 2, 0, -1507328, 2, 0, -1507327, 2, 0, -1507326, 2, 0, -1507325, 2, 0, -1507324, 2, 0, -1507323, 2, 0, -1507322, 2, 0, -1507321, 2, 0, -1507320, 2, 0, -1507319, 2, 0, -1507318, 2, 0, -1507317, 2, 0, -1507316, 2, 0, -1507315, 2, 0, -1507314, 2, 0, -1507313, 2, 0, -1507312, 2, 0, -1507311, 2, 0, -1507310, 2, 0, -1507309, 2, 0, -1507308, 2, 0, -1507307, 2, 0, -1507306, 2, 0, -1507305, 2, 0, -1507304, 2, 0, -1507303, 2, 0, -1507302, 2, 0, -1507301, 2, 0, -1507300, 2, 0, -1507299, 2, 0, -1507298, 2, 0, -1507297, 2, 0, -1507296, 2, 0, -1507295, 2, 0, -1507294, 2, 0, -1507293, 2, 0, -1507292, 2, 0, -1507291, 2, 0, -1507290, 2, 0, -1507289, 2, 0, -1507288, 2, 0, -1507287, 2, 0, -1507286, 2, 0, -1507285, 2, 0, -1507284, 2, 0, -1507283, 2, 0, -1507282, 2, 0, -1507281, 2, 0, -1507280, 2, 0, -1376297, 2, 0, -1376296, 2, 0, -1376295, 2, 0, -1376294, 2, 0, -1376293, 2, 0, -1376292, 2, 0, -1376291, 2, 0, -1376290, 2, 0, -1376289, 2, 0, -1376288, 2, 0, -1376287, 2, 0, -1376286, 2, 0, -1376285, 2, 0, -1376284, 2, 0, -1376283, 2, 0, -1376282, 2, 0, -1376281, 2, 0, -1376280, 2, 0, -1376279, 2, 0, -1376278, 2, 0, -1376277, 2, 0, -1376276, 2, 0, -1376275, 2, 0, -1376274, 2, 0, -1376273, 2, 0, -1376272, 2, 0, -1376271, 2, 0, -1376270, 2, 0, -1376269, 2, 0, -1376268, 2, 0, -1376267, 2, 0, -1376266, 2, 0, -1376265, 2, 0, -1376264, 2, 0, -1376263, 2, 0, -1376262, 2, 0, -1376261, 2, 0, -1376260, 2, 0, -1376259, 2, 0, -1376258, 2, 0, -1376257, 2, 0, -1441792, 2, 0, -1441791, 2, 0, -1441790, 2, 0, -1441789, 2, 0, -1441788, 2, 0, -1441787, 2, 0, -1441786, 2, 0, -1441785, 2, 0, -1441784, 2, 0, -1441783, 2, 0, -1441782, 2, 0, -1441781, 2, 0, -1441780, 2, 0, -1441779, 2, 0, -1441778, 2, 0, -1441777, 2, 0, -1441776, 2, 0, -1441775, 2, 0, -1441774, 2, 0, -1441773, 2, 0, -1441772, 2, 0, -1441771, 2, 0, -1441770, 2, 0, -1441769, 2, 0, -1441768, 2, 0, -1441767, 2, 0, -1441766, 2, 0, -1441765, 2, 0, -1441764, 2, 0, -1441763, 2, 0, -1441762, 2, 0, -1441761, 2, 0, -1441760, 2, 0, -1441759, 2, 0, -1441758, 2, 0, -1441757, 2, 0, -1441756, 2, 0, -1441755, 2, 0, -1441754, 2, 0, -1441753, 2, 0, -1441752, 2, 0, -1441751, 2, 0, -1441750, 2, 0, -1441749, 2, 0, -1441748, 2, 0, -1441747, 2, 0, -1441746, 2, 0, -1441745, 2, 0, -1441744, 2, 0, -1310760, 2, 0, -1310759, 2, 0, -1310758, 2, 0, -1310757, 2, 0, -1310756, 2, 0, -1310755, 2, 0, -1310754, 2, 0, -1310753, 2, 0, -1310752, 2, 0, -1310751, 2, 0, -1310750, 2, 0, -1310749, 2, 0, -1310748, 2, 0, -1310747, 2, 0, -1310746, 2, 0, -1310745, 2, 0, -1310744, 2, 0, -1310743, 2, 0, -1310742, 2, 0, -1310741, 2, 0, -1310740, 2, 0, -1310739, 2, 0, -1310738, 2, 0, -1310737, 2, 0, -1310736, 2, 0, -1310735, 2, 0, -1310734, 2, 0, -1310733, 2, 0, -1310732, 2, 0, -1310731, 2, 0, -1310730, 2, 0, -1310729, 2, 0, -1310728, 2, 0, -1310727, 2, 0, -1310726, 2, 0, -1310725, 2, 0, -1310724, 2, 0, -1310723, 2, 0, -1310722, 2, 0, -1310721, 2, 0, -1376256, 2, 0, -1376255, 2, 0, -1376254, 2, 0, -1376253, 2, 0, -1376252, 2, 0, -1376251, 2, 0, -1376250, 2, 0, -1376249, 2, 0, -1376248, 2, 0, -1376247, 2, 0, -1376246, 2, 0, -1376245, 2, 0, -1376244, 2, 0, -1376243, 2, 0, -1376242, 2, 0, -1376241, 2, 0, -1376240, 2, 0, -1376239, 2, 0, -1376238, 2, 0, -1376237, 2, 0, -1376236, 2, 0, -1376235, 2, 0, -1376234, 2, 0, -1376233, 2, 0, -1376232, 2, 0, -1376231, 2, 0, -1376230, 2, 0, -1376229, 2, 0, -1376228, 2, 0, -1376227, 2, 0, -1376226, 2, 0, -1376225, 2, 0, -1376224, 2, 0, -1376223, 2, 0, -1376222, 2, 0, -1376221, 2, 0, -1376220, 2, 0, -1376219, 2, 0, -1376218, 2, 0, -1376217, 2, 0, -1376216, 2, 0, -1376215, 2, 0, -1376214, 2, 0, -1376213, 2, 0, -1376212, 2, 0, -1376211, 2, 0, -1376210, 2, 0, -1376209, 2, 0, -1376208, 2, 0, -1376207, 2, 0, -1245224, 2, 0, -1245223, 2, 0, -1245222, 2, 0, -1245221, 2, 0, -1245220, 2, 0, -1245219, 2, 0, -1245218, 2, 0, -1245217, 2, 0, -1245216, 2, 0, -1245215, 2, 0, -1245214, 2, 0, -1245213, 2, 0, -1245212, 2, 0, -1245211, 2, 0, -1245210, 2, 0, -1245209, 2, 0, -1245208, 2, 0, -1245207, 2, 0, -1245206, 2, 0, -1245205, 2, 0, -1245204, 2, 0, -1245203, 2, 0, -1245202, 2, 0, -1245201, 2, 0, -1245200, 2, 0, -1245199, 2, 0, -1245198, 2, 0, -1245197, 2, 0, -1245196, 2, 0, -1245195, 2, 0, -1245194, 2, 0, -1245193, 2, 0, -1245192, 2, 0, -1245191, 2, 0, -1245190, 2, 0, -1245189, 2, 0, -1245188, 2, 0, -1245187, 2, 0, -1245186, 2, 0, -1245185, 2, 0, -1310720, 2, 0, -1310719, 2, 0, -1310718, 2, 0, -1310717, 2, 0, -1310716, 2, 0, -1310715, 2, 0, -1310714, 2, 0, -1310713, 2, 0, -1310712, 2, 0, -1310711, 2, 0, -1310710, 2, 0, -1310709, 2, 0, -1310708, 2, 0, -1310707, 2, 0, -1310706, 2, 0, -1310705, 2, 0, -1310704, 2, 0, -1310703, 2, 0, -1310702, 2, 0, -1310701, 2, 0, -1310700, 2, 0, -1310699, 2, 0, -1310698, 2, 0, -1310697, 2, 0, -1310696, 2, 0, -1310695, 2, 0, -1310694, 2, 0, -1310693, 2, 0, -1310692, 2, 0, -1310691, 2, 0, -1310690, 2, 0, -1310689, 2, 0, -1310688, 2, 0, -1310687, 2, 0, -1310686, 2, 0, -1310685, 2, 0, -1310684, 2, 0, -1310683, 2, 0, -1310682, 2, 0, -1310681, 2, 0, -1310680, 2, 0, -1310679, 2, 0, -1310678, 2, 0, -1310677, 2, 0, -1310676, 2, 0, -1310675, 2, 0, -1310674, 2, 0, -1310673, 2, 0, -1310672, 2, 0, -1310671, 2, 0, -1310670, 2, 0, -1310669, 2, 0, -1179688, 2, 0, -1179687, 2, 0, -1179686, 2, 0, -1179685, 2, 0, -1179684, 2, 0, -1179683, 2, 0, -1179682, 2, 0, -1179681, 2, 0, -1179680, 2, 0, -1179679, 2, 0, -1179678, 2, 0, -1179677, 2, 0, -1179676, 2, 0, -1179675, 2, 0, -1179674, 2, 0, -1179673, 2, 0, -1179672, 2, 0, -1179671, 2, 0, -1179670, 2, 0, -1179669, 2, 0, -1179668, 2, 0, -1179667, 2, 0, -1179666, 2, 0, -1179665, 2, 0, -1179664, 2, 0, -1179663, 2, 0, -1179662, 2, 0, -1179661, 2, 0, -1179660, 2, 0, -1179659, 2, 0, -1179658, 2, 0, -1179657, 2, 0, -1179656, 2, 0, -1179655, 2, 0, -1179654, 2, 0, -1179653, 2, 0, -1179652, 2, 0, -1179651, 2, 0, -1179650, 2, 0, -1179649, 2, 0, -1245184, 2, 0, -1245183, 2, 0, -1245182, 2, 0, -1245181, 2, 0, -1245180, 2, 0, -1245179, 2, 0, -1245178, 2, 0, -1245177, 2, 0, -1245176, 2, 0, -1245175, 2, 0, -1245174, 2, 0, -1245173, 2, 0, -1245172, 2, 0, -1245171, 2, 0, -1245170, 2, 0, -1245169, 2, 0, -1245168, 2, 0, -1245167, 2, 0, -1245166, 2, 0, -1245165, 2, 0, -1245164, 2, 0, -1245163, 2, 0, -1245162, 2, 0, -1245161, 2, 0, -1245160, 2, 0, -1245159, 2, 0, -1245158, 2, 0, -1245157, 2, 0, -1245156, 2, 0, -1245155, 2, 0, -1245154, 2, 0, -1245153, 2, 0, -1245152, 2, 0, -1245151, 2, 0, -1245150, 2, 0, -1245149, 2, 0, -1245148, 2, 0, -1245147, 2, 0, -1245146, 2, 0, -1245145, 2, 0, -1245144, 2, 0, -1245143, 2, 0, -1245142, 2, 0, -1245141, 2, 0, -1245140, 2, 0, -1245139, 2, 0, -1245138, 2, 0, -1245137, 2, 0, -1245136, 2, 0, -1245135, 2, 0, -1245134, 2, 0, -1245133, 2, 0, -1245132, 2, 0, -1114152, 2, 0, -1114151, 2, 0, -1114150, 2, 0, -1114149, 2, 0, -1114148, 2, 0, -1114147, 2, 0, -1114146, 2, 0, -1114145, 2, 0, -1114144, 2, 0, -1114143, 2, 0, -1114142, 2, 0, -1114141, 2, 0, -1114140, 2, 0, -1114139, 2, 0, -1114138, 2, 0, -1114137, 2, 0, -1114136, 2, 0, -1114135, 2, 0, -1114134, 2, 0, -1114133, 2, 0, -1114132, 2, 0, -1114131, 2, 0, -1114130, 2, 0, -1114129, 2, 0, -1114128, 2, 0, -1114127, 2, 0, -1114126, 2, 0, -1114125, 2, 0, -1114124, 2, 0, -1114123, 2, 0, -1114122, 2, 0, -1114121, 2, 0, -1114120, 2, 0, -1114119, 2, 0, -1114118, 2, 0, -1114117, 2, 0, -1114116, 2, 0, -1114115, 2, 0, -1114114, 2, 0, -1114113, 2, 0, -1179648, 2, 0, -1179647, 2, 0, -1179646, 2, 0, -1179645, 2, 0, -1179644, 2, 0, -1179643, 2, 0, -1179642, 2, 0, -1179641, 2, 0, -1179640, 2, 0, -1179639, 2, 0, -1179638, 2, 0, -1179637, 2, 0, -1179636, 2, 0, -1179635, 2, 0, -1179634, 2, 0, -1179633, 2, 0, -1179632, 2, 0, -1179631, 2, 0, -1179630, 2, 0, -1179629, 2, 0, -1179628, 2, 0, -1179627, 2, 0, -1179626, 2, 0, -1179625, 2, 0, -1179624, 2, 0, -1179623, 2, 0, -1179622, 2, 0, -1179621, 2, 0, -1179620, 2, 0, -1179619, 2, 0, -1179618, 2, 0, -1179617, 2, 0, -1179616, 2, 0, -1179615, 2, 0, -1179614, 2, 0, -1179613, 2, 0, -1179612, 2, 0, -1179611, 2, 0, -1179610, 2, 0, -1179609, 2, 0, -1179608, 2, 0, -1179607, 2, 0, -1179606, 2, 0, -1179605, 2, 0, -1179604, 2, 0, -1179603, 2, 0, -1179602, 2, 0, -1179601, 2, 0, -1179600, 2, 0, -1179599, 2, 0, -1179598, 2, 0, -1179597, 2, 0, -1179596, 2, 0, -1048615, 2, 0, -1048614, 2, 0, -1048613, 2, 0, -1048612, 2, 0, -1048611, 2, 0, -1048610, 2, 0, -1048609, 2, 0, -1048608, 2, 0, -1048607, 2, 0, -1048606, 2, 0, -1048605, 2, 0, -1048604, 2, 0, -1048603, 2, 0, -1048602, 2, 0, -1048601, 2, 0, -1048600, 2, 0, -1048599, 2, 0, -1048598, 2, 0, -1048597, 2, 0, -1048596, 2, 0, -1048595, 2, 0, -1048594, 2, 0, -1048593, 2, 0, -1048592, 2, 0, -1048591, 2, 0, -1048590, 2, 0, -1048589, 2, 0, -1048588, 2, 0, -1048587, 2, 0, -1048586, 2, 0, -1048585, 2, 0, -1048584, 2, 0, -1048583, 2, 0, -1048582, 2, 0, -1048581, 2, 0, -1048580, 2, 0, -1048579, 2, 0, -1048578, 2, 0, -1048577, 2, 0, -1114112, 2, 0, -1114111, 2, 0, -1114110, 2, 0, -1114109, 2, 0, -1114108, 2, 0, -1114107, 2, 0, -1114106, 2, 0, -1114105, 2, 0, -1114104, 2, 0, -1114103, 2, 0, -1114102, 2, 0, -1114101, 2, 0, -1114100, 2, 0, -1114099, 2, 0, -1114098, 2, 0, -1114097, 2, 0, -1114096, 2, 0, -1114095, 2, 0, -1114094, 2, 0, -1114093, 2, 0, -1114092, 2, 0, -1114091, 2, 0, -1114090, 2, 0, -1114089, 2, 0, -1114088, 2, 0, -1114087, 2, 0, -1114086, 2, 0, -1114085, 2, 0, -1114084, 2, 0, -1114083, 2, 0, -1114082, 2, 0, -1114081, 2, 0, -1114080, 2, 0, -1114079, 2, 0, -1114078, 2, 0, -1114077, 2, 0, -1114076, 2, 0, -1114075, 2, 0, -1114074, 2, 0, -1114073, 2, 0, -1114072, 2, 0, -1114071, 2, 0, -1114070, 2, 0, -1114069, 2, 0, -1114068, 2, 0, -1114067, 2, 0, -1114066, 2, 0, -1114065, 2, 0, -1114064, 2, 0, -1114063, 2, 0, -1114062, 2, 0, -1114061, 2, 0, -1114060, 2, 0, -1114059, 2, 0, -983079, 2, 0, -983078, 2, 0, -983077, 2, 0, -983076, 2, 0, -983075, 2, 0, -983074, 2, 0, -983073, 2, 0, -983072, 2, 0, -983071, 2, 0, -983070, 2, 0, -983069, 2, 0, -983068, 2, 0, -983067, 2, 0, -983066, 2, 0, -983065, 2, 0, -983064, 2, 0, -983063, 2, 0, -983062, 2, 0, -983061, 2, 0, -983060, 2, 0, -983059, 2, 0, -983058, 2, 0, -983057, 2, 0, -983056, 2, 0, -983055, 2, 0, -983054, 2, 0, -983053, 2, 0, -983052, 2, 0, -983051, 2, 0, -983050, 2, 0, -983049, 2, 0, -983048, 2, 0, -983047, 2, 0, -983046, 2, 0, -983045, 2, 0, -983044, 2, 0, -983043, 2, 0, -983042, 2, 0, -983041, 2, 0, -1048576, 2, 0, -1048575, 2, 0, -1048574, 2, 0, -1048573, 2, 0, -1048572, 2, 0, -1048571, 2, 0, -1048570, 2, 0, -1048569, 2, 0, -1048568, 2, 0, -1048567, 2, 0, -1048566, 2, 0, -1048565, 2, 0, -1048564, 2, 0, -1048563, 2, 0, -1048562, 2, 0, -1048561, 2, 0, -1048560, 2, 0, -1048559, 2, 0, -1048558, 2, 0, -1048557, 2, 0, -1048556, 2, 0, -1048555, 2, 0, -1048554, 2, 0, -1048553, 2, 0, -1048552, 2, 0, -1048551, 2, 0, -1048550, 2, 0, -1048549, 2, 0, -1048548, 2, 0, -1048547, 2, 0, -1048546, 2, 0, -1048545, 2, 0, -1048544, 2, 0, -1048543, 2, 0, -1048542, 2, 0, -1048541, 2, 0, -1048540, 2, 0, -1048539, 2, 0, -1048538, 2, 0, -1048537, 2, 0, -1048536, 2, 0, -1048535, 2, 0, -1048534, 2, 0, -1048533, 2, 0, -1048532, 2, 0, -1048531, 2, 0, -1048530, 2, 0, -1048529, 2, 0, -1048528, 2, 0, -1048527, 2, 0, -1048526, 2, 0, -1048525, 2, 0, -1048524, 2, 0, -1048523, 2, 0, -917543, 2, 0, -917542, 2, 0, -917541, 2, 0, -917540, 2, 0, -917539, 2, 0, -917538, 2, 0, -917537, 2, 0, -917536, 2, 0, -917535, 2, 0, -917534, 2, 0, -917533, 2, 0, -917532, 2, 0, -917531, 2, 0, -917530, 2, 0, -917529, 2, 0, -917528, 2, 0, -917527, 2, 0, -917526, 2, 0, -917525, 2, 0, -917524, 2, 0, -917523, 2, 0, -917522, 2, 0, -917521, 2, 0, -917520, 2, 0, -917519, 2, 0, -917518, 2, 0, -917517, 2, 0, -917516, 2, 0, -917515, 2, 0, -917514, 2, 0, -917513, 2, 0, -917512, 2, 0, -917511, 2, 0, -917510, 2, 0, -917509, 2, 0, -917508, 2, 0, -917507, 2, 0, -917506, 2, 0, -917505, 2, 0, -983040, 2, 0, -983039, 2, 0, -983038, 2, 0, -983037, 2, 0, -983036, 2, 0, -983035, 2, 0, -983034, 2, 0, -983033, 2, 0, -983032, 2, 0, -983031, 2, 0, -983030, 2, 0, -983029, 2, 0, -983028, 2, 0, -983027, 2, 0, -983026, 2, 0, -983025, 2, 0, -983024, 2, 0, -983023, 2, 0, -983022, 2, 0, -983021, 2, 0, -983020, 2, 0, -983019, 2, 0, -983018, 2, 0, -983017, 2, 0, -983016, 2, 0, -983015, 2, 0, -983014, 2, 0, -983013, 2, 0, -983012, 2, 0, -983011, 2, 0, -983010, 2, 0, -983009, 2, 0, -983008, 2, 0, -983007, 2, 0, -983006, 2, 0, -983005, 2, 0, -983004, 2, 0, -983003, 2, 0, -983002, 2, 0, -983001, 2, 0, -983000, 2, 0, -982999, 2, 0, -982998, 2, 0, -982997, 2, 0, -982996, 2, 0, -982995, 2, 0, -982994, 2, 0, -982993, 2, 0, -982992, 2, 0, -982991, 2, 0, -982990, 2, 0, -982989, 2, 0, -982988, 2, 0, -982987, 2, 0, -982986, 2, 0, -852007, 2, 0, -852006, 2, 0, -852005, 2, 0, -852004, 2, 0, -852003, 2, 0, -852002, 2, 0, -852001, 2, 0, -852000, 2, 0, -851999, 2, 0, -851998, 2, 0, -851997, 2, 0, -851996, 2, 0, -851995, 2, 0, -851994, 2, 0, -851993, 2, 0, -851992, 2, 0, -851991, 2, 0, -851990, 2, 0, -851989, 2, 0, -851988, 2, 0, -851987, 2, 0, -851986, 2, 0, -851985, 2, 0, -851984, 2, 0, -851983, 2, 0, -851982, 2, 0, -851981, 2, 0, -851980, 2, 0, -851979, 2, 0, -851978, 2, 0, -851977, 2, 0, -851976, 2, 0, -851975, 2, 0, -851974, 2, 0, -851973, 2, 0, -851972, 2, 0, -851971, 2, 0, -851970, 2, 0, -851969, 2, 0, -917504, 2, 0, -917503, 2, 0, -917502, 2, 0, -917501, 2, 0, -917500, 2, 0, -917499, 2, 0, -917498, 2, 0, -917497, 2, 0, -917496, 2, 0, -917495, 2, 0, -917494, 2, 0, -917493, 2, 0, -917492, 2, 0, -917491, 2, 0, -917490, 2, 0, -917489, 2, 0, -917488, 2, 0, -917487, 2, 0, -917486, 2, 0, -917485, 2, 0, -917484, 2, 0, -917483, 2, 0, -917482, 2, 0, -917481, 2, 0, -917480, 2, 0, -917479, 2, 0, -917478, 2, 0, -917477, 2, 0, -917476, 2, 0, -917475, 2, 0, -917474, 2, 0, -917473, 2, 0, -917472, 2, 0, -917471, 2, 0, -917470, 2, 0, -917469, 2, 0, -917468, 2, 0, -917467, 2, 0, -917466, 2, 0, -917465, 2, 0, -917464, 2, 0, -917463, 2, 0, -917462, 2, 0, -917461, 2, 0, -917460, 2, 0, -917459, 2, 0, -917458, 2, 0, -917457, 2, 0, -917456, 2, 0, -917455, 2, 0, -917454, 2, 0, -917453, 2, 0, -917452, 2, 0, -917451, 2, 0, -917450, 2, 0, -786471, 2, 0, -786470, 2, 0, -786469, 2, 0, -786468, 2, 0, -786467, 2, 0, -786466, 2, 0, -786465, 2, 0, -786464, 2, 0, -786463, 2, 0, -786462, 2, 0, -786461, 2, 0, -786460, 2, 0, -786459, 2, 0, -786458, 2, 0, -786457, 2, 0, -786456, 2, 0, -786455, 2, 0, -786454, 2, 0, -786453, 2, 0, -786452, 2, 0, -786451, 2, 0, -786450, 2, 0, -786449, 2, 0, -786448, 2, 0, -786447, 2, 0, -786446, 2, 0, -786445, 2, 0, -786444, 2, 0, -786443, 2, 0, -786442, 2, 0, -786441, 2, 0, -786440, 2, 0, -786439, 2, 0, -786438, 2, 0, -786437, 2, 0, -786436, 2, 0, -786435, 2, 0, -786434, 2, 0, -786433, 2, 0, -851968, 2, 0, -851967, 2, 0, -851966, 2, 0, -851965, 2, 0, -851964, 2, 0, -851963, 2, 0, -851962, 2, 0, -851961, 2, 0, -851960, 2, 0, -851959, 2, 0, -851958, 2, 0, -851957, 2, 0, -851956, 2, 0, -851955, 2, 0, -851954, 2, 0, -851953, 2, 0, -851952, 2, 0, -851951, 2, 0, -851950, 2, 0, -851949, 2, 0, -851948, 2, 0, -851947, 2, 0, -851946, 2, 0, -851945, 2, 0, -851944, 2, 0, -851943, 2, 0, -851942, 2, 0, -851941, 2, 0, -851940, 2, 0, -851939, 2, 0, -851938, 2, 0, -851937, 2, 0, -851936, 2, 0, -851935, 2, 0, -851934, 2, 0, -851933, 2, 0, -851932, 2, 0, -851931, 2, 0, -851930, 2, 0, -851929, 2, 0, -851928, 2, 0, -851927, 2, 0, -851926, 2, 0, -851925, 2, 0, -851924, 2, 0, -851923, 2, 0, -851922, 2, 0, -851921, 2, 0, -851920, 2, 0, -851919, 2, 0, -851918, 2, 0, -851917, 2, 0, -851916, 2, 0, -851915, 2, 0, -851914, 2, 0, -851913, 2, 0, -720934, 2, 0, -720933, 2, 0, -720932, 2, 0, -720931, 2, 0, -720930, 2, 0, -720929, 2, 0, -720928, 2, 0, -720927, 2, 0, -720926, 2, 0, -720925, 2, 0, -720924, 2, 0, -720923, 2, 0, -720922, 2, 0, -720921, 2, 0, -720920, 2, 0, -720919, 2, 0, -720918, 2, 0, -720917, 2, 0, -720916, 2, 0, -720915, 2, 0, -720914, 2, 0, -720913, 2, 0, -720912, 2, 0, -720911, 2, 0, -720910, 2, 0, -720909, 2, 0, -720908, 2, 0, -720907, 2, 0, -720906, 2, 0, -720905, 2, 0, -720904, 2, 0, -720903, 2, 0, -720902, 2, 0, -720901, 2, 0, -720900, 2, 0, -720899, 2, 0, -720898, 2, 0, -720897, 2, 0, -786432, 2, 0, -786431, 2, 0, -786430, 2, 0, -786429, 2, 0, -786428, 2, 0, -786427, 2, 0, -786426, 2, 0, -786425, 2, 0, -786424, 2, 0, -786423, 2, 0, -786422, 2, 0, -786421, 2, 0, -786420, 2, 0, -786419, 2, 0, -786418, 2, 0, -786417, 2, 0, -786416, 2, 0, -786415, 2, 0, -786414, 2, 0, -786413, 2, 0, -786412, 2, 0, -786411, 2, 0, -786410, 2, 0, -786409, 2, 0, -786408, 2, 0, -786407, 2, 0, -786406, 2, 0, -786405, 2, 0, -786404, 2, 0, -786403, 2, 0, -786402, 2, 0, -786401, 2, 0, -786400, 2, 0, -786399, 2, 0, -786398, 2, 0, -786397, 2, 0, -786396, 2, 0, -786395, 2, 0, -786394, 2, 0, -786393, 2, 0, -786392, 2, 0, -786391, 2, 0, -786390, 2, 0, -786389, 2, 0, -786388, 2, 0, -786387, 2, 0, -786386, 2, 0, -786385, 2, 0, -786384, 2, 0, -786383, 2, 0, -786382, 2, 0, -786381, 2, 0, -786380, 2, 0, -786379, 2, 0, -786378, 2, 0, -786377, 2, 0, -655398, 2, 0, -655397, 2, 0, -655396, 2, 0, -655395, 2, 0, -655394, 2, 0, -655393, 2, 0, -655392, 2, 0, -655391, 2, 0, -655390, 2, 0, -655389, 2, 0, -655388, 2, 0, -655387, 2, 0, -655386, 2, 0, -655385, 2, 0, -655384, 2, 0, -655383, 2, 0, -655382, 2, 0, -655381, 2, 0, -655380, 2, 0, -655379, 2, 0, -655378, 2, 0, -655377, 2, 0, -655376, 2, 0, -655375, 2, 0, -655374, 2, 0, -655373, 2, 0, -655372, 2, 0, -655371, 2, 0, -655370, 2, 0, -655369, 2, 0, -655368, 2, 0, -655367, 2, 0, -655366, 2, 0, -655365, 2, 0, -655364, 2, 0, -655363, 2, 0, -655362, 2, 0, -655361, 2, 0, -720896, 2, 0, -720895, 2, 0, -720894, 2, 0, -720893, 2, 0, -720892, 2, 0, -720891, 2, 0, -720890, 2, 0, -720889, 2, 0, -720888, 2, 0, -720887, 2, 0, -720886, 2, 0, -720885, 2, 0, -720884, 2, 0, -720883, 2, 0, -720882, 2, 0, -720881, 2, 0, -720880, 2, 0, -720879, 2, 0, -720878, 2, 0, -720877, 2, 0, -720876, 2, 0, -720875, 2, 0, -720874, 2, 0, -720873, 2, 0, -720872, 2, 0, -720871, 2, 0, -720870, 2, 0, -720869, 2, 0, -720868, 2, 0, -720867, 2, 0, -720866, 2, 0, -720865, 2, 0, -720864, 2, 0, -720863, 2, 0, -720862, 2, 0, -720861, 2, 0, -720860, 2, 0, -720859, 2, 0, -720858, 2, 0, -720857, 2, 0, -720856, 2, 0, -720855, 2, 0, -720854, 2, 0, -720853, 2, 0, -720852, 2, 0, -720851, 2, 0, -720850, 2, 0, -720849, 2, 0, -720848, 2, 0, -720847, 2, 0, -720846, 2, 0, -720845, 2, 0, -720844, 2, 0, -720843, 2, 0, -720842, 2, 0, -720841, 2, 0, -720840, 2, 0, -589862, 2, 0, -589861, 2, 0, -589860, 2, 0, -589859, 2, 0, -589858, 2, 0, -589857, 2, 0, -589856, 2, 0, -589855, 2, 0, -589854, 2, 0, -589853, 2, 0, -589852, 2, 0, -589851, 2, 0, -589850, 2, 0, -589849, 2, 0, -589848, 2, 0, -589847, 2, 0, -589846, 2, 0, -589845, 2, 0, -589844, 2, 0, -589843, 2, 0, -589842, 2, 0, -589841, 2, 0, -589840, 2, 0, -589839, 2, 0, -589838, 2, 0, -589837, 2, 0, -589836, 2, 0, -589835, 2, 0, -589834, 2, 0, -589833, 2, 0, -589832, 2, 0, -589831, 2, 0, -589830, 2, 0, -589829, 2, 0, -589828, 2, 0, -589827, 2, 0, -589826, 2, 0, -589825, 2, 0, -655360, 2, 0, -655359, 2, 0, -655358, 2, 0, -655357, 2, 0, -655356, 2, 0, -655355, 2, 0, -655354, 2, 0, -655353, 2, 0, -655352, 2, 0, -655351, 2, 0, -655350, 2, 0, -655349, 2, 0, -655348, 2, 0, -655347, 2, 0, -655346, 2, 0, -655345, 2, 0, -655344, 2, 0, -655343, 2, 0, -655342, 2, 0, -655341, 2, 0, -655340, 2, 0, -655339, 2, 0, -655338, 2, 0, -655337, 2, 0, -655336, 2, 0, -655335, 2, 0, -655334, 2, 0, -655333, 2, 0, -655332, 2, 0, -655331, 2, 0, -655330, 2, 0, -655329, 2, 0, -655328, 2, 0, -655327, 2, 0, -655326, 2, 0, -655325, 2, 0, -655324, 2, 0, -655323, 2, 0, -655322, 2, 0, -655321, 2, 0, -655320, 2, 0, -655319, 2, 0, -655318, 2, 0, -655317, 2, 0, -655316, 2, 0, -655315, 2, 0, -655314, 2, 0, -655313, 2, 0, -655312, 2, 0, -655311, 2, 0, -655310, 2, 0, -655309, 2, 0, -655308, 2, 0, -655307, 2, 0, -655306, 2, 0, -655305, 2, 0, -655304, 2, 0, -524326, 2, 0, -524325, 2, 0, -524324, 2, 0, -524323, 2, 0, -524322, 2, 0, -524321, 2, 0, -524320, 2, 0, -524319, 2, 0, -524318, 2, 0, -524317, 2, 0, -524316, 2, 0, -524315, 2, 0, -524314, 2, 0, -524313, 2, 0, -524312, 2, 0, -524311, 2, 0, -524310, 2, 0, -524309, 2, 0, -524308, 2, 0, -524307, 2, 0, -524306, 2, 0, -524305, 2, 0, -524304, 2, 0, -524303, 2, 0, -524302, 2, 0, -524301, 2, 0, -524300, 2, 0, -524299, 2, 0, -524298, 2, 0, -524297, 2, 0, -524296, 2, 0, -524295, 2, 0, -524294, 2, 0, -524293, 2, 0, -524292, 2, 0, -524291, 2, 0, -524290, 2, 0, -524289, 2, 0, -589824, 2, 0, -589823, 2, 0, -589822, 2, 0, -589821, 2, 0, -589820, 2, 0, -589819, 2, 0, -589818, 2, 0, -589817, 2, 0, -589816, 2, 0, -589815, 2, 0, -589814, 2, 0, -589813, 2, 0, -589812, 2, 0, -589811, 2, 0, -589810, 2, 0, -589809, 2, 0, -589808, 2, 0, -589807, 2, 0, -589806, 2, 0, -589805, 2, 0, -589804, 2, 0, -589803, 2, 0, -589802, 2, 0, -589801, 2, 0, -589800, 2, 0, -589799, 2, 0, -589798, 2, 0, -589797, 2, 0, -589796, 2, 0, -589795, 2, 0, -589794, 2, 0, -589793, 2, 0, -589792, 2, 0, -589791, 2, 0, -589790, 2, 0, -589789, 2, 0, -589788, 2, 0, -589787, 2, 0, -589786, 2, 0, -589785, 2, 0, -589784, 2, 0, -589783, 2, 0, -589782, 2, 0, -589781, 2, 0, -589780, 2, 0, -589779, 2, 0, -589778, 2, 0, -589777, 2, 0, -589776, 2, 0, -589775, 2, 0, -589774, 2, 0, -589773, 2, 0, -589772, 2, 0, -589771, 2, 0, -589770, 2, 0, -589769, 2, 0, -589768, 2, 0, -458789, 2, 0, -458788, 2, 0, -458787, 2, 0, -458786, 2, 0, -458785, 2, 0, -458784, 2, 0, -458783, 2, 0, -458782, 2, 0, -458781, 2, 0, -458780, 2, 0, -458779, 2, 0, -458778, 2, 0, -458777, 2, 0, -458776, 2, 0, -458775, 2, 0, -458774, 2, 0, -458773, 2, 0, -458772, 2, 0, -458771, 2, 0, -458770, 2, 0, -458769, 2, 0, -458768, 2, 0, -458767, 2, 0, -458766, 2, 0, -458765, 2, 0, -458764, 2, 0, -458763, 2, 0, -458762, 2, 0, -458761, 2, 0, -458760, 2, 0, -458759, 2, 0, -458758, 2, 0, -458757, 2, 0, -458756, 2, 0, -458755, 2, 0, -458754, 2, 0, -458753, 2, 0, -524288, 2, 0, -524287, 2, 0, -524286, 2, 0, -524285, 2, 0, -524284, 2, 0, -524283, 2, 0, -524282, 2, 0, -524281, 2, 0, -524280, 2, 0, -524279, 2, 0, -524278, 2, 0, -524277, 2, 0, -524276, 2, 0, -524275, 2, 0, -524274, 2, 0, -524273, 2, 0, -524272, 2, 0, -524271, 2, 0, -524270, 2, 0, -524269, 2, 0, -524268, 2, 0, -524267, 2, 0, -524266, 2, 0, -524265, 2, 0, -524264, 2, 0, -524263, 2, 0, -524262, 2, 0, -524261, 2, 0, -524260, 2, 0, -524259, 2, 0, -524258, 2, 0, -524257, 2, 0, -524256, 2, 0, -524255, 2, 0, -524254, 2, 0, -524253, 2, 0, -524252, 2, 0, -524251, 2, 0, -524250, 2, 0, -524249, 2, 0, -524248, 2, 0, -524247, 2, 0, -524246, 2, 0, -524245, 2, 0, -524244, 2, 0, -524243, 2, 0, -524242, 2, 0, -524241, 2, 0, -524240, 2, 0, -524239, 2, 0, -524238, 2, 0, -524237, 2, 0, -524236, 2, 0, -524235, 2, 0, -524234, 2, 0, -524233, 2, 0, -524232, 2, 0, -393253, 2, 0, -393252, 2, 0, -393251, 2, 0, -393250, 2, 0, -393249, 2, 0, -393248, 2, 0, -393247, 2, 0, -393246, 2, 0, -393245, 2, 0, -393244, 2, 0, -393243, 2, 0, -393242, 2, 0, -393241, 2, 0, -393240, 2, 0, -393239, 2, 0, -393238, 2, 0, -393237, 2, 0, -393236, 2, 0, -393235, 2, 0, -393234, 2, 0, -393233, 2, 0, -393232, 2, 0, -393231, 2, 0, -393230, 2, 0, -393229, 2, 0, -393228, 2, 0, -393227, 2, 0, -393226, 2, 0, -393225, 2, 0, -393224, 2, 0, -393223, 2, 0, -393222, 2, 0, -393221, 2, 0, -393220, 2, 0, -393219, 2, 0, -393218, 2, 0, -393217, 2, 0, -458752, 2, 0, -458751, 2, 0, -458750, 2, 0, -458749, 2, 0, -458748, 2, 0, -458747, 2, 0, -458746, 2, 0, -458745, 2, 0, -458744, 2, 0, -458743, 2, 0, -458742, 2, 0, -458741, 2, 0, -458740, 2, 0, -458739, 2, 0, -458738, 2, 0, -458737, 2, 0, -458736, 2, 0, -458735, 2, 0, -458734, 2, 0, -458733, 2, 0, -458732, 2, 0, -458731, 2, 0, -458730, 2, 0, -458729, 2, 0, -458728, 2, 0, -458727, 2, 0, -458726, 2, 0, -458725, 2, 0, -458724, 2, 0, -458723, 2, 0, -458722, 2, 0, -458721, 2, 0, -458720, 2, 0, -458719, 2, 0, -458718, 2, 0, -458717, 2, 0, -458716, 2, 0, -458715, 2, 0, -458714, 2, 0, -458713, 2, 0, -458712, 2, 0, -458711, 2, 0, -458710, 2, 0, -458709, 2, 0, -458708, 2, 0, -458707, 2, 0, -458706, 2, 0, -458705, 2, 0, -458704, 2, 0, -458703, 2, 0, -458702, 2, 0, -458701, 2, 0, -458700, 2, 0, -458699, 2, 0, -458698, 2, 0, -458697, 2, 0, -458696, 2, 0, -327717, 2, 0, -327716, 2, 0, -327715, 2, 0, -327714, 2, 0, -327713, 2, 0, -327712, 2, 0, -327711, 2, 0, -327710, 2, 0, -327709, 2, 0, -327708, 2, 0, -327707, 2, 0, -327706, 2, 0, -327705, 2, 0, -327704, 2, 0, -327703, 2, 0, -327702, 2, 0, -327701, 2, 0, -327700, 2, 0, -327699, 2, 0, -327698, 2, 0, -327697, 2, 0, -327696, 2, 0, -327695, 2, 0, -327694, 2, 0, -327693, 2, 0, -327692, 2, 0, -327691, 2, 0, -327690, 2, 0, -327689, 2, 0, -327688, 2, 0, -327687, 2, 0, -327686, 2, 0, -327685, 2, 0, -327684, 2, 0, -327683, 2, 0, -327682, 2, 0, -327681, 2, 0, -393216, 2, 0, -393215, 2, 0, -393214, 2, 0, -393213, 2, 0, -393212, 2, 0, -393211, 2, 0, -393210, 2, 0, -393209, 2, 0, -393208, 2, 0, -393207, 2, 0, -393206, 2, 0, -393205, 2, 0, -393204, 2, 0, -393203, 2, 0, -393202, 2, 0, -393201, 2, 0, -393200, 2, 0, -393199, 2, 0, -393198, 2, 0, -393197, 2, 0, -393196, 2, 0, -393195, 2, 0, -393194, 2, 0, -393193, 2, 0, -393192, 2, 0, -393191, 2, 0, -393190, 2, 0, -393189, 2, 0, -393188, 2, 0, -393187, 2, 0, -393186, 2, 0, -393185, 2, 0, -393184, 2, 0, -393183, 2, 0, -393182, 2, 0, -393181, 2, 0, -393180, 2, 0, -393179, 2, 0, -393178, 2, 0, -393177, 2, 0, -393176, 2, 0, -393175, 2, 0, -393174, 2, 0, -393173, 2, 0, -393172, 2, 0, -393171, 2, 0, -393170, 2, 0, -393169, 2, 0, -393168, 2, 0, -393167, 2, 0, -393166, 2, 0, -393165, 2, 0, -393164, 2, 0, -393163, 2, 0, -393162, 2, 0, -393161, 2, 0, -393160, 2, 0, -393159, 2, 0, -262181, 2, 0, -262180, 2, 0, -262179, 2, 0, -262178, 2, 0, -262177, 2, 0, -262176, 2, 0, -262175, 2, 0, -262174, 2, 0, -262173, 2, 0, -262172, 2, 0, -262171, 2, 0, -262170, 2, 0, -262169, 2, 0, -262168, 2, 0, -262167, 2, 0, -262166, 2, 0, -262165, 2, 0, -262164, 2, 0, -262163, 2, 0, -262162, 2, 0, -262161, 2, 0, -262160, 2, 0, -262159, 2, 0, -262158, 2, 0, -262157, 2, 0, -262156, 2, 0, -262155, 2, 0, -262154, 2, 0, -262153, 2, 0, -262152, 2, 0, -262151, 2, 0, -262150, 2, 0, -262149, 2, 0, -262148, 2, 0, -262147, 2, 0, -262146, 2, 0, -262145, 2, 0, -327680, 2, 0, -327679, 2, 0, -327678, 2, 0, -327677, 2, 0, -327676, 2, 0, -327675, 2, 0, -327674, 2, 0, -327673, 2, 0, -327672, 2, 0, -327671, 2, 0, -327670, 2, 0, -327669, 2, 0, -327668, 2, 0, -327667, 2, 0, -327666, 2, 0, -327665, 2, 0, -327664, 2, 0, -327663, 2, 0, -327662, 2, 0, -327661, 2, 0, -327660, 2, 0, -327659, 2, 0, -327658, 2, 0, -327657, 2, 0, -327656, 2, 0, -327655, 2, 0, -327654, 2, 0, -327653, 2, 0, -327652, 2, 0, -327651, 2, 0, -327650, 2, 0, -327649, 2, 0, -327648, 2, 0, -327647, 2, 0, -327646, 2, 0, -327645, 2, 0, -327644, 2, 0, -327643, 2, 0, -327642, 2, 0, -327641, 2, 0, -327640, 2, 0, -327639, 2, 0, -327638, 2, 0, -327637, 2, 0, -327636, 2, 0, -327635, 2, 0, -327634, 2, 0, -327633, 2, 0, -327632, 2, 0, -327631, 2, 0, -327630, 2, 0, -327629, 2, 0, -327628, 2, 0, -327627, 2, 0, -327626, 2, 0, -327625, 2, 0, -327624, 2, 0, -327623, 2, 0, -196645, 2, 0, -196644, 2, 0, -196643, 2, 0, -196642, 2, 0, -196641, 2, 0, -196640, 2, 0, -196639, 2, 0, -196638, 2, 0, -196637, 2, 0, -196636, 2, 0, -196635, 2, 0, -196634, 2, 0, -196633, 2, 0, -196632, 2, 0, -196631, 2, 0, -196630, 2, 0, -196629, 2, 0, -196628, 2, 0, -196627, 2, 0, -196626, 2, 0, -196625, 2, 0, -196624, 2, 0, -196623, 2, 0, -196622, 2, 0, -196621, 2, 0, -196620, 2, 0, -196619, 2, 0, -196618, 2, 0, -196617, 2, 0, -196616, 2, 0, -196615, 2, 0, -196614, 2, 0, -196613, 2, 0, -196612, 2, 0, -196611, 2, 0, -196610, 2, 0, -196609, 2, 0, -262144, 2, 0, -262143, 2, 0, -262142, 2, 0, -262141, 2, 0, -262140, 2, 0, -262139, 2, 0, -262138, 2, 0, -262137, 2, 0, -262136, 2, 0, -262135, 2, 0, -262134, 2, 0, -262133, 2, 0, -262132, 2, 0, -262131, 2, 0, -262130, 2, 0, -262129, 2, 0, -262128, 2, 0, -262127, 2, 0, -262126, 2, 0, -262125, 2, 0, -262124, 2, 0, -262123, 2, 0, -262122, 2, 0, -262121, 2, 0, -262120, 2, 0, -262119, 2, 0, -262118, 2, 0, -262117, 2, 0, -262116, 2, 0, -262115, 2, 0, -262114, 2, 0, -262113, 2, 0, -262112, 2, 0, -262111, 2, 0, -262110, 2, 0, -262109, 2, 0, -262108, 2, 0, -262107, 2, 0, -262106, 2, 0, -262105, 2, 0, -262104, 2, 0, -262103, 2, 0, -262102, 2, 0, -262101, 2, 0, -262100, 2, 0, -262099, 2, 0, -262098, 2, 0, -262097, 2, 0, -262096, 2, 0, -262095, 2, 0, -262094, 2, 0, -262093, 2, 0, -262092, 2, 0, -262091, 2, 0, -262090, 2, 0, -262089, 2, 0, -262088, 2, 0, -262087, 2, 0, -131108, 2, 0, -131107, 2, 0, -131106, 2, 0, -131105, 2, 0, -131104, 2, 0, -131103, 2, 0, -131102, 2, 0, -131101, 2, 0, -131100, 2, 0, -131099, 2, 0, -131098, 2, 0, -131097, 2, 0, -131096, 2, 0, -131095, 2, 0, -131094, 2, 0, -131093, 2, 0, -131092, 2, 0, -131091, 2, 0, -131090, 2, 0, -131089, 2, 0, -131088, 2, 0, -131087, 2, 0, -131086, 2, 0, -131085, 2, 0, -131084, 2, 0, -131083, 2, 0, -131082, 2, 0, -131081, 2, 0, -131080, 2, 0, -131079, 2, 0, -131078, 2, 0, -131077, 2, 0, -131076, 2, 0, -131075, 2, 0, -131074, 2, 0, -131073, 2, 0, -196608, 2, 0, -196607, 2, 0, -196606, 2, 0, -196605, 2, 0, -196604, 2, 0, -196603, 2, 0, -196602, 2, 0, -196601, 2, 0, -196600, 2, 0, -196599, 2, 0, -196598, 2, 0, -196597, 2, 0, -196596, 2, 0, -196595, 2, 0, -196594, 2, 0, -196593, 2, 0, -196592, 2, 0, -196591, 2, 0, -196590, 2, 0, -196589, 2, 0, -196588, 2, 0, -196587, 2, 0, -196586, 2, 0, -196585, 2, 0, -196584, 2, 0, -196583, 2, 0, -196582, 2, 0, -196581, 2, 0, -196580, 2, 0, -196579, 2, 0, -196578, 2, 0, -196577, 2, 0, -196576, 2, 0, -196575, 2, 0, -196574, 2, 0, -196573, 2, 0, -196572, 2, 0, -196571, 2, 0, -196570, 2, 0, -196569, 2, 0, -196568, 2, 0, -196567, 2, 0, -196566, 2, 0, -196565, 2, 0, -196564, 2, 0, -196563, 2, 0, -196562, 2, 0, -196561, 2, 0, -196560, 2, 0, -196559, 2, 0, -196558, 2, 0, -196557, 2, 0, -196556, 2, 0, -196555, 2, 0, -196554, 2, 0, -196553, 2, 0, -196552, 2, 0, -196551, 2, 0, -65572, 2, 0, -65571, 2, 0, -65570, 2, 0, -65569, 2, 0, -65568, 2, 0, -65567, 2, 0, -65566, 2, 0, -65565, 2, 0, -65564, 2, 0, -65563, 2, 0, -65562, 2, 0, -65561, 2, 0, -65560, 2, 0, -65559, 2, 0, -65558, 2, 0, -65557, 2, 0, -65556, 2, 0, -65555, 2, 0, -65554, 2, 0, -65553, 2, 0, -65552, 2, 0, -65551, 2, 0, -65550, 2, 0, -65549, 2, 0, -65548, 2, 0, -65547, 2, 0, -65546, 2, 0, -65545, 2, 0, -65544, 2, 0, -65543, 2, 0, -65542, 2, 0, -65541, 2, 0, -65540, 2, 0, -65539, 2, 0, -65538, 2, 0, -65537, 2, 0, -131072, 2, 0, -131071, 2, 0, -131070, 2, 0, -131069, 2, 0, -131068, 2, 0, -131067, 2, 0, -131066, 2, 0, -131065, 2, 0, -131064, 2, 0, -131063, 2, 0, -131062, 2, 0, -131061, 2, 0, -131060, 2, 0, -131059, 2, 0, -131058, 2, 0, -131057, 2, 0, -131056, 2, 0, -131055, 2, 0, -131054, 2, 0, -131053, 2, 0, -131052, 2, 0, -131051, 2, 0, -131050, 2, 0, -131049, 2, 0, -131048, 2, 0, -131047, 2, 0, -131046, 2, 0, -131045, 2, 0, -131044, 2, 0, -131043, 2, 0, -131042, 2, 0, -131041, 2, 0, -131040, 2, 0, -131039, 2, 0, -131038, 2, 0, -131037, 2, 0, -131036, 2, 0, -131035, 2, 0, -131034, 2, 0, -131033, 2, 0, -131032, 2, 0, -131031, 2, 0, -131030, 2, 0, -131029, 2, 0, -131028, 2, 0, -131027, 2, 0, -131026, 2, 0, -131025, 2, 0, -131024, 2, 0, -131023, 2, 0, -131022, 2, 0, -131021, 2, 0, -131020, 2, 0, -131019, 2, 0, -131018, 2, 0, -131017, 2, 0, -131016, 2, 0, -131015, 2, 0, -36, 2, 0, -35, 2, 0, -34, 2, 0, -33, 2, 0, -32, 2, 0, -31, 2, 0, -30, 2, 0, -29, 2, 0, -28, 2, 0, -27, 2, 0, -26, 2, 0, -25, 2, 0, -24, 2, 0, -23, 2, 0, -22, 2, 0, -21, 2, 0, -20, 2, 0, -19, 2, 0, -18, 2, 0, -17, 2, 0, -16, 2, 0, -15, 2, 0, -14, 2, 0, -13, 2, 0, -12, 2, 0, -11, 2, 0, -10, 2, 0, -9, 2, 0, -8, 2, 0, -7, 2, 0, -6, 2, 0, -5, 2, 0, -4, 2, 0, -3, 2, 0, -2, 2, 0, -1, 2, 0, -65536, 2, 0, -65535, 2, 0, -65534, 2, 0, -65533, 2, 0, -65532, 2, 0, -65531, 2, 0, -65530, 2, 0, -65529, 2, 0, -65528, 2, 0, -65527, 2, 0, -65526, 2, 0, -65525, 2, 0, -65524, 2, 0, -65523, 2, 0, -65522, 2, 0, -65521, 2, 0, -65520, 2, 0, -65519, 2, 0, -65518, 2, 0, -65517, 2, 0, -65516, 2, 0, -65515, 2, 0, -65514, 2, 0, -65513, 2, 0, -65512, 2, 0, -65511, 2, 0, -65510, 2, 0, -65509, 2, 0, -65508, 2, 0, -65507, 2, 0, -65506, 2, 0, -65505, 2, 0, -65504, 2, 0, -65503, 2, 0, -65502, 2, 0, -65501, 2, 0, -65500, 2, 0, -65499, 2, 0, -65498, 2, 0, -65497, 2, 0, -65496, 2, 0, -65495, 2, 0, -65494, 2, 0, -65493, 2, 0, -65492, 2, 0, -65491, 2, 0, -65490, 2, 0, -65489, 2, 0, -65488, 2, 0, -65487, 2, 0, -65486, 2, 0, -65485, 2, 0, -65484, 2, 0, -65483, 2, 0, -65482, 2, 0, -65481, 2, 0, -65480, 2, 0, -65479, 2, 0, 65500, 2, 0, 65501, 2, 0, 65502, 2, 0, 65503, 2, 0, 65504, 2, 0, 65505, 2, 0, 65506, 2, 0, 65507, 2, 0, 65508, 2, 0, 65509, 2, 0, 65510, 2, 0, 65511, 2, 0, 65512, 2, 0, 65513, 2, 0, 65514, 2, 0, 65515, 2, 0, 65516, 2, 0, 65517, 2, 0, 65518, 2, 0, 65519, 2, 0, 65520, 2, 0, 65521, 2, 0, 65522, 2, 0, 65523, 2, 0, 65524, 2, 0, 65525, 2, 0, 65526, 2, 0, 65527, 2, 0, 65528, 2, 0, 65529, 2, 0, 65530, 2, 0, 65531, 2, 0, 65532, 2, 0, 65533, 2, 0, 65534, 2, 0, 65535, 2, 0, 0, 2, 0, 1, 2, 0, 2, 2, 0, 3, 2, 0, 4, 2, 0, 5, 2, 0, 6, 2, 0, 7, 2, 0, 8, 2, 0, 9, 2, 0, 10, 2, 0, 11, 2, 0, 12, 2, 0, 13, 2, 0, 14, 2, 0, 15, 2, 0, 16, 2, 0, 17, 2, 0, 18, 2, 0, 19, 2, 0, 20, 2, 0, 21, 2, 0, 22, 2, 0, 23, 2, 0, 24, 2, 0, 25, 2, 0, 26, 2, 0, 27, 2, 0, 28, 2, 0, 29, 2, 0, 30, 2, 0, 31, 2, 0, 32, 2, 0, 33, 2, 0, 34, 2, 0, 35, 2, 0, 36, 2, 0, 37, 2, 0, 38, 2, 0, 39, 2, 0, 40, 2, 0, 41, 2, 0, 42, 2, 0, 43, 2, 0, 44, 2, 0, 45, 2, 0, 46, 2, 0, 47, 2, 0, 48, 2, 0, 49, 2, 0, 50, 2, 0, 51, 2, 0, 52, 2, 0, 53, 2, 0, 54, 2, 0, 55, 2, 0, 56, 2, 0, 57, 2, 0, 131037, 2, 0, 131038, 2, 0, 131039, 2, 0, 131040, 2, 0, 131041, 2, 0, 131042, 2, 0, 131043, 2, 0, 131044, 2, 0, 131045, 2, 0, 131046, 2, 0, 131047, 2, 0, 131048, 2, 0, 131049, 2, 0, 131050, 2, 0, 131051, 2, 0, 131052, 2, 0, 131053, 2, 0, 131054, 2, 0, 131055, 2, 0, 131056, 2, 0, 131057, 2, 0, 131058, 2, 0, 131059, 2, 0, 131060, 2, 0, 131061, 2, 0, 131062, 2, 0, 131063, 2, 0, 131064, 2, 0, 131065, 2, 0, 131066, 2, 0, 131067, 2, 0, 131068, 2, 0, 131069, 2, 0, 131070, 2, 0, 131071, 2, 0, 65536, 2, 0, 65537, 2, 0, 65538, 2, 0, 65539, 2, 0, 65540, 2, 0, 65541, 2, 0, 65542, 2, 0, 65543, 2, 0, 65544, 2, 0, 65545, 2, 0, 65546, 2, 0, 65547, 2, 0, 65548, 2, 0, 65549, 2, 0, 65550, 2, 0, 65551, 2, 0, 65552, 2, 0, 65553, 2, 0, 65554, 2, 0, 65555, 2, 0, 65556, 2, 0, 65557, 2, 0, 65558, 2, 0, 65559, 2, 0, 65560, 2, 0, 65561, 2, 0, 65562, 2, 0, 65563, 2, 0, 65564, 2, 0, 65565, 2, 0, 65566, 2, 0, 65567, 2, 0, 65568, 2, 0, 65569, 2, 0, 65570, 2, 0, 65571, 2, 0, 65572, 2, 0, 65573, 2, 0, 65574, 2, 0, 65575, 2, 0, 65576, 2, 0, 65577, 2, 0, 65578, 2, 0, 65579, 2, 0, 65580, 2, 0, 65581, 2, 0, 65582, 2, 0, 65583, 2, 0, 65584, 2, 0, 65585, 2, 0, 65586, 2, 0, 65587, 2, 0, 65588, 2, 0, 65589, 2, 0, 65590, 2, 0, 65591, 2, 0, 65592, 2, 0, 65593, 2, 0, 196573, 2, 0, 196574, 2, 0, 196575, 2, 0, 196576, 2, 0, 196577, 2, 0, 196578, 2, 0, 196579, 2, 0, 196580, 2, 0, 196581, 2, 0, 196582, 2, 0, 196583, 2, 0, 196584, 2, 0, 196585, 2, 0, 196586, 2, 0, 196587, 2, 0, 196588, 2, 0, 196589, 2, 0, 196590, 2, 0, 196591, 2, 0, 196592, 2, 0, 196593, 2, 0, 196594, 2, 0, 196595, 2, 0, 196596, 2, 0, 196597, 2, 0, 196598, 2, 0, 196599, 2, 0, 196600, 2, 0, 196601, 2, 0, 196602, 2, 0, 196603, 2, 0, 196604, 2, 0, 196605, 2, 0, 196606, 2, 0, 196607, 2, 0, 131072, 2, 0, 131073, 2, 0, 131074, 2, 0, 131075, 2, 0, 131076, 2, 0, 131077, 2, 0, 131078, 2, 0, 131079, 2, 0, 131080, 2, 0, 131081, 2, 0, 131082, 2, 0, 131083, 2, 0, 131084, 2, 0, 131085, 2, 0, 131086, 2, 0, 131087, 2, 0, 131088, 2, 0, 131089, 2, 0, 131090, 2, 0, 131091, 2, 0, 131092, 2, 0, 131093, 2, 0, 131094, 2, 0, 131095, 2, 0, 131096, 2, 0, 131097, 2, 0, 131098, 2, 0, 131099, 2, 0, 131100, 2, 0, 131101, 2, 0, 131102, 2, 0, 131103, 2, 0, 131104, 2, 0, 131105, 2, 0, 131106, 2, 0, 131107, 2, 0, 131108, 2, 0, 131109, 2, 0, 131110, 2, 0, 131111, 2, 0, 131112, 2, 0, 131113, 2, 0, 131114, 2, 0, 131115, 2, 0, 131116, 2, 0, 131117, 2, 0, 131118, 2, 0, 131119, 2, 0, 131120, 2, 0, 131121, 2, 0, 131122, 2, 0, 131123, 2, 0, 131124, 2, 0, 131125, 2, 0, 131126, 2, 0, 131127, 2, 0, 131128, 2, 0, 131129, 2, 0, 262109, 2, 0, 262110, 2, 0, 262111, 2, 0, 262112, 2, 0, 262113, 2, 0, 262114, 2, 0, 262115, 2, 0, 262116, 2, 0, 262117, 2, 0, 262118, 2, 0, 262119, 2, 0, 262120, 2, 0, 262121, 2, 0, 262122, 2, 0, 262123, 2, 0, 262124, 2, 0, 262125, 2, 0, 262126, 2, 0, 262127, 2, 0, 262128, 2, 0, 262129, 2, 0, 262130, 2, 0, 262131, 2, 0, 262132, 2, 0, 262133, 2, 0, 262134, 2, 0, 262135, 2, 0, 262136, 2, 0, 262137, 2, 0, 262138, 2, 0, 262139, 2, 0, 262140, 2, 0, 262141, 2, 0, 262142, 2, 0, 262143, 2, 0, 196608, 2, 0, 196609, 2, 0, 196610, 2, 0, 196611, 2, 0, 196612, 2, 0, 196613, 2, 0, 196614, 2, 0, 196615, 2, 0, 196616, 2, 0, 196617, 2, 0, 196618, 2, 0, 196619, 2, 0, 196620, 2, 0, 196621, 2, 0, 196622, 2, 0, 196623, 2, 0, 196624, 2, 0, 196625, 2, 0, 196626, 2, 0, 196627, 2, 0, 196628, 2, 0, 196629, 2, 0, 196630, 2, 0, 196631, 2, 0, 196632, 2, 0, 196633, 2, 0, 196634, 2, 0, 196635, 2, 0, 196636, 2, 0, 196637, 2, 0, 196638, 2, 0, 196639, 2, 0, 196640, 2, 0, 196641, 2, 0, 196642, 2, 0, 196643, 2, 0, 196644, 2, 0, 196645, 2, 0, 196646, 2, 0, 196647, 2, 0, 196648, 2, 0, 196649, 2, 0, 196650, 2, 0, 196651, 2, 0, 196652, 2, 0, 196653, 2, 0, 196654, 2, 0, 196655, 2, 0, 196656, 2, 0, 196657, 2, 0, 196658, 2, 0, 196659, 2, 0, 196660, 2, 0, 196661, 2, 0, 196662, 2, 0, 196663, 2, 0, 196664, 2, 0, 196665, 2, 0, 327645, 2, 0, 327646, 2, 0, 327647, 2, 0, 327648, 2, 0, 327649, 2, 0, 327650, 2, 0, 327651, 2, 0, 327652, 2, 0, 327653, 2, 0, 327654, 2, 0, 327655, 2, 0, 327656, 2, 0, 327657, 2, 0, 327658, 2, 0, 327659, 2, 0, 327660, 2, 0, 327661, 2, 0, 327662, 2, 0, 327663, 2, 0, 327664, 2, 0, 327665, 2, 0, 327666, 2, 0, 327667, 2, 0, 327668, 2, 0, 327669, 2, 0, 327670, 2, 0, 327671, 2, 0, 327672, 2, 0, 327673, 2, 0, 327674, 2, 0, 327675, 2, 0, 327676, 2, 0, 327677, 2, 0, 327678, 2, 0, 327679, 2, 0, 262144, 2, 0, 262145, 2, 0, 262146, 2, 0, 262147, 2, 0, 262148, 2, 0, 262149, 2, 0, 262150, 2, 0, 262151, 2, 0, 262152, 2, 0, 262153, 2, 0, 262154, 2, 0, 262155, 2, 0, 262156, 2, 0, 262157, 2, 0, 262158, 2, 0, 262159, 2, 0, 262160, 2, 0, 262161, 2, 0, 262162, 2, 0, 262163, 2, 0, 262164, 2, 0, 262165, 2, 0, 262166, 2, 0, 262167, 2, 0, 262168, 2, 0, 262169, 2, 0, 262170, 2, 0, 262171, 2, 0, 262172, 2, 0, 262173, 2, 0, 262174, 2, 0, 262175, 2, 0, 262176, 2, 0, 262177, 2, 0, 262178, 2, 0, 262179, 2, 0, 262180, 2, 0, 262181, 2, 0, 262182, 2, 0, 262183, 2, 0, 262184, 2, 0, 262185, 2, 0, 262186, 2, 0, 262187, 2, 0, 262188, 2, 0, 262189, 2, 0, 262190, 2, 0, 262191, 2, 0, 262192, 2, 0, 262193, 2, 0, 262194, 2, 0, 262195, 2, 0, 262196, 2, 0, 262197, 2, 0, 262198, 2, 0, 262199, 2, 0, 262200, 2, 0, 262201, 2, 0, 393182, 2, 0, 393183, 2, 0, 393184, 2, 0, 393185, 2, 0, 393186, 2, 0, 393187, 2, 0, 393188, 2, 0, 393189, 2, 0, 393190, 2, 0, 393191, 2, 0, 393192, 2, 0, 393193, 2, 0, 393194, 2, 0, 393195, 2, 0, 393196, 2, 0, 393197, 2, 0, 393198, 2, 0, 393199, 2, 0, 393200, 2, 0, 393201, 2, 0, 393202, 2, 0, 393203, 2, 0, 393204, 2, 0, 393205, 2, 0, 393206, 2, 0, 393207, 2, 0, 393208, 2, 0, 393209, 2, 0, 393210, 2, 0, 393211, 2, 0, 393212, 2, 0, 393213, 2, 0, 393214, 2, 0, 393215, 2, 0, 327680, 2, 0, 327681, 2, 0, 327682, 2, 0, 327683, 2, 0, 327684, 2, 0, 327685, 2, 0, 327686, 2, 0, 327687, 2, 0, 327688, 2, 0, 327689, 2, 0, 327690, 2, 0, 327691, 2, 0, 327692, 2, 0, 327693, 2, 0, 327694, 2, 0, 327695, 2, 0, 327696, 2, 0, 327697, 2, 0, 327698, 2, 0, 327699, 2, 0, 327700, 2, 0, 327701, 2, 0, 327702, 2, 0, 327703, 2, 0, 327704, 2, 0, 327705, 2, 0, 327706, 2, 0, 327707, 2, 0, 327708, 2, 0, 327709, 2, 0, 327710, 2, 0, 327711, 2, 0, 327712, 2, 0, 327713, 2, 0, 327714, 2, 0, 327715, 2, 0, 327716, 2, 0, 327717, 2, 0, 327718, 2, 0, 327719, 2, 0, 327720, 2, 0, 327721, 2, 0, 327722, 2, 0, 327723, 2, 0, 327724, 2, 0, 327725, 2, 0, 327726, 2, 0, 327727, 2, 0, 327728, 2, 0, 327729, 2, 0, 327730, 2, 0, 327731, 2, 0, 327732, 2, 0, 327733, 2, 0, 327734, 2, 0, 327735, 2, 0, 327736, 2, 0, 458718, 2, 0, 458719, 2, 0, 458720, 2, 0, 458721, 2, 0, 458722, 2, 0, 458723, 2, 0, 458724, 2, 0, 458725, 2, 0, 458726, 2, 0, 458727, 2, 0, 458728, 2, 0, 458729, 2, 0, 458730, 2, 0, 458731, 2, 0, 458732, 2, 0, 458733, 2, 0, 458734, 2, 0, 458735, 2, 0, 458736, 2, 0, 458737, 2, 0, 458738, 2, 0, 458739, 2, 0, 458740, 2, 0, 458741, 2, 0, 458742, 2, 0, 458743, 2, 0, 458744, 2, 0, 458745, 2, 0, 458746, 2, 0, 458747, 2, 0, 458748, 2, 0, 458749, 2, 0, 458750, 2, 0, 458751, 2, 0, 393216, 2, 0, 393217, 2, 0, 393218, 2, 0, 393219, 2, 0, 393220, 2, 0, 393221, 2, 0, 393222, 2, 0, 393223, 2, 0, 393224, 2, 0, 393225, 2, 0, 393226, 2, 0, 393227, 2, 0, 393228, 2, 0, 393229, 2, 0, 393230, 2, 0, 393231, 2, 0, 393232, 2, 0, 393233, 2, 0, 393234, 2, 0, 393235, 2, 0, 393236, 2, 0, 393237, 2, 0, 393238, 2, 0, 393239, 2, 0, 393240, 2, 0, 393241, 2, 0, 393242, 2, 0, 393243, 2, 0, 393244, 2, 0, 393245, 2, 0, 393246, 2, 0, 393247, 2, 0, 393248, 2, 0, 393249, 2, 0, 393250, 2, 0, 393251, 2, 0, 393252, 2, 0, 393253, 2, 0, 393254, 2, 0, 393255, 2, 0, 393256, 2, 0, 393257, 2, 0, 393258, 2, 0, 393259, 2, 0, 393260, 2, 0, 393261, 2, 0, 393262, 2, 0, 393263, 2, 0, 393264, 2, 0, 393265, 2, 0, 393266, 2, 0, 393267, 2, 0, 393268, 2, 0, 393269, 2, 0, 393270, 2, 0, 393271, 2, 0, 393272, 2, 0, 524254, 2, 0, 524255, 2, 0, 524256, 2, 0, 524257, 2, 0, 524258, 2, 0, 524259, 2, 0, 524260, 2, 0, 524261, 2, 0, 524262, 2, 0, 524263, 2, 0, 524264, 2, 0, 524265, 2, 0, 524266, 2, 0, 524267, 2, 0, 524268, 2, 0, 524269, 2, 0, 524270, 2, 0, 524271, 2, 0, 524272, 2, 0, 524273, 2, 0, 524274, 2, 0, 524275, 2, 0, 524276, 2, 0, 524277, 2, 0, 524278, 2, 0, 524279, 2, 0, 524280, 2, 0, 524281, 2, 0, 524282, 2, 0, 524283, 2, 0, 524284, 2, 0, 524285, 2, 0, 524286, 2, 0, 524287, 2, 0, 458752, 2, 0, 458753, 2, 0, 458754, 2, 0, 458755, 2, 0, 458756, 2, 0, 458757, 2, 0, 458758, 2, 0, 458759, 2, 0, 458760, 2, 0, 458761, 2, 0, 458762, 2, 0, 458763, 2, 0, 458764, 2, 0, 458765, 2, 0, 458766, 2, 0, 458767, 2, 0, 458768, 2, 0, 458769, 2, 0, 458770, 2, 0, 458771, 2, 0, 458772, 2, 0, 458773, 2, 0, 458774, 2, 0, 458775, 2, 0, 458776, 2, 0, 458777, 2, 0, 458778, 2, 0, 458779, 2, 0, 458780, 2, 0, 458781, 2, 0, 458782, 2, 0, 458783, 2, 0, 458784, 2, 0, 458785, 2, 0, 458786, 2, 0, 458787, 2, 0, 458788, 2, 0, 458789, 2, 0, 458790, 2, 0, 458791, 2, 0, 458792, 2, 0, 458793, 2, 0, 458794, 2, 0, 458795, 2, 0, 458796, 2, 0, 458797, 2, 0, 458798, 2, 0, 458799, 2, 0, 458800, 2, 0, 458801, 2, 0, 458802, 2, 0, 458803, 2, 0, 458804, 2, 0, 458805, 2, 0, 458806, 2, 0, 458807, 2, 0, 458808, 2, 0, 589790, 2, 0, 589791, 2, 0, 589792, 2, 0, 589793, 2, 0, 589794, 2, 0, 589795, 2, 0, 589796, 2, 0, 589797, 2, 0, 589798, 2, 0, 589799, 2, 0, 589800, 2, 0, 589801, 2, 0, 589802, 2, 0, 589803, 2, 0, 589804, 2, 0, 589805, 2, 0, 589806, 2, 0, 589807, 2, 0, 589808, 2, 0, 589809, 2, 0, 589810, 2, 0, 589811, 2, 0, 589812, 2, 0, 589813, 2, 0, 589814, 2, 0, 589815, 2, 0, 589816, 2, 0, 589817, 2, 0, 589818, 2, 0, 589819, 2, 0, 589820, 2, 0, 589821, 2, 0, 589822, 2, 0, 589823, 2, 0, 524288, 2, 0, 524289, 2, 0, 524290, 2, 0, 524291, 2, 0, 524292, 2, 0, 524293, 2, 0, 524294, 2, 0, 524295, 2, 0, 524296, 2, 0, 524297, 2, 0, 524298, 2, 0, 524299, 2, 0, 524300, 2, 0, 524301, 2, 0, 524302, 2, 0, 524303, 2, 0, 524304, 2, 0, 524305, 2, 0, 524306, 2, 0, 524307, 2, 0, 524308, 2, 0, 524309, 2, 0, 524310, 2, 0, 524311, 2, 0, 524312, 2, 0, 524313, 2, 0, 524314, 2, 0, 524315, 2, 0, 524316, 2, 0, 524317, 2, 0, 524318, 2, 0, 524319, 2, 0, 524320, 2, 0, 524321, 2, 0, 524322, 2, 0, 524323, 2, 0, 524324, 2, 0, 524325, 2, 0, 524326, 2, 0, 524327, 2, 0, 524328, 2, 0, 524329, 2, 0, 524330, 2, 0, 524331, 2, 0, 524332, 2, 0, 524333, 2, 0, 524334, 2, 0, 524335, 2, 0, 524336, 2, 0, 524337, 2, 0, 524338, 2, 0, 524339, 2, 0, 524340, 2, 0, 524341, 2, 0, 524342, 2, 0, 524343, 2, 0, 524344, 2, 0, 655327, 2, 0, 655328, 2, 0, 655329, 2, 0, 655330, 2, 0, 655331, 2, 0, 655332, 2, 0, 655333, 2, 0, 655334, 2, 0, 655335, 2, 0, 655336, 2, 0, 655337, 2, 0, 655338, 2, 0, 655339, 2, 0, 655340, 2, 0, 655341, 2, 0, 655342, 2, 0, 655343, 2, 0, 655344, 2, 0, 655345, 2, 0, 655346, 2, 0, 655347, 2, 0, 655348, 2, 0, 655349, 2, 0, 655350, 2, 0, 655351, 2, 0, 655352, 2, 0, 655353, 2, 0, 655354, 2, 0, 655355, 2, 0, 655356, 2, 0, 655357, 2, 0, 655358, 2, 0, 655359, 2, 0, 589824, 2, 0, 589825, 2, 0, 589826, 2, 0, 589827, 2, 0, 589828, 2, 0, 589829, 2, 0, 589830, 2, 0, 589831, 2, 0, 589832, 2, 0, 589833, 2, 0, 589834, 2, 0, 589835, 2, 0, 589836, 2, 0, 589837, 2, 0, 589838, 2, 0, 589839, 2, 0, 589840, 2, 0, 589841, 2, 0, 589842, 2, 0, 589843, 2, 0, 589844, 2, 0, 589845, 2, 0, 589846, 2, 0, 589847, 2, 0, 589848, 2, 0, 589849, 2, 0, 589850, 2, 0, 589851, 2, 0, 589852, 2, 0, 589853, 2, 0, 589854, 2, 0, 589855, 2, 0, 589856, 2, 0, 589857, 2, 0, 589858, 2, 0, 589859, 2, 0, 589860, 2, 0, 589861, 2, 0, 589862, 2, 0, 589863, 2, 0, 589864, 2, 0, 589865, 2, 0, 589866, 2, 0, 589867, 2, 0, 589868, 2, 0, 589869, 2, 0, 589870, 2, 0, 589871, 2, 0, 589872, 2, 0, 589873, 2, 0, 589874, 2, 0, 589875, 2, 0, 589876, 2, 0, 589877, 2, 0, 589878, 2, 0, 589879, 2, 0, 720863, 2, 0, 720864, 2, 0, 720865, 2, 0, 720866, 2, 0, 720867, 2, 0, 720868, 2, 0, 720869, 2, 0, 720870, 2, 0, 720871, 2, 0, 720872, 2, 0, 720873, 2, 0, 720874, 2, 0, 720875, 2, 0, 720876, 2, 0, 720877, 2, 0, 720878, 2, 0, 720879, 2, 0, 720880, 2, 0, 720881, 2, 0, 720882, 2, 0, 720883, 2, 0, 720884, 2, 0, 720885, 2, 0, 720886, 2, 0, 720887, 2, 0, 720888, 2, 0, 720889, 2, 0, 720890, 2, 0, 720891, 2, 0, 720892, 2, 0, 720893, 2, 0, 720894, 2, 0, 720895, 2, 0, 655360, 2, 0, 655361, 2, 0, 655362, 2, 0, 655363, 2, 0, 655364, 2, 0, 655365, 2, 0, 655366, 2, 0, 655367, 2, 0, 655368, 2, 0, 655369, 2, 0, 655370, 2, 0, 655371, 2, 0, 655372, 2, 0, 655373, 2, 0, 655374, 2, 0, 655375, 2, 0, 655376, 2, 0, 655377, 2, 0, 655378, 2, 0, 655379, 2, 0, 655380, 2, 0, 655381, 2, 0, 655382, 2, 0, 655383, 2, 0, 655384, 2, 0, 655385, 2, 0, 655386, 2, 0, 655387, 2, 0, 655388, 2, 0, 655389, 2, 0, 655390, 2, 0, 655391, 2, 0, 655392, 2, 0, 655393, 2, 0, 655394, 2, 0, 655395, 2, 0, 655396, 2, 0, 655397, 2, 0, 655398, 2, 0, 655399, 2, 0, 655400, 2, 0, 655401, 2, 0, 655402, 2, 0, 655403, 2, 0, 655404, 2, 0, 655405, 2, 0, 655406, 2, 0, 655407, 2, 0, 655408, 2, 0, 655409, 2, 0, 655410, 2, 0, 655411, 2, 0, 655412, 2, 0, 655413, 2, 0, 655414, 2, 0, 655415, 2, 0, 786399, 2, 0, 786400, 2, 0, 786401, 2, 0, 786402, 2, 0, 786403, 2, 0, 786404, 2, 0, 786405, 2, 0, 786406, 2, 0, 786407, 2, 0, 786408, 2, 0, 786409, 2, 0, 786410, 2, 0, 786411, 2, 0, 786412, 2, 0, 786413, 2, 0, 786414, 2, 0, 786415, 2, 0, 786416, 2, 0, 786417, 2, 0, 786418, 2, 0, 786419, 2, 0, 786420, 2, 0, 786421, 2, 0, 786422, 2, 0, 786423, 2, 0, 786424, 2, 0, 786425, 2, 0, 786426, 2, 0, 786427, 2, 0, 786428, 2, 0, 786429, 2, 0, 786430, 2, 0, 786431, 2, 0, 720896, 2, 0, 720897, 2, 0, 720898, 2, 0, 720899, 2, 0, 720900, 2, 0, 720901, 2, 0, 720902, 2, 0, 720903, 2, 0, 720904, 2, 0, 720905, 2, 0, 720906, 2, 0, 720907, 2, 0, 720908, 2, 0, 720909, 2, 0, 720910, 2, 0, 720911, 2, 0, 720912, 2, 0, 720913, 2, 0, 720914, 2, 0, 720915, 2, 0, 720916, 2, 0, 720917, 2, 0, 720918, 2, 0, 720919, 2, 0, 720920, 2, 0, 720921, 2, 0, 720922, 2, 0, 720923, 2, 0, 720924, 2, 0, 720925, 2, 0, 720926, 2, 0, 720927, 2, 0, 720928, 2, 0, 720929, 2, 0, 720930, 2, 0, 720931, 2, 0, 720932, 2, 0, 720933, 2, 0, 720934, 2, 0, 720935, 2, 0, 720936, 2, 0, 720937, 2, 0, 720938, 2, 0, 720939, 2, 0, 720940, 2, 0, 720941, 2, 0, 720942, 2, 0, 720943, 2, 0, 720944, 2, 0, 720945, 2, 0, 720946, 2, 0, 720947, 2, 0, 720948, 2, 0, 720949, 2, 0, 720950, 2, 0, 720951, 2, 0, 851934, 2, 0, 851935, 2, 0, 851936, 2, 0, 851942, 2, 0, 851943, 2, 0, 851944, 2, 0, 851945, 2, 0, 851946, 2, 0, 851947, 2, 0, 851948, 2, 0, 851949, 2, 0, 851950, 2, 0, 851951, 2, 0, 851952, 2, 0, 851953, 2, 0, 851954, 2, 0, 851955, 2, 0, 851956, 2, 0, 851957, 2, 0, 851958, 2, 0, 851959, 2, 0, 851960, 2, 0, 851961, 2, 0, 851962, 2, 0, 851963, 2, 0, 851964, 2, 0, 851965, 2, 0, 851966, 2, 0, 851967, 2, 0, 786432, 2, 0, 786433, 2, 0, 786434, 2, 0, 786435, 2, 0, 786436, 2, 0, 786437, 2, 0, 786438, 2, 0, 786439, 2, 0, 786440, 2, 0, 786441, 2, 0, 786442, 2, 0, 786443, 2, 0, 786444, 2, 0, 786445, 2, 0, 786446, 2, 0, 786447, 2, 0, 786448, 2, 0, 786449, 2, 0, 786450, 2, 0, 786451, 2, 0, 786452, 2, 0, 786453, 2, 0, 786454, 2, 0, 786455, 2, 0, 786456, 2, 0, 786457, 2, 0, 786458, 2, 0, 786459, 2, 0, 786460, 2, 0, 786461, 2, 0, 786462, 2, 0, 786463, 2, 0, 786464, 2, 0, 786465, 2, 0, 786466, 2, 0, 786467, 2, 0, 786468, 2, 0, 786469, 2, 0, 786470, 2, 0, 786471, 2, 0, 786472, 2, 0, 786473, 2, 0, 786474, 2, 0, 786475, 2, 0, 786476, 2, 0, 786477, 2, 0, 786478, 2, 0, 786479, 2, 0, 786480, 2, 0, 786481, 2, 0, 786482, 2, 0, 786483, 2, 0, 786484, 2, 0, 786485, 2, 0, 786486, 2, 0, 917472, 2, 0, 917479, 2, 0, 917480, 2, 0, 917481, 2, 0, 917482, 2, 0, 917483, 2, 0, 917484, 2, 0, 917485, 2, 0, 917486, 2, 0, 917487, 2, 0, 917488, 2, 0, 917489, 2, 0, 917490, 2, 0, 917491, 2, 0, 917492, 2, 0, 917493, 2, 0, 917494, 2, 0, 917495, 2, 0, 917496, 2, 0, 917497, 2, 0, 917498, 2, 0, 917499, 2, 0, 917500, 2, 0, 917501, 2, 0, 917502, 2, 0, 917503, 2, 0, 851968, 2, 0, 851969, 2, 0, 851970, 2, 0, 851971, 2, 0, 851972, 2, 0, 851973, 2, 0, 851974, 2, 0, 851975, 2, 0, 851976, 2, 0, 851977, 2, 0, 851978, 2, 0, 851979, 2, 0, 851980, 2, 0, 851981, 2, 0, 851982, 2, 0, 851983, 2, 0, 851984, 2, 0, 851985, 2, 0, 851986, 2, 0, 851987, 2, 0, 851988, 2, 0, 851989, 2, 0, 851990, 2, 0, 851991, 2, 0, 851992, 2, 0, 851993, 2, 0, 851994, 2, 0, 851995, 2, 0, 851996, 2, 0, 851997, 2, 0, 851998, 2, 0, 851999, 2, 0, 852000, 2, 0, 852001, 2, 0, 852002, 2, 0, 852003, 2, 0, 852004, 2, 0, 852005, 2, 0, 852006, 2, 0, 852007, 2, 0, 852008, 2, 0, 852009, 2, 0, 852010, 2, 0, 852011, 2, 0, 852012, 2, 0, 852013, 2, 0, 852014, 2, 0, 852015, 2, 0, 852016, 2, 0, 852017, 2, 0, 852018, 2, 0, 852019, 2, 0, 852020, 2, 0, 852021, 2, 0, 852022, 2, 0, 983008, 2, 0, 983016, 2, 0, 983017, 2, 0, 983018, 2, 0, 983019, 2, 0, 983020, 2, 0, 983021, 2, 0, 983022, 2, 0, 983023, 2, 0, 983024, 2, 0, 983025, 2, 0, 983026, 2, 0, 983027, 2, 0, 983028, 2, 0, 983029, 2, 0, 983030, 2, 0, 983031, 2, 0, 983032, 2, 0, 983033, 2, 0, 983034, 2, 0, 983035, 2, 0, 983036, 2, 0, 983037, 2, 0, 983038, 2, 0, 983039, 2, 0, 917504, 2, 0, 917505, 2, 0, 917506, 2, 0, 917507, 2, 0, 917508, 2, 0, 917509, 2, 0, 917510, 2, 0, 917511, 2, 0, 917512, 2, 0, 917513, 2, 0, 917514, 2, 0, 917515, 2, 0, 917516, 2, 0, 917517, 2, 0, 917518, 2, 0, 917519, 2, 0, 917520, 2, 0, 917521, 2, 0, 917522, 2, 0, 917523, 2, 0, 917524, 2, 0, 917525, 2, 0, 917526, 2, 0, 917527, 2, 0, 917528, 2, 0, 917529, 2, 0, 917530, 2, 0, 917531, 2, 0, 917532, 2, 0, 917533, 2, 0, 917534, 2, 0, 917535, 2, 0, 917536, 2, 0, 917537, 2, 0, 917538, 2, 0, 917539, 2, 0, 917540, 2, 0, 917541, 2, 0, 917542, 2, 0, 917543, 2, 0, 917544, 2, 0, 917545, 2, 0, 917546, 2, 0, 917547, 2, 0, 917548, 2, 0, 917549, 2, 0, 917550, 2, 0, 917551, 2, 0, 917552, 2, 0, 917553, 2, 0, 917554, 2, 0, 917555, 2, 0, 917556, 2, 0, 917557, 2, 0, 917558, 2, 0, 1048545, 2, 0, 1048553, 2, 0, 1048554, 2, 0, 1048555, 2, 0, 1048556, 2, 0, 1048557, 2, 0, 1048558, 2, 0, 1048559, 2, 0, 1048560, 2, 0, 1048561, 2, 0, 1048562, 2, 0, 1048563, 2, 0, 1048564, 2, 0, 1048565, 2, 0, 1048566, 2, 0, 1048567, 2, 0, 1048568, 2, 0, 1048569, 2, 0, 1048570, 2, 0, 1048571, 2, 0, 1048572, 2, 0, 1048573, 2, 0, 1048574, 2, 0, 1048575, 2, 0, 983040, 2, 0, 983041, 2, 0, 983042, 2, 0, 983043, 2, 0, 983044, 2, 0, 983045, 2, 0, 983046, 2, 0, 983047, 2, 0, 983048, 2, 0, 983049, 2, 0, 983050, 2, 0, 983051, 2, 0, 983052, 2, 0, 983053, 2, 0, 983054, 2, 0, 983055, 2, 0, 983056, 2, 0, 983057, 2, 0, 983058, 2, 0, 983059, 2, 0, 983060, 2, 0, 983061, 2, 0, 983062, 2, 0, 983063, 2, 0, 983064, 2, 0, 983065, 2, 0, 983066, 2, 0, 983067, 2, 0, 983068, 2, 0, 983069, 2, 0, 983070, 2, 0, 983071, 2, 0, 983072, 2, 0, 983073, 2, 0, 983074, 2, 0, 983075, 2, 0, 983076, 2, 0, 983077, 2, 0, 983078, 2, 0, 983079, 2, 0, 983080, 2, 0, 983081, 2, 0, 983082, 2, 0, 983083, 2, 0, 983084, 2, 0, 983085, 2, 0, 983086, 2, 0, 983087, 2, 0, 983088, 2, 0, 983089, 2, 0, 983090, 2, 0, 983091, 2, 0, 983092, 2, 0, 983093, 2, 0, 1114081, 2, 0, 1114090, 2, 0, 1114091, 2, 0, 1114092, 2, 0, 1114093, 2, 0, 1114094, 2, 0, 1114095, 2, 0, 1114096, 2, 0, 1114097, 2, 0, 1114098, 2, 0, 1114099, 2, 0, 1114100, 2, 0, 1114101, 2, 0, 1114102, 2, 0, 1114103, 2, 0, 1114104, 2, 0, 1114105, 2, 0, 1114106, 2, 0, 1114107, 2, 0, 1114108, 2, 0, 1114109, 2, 0, 1114110, 2, 0, 1114111, 2, 0, 1048576, 2, 0, 1048577, 2, 0, 1048578, 2, 0, 1048579, 2, 0, 1048580, 2, 0, 1048581, 2, 0, 1048582, 2, 0, 1048583, 2, 0, 1048584, 2, 0, 1048585, 2, 0, 1048586, 2, 0, 1048587, 2, 0, 1048588, 2, 0, 1048589, 2, 0, 1048590, 2, 0, 1048591, 2, 0, 1048592, 2, 0, 1048593, 2, 0, 1048594, 2, 0, 1048595, 2, 0, 1048596, 2, 0, 1048597, 2, 0, 1048598, 2, 0, 1048599, 2, 0, 1048600, 2, 0, 1048601, 2, 0, 1048602, 2, 0, 1048603, 2, 0, 1048604, 2, 0, 1048605, 2, 0, 1048606, 2, 0, 1048607, 2, 0, 1048608, 2, 0, 1048609, 2, 0, 1048610, 2, 0, 1048611, 2, 0, 1048612, 2, 0, 1048613, 2, 0, 1048614, 2, 0, 1048615, 2, 0, 1048616, 2, 0, 1048617, 2, 0, 1048618, 2, 0, 1048619, 2, 0, 1048620, 2, 0, 1048621, 2, 0, 1048622, 2, 0, 1048623, 2, 0, 1048624, 2, 0, 1048625, 2, 0, 1048626, 2, 0, 1048627, 2, 0, 1048628, 2, 0, 1048629, 2, 0, 1179618, 2, 0, 1179627, 2, 0, 1179628, 2, 0, 1179629, 2, 0, 1179630, 2, 0, 1179631, 2, 0, 1179632, 2, 0, 1179633, 2, 0, 1179634, 2, 0, 1179635, 2, 0, 1179636, 2, 0, 1179637, 2, 0, 1179638, 2, 0, 1179639, 2, 0, 1179640, 2, 0, 1179641, 2, 0, 1179642, 2, 0, 1179643, 2, 0, 1179644, 2, 0, 1179645, 2, 0, 1179646, 2, 0, 1179647, 2, 0, 1114112, 2, 0, 1114113, 2, 0, 1114114, 2, 0, 1114115, 2, 0, 1114116, 2, 0, 1114117, 2, 0, 1114118, 2, 0, 1114119, 2, 0, 1114120, 2, 0, 1114121, 2, 0, 1114122, 2, 0, 1114123, 2, 0, 1114124, 2, 0, 1114125, 2, 0, 1114126, 2, 0, 1114127, 2, 0, 1114128, 2, 0, 1114129, 2, 0, 1114130, 2, 0, 1114131, 2, 0, 1114132, 2, 0, 1114133, 2, 0, 1114134, 2, 0, 1114135, 2, 0, 1114136, 2, 0, 1114137, 2, 0, 1114138, 2, 0, 1114139, 2, 0, 1114140, 2, 0, 1114141, 2, 0, 1114142, 2, 0, 1114143, 2, 0, 1114144, 2, 0, 1114145, 2, 0, 1114146, 2, 0, 1114147, 2, 0, 1114148, 2, 0, 1114149, 2, 0, 1114150, 2, 0, 1114151, 2, 0, 1114152, 2, 0, 1114153, 2, 0, 1114154, 2, 0, 1114155, 2, 0, 1114156, 2, 0, 1114157, 2, 0, 1114158, 2, 0, 1114159, 2, 0, 1114160, 2, 0, 1114161, 2, 0, 1114162, 2, 0, 1114163, 2, 0, 1114164, 2, 0, 1114165, 2, 0, 1245154, 2, 0, 1245164, 2, 0, 1245165, 2, 0, 1245166, 2, 0, 1245167, 2, 0, 1245168, 2, 0, 1245169, 2, 0, 1245170, 2, 0, 1245171, 2, 0, 1245172, 2, 0, 1245173, 2, 0, 1245174, 2, 0, 1245175, 2, 0, 1245176, 2, 0, 1245177, 2, 0, 1245178, 2, 0, 1245179, 2, 0, 1245180, 2, 0, 1245181, 2, 0, 1245182, 2, 0, 1245183, 2, 0, 1179648, 2, 0, 1179649, 2, 0, 1179650, 2, 0, 1179651, 2, 0, 1179652, 2, 0, 1179653, 2, 0, 1179654, 2, 0, 1179655, 2, 0, 1179656, 2, 0, 1179657, 2, 0, 1179658, 2, 0, 1179659, 2, 0, 1179660, 2, 0, 1179661, 2, 0, 1179662, 2, 0, 1179663, 2, 0, 1179664, 2, 0, 1179665, 2, 0, 1179666, 2, 0, 1179667, 2, 0, 1179668, 2, 0, 1179669, 2, 0, 1179670, 2, 0, 1179671, 2, 0, 1179672, 2, 0, 1179673, 2, 0, 1179674, 2, 0, 1179675, 2, 0, 1179676, 2, 0, 1179677, 2, 0, 1179678, 2, 0, 1179679, 2, 0, 1179680, 2, 0, 1179681, 2, 0, 1179682, 2, 0, 1179683, 2, 0, 1179684, 2, 0, 1179685, 2, 0, 1179686, 2, 0, 1179687, 2, 0, 1179688, 2, 0, 1179689, 2, 0, 1179690, 2, 0, 1179691, 2, 0, 1179692, 2, 0, 1179693, 2, 0, 1179694, 2, 0, 1179695, 2, 0, 1179696, 2, 0, 1179697, 2, 0, 1179698, 2, 0, 1179699, 2, 0, 1179700, 2, 0, 1179701, 2, 0, 1310690, 2, 0, 1310701, 2, 0, 1310702, 2, 0, 1310703, 2, 0, 1310704, 2, 0, 1310705, 2, 0, 1310706, 2, 0, 1310707, 2, 0, 1310708, 2, 0, 1310709, 2, 0, 1310710, 2, 0, 1310711, 2, 0, 1310712, 2, 0, 1310713, 2, 0, 1310714, 2, 0, 1310715, 2, 0, 1310716, 2, 0, 1310717, 2, 0, 1310718, 2, 0, 1310719, 2, 0, 1245184, 2, 0, 1245185, 2, 0, 1245186, 2, 0, 1245187, 2, 0, 1245188, 2, 0, 1245189, 2, 0, 1245190, 2, 0, 1245191, 2, 0, 1245192, 2, 0, 1245193, 2, 0, 1245194, 2, 0, 1245195, 2, 0, 1245196, 2, 0, 1245197, 2, 0, 1245198, 2, 0, 1245199, 2, 0, 1245200, 2, 0, 1245201, 2, 0, 1245202, 2, 0, 1245203, 2, 0, 1245204, 2, 0, 1245205, 2, 0, 1245206, 2, 0, 1245207, 2, 0, 1245208, 2, 0, 1245209, 2, 0, 1245210, 2, 0, 1245211, 2, 0, 1245212, 2, 0, 1245213, 2, 0, 1245214, 2, 0, 1245215, 2, 0, 1245216, 2, 0, 1245217, 2, 0, 1245218, 2, 0, 1245219, 2, 0, 1245220, 2, 0, 1245221, 2, 0, 1245222, 2, 0, 1245223, 2, 0, 1245224, 2, 0, 1245225, 2, 0, 1245226, 2, 0, 1245227, 2, 0, 1245228, 2, 0, 1245229, 2, 0, 1245230, 2, 0, 1245231, 2, 0, 1245232, 2, 0, 1245233, 2, 0, 1245234, 2, 0, 1245235, 2, 0, 1245236, 2, 0, 1376238, 2, 0, 1376239, 2, 0, 1376240, 2, 0, 1376241, 2, 0, 1376242, 2, 0, 1376243, 2, 0, 1376244, 2, 0, 1376245, 2, 0, 1376246, 2, 0, 1376247, 2, 0, 1376248, 2, 0, 1376249, 2, 0, 1376250, 2, 0, 1376251, 2, 0, 1376252, 2, 0, 1376253, 2, 0, 1376254, 2, 0, 1376255, 2, 0, 1310720, 2, 0, 1310721, 2, 0, 1310722, 2, 0, 1310723, 2, 0, 1310724, 2, 0, 1310725, 2, 0, 1310726, 2, 0, 1310727, 2, 0, 1310728, 2, 0, 1310729, 2, 0, 1310730, 2, 0, 1310731, 2, 0, 1310732, 2, 0, 1310733, 2, 0, 1310734, 2, 0, 1310735, 2, 0, 1310736, 2, 0, 1310737, 2, 0, 1310738, 2, 0, 1310739, 2, 0, 1310740, 2, 0, 1310741, 2, 0, 1310742, 2, 0, 1310743, 2, 0, 1310744, 2, 0, 1310745, 2, 0, 1310746, 2, 0, 1310747, 2, 0, 1310748, 2, 0, 1310749, 2, 0, 1310750, 2, 0, 1310751, 2, 0, 1310752, 2, 0, 1310753, 2, 0, 1310754, 2, 0, 1310755, 2, 0, 1310756, 2, 0, 1310757, 2, 0, 1310758, 2, 0, 1310759, 2, 0, 1310760, 2, 0, 1310761, 2, 0, 1310762, 2, 0, 1310763, 2, 0, 1310764, 2, 0, 1310765, 2, 0, 1310766, 2, 0, 1310767, 2, 0, 1310768, 2, 0, 1310769, 2, 0, 1310770, 2, 0, 1310771, 2, 0, 1310772, 2, 0, 1441775, 2, 0, 1441776, 2, 0, 1441777, 2, 0, 1441778, 2, 0, 1441779, 2, 0, 1441780, 2, 0, 1441781, 2, 0, 1441782, 2, 0, 1441783, 2, 0, 1441784, 2, 0, 1441785, 2, 0, 1441786, 2, 0, 1441787, 2, 0, 1441788, 2, 0, 1441789, 2, 0, 1441790, 2, 0, 1441791, 2, 0, 1376256, 2, 0, 1376257, 2, 0, 1376258, 2, 0, 1376259, 2, 0, 1376260, 2, 0, 1376261, 2, 0, 1376262, 2, 0, 1376263, 2, 0, 1376264, 2, 0, 1376265, 2, 0, 1376266, 2, 0, 1376267, 2, 0, 1376268, 2, 0, 1376269, 2, 0, 1376270, 2, 0, 1376271, 2, 0, 1376272, 2, 0, 1376273, 2, 0, 1376274, 2, 0, 1376275, 2, 0, 1376276, 2, 0, 1376277, 2, 0, 1376278, 2, 0, 1376279, 2, 0, 1376280, 2, 0, 1376281, 2, 0, 1376282, 2, 0, 1376283, 2, 0, 1376284, 2, 0, 1376285, 2, 0, 1376286, 2, 0, 1376287, 2, 0, 1376288, 2, 0, 1376289, 2, 0, 1376290, 2, 0, 1376291, 2, 0, 1376292, 2, 0, 1376293, 2, 0, 1376294, 2, 0, 1376295, 2, 0, 1376296, 2, 0, 1376297, 2, 0, 1376298, 2, 0, 1376299, 2, 0, 1376300, 2, 0, 1376301, 2, 0, 1376302, 2, 0, 1376303, 2, 0, 1376304, 2, 0, 1376305, 2, 0, 1376306, 2, 0, 1376307, 2, 0, 1376308, 2, 0, 1507312, 2, 0, 1507313, 2, 0, 1507314, 2, 0, 1507315, 2, 0, 1507316, 2, 0, 1507317, 2, 0, 1507318, 2, 0, 1507319, 2, 0, 1507320, 2, 0, 1507321, 2, 0, 1507322, 2, 0, 1507323, 2, 0, 1507324, 2, 0, 1507325, 2, 0, 1507326, 2, 0, 1507327, 2, 0, 1441792, 2, 0, 1441793, 2, 0, 1441794, 2, 0, 1441795, 2, 0, 1441796, 2, 0, 1441797, 2, 0, 1441798, 2, 0, 1441799, 2, 0, 1441800, 2, 0, 1441801, 2, 0, 1441802, 2, 0, 1441803, 2, 0, 1441804, 2, 0, 1441805, 2, 0, 1441806, 2, 0, 1441807, 2, 0, 1441808, 2, 0, 1441809, 2, 0, 1441810, 2, 0, 1441811, 2, 0, 1441812, 2, 0, 1441813, 2, 0, 1441814, 2, 0, 1441815, 2, 0, 1441816, 2, 0, 1441817, 2, 0, 1441818, 2, 0, 1441819, 2, 0, 1441820, 2, 0, 1441821, 2, 0, 1441822, 2, 0, 1441823, 2, 0, 1441824, 2, 0, 1441825, 2, 0, 1441826, 2, 0, 1441827, 2, 0, 1441828, 2, 0, 1441829, 2, 0, 1441830, 2, 0, 1441831, 2, 0, 1441832, 2, 0, 1441833, 2, 0, 1441834, 2, 0, 1441835, 2, 0, 1441836, 2, 0, 1441837, 2, 0, 1441838, 2, 0, 1441839, 2, 0, 1441840, 2, 0, 1441841, 2, 0, 1441842, 2, 0, 1441843, 2, 0, 1572849, 2, 0, 1572850, 2, 0, 1572851, 2, 0, 1572852, 2, 0, 1572853, 2, 0, 1572854, 2, 0, 1572855, 2, 0, 1572856, 2, 0, 1572857, 2, 0, 1572858, 2, 0, 1572859, 2, 0, 1572860, 2, 0, 1572861, 2, 0, 1572862, 2, 0, 1572863, 2, 0, 1507328, 2, 0, 1507329, 2, 0, 1507330, 2, 0, 1507331, 2, 0, 1507332, 2, 0, 1507333, 2, 0, 1507334, 2, 0, 1507335, 2, 0, 1507336, 2, 0, 1507337, 2, 0, 1507338, 2, 0, 1507339, 2, 0, 1507340, 2, 0, 1507341, 2, 0, 1507342, 2, 0, 1507343, 2, 0, 1507344, 2, 0, 1507345, 2, 0, 1507346, 2, 0, 1507347, 2, 0, 1507348, 2, 0, 1507349, 2, 0, 1507350, 2, 0, 1507351, 2, 0, 1507352, 2, 0, 1507353, 2, 0, 1507354, 2, 0, 1507355, 2, 0, 1507356, 2, 0, 1507357, 2, 0, 1507358, 2, 0, 1507359, 2, 0, 1507360, 2, 0, 1507361, 2, 0, 1507362, 2, 0, 1507363, 2, 0, 1507364, 2, 0, 1507365, 2, 0, 1507366, 2, 0, 1507367, 2, 0, 1507368, 2, 0, 1507369, 2, 0, 1507370, 2, 0, 1507371, 2, 0, 1507372, 2, 0, 1507373, 2, 0, 1507374, 2, 0, 1507375, 2, 0, 1507376, 2, 0, 1507377, 2, 0, 1507378, 2, 0, 1507379, 2, 0, 1638385, 2, 0, 1638386, 2, 0, 1638387, 2, 0, 1638388, 2, 0, 1638389, 2, 0, 1638390, 2, 0, 1638391, 2, 0, 1638392, 2, 0, 1638393, 2, 0, 1638394, 2, 0, 1638395, 2, 0, 1638396, 2, 0, 1638397, 2, 0, 1638398, 2, 0, 1638399, 2, 0, 1572864, 2, 0, 1572865, 2, 0, 1572866, 2, 0, 1572867, 2, 0, 1572868, 2, 0, 1572869, 2, 0, 1572870, 2, 0, 1572871, 2, 0, 1572872, 2, 0, 1572873, 2, 0, 1572874, 2, 0, 1572875, 2, 0, 1572876, 2, 0, 1572877, 2, 0, 1572878, 2, 0, 1572879, 2, 0, 1572880, 2, 0, 1572881, 2, 0, 1572882, 2, 0, 1572883, 2, 0, 1572884, 2, 0, 1572885, 2, 0, 1572886, 2, 0, 1572887, 2, 0, 1572888, 2, 0, 1572889, 2, 0, 1572890, 2, 0, 1572891, 2, 0, 1572892, 2, 0, 1572893, 2, 0, 1572894, 2, 0, 1572895, 2, 0, 1572896, 2, 0, 1572897, 2, 0, 1572898, 2, 0, 1572899, 2, 0, 1572900, 2, 0, 1572901, 2, 0, 1572902, 2, 0, 1572903, 2, 0, 1572904, 2, 0, 1572905, 2, 0, 1572906, 2, 0, 1572907, 2, 0, 1572908, 2, 0, 1572909, 2, 0, 1572910, 2, 0, 1572911, 2, 0, 1572912, 2, 0, 1572913, 2, 0, 1572914, 2, 0, 1703922, 2, 0, 1703923, 2, 0, 1703924, 2, 0, 1703925, 2, 0, 1703926, 2, 0, 1703927, 2, 0, 1703928, 2, 0, 1703929, 2, 0, 1703930, 2, 0, 1703931, 2, 0, 1703932, 2, 0, 1703933, 2, 0, 1703934, 2, 0, 1703935, 2, 0, 1638400, 2, 0, 1638401, 2, 0, 1638402, 2, 0, 1638403, 2, 0, 1638404, 2, 0, 1638405, 2, 0, 1638406, 2, 0, 1638407, 2, 0, 1638408, 2, 0, 1638409, 2, 0, 1638410, 2, 0, 1638411, 2, 0, 1638412, 2, 0, 1638413, 2, 0, 1638414, 2, 0, 1638415, 2, 0, 1638416, 2, 0, 1638417, 2, 0, 1638418, 2, 0, 1638419, 2, 0, 1638420, 2, 0, 1638421, 2, 0, 1638422, 2, 0, 1638423, 2, 0, 1638424, 2, 0, 1638425, 2, 0, 1638426, 2, 0, 1638427, 2, 0, 1638428, 2, 0, 1638429, 2, 0, 1638430, 2, 0, 1638431, 2, 0, 1638432, 2, 0, 1638433, 2, 0, 1638434, 2, 0, 1638435, 2, 0, 1638436, 2, 0, 1638437, 2, 0, 1638438, 2, 0, 1638439, 2, 0, 1638440, 2, 0, 1638441, 2, 0, 1638442, 2, 0, 1638443, 2, 0, 1638444, 2, 0, 1638445, 2, 0, 1638446, 2, 0, 1638447, 2, 0, 1638448, 2, 0, 1638449, 2, 0, 1638450, 2, 0, 1769459, 2, 0, 1769460, 2, 0, 1769461, 2, 0, 1769462, 2, 0, 1769463, 2, 0, 1769464, 2, 0, 1769465, 2, 0, 1769466, 2, 0, 1769467, 2, 0, 1769468, 2, 0, 1769469, 2, 0, 1769470, 2, 0, 1769471, 2, 0, 1703936, 2, 0, 1703937, 2, 0, 1703938, 2, 0, 1703939, 2, 0, 1703940, 2, 0, 1703941, 2, 0, 1703942, 2, 0, 1703943, 2, 0, 1703944, 2, 0, 1703945, 2, 0, 1703946, 2, 0, 1703947, 2, 0, 1703948, 2, 0, 1703949, 2, 0, 1703950, 2, 0, 1703951, 2, 0, 1703952, 2, 0, 1703953, 2, 0, 1703954, 2, 0, 1703955, 2, 0, 1703956, 2, 0, 1703957, 2, 0, 1703958, 2, 0, 1703959, 2, 0, 1703960, 2, 0, 1703961, 2, 0, 1703962, 2, 0, 1703963, 2, 0, 1703964, 2, 0, 1703965, 2, 0, 1703966, 2, 0, 1703967, 2, 0, 1703968, 2, 0, 1703969, 2, 0, 1703970, 2, 0, 1703971, 2, 0, 1703972, 2, 0, 1703973, 2, 0, 1703974, 2, 0, 1703975, 2, 0, 1703976, 2, 0, 1703977, 2, 0, 1703978, 2, 0, 1703979, 2, 0, 1703980, 2, 0, 1703981, 2, 0, 1703982, 2, 0, 1703983, 2, 0, 1703984, 2, 0, 1703985, 2, 0, 1834996, 2, 0, 1834997, 2, 0, 1834998, 2, 0, 1834999, 2, 0, 1835000, 2, 0, 1835001, 2, 0, 1835002, 2, 0, 1835003, 2, 0, 1835004, 2, 0, 1835005, 2, 0, 1835006, 2, 0, 1835007, 2, 0, 1769472, 2, 0, 1769473, 2, 0, 1769474, 2, 0, 1769475, 2, 0, 1769476, 2, 0, 1769477, 2, 0, 1769478, 2, 0, 1769479, 2, 0, 1769480, 2, 0, 1769481, 2, 0, 1769482, 2, 0, 1769483, 2, 0, 1769484, 2, 0, 1769485, 2, 0, 1769486, 2, 0, 1769487, 2, 0, 1769488, 2, 0, 1769489, 2, 0, 1769490, 2, 0, 1769491, 2, 0, 1769492, 2, 0, 1769493, 2, 0, 1769494, 2, 0, 1769495, 2, 0, 1769496, 2, 0, 1769497, 2, 0, 1769498, 2, 0, 1769499, 2, 0, 1769500, 2, 0, 1769501, 2, 0, 1769502, 2, 0, 1769503, 2, 0, 1769504, 2, 0, 1769505, 2, 0, 1769506, 2, 0, 1769507, 2, 0, 1769508, 2, 0, 1769509, 2, 0, 1769510, 2, 0, 1769511, 2, 0, 1769512, 2, 0, 1769513, 2, 0, 1769514, 2, 0, 1769515, 2, 0, 1769516, 2, 0, 1769517, 2, 0, 1769518, 2, 0, 1769519, 2, 0, 1769520, 2, 0, 1769521, 2, 0, 1900533, 2, 0, 1900534, 2, 0, 1900535, 2, 0, 1900536, 2, 0, 1900537, 2, 0, 1900538, 2, 0, 1900539, 2, 0, 1900540, 2, 0, 1900541, 2, 0, 1900542, 2, 0, 1900543, 2, 0, 1835008, 2, 0, 1835009, 2, 0, 1835010, 2, 0, 1835011, 2, 0, 1835012, 2, 0, 1835013, 2, 0, 1835014, 2, 0, 1835015, 2, 0, 1835016, 2, 0, 1835017, 2, 0, 1835018, 2, 0, 1835019, 2, 0, 1835020, 2, 0, 1835021, 2, 0, 1835022, 2, 0, 1835023, 2, 0, 1835024, 2, 0, 1835025, 2, 0, 1835026, 2, 0, 1835027, 2, 0, 1835028, 2, 0, 1835029, 2, 0, 1835030, 2, 0, 1835031, 2, 0, 1835032, 2, 0, 1835033, 2, 0, 1835034, 2, 0, 1835035, 2, 0, 1835036, 2, 0, 1835037, 2, 0, 1835038, 2, 0, 1835039, 2, 0, 1835040, 2, 0, 1835041, 2, 0, 1835042, 2, 0, 1835043, 2, 0, 1835044, 2, 0, 1835045, 2, 0, 1835046, 2, 0, 1835047, 2, 0, 1835048, 2, 0, 1835049, 2, 0, 1835050, 2, 0, 1835051, 2, 0, 1835052, 2, 0, 1835053, 2, 0, 1835054, 2, 0, 1835055, 2, 0, 1835056, 2, 0, 1966070, 2, 0, 1966071, 2, 0, 1966072, 2, 0, 1966073, 2, 0, 1966074, 2, 0, 1966075, 2, 0, 1966076, 2, 0, 1966077, 2, 0, 1966078, 2, 0, 1966079, 2, 0, 1900544, 2, 0, 1900545, 2, 0, 1900546, 2, 0, 1900547, 2, 0, 1900548, 2, 0, 1900549, 2, 0, 1900550, 2, 0, 1900551, 2, 0, 1900552, 2, 0, 1900553, 2, 0, 1900554, 2, 0, 1900555, 2, 0, 1900556, 2, 0, 1900557, 2, 0, 1900558, 2, 0, 1900559, 2, 0, 1900560, 2, 0, 1900561, 2, 0, 1900562, 2, 0, 1900563, 2, 0, 1900564, 2, 0, 1900565, 2, 0, 1900566, 2, 0, 1900567, 2, 0, 1900568, 2, 0, 1900569, 2, 0, 1900570, 2, 0, 1900571, 2, 0, 1900572, 2, 0, 1900573, 2, 0, 1900574, 2, 0, 1900575, 2, 0, 1900576, 2, 0, 1900577, 2, 0, 1900578, 2, 0, 1900579, 2, 0, 1900580, 2, 0, 1900581, 2, 0, 1900582, 2, 0, 1900583, 2, 0, 1900584, 2, 0, 1900585, 2, 0, 1900586, 2, 0, 1900587, 2, 0, 1900588, 2, 0, 1900589, 2, 0, 1900590, 2, 0, 1900591, 2, 0, 1900592, 2, 0, 2031607, 2, 0, 2031608, 2, 0, 2031609, 2, 0, 2031610, 2, 0, 2031611, 2, 0, 2031612, 2, 0, 2031613, 2, 0, 2031614, 2, 0, 2031615, 2, 0, 1966080, 2, 0, 1966081, 2, 0, 1966082, 2, 0, 1966083, 2, 0, 1966084, 2, 0, 1966085, 2, 0, 1966086, 2, 0, 1966087, 2, 0, 1966088, 2, 0, 1966089, 2, 0, 1966090, 2, 0, 1966091, 2, 0, 1966092, 2, 0, 1966093, 2, 0, 1966094, 2, 0, 1966095, 2, 0, 1966096, 2, 0, 1966097, 2, 0, 1966098, 2, 0, 1966099, 2, 0, 1966100, 2, 0, 1966101, 2, 0, 1966102, 2, 0, 1966103, 2, 0, 1966104, 2, 0, 1966105, 2, 0, 1966106, 2, 0, 1966107, 2, 0, 1966108, 2, 0, 1966109, 2, 0, 1966110, 2, 0, 1966111, 2, 0, 1966112, 2, 0, 1966113, 2, 0, 1966114, 2, 0, 1966115, 2, 0, 1966116, 2, 0, 1966117, 2, 0, 1966118, 2, 0, 1966119, 2, 0, 1966120, 2, 0, 1966121, 2, 0, 1966122, 2, 0, 1966123, 2, 0, 1966124, 2, 0, 1966125, 2, 0, 1966126, 2, 0, 1966127, 2, 0, 2097144, 2, 0, 2097145, 2, 0, 2097146, 2, 0, 2097147, 2, 0, 2097148, 2, 0, 2097149, 2, 0, 2097150, 2, 0, 2097151, 2, 0, 2031616, 2, 0, 2031617, 2, 0, 2031618, 2, 0, 2031619, 2, 0, 2031620, 2, 0, 2031621, 2, 0, 2031622, 2, 0, 2031623, 2, 0, 2031624, 2, 0, 2031625, 2, 0, 2031626, 2, 0, 2031627, 2, 0, 2031628, 2, 0, 2031629, 2, 0, 2031630, 2, 0, 2031631, 2, 0, 2031632, 2, 0, 2031633, 2, 0, 2031634, 2, 0, 2031635, 2, 0, 2031636, 2, 0, 2031637, 2, 0, 2031638, 2, 0, 2031639, 2, 0, 2031640, 2, 0, 2031641, 2, 0, 2031642, 2, 0, 2031643, 2, 0, 2031644, 2, 0, 2031645, 2, 0, 2031646, 2, 0, 2031647, 2, 0, 2031648, 2, 0, 2031649, 2, 0, 2031650, 2, 0, 2031651, 2, 0, 2031652, 2, 0, 2031653, 2, 0, 2031654, 2, 0, 2031655, 2, 0, 2031656, 2, 0, 2031657, 2, 0, 2031658, 2, 0, 2031659, 2, 0, 2031660, 2, 0, 2031661, 2, 0, 2031662, 2, 0, 2031663, 2, 0, 2162681, 2, 0, 2162682, 2, 0, 2162683, 2, 0, 2162684, 2, 0, 2162685, 2, 0, 2162686, 2, 0, 2162687, 2, 0, 2097152, 2, 0, 2097153, 2, 0, 2097154, 2, 0, 2097155, 2, 0, 2097156, 2, 0, 2097157, 2, 0, 2097158, 2, 0, 2097159, 2, 0, 2097160, 2, 0, 2097161, 2, 0, 2097162, 2, 0, 2097163, 2, 0, 2097164, 2, 0, 2097165, 2, 0, 2097166, 2, 0, 2097167, 2, 0, 2097168, 2, 0, 2097169, 2, 0, 2097170, 2, 0, 2097171, 2, 0, 2097172, 2, 0, 2097173, 2, 0, 2097174, 2, 0, 2097175, 2, 0, 2097176, 2, 0, 2097177, 2, 0, 2097178, 2, 0, 2097179, 2, 0, 2097180, 2, 0, 2097181, 2, 0, 2097182, 2, 0, 2097183, 2, 0, 2097184, 2, 0, 2097185, 2, 0, 2097186, 2, 0, 2097187, 2, 0, 2097188, 2, 0, 2097189, 2, 0, 2097190, 2, 0, 2097191, 2, 0, 2097192, 2, 0, 2097193, 2, 0, 2097194, 2, 0, 2097195, 2, 0, 2097196, 2, 0, 2097197, 2, 0, 2097198, 2, 0, 2097199, 2, 0, 2228218, 2, 0, 2228219, 2, 0, 2228220, 2, 0, 2228221, 2, 0, 2228222, 2, 0, 2228223, 2, 0, 2162688, 2, 0, 2162689, 2, 0, 2162690, 2, 0, 2162691, 2, 0, 2162692, 2, 0, 2162693, 2, 0, 2162694, 2, 0, 2162695, 2, 0, 2162696, 2, 0, 2162697, 2, 0, 2162698, 2, 0, 2162699, 2, 0, 2162700, 2, 0, 2162701, 2, 0, 2162702, 2, 0, 2162703, 2, 0, 2162704, 2, 0, 2162705, 2, 0, 2162706, 2, 0, 2162707, 2, 0, 2162708, 2, 0, 2162709, 2, 0, 2162710, 2, 0, 2162711, 2, 0, 2162712, 2, 0, 2162713, 2, 0, 2162714, 2, 0, 2162715, 2, 0, 2162716, 2, 0, 2162717, 2, 0, 2162718, 2, 0, 2162719, 2, 0, 2162720, 2, 0, 2162721, 2, 0, 2162722, 2, 0, 2162723, 2, 0, 2162724, 2, 0, 2162725, 2, 0, 2162726, 2, 0, 2162727, 2, 0, 2162728, 2, 0, 2162729, 2, 0, 2162730, 2, 0, 2162731, 2, 0, 2162732, 2, 0, 2162733, 2, 0, 2162734, 2, 0, 2293754, 2, 0, 2293755, 2, 0, 2293756, 2, 0, 2293757, 2, 0, 2293758, 2, 0, 2293759, 2, 0, 2228224, 2, 0, 2228225, 2, 0, 2228226, 2, 0, 2228227, 2, 0, 2228228, 2, 0, 2228229, 2, 0, 2228230, 2, 0, 2228231, 2, 0, 2228232, 2, 0, 2228233, 2, 0, 2228234, 2, 0, 2228235, 2, 0, 2228236, 2, 0, 2228237, 2, 0, 2228238, 2, 0, 2228239, 2, 0, 2228240, 2, 0, 2228241, 2, 0, 2228242, 2, 0, 2228243, 2, 0, 2228244, 2, 0, 2228245, 2, 0, 2228246, 2, 0, 2228247, 2, 0, 2228248, 2, 0, 2228249, 2, 0, 2228250, 2, 0, 2228251, 2, 0, 2228252, 2, 0, 2228253, 2, 0, 2228254, 2, 0, 2228255, 2, 0, 2228256, 2, 0, 2228257, 2, 0, 2228258, 2, 0, 2228259, 2, 0, 2228260, 2, 0, 2228261, 2, 0, 2228262, 2, 0, 2228263, 2, 0, 2228264, 2, 0, 2228265, 2, 0, 2228266, 2, 0, 2228267, 2, 0, 2228268, 2, 0, 2228269, 2, 0, 2228270, 2, 0, 2359291, 2, 0, 2359292, 2, 0, 2359293, 2, 0, 2359294, 2, 0, 2359295, 2, 0, 2293760, 2, 0, 2293761, 2, 0, 2293762, 2, 0, 2293763, 2, 0, 2293764, 2, 0, 2293765, 2, 0, 2293766, 2, 0, 2293767, 2, 0, 2293768, 2, 0, 2293769, 2, 0, 2293770, 2, 0, 2293771, 2, 0, 2293772, 2, 0, 2293773, 2, 0, 2293774, 2, 0, 2293775, 2, 0, 2293776, 2, 0, 2293777, 2, 0, 2293778, 2, 0, 2293779, 2, 0, 2293780, 2, 0, 2293781, 2, 0, 2293782, 2, 0, 2293783, 2, 0, 2293784, 2, 0, 2293785, 2, 0, 2293786, 2, 0, 2293787, 2, 0, 2293788, 2, 0, 2293789, 2, 0, 2293790, 2, 0, 2293791, 2, 0, 2293792, 2, 0, 2293793, 2, 0, 2293794, 2, 0, 2293795, 2, 0, 2293796, 2, 0, 2293797, 2, 0, 2293798, 2, 0, 2293799, 2, 0, 2293800, 2, 0, 2293801, 2, 0, 2293802, 2, 0, 2293803, 2, 0, 2293804, 2, 0, 2293805, 2, 0, 2424828, 2, 0, 2424829, 2, 0, 2424830, 2, 0, 2424831, 2, 0, 2359296, 2, 0, 2359297, 2, 0, 2359298, 2, 0, 2359299, 2, 0, 2359300, 2, 0, 2359301, 2, 0, 2359302, 2, 0, 2359303, 2, 0, 2359304, 2, 0, 2359305, 2, 0, 2359306, 2, 0, 2359307, 2, 0, 2359308, 2, 0, 2359309, 2, 0, 2359310, 2, 0, 2359311, 2, 0, 2359312, 2, 0, 2359313, 2, 0, 2359314, 2, 0, 2359315, 2, 0, 2359316, 2, 0, 2359317, 2, 0, 2359318, 2, 0, 2359319, 2, 0, 2359320, 2, 0, 2359321, 2, 0, 2359322, 2, 0, 2359323, 2, 0, 2359324, 2, 0, 2359325, 2, 0, 2359326, 2, 0, 2359327, 2, 0, 2359328, 2, 0, 2359329, 2, 0, 2359330, 2, 0, 2359331, 2, 0, 2359332, 2, 0, 2359333, 2, 0, 2359334, 2, 0, 2359335, 2, 0, 2359336, 2, 0, 2359337, 2, 0, 2359338, 2, 0, 2359339, 2, 0, 2359340, 2, 0, 2490365, 2, 0, 2490366, 2, 0, 2490367, 2, 0, 2424832, 2, 0, 2424833, 2, 0, 2424834, 2, 0, 2424835, 2, 0, 2424836, 2, 0, 2424837, 2, 0, 2424838, 2, 0, 2424839, 2, 0, 2424840, 2, 0, 2424841, 2, 0, 2424842, 2, 0, 2424843, 2, 0, 2424844, 2, 0, 2424845, 2, 0, 2424846, 2, 0, 2424847, 2, 0, 2424848, 2, 0, 2424849, 2, 0, 2424850, 2, 0, 2424851, 2, 0, 2424852, 2, 0, 2424853, 2, 0, 2424854, 2, 0, 2424855, 2, 0, 2424856, 2, 0, 2424857, 2, 0, 2424858, 2, 0, 2424859, 2, 0, 2424860, 2, 0, 2424861, 2, 0, 2424862, 2, 0, 2424863, 2, 0, 2424864, 2, 0, 2424865, 2, 0, 2424866, 2, 0, 2424867, 2, 0, 2424868, 2, 0, 2424869, 2, 0, 2424870, 2, 0, 2424871, 2, 0, 2424872, 2, 0, 2424873, 2, 0, 2424874, 2, 0, 2424875, 2, 0, 2424876, 2, 0, 2555903, 2, 0, 2490368, 2, 0, 2490369, 2, 0, 2490370, 2, 0, 2490371, 2, 0, 2490372, 2, 0, 2490373, 2, 0, 2490374, 2, 0, 2490375, 2, 0, 2490376, 2, 0, 2490377, 2, 0, 2490378, 2, 0, 2490379, 2, 0, 2490380, 2, 0, 2490381, 2, 0, 2490382, 2, 0, 2490383, 2, 0, 2490384, 2, 0, 2490385, 2, 0, 2490386, 2, 0, 2490387, 2, 0, 2490388, 2, 0, 2490389, 2, 0, 2490390, 2, 0, 2490391, 2, 0, 2490392, 2, 0, 2490393, 2, 0, 2490394, 2, 0, 2490395, 2, 0, 2490396, 2, 0, 2490397, 2, 0, 2490398, 2, 0, 2490399, 2, 0, 2490400, 2, 0, 2490401, 2, 0, 2490402, 2, 0, 2490403, 2, 0, 2490404, 2, 0, 2490405, 2, 0, 2490406, 2, 0, 2490407, 2, 0, 2490408, 2, 0, 2490409, 2, 0, 2490410, 2, 0, 2490411, 2, 0, 2555904, 2, 0, 2555905, 2, 0, 2555906, 2, 0, 2555907, 2, 0, 2555908, 2, 0, 2555909, 2, 0, 2555910, 2, 0, 2555911, 2, 0, 2555912, 2, 0, 2555913, 2, 0, 2555914, 2, 0, 2555915, 2, 0, 2555916, 2, 0, 2555917, 2, 0, 2555918, 2, 0, 2555919, 2, 0, 2555920, 2, 0, 2555921, 2, 0, 2555922, 2, 0, 2555923, 2, 0, 2555924, 2, 0, 2555925, 2, 0, 2555926, 2, 0, 2555927, 2, 0, 2555928, 2, 0, 2555929, 2, 0, 2555930, 2, 0, 2555931, 2, 0, 2555932, 2, 0, 2555933, 2, 0, 2555934, 2, 0, 2555935, 2, 0, 2555936, 2, 0, 2555937, 2, 0, 2555938, 2, 0, 2555939, 2, 0, 2555940, 2, 0, 2555941, 2, 0, 2555942, 2, 0, 2555943, 2, 0, 2555944, 2, 0, 2555945, 2, 0, 2555946, 2, 0, 2555947, 2, 0, 2621441, 2, 0, 2621442, 2, 0, 2621443, 2, 0, 2621444, 2, 0, 2621445, 2, 0, 2621446, 2, 0, 2621447, 2, 0, 2621448, 2, 0, 2621449, 2, 0, 2621450, 2, 0, 2621451, 2, 0, 2621452, 2, 0, 2621453, 2, 0, 2621454, 2, 0, 2621455, 2, 0, 2621456, 2, 0, 2621457, 2, 0, 2621458, 2, 0, 2621459, 2, 0, 2621460, 2, 0, 2621461, 2, 0, 2621462, 2, 0, 2621463, 2, 0, 2621464, 2, 0, 2621465, 2, 0, 2621466, 2, 0, 2621467, 2, 0, 2621468, 2, 0, 2621469, 2, 0, 2621470, 2, 0, 2621471, 2, 0, 2621472, 2, 0, 2621473, 2, 0, 2621474, 2, 0, 2621475, 2, 0, 2621476, 2, 0, 2621477, 2, 0, 2621478, 2, 0, 2621479, 2, 0, 2621480, 2, 0, 2621481, 2, 0, 2621482, 2, 0, 2686979, 2, 0, 2686980, 2, 0, 2686981, 2, 0, 2686982, 2, 0, 2686983, 2, 0, 2686984, 2, 0, 2686985, 2, 0, 2686986, 2, 0, 2686987, 2, 0, 2686988, 2, 0, 2686989, 2, 0, 2686990, 2, 0, 2686991, 2, 0, 2686992, 2, 0, 2686993, 2, 0, 2686994, 2, 0, 2686995, 2, 0, 2686996, 2, 0, 2686997, 2, 0, 2686998, 2, 0, 2686999, 2, 0, 2687000, 2, 0, 2687001, 2, 0, 2687002, 2, 0, 2687003, 2, 0, 2687004, 2, 0, 2687005, 2, 0, 2687006, 2, 0, 2687007, 2, 0, 2687008, 2, 0, 2687009, 2, 0, 2687010, 2, 0, 2687011, 2, 0, 2687012, 2, 0, 2687013, 2, 0, 2687014, 2, 0, 2687015, 2, 0, 2687016, 2, 0, 2687017, 2, 0, 2687018, 2, 0, 2752516, 2, 0, 2752517, 2, 0, 2752518, 2, 0, 2752519, 2, 0, 2752520, 2, 0, 2752521, 2, 0, 2752522, 2, 0, 2752523, 2, 0, 2752524, 2, 0, 2752525, 2, 0, 2752526, 2, 0, 2752527, 2, 0, 2752528, 2, 0, 2752529, 2, 0, 2752530, 2, 0, 2752531, 2, 0, 2752532, 2, 0, 2752533, 2, 0, 2752534, 2, 0, 2752535, 2, 0, 2752536, 2, 0, 2752537, 2, 0, 2752538, 2, 0, 2752539, 2, 0, 2752540, 2, 0, 2752541, 2, 0, 2752542, 2, 0, 2752543, 2, 0, 2752544, 2, 0, 2752545, 2, 0, 2752546, 2, 0, 2752547, 2, 0, 2752548, 2, 0, 2752549, 2, 0, 2752550, 2, 0, 2752551, 2, 0, 2752552, 2, 0, 2752553, 2, 0, 2818053, 2, 0, 2818054, 2, 0, 2818055, 2, 0, 2818056, 2, 0, 2818057, 2, 0, 2818058, 2, 0, 2818059, 2, 0, 2818060, 2, 0, 2818061, 2, 0, 2818062, 2, 0, 2818063, 2, 0, 2818064, 2, 0, 2818065, 2, 0, 2818066, 2, 0, 2818067, 2, 0, 2818068, 2, 0, 2818069, 2, 0, 2818070, 2, 0, 2818071, 2, 0, 2818072, 2, 0, 2818073, 2, 0, 2818074, 2, 0, 2818075, 2, 0, 2818076, 2, 0, 2818077, 2, 0, 2818078, 2, 0, 2818079, 2, 0, 2818080, 2, 0, 2818081, 2, 0, 2818082, 2, 0, 2818083, 2, 0, 2818084, 2, 0, 2818085, 2, 0, 2818086, 2, 0, 2818087, 2, 0, 2818088, 2, 0, 2883591, 2, 0, 2883592, 2, 0, 2883593, 2, 0, 2883594, 2, 0, 2883595, 2, 0, 2883596, 2, 0, 2883597, 2, 0, 2883598, 2, 0, 2883599, 2, 0, 2883600, 2, 0, 2883601, 2, 0, 2883602, 2, 0, 2883603, 2, 0, 2883604, 2, 0, 2883605, 2, 0, 2883606, 2, 0, 2883607, 2, 0, 2883608, 2, 0, 2883609, 2, 0, 2883610, 2, 0, 2883611, 2, 0, 2883612, 2, 0, 2883613, 2, 0, 2883614, 2, 0, 2883615, 2, 0, 2883616, 2, 0, 2883617, 2, 0, 2883618, 2, 0, 2883619, 2, 0, 2883620, 2, 0, 2883621, 2, 0, 2883622, 2, 0, 2949128, 2, 0, 2949129, 2, 0, 2949130, 2, 0, 2949131, 2, 0, 2949132, 2, 0, 2949133, 2, 0, 2949134, 2, 0, 2949135, 2, 0, 2949136, 2, 0, 2949137, 2, 0, 2949138, 2, 0, 2949139, 2, 0, 2949140, 2, 0, 2949141, 2, 0, 2949142, 2, 0, 2949143, 2, 0, 2949144, 2, 0, 2949145, 2, 0, 2949146, 2, 0, 2949147, 2, 0, 2949148, 2, 0, 2949149, 2, 0, 2949150, 2, 0, 2949151, 2, 0, 2949152, 2, 0, 2949153, 2, 0, 2949154, 2, 0, 2949155, 2, 0, 2949156, 2, 0, 2949157, 2, 0, 3014665, 2, 0, 3014666, 2, 0, 3014667, 2, 0, 3014668, 2, 0, 3014669, 2, 0, 3014670, 2, 0, 3014671, 2, 0, 3014672, 2, 0, 3014673, 2, 0, 3014674, 2, 0, 3014675, 2, 0, 3014676, 2, 0, 3014677, 2, 0, 3014678, 2, 0, 3014679, 2, 0, 3014680, 2, 0, 3014681, 2, 0, 3014682, 2, 0, 3014683, 2, 0, 3014684, 2, 0, 3014685, 2, 0, 3014686, 2, 0, 3014687, 2, 0, 3014688, 2, 0, 3014689, 2, 0, 3014690, 2, 0, 3014691, 2, 0, 3014692, 2, 0, 3014693, 2, 0, 3080202, 2, 0, 3080203, 2, 0, 3080204, 2, 0, 3080205, 2, 0, 3080206, 2, 0, 3080207, 2, 0, 3080208, 2, 0, 3080209, 2, 0, 3080210, 2, 0, 3080211, 2, 0, 3080212, 2, 0, 3080213, 2, 0, 3080214, 2, 0, 3080215, 2, 0, 3080216, 2, 0, 3080217, 2, 0, 3080218, 2, 0, 3080219, 2, 0, 3080220, 2, 0, 3080221, 2, 0, 3080222, 2, 0, 3080223, 2, 0, 3080224, 2, 0, 3080225, 2, 0, 3080226, 2, 0, 3080227, 2, 0, 3080228, 2, 0, 3145739, 2, 0, 3145740, 2, 0, 3145741, 2, 0, 3145742, 2, 0, 3145743, 2, 0, 3145744, 2, 0, 3145745, 2, 0, 3145746, 2, 0, 3145747, 2, 0, 3145748, 2, 0, 3145749, 2, 0, 3145750, 2, 0, 3145751, 2, 0, 3145752, 2, 0, 3145753, 2, 0, 3145754, 2, 0, 3145755, 2, 0, 3145756, 2, 0, 3145757, 2, 0, 3145758, 2, 0, 3145759, 2, 0, 3145760, 2, 0, 3145761, 2, 0, 3145762, 2, 0, 3145763, 2, 0, 3211276, 2, 0, 3211277, 2, 0, 3211278, 2, 0, 3211279, 2, 0, 3211280, 2, 0, 3211281, 2, 0, 3211282, 2, 0, 3211283, 2, 0, 3211284, 2, 0, 3211285, 2, 0, 3211286, 2, 0, 3211287, 2, 0, 3211288, 2, 0, 3211289, 2, 0, 3211290, 2, 0, 3211291, 2, 0, 3211292, 2, 0, 3211293, 2, 0, 3211294, 2, 0, 3211295, 2, 0, 3211296, 2, 0, 3211297, 2, 0, 3211298, 2, 0, 3276813, 2, 0, 3276814, 2, 0, 3276815, 2, 0, 3276816, 2, 0, 3276817, 2, 0, 3276818, 2, 0, 3276819, 2, 0, 3276820, 2, 0, 3276821, 2, 0, 3276822, 2, 0, 3276823, 2, 0, 3276824, 2, 0, 3276825, 2, 0, 3276826, 2, 0, 3276827, 2, 0, 3276828, 2, 0, 3276829, 2, 0, 3276830, 2, 0, 3276831, 2, 0, 3276832, 2, 0, 3342351, 2, 0, 3342352, 2, 0, 3342353, 2, 0, 3342354, 2, 0, 3342355, 2, 0, 3342356, 2, 0, 3342357, 2, 0, 3342358, 2, 0, 3342359, 2, 0, 3342360, 2, 0, 3342361, 2, 0, 3342362, 2, 0, 3342363, 2, 0, 3342364, 2, 0, 3342365, 2, 0, 3342366, 2, 0, 3342367, 2, 0, 3407888, 2, 0, 3407889, 2, 0, 3407890, 2, 0, 3407891, 2, 0, 3407892, 2, 0, 3407893, 2, 0, 3407894, 2, 0, 3407895, 2, 0, 3407896, 2, 0, 3407897, 2, 0, 3407898, 2, 0, 3407899, 2, 0, 3407900, 2, 0, 3407901, 2, 0, 3473427, 2, 0, 3473428, 2, 0, 3473429, 2, 0, 3473430, 2, 0, 3473431, 2, 0, 3473432, 2, 0, 3473433, 2, 0, 3473434, 2, 0 ) diff --git a/game/test_iso_tileset/TileMap44x24.tscn b/game/test_iso_tileset/TileMap44x24.tscn new file mode 100644 index 0000000..6fe3bc5 --- /dev/null +++ b/game/test_iso_tileset/TileMap44x24.tscn @@ -0,0 +1,11 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://test_iso_tileset/new_tileset.tres" type="TileSet" id=1] + +[node name="TileMap" type="TileMap"] +mode = 1 +tile_set = ExtResource( 1 ) +cell_size = Vector2( 44, 24 ) +cell_y_sort = true +format = 1 +tile_data = PoolIntArray( -3801106, 2, 0, -3670043, 2, 0, -3473452, 1, 0, -3473451, 1, 0, -3473450, 1, 0, -3407917, 1, 0, -3407916, 1, 0, -3407915, 1, 0, -3407914, 1, 0, -3407913, 1, 0, -3407912, 1, 0, -3407911, 1, 0, -3407910, 1, 0, -3407909, 1, 0, -3342381, 1, 0, -3342380, 1, 0, -3342379, 1, 0, -3342378, 1, 0, -3342377, 1, 0, -3342376, 1, 0, -3342375, 1, 0, -3342374, 1, 0, -3342373, 1, 0, -3342372, 1, 0, -3342371, 1, 0, -3342370, 1, 0, -3342369, 1, 0, -3342368, 1, 0, -3342367, 1, 0, -3342366, 1, 0, -3276845, 1, 0, -3276844, 1, 0, -3276843, 1, 0, -3276842, 1, 0, -3276841, 1, 0, -3276840, 1, 0, -3276839, 1, 0, -3276838, 1, 0, -3276837, 1, 0, -3276836, 1, 0, -3276835, 1, 0, -3276834, 1, 0, -3276833, 1, 0, -3276832, 1, 0, -3276831, 1, 0, -3276830, 1, 0, -3276829, 1, 0, -3276828, 1, 0, -3276827, 1, 0, -3276826, 1, 0, -3211309, 1, 0, -3211308, 1, 0, -3211307, 1, 0, -3211306, 1, 0, -3211305, 1, 0, -3211304, 1, 0, -3211303, 1, 0, -3211302, 1, 0, -3211301, 1, 0, -3211300, 1, 0, -3211299, 1, 0, -3211298, 1, 0, -3211297, 1, 0, -3211296, 1, 0, -3211295, 1, 0, -3211294, 1, 0, -3211293, 1, 0, -3211292, 1, 0, -3211291, 1, 0, -3211290, 1, 0, -3211289, 1, 0, -3211288, 1, 0, -3211287, 1, 0, -3211286, 1, 0, -3211285, 1, 0, -3211284, 1, 0, -3211283, 1, 0, -3211282, 1, 0, -3145773, 1, 0, -3145772, 1, 0, -3145771, 1, 0, -3145770, 1, 0, -3145769, 1, 0, -3145768, 1, 0, -3145767, 1, 0, -3145766, 1, 0, -3145765, 1, 0, -3145764, 1, 0, -3145763, 1, 0, -3145762, 1, 0, -3145761, 1, 0, -3145760, 1, 0, -3145759, 1, 0, -3145758, 1, 0, -3145757, 1, 0, -3145756, 1, 0, -3145755, 1, 0, -3145754, 1, 0, -3145753, 1, 0, -3145752, 1, 0, -3145751, 1, 0, -3145750, 1, 0, -3145749, 1, 0, -3145748, 1, 0, -3145747, 1, 0, -3145746, 1, 0, -3145745, 1, 0, -3145744, 1, 0, -3145743, 1, 0, -3145742, 1, 0, -3145741, 1, 0, -3145740, 1, 0, -3145739, 1, 0, -3145738, 1, 0, -3145737, 1, 0, -3080237, 1, 0, -3080236, 1, 0, -3080235, 1, 0, -3080234, 1, 0, -3080233, 1, 0, -3080232, 1, 0, -3080231, 1, 0, -3080230, 1, 0, -3080229, 1, 0, -3080228, 1, 0, -3080227, 1, 0, -3080226, 1, 0, -3080225, 1, 0, -3080224, 1, 0, -3080223, 1, 0, -3080222, 1, 0, -3080221, 1, 0, -3080220, 1, 0, -3080219, 1, 0, -3080218, 1, 0, -3080217, 1, 0, -3080216, 1, 0, -3080215, 1, 0, -3080214, 1, 0, -3080213, 1, 0, -3080212, 1, 0, -3080211, 1, 0, -3080210, 1, 0, -3080209, 1, 0, -3080208, 1, 0, -3080207, 1, 0, -3080206, 1, 0, -3080205, 1, 0, -3080204, 1, 0, -3080203, 1, 0, -3080202, 1, 0, -3080201, 1, 0, -3080200, 1, 0, -3080199, 1, 0, -3080198, 1, 0, -3014701, 1, 0, -3014700, 1, 0, -3014699, 1, 0, -3014698, 1, 0, -3014697, 1, 0, -3014696, 1, 0, -3014695, 1, 0, -3014694, 1, 0, -3014693, 1, 0, -3014692, 1, 0, -3014691, 1, 0, -3014690, 1, 0, -3014689, 1, 0, -3014688, 1, 0, -3014687, 1, 0, -3014686, 1, 0, -3014685, 1, 0, -3014684, 1, 0, -3014683, 1, 0, -3014682, 1, 0, -3014681, 1, 0, -3014680, 1, 0, -3014679, 1, 0, -3014678, 1, 0, -3014677, 1, 0, -3014676, 1, 0, -3014675, 1, 0, -3014674, 1, 0, -3014673, 1, 0, -3014672, 1, 0, -3014671, 1, 0, -3014670, 1, 0, -3014669, 1, 0, -3014668, 1, 0, -3014667, 1, 0, -3014666, 1, 0, -3014665, 1, 0, -3014664, 1, 0, -3014663, 1, 0, -3014662, 1, 0, -3014661, 1, 0, -3014660, 1, 0, -3014659, 1, 0, -3014658, 1, 0, -2949165, 1, 0, -2949164, 1, 0, -2949163, 1, 0, -2949162, 1, 0, -2949161, 1, 0, -2949160, 1, 0, -2949159, 1, 0, -2949158, 1, 0, -2949157, 1, 0, -2949156, 1, 0, -2949155, 1, 0, -2949154, 1, 0, -2949153, 1, 0, -2949152, 1, 0, -2949151, 1, 0, -2949150, 1, 0, -2949149, 1, 0, -2949148, 1, 0, -2949147, 1, 0, -2949146, 1, 0, -2949145, 1, 0, -2949144, 1, 0, -2949143, 1, 0, -2949142, 1, 0, -2949141, 1, 0, -2949140, 1, 0, -2949139, 1, 0, -2949138, 1, 0, -2949137, 1, 0, -2949136, 1, 0, -2949135, 1, 0, -2949134, 1, 0, -2949133, 1, 0, -2949132, 1, 0, -2949131, 1, 0, -2949130, 1, 0, -2949129, 1, 0, -2949128, 1, 0, -2949127, 1, 0, -2949126, 1, 0, -2949125, 1, 0, -2949124, 1, 0, -2949123, 1, 0, -2949122, 1, 0, -2949121, 1, 0, -3014656, 1, 0, -3014655, 1, 0, -3014654, 1, 0, -2883628, 1, 0, -2883627, 1, 0, -2883626, 1, 0, -2883625, 1, 0, -2883624, 1, 0, -2883623, 1, 0, -2883622, 1, 0, -2883621, 1, 0, -2883620, 1, 0, -2883619, 1, 0, -2883618, 1, 0, -2883617, 1, 0, -2883616, 1, 0, -2883615, 1, 0, -2883614, 1, 0, -2883613, 1, 0, -2883612, 1, 0, -2883611, 1, 0, -2883610, 1, 0, -2883609, 1, 0, -2883608, 1, 0, -2883607, 1, 0, -2883606, 1, 0, -2883605, 1, 0, -2883604, 1, 0, -2883603, 1, 0, -2883602, 1, 0, -2883601, 1, 0, -2883600, 1, 0, -2883599, 1, 0, -2883598, 1, 0, -2883597, 1, 0, -2883596, 1, 0, -2883595, 1, 0, -2883594, 1, 0, -2883593, 1, 0, -2883592, 1, 0, -2883591, 1, 0, -2883590, 1, 0, -2883589, 1, 0, -2883588, 1, 0, -2883587, 1, 0, -2883586, 1, 0, -2883585, 1, 0, -2949120, 1, 0, -2949119, 1, 0, -2949118, 1, 0, -2949117, 1, 0, -2949116, 1, 0, -2949115, 1, 0, -2949114, 1, 0, -2818092, 1, 0, -2818091, 1, 0, -2818090, 1, 0, -2818089, 1, 0, -2818088, 1, 0, -2818087, 1, 0, -2818086, 1, 0, -2818085, 1, 0, -2818084, 1, 0, -2818083, 1, 0, -2818082, 1, 0, -2818081, 1, 0, -2818080, 1, 0, -2818079, 1, 0, -2818078, 1, 0, -2818077, 1, 0, -2818076, 1, 0, -2818075, 1, 0, -2818074, 1, 0, -2818073, 1, 0, -2818072, 1, 0, -2818071, 1, 0, -2818070, 1, 0, -2818069, 1, 0, -2818068, 1, 0, -2818067, 1, 0, -2818066, 1, 0, -2818065, 1, 0, -2818064, 1, 0, -2818063, 1, 0, -2818062, 1, 0, -2818061, 1, 0, -2818060, 1, 0, -2818059, 1, 0, -2818058, 1, 0, -2818057, 1, 0, -2818056, 1, 0, -2818055, 1, 0, -2818054, 1, 0, -2818053, 1, 0, -2818052, 1, 0, -2818051, 1, 0, -2818050, 1, 0, -2818049, 1, 0, -2883584, 1, 0, -2883583, 1, 0, -2883582, 1, 0, -2883581, 1, 0, -2883580, 1, 0, -2883579, 1, 0, -2883578, 1, 0, -2883577, 1, 0, -2883576, 1, 0, -2752556, 1, 0, -2752555, 1, 0, -2752554, 1, 0, -2752553, 1, 0, -2752552, 1, 0, -2752551, 1, 0, -2752550, 1, 0, -2752549, 1, 0, -2752548, 1, 0, -2752547, 1, 0, -2752546, 1, 0, -2752545, 1, 0, -2752544, 1, 0, -2752543, 1, 0, -2752542, 1, 0, -2752541, 1, 0, -2752540, 1, 0, -2752539, 1, 0, -2752538, 1, 0, -2752537, 1, 0, -2752536, 1, 0, -2752535, 1, 0, -2752534, 1, 0, -2752533, 1, 0, -2752532, 1, 0, -2752531, 1, 0, -2752530, 1, 0, -2752529, 1, 0, -2752528, 1, 0, -2752527, 1, 0, -2752526, 1, 0, -2752525, 1, 0, -2752524, 1, 0, -2752523, 1, 0, -2752522, 1, 0, -2752521, 1, 0, -2752520, 1, 0, -2752519, 1, 0, -2752518, 1, 0, -2752517, 1, 0, -2752516, 1, 0, -2752515, 1, 0, -2752514, 1, 0, -2752513, 1, 0, -2818048, 1, 0, -2818047, 1, 0, -2818046, 1, 0, -2818045, 1, 0, -2818044, 1, 0, -2818043, 1, 0, -2818042, 1, 0, -2818041, 1, 0, -2818040, 1, 0, -2818039, 1, 0, -2818038, 1, 0, -2818037, 1, 0, -2818036, 1, 0, -2687020, 1, 0, -2687019, 1, 0, -2687018, 1, 0, -2687017, 1, 0, -2687016, 1, 0, -2687015, 1, 0, -2687014, 1, 0, -2687013, 1, 0, -2687012, 1, 0, -2687011, 1, 0, -2687010, 1, 0, -2687009, 1, 0, -2687008, 1, 0, -2687007, 1, 0, -2687006, 1, 0, -2687005, 1, 0, -2687004, 1, 0, -2687003, 1, 0, -2687002, 1, 0, -2687001, 1, 0, -2687000, 1, 0, -2686999, 1, 0, -2686998, 1, 0, -2686997, 1, 0, -2686996, 1, 0, -2686995, 1, 0, -2686994, 1, 0, -2686993, 1, 0, -2686992, 1, 0, -2686991, 1, 0, -2686990, 1, 0, -2686989, 1, 0, -2686988, 1, 0, -2686987, 1, 0, -2686986, 1, 0, -2686985, 1, 0, -2686984, 1, 0, -2686983, 1, 0, -2686982, 1, 0, -2686981, 1, 0, -2686980, 1, 0, -2686979, 1, 0, -2686978, 1, 0, -2686977, 1, 0, -2752512, 1, 0, -2752511, 1, 0, -2752510, 1, 0, -2752509, 1, 0, -2752508, 1, 0, -2752507, 1, 0, -2752506, 1, 0, -2752505, 1, 0, -2752504, 1, 0, -2752503, 1, 0, -2752502, 1, 0, -2752501, 1, 0, -2752500, 1, 0, -2752499, 1, 0, -2752498, 1, 0, -2752497, 1, 0, -2621484, 1, 0, -2621483, 1, 0, -2621482, 1, 0, -2621481, 1, 0, -2621480, 1, 0, -2621479, 1, 0, -2621478, 1, 0, -2621477, 1, 0, -2621476, 1, 0, -2621475, 1, 0, -2621474, 1, 0, -2621473, 1, 0, -2621472, 1, 0, -2621471, 1, 0, -2621470, 1, 0, -2621469, 1, 0, -2621468, 1, 0, -2621467, 1, 0, -2621466, 1, 0, -2621465, 1, 0, -2621464, 1, 0, -2621463, 1, 0, -2621462, 1, 0, -2621461, 1, 0, -2621460, 1, 0, -2621459, 1, 0, -2621458, 1, 0, -2621457, 1, 0, -2621456, 1, 0, -2621455, 1, 0, -2621454, 1, 0, -2621453, 1, 0, -2621452, 1, 0, -2621451, 1, 0, -2621450, 1, 0, -2621449, 1, 0, -2621448, 1, 0, -2621447, 1, 0, -2621446, 1, 0, -2621445, 1, 0, -2621444, 1, 0, -2621443, 1, 0, -2621442, 1, 0, -2621441, 1, 0, -2686976, 1, 0, -2686975, 1, 0, -2686974, 1, 0, -2686973, 1, 0, -2686972, 1, 0, -2686971, 1, 0, -2686970, 1, 0, -2686969, 1, 0, -2686968, 1, 0, -2686967, 1, 0, -2686966, 1, 0, -2686965, 1, 0, -2686964, 1, 0, -2686963, 1, 0, -2686962, 1, 0, -2686961, 1, 0, -2686960, 1, 0, -2686959, 1, 0, -2555948, 1, 0, -2555947, 1, 0, -2555946, 1, 0, -2555945, 1, 0, -2555944, 1, 0, -2555943, 1, 0, -2555942, 1, 0, -2555941, 1, 0, -2555940, 1, 0, -2555939, 1, 0, -2555938, 1, 0, -2555937, 1, 0, -2555936, 1, 0, -2555935, 1, 0, -2555934, 1, 0, -2555933, 1, 0, -2555932, 1, 0, -2555931, 1, 0, -2555930, 1, 0, -2555929, 1, 0, -2555928, 1, 0, -2555927, 1, 0, -2555926, 1, 0, -2555925, 1, 0, -2555924, 1, 0, -2555923, 1, 0, -2555922, 1, 0, -2555921, 1, 0, -2555920, 1, 0, -2555919, 1, 0, -2555918, 1, 0, -2555917, 1, 0, -2555916, 1, 0, -2555915, 1, 0, -2555914, 1, 0, -2555913, 1, 0, -2555912, 1, 0, -2555911, 1, 0, -2555910, 1, 0, -2555909, 1, 0, -2555908, 1, 0, -2555907, 1, 0, -2555906, 1, 0, -2555905, 1, 0, -2621440, 1, 0, -2621439, 1, 0, -2621438, 1, 0, -2621437, 1, 0, -2621436, 1, 0, -2621435, 1, 0, -2621434, 1, 0, -2621433, 1, 0, -2621432, 1, 0, -2621431, 1, 0, -2621430, 1, 0, -2621429, 1, 0, -2621428, 1, 0, -2621427, 1, 0, -2621426, 1, 0, -2621425, 1, 0, -2621424, 1, 0, -2621423, 1, 0, -2621422, 1, 0, -2621421, 1, 0, -2490412, 1, 0, -2490411, 1, 0, -2490410, 1, 0, -2490409, 1, 0, -2490408, 1, 0, -2490407, 1, 0, -2490406, 1, 0, -2490405, 1, 0, -2490404, 1, 0, -2490403, 1, 0, -2490402, 1, 0, -2490401, 1, 0, -2490400, 1, 0, -2490399, 1, 0, -2490398, 1, 0, -2490397, 1, 0, -2490396, 1, 0, -2490395, 1, 0, -2490394, 1, 0, -2490393, 1, 0, -2490392, 1, 0, -2490391, 1, 0, -2490390, 1, 0, -2490389, 1, 0, -2490388, 1, 0, -2490387, 1, 0, -2490386, 1, 0, -2490385, 1, 0, -2490384, 1, 0, -2490383, 1, 0, -2490382, 1, 0, -2490381, 1, 0, -2490380, 1, 0, -2490379, 1, 0, -2490378, 1, 0, -2490377, 1, 0, -2490376, 1, 0, -2490375, 1, 0, -2490374, 1, 0, -2490373, 1, 0, -2490372, 1, 0, -2490371, 1, 0, -2490370, 1, 0, -2490369, 1, 0, -2555904, 1, 0, -2555903, 1, 0, -2555902, 1, 0, -2555901, 1, 0, -2555900, 1, 0, -2555899, 1, 0, -2555898, 1, 0, -2555897, 1, 0, -2555896, 1, 0, -2555895, 1, 0, -2555894, 1, 0, -2555893, 1, 0, -2555892, 1, 0, -2555891, 1, 0, -2555890, 1, 0, -2555889, 1, 0, -2555888, 1, 0, -2555887, 1, 0, -2555886, 1, 0, -2555885, 1, 0, -2555884, 1, 0, -2555883, 1, 0, -2424876, 1, 0, -2424875, 1, 0, -2424874, 1, 0, -2424873, 1, 0, -2424872, 1, 0, -2424871, 1, 0, -2424870, 1, 0, -2424869, 1, 0, -2424868, 1, 0, -2424867, 1, 0, -2424866, 1, 0, -2424865, 1, 0, -2424864, 1, 0, -2424863, 1, 0, -2424862, 1, 0, -2424861, 1, 0, -2424860, 1, 0, -2424859, 1, 0, -2424858, 1, 0, -2424857, 1, 0, -2424856, 1, 0, -2424855, 1, 0, -2424854, 1, 0, -2424853, 1, 0, -2424852, 1, 0, -2424851, 1, 0, -2424850, 1, 0, -2424849, 1, 0, -2424848, 1, 0, -2424847, 1, 0, -2424846, 1, 0, -2424845, 1, 0, -2424844, 1, 0, -2424843, 1, 0, -2424842, 1, 0, -2424841, 1, 0, -2424840, 1, 0, -2424839, 1, 0, -2424838, 1, 0, -2424837, 1, 0, -2424836, 1, 0, -2424835, 1, 0, -2424834, 1, 0, -2424833, 1, 0, -2490368, 1, 0, -2490367, 1, 0, -2490366, 1, 0, -2490365, 1, 0, -2490364, 1, 0, -2490363, 1, 0, -2490362, 1, 0, -2490361, 1, 0, -2490360, 1, 0, -2490359, 1, 0, -2490358, 1, 0, -2490357, 1, 0, -2490356, 1, 0, -2490355, 1, 0, -2490354, 1, 0, -2490353, 1, 0, -2490352, 1, 0, -2490351, 1, 0, -2490350, 1, 0, -2490349, 1, 0, -2490348, 1, 0, -2490347, 1, 0, -2490346, 1, 0, -2490345, 1, 0, -2359339, 1, 0, -2359338, 1, 0, -2359337, 1, 0, -2359336, 1, 0, -2359335, 1, 0, -2359334, 1, 0, -2359333, 1, 0, -2359332, 1, 0, -2359331, 1, 0, -2359330, 1, 0, -2359329, 1, 0, -2359328, 1, 0, -2359327, 1, 0, -2359326, 1, 0, -2359325, 1, 0, -2359324, 1, 0, -2359323, 1, 0, -2359322, 1, 0, -2359321, 1, 0, -2359320, 1, 0, -2359319, 1, 0, -2359318, 1, 0, -2359317, 1, 0, -2359316, 1, 0, -2359315, 1, 0, -2359314, 1, 0, -2359313, 1, 0, -2359312, 1, 0, -2359311, 1, 0, -2359310, 1, 0, -2359309, 1, 0, -2359308, 1, 0, -2359307, 1, 0, -2359306, 1, 0, -2359305, 1, 0, -2359304, 1, 0, -2359303, 1, 0, -2359302, 1, 0, -2359301, 1, 0, -2359300, 1, 0, -2359299, 1, 0, -2359298, 1, 0, -2359297, 1, 0, -2424832, 1, 0, -2424831, 1, 0, -2424830, 1, 0, -2424829, 1, 0, -2424828, 1, 0, -2424827, 1, 0, -2424826, 1, 0, -2424825, 1, 0, -2424824, 1, 0, -2424823, 1, 0, -2424822, 1, 0, -2424821, 1, 0, -2424820, 1, 0, -2424819, 1, 0, -2424818, 1, 0, -2424817, 1, 0, -2424816, 1, 0, -2424815, 1, 0, -2424814, 1, 0, -2424813, 1, 0, -2424812, 1, 0, -2424811, 1, 0, -2424810, 1, 0, -2424809, 1, 0, -2424808, 1, 0, -2424807, 1, 0, -2424806, 1, 0, -2293803, 1, 0, -2293802, 1, 0, -2293801, 1, 0, -2293800, 1, 0, -2293799, 1, 0, -2293798, 1, 0, -2293797, 1, 0, -2293796, 1, 0, -2293795, 1, 0, -2293794, 1, 0, -2293793, 1, 0, -2293792, 1, 0, -2293791, 1, 0, -2293790, 1, 0, -2293789, 1, 0, -2293788, 1, 0, -2293787, 1, 0, -2293786, 1, 0, -2293785, 1, 0, -2293784, 1, 0, -2293783, 1, 0, -2293782, 1, 0, -2293781, 1, 0, -2293780, 1, 0, -2293779, 1, 0, -2293778, 1, 0, -2293777, 1, 0, -2293776, 1, 0, -2293775, 1, 0, -2293774, 1, 0, -2293773, 1, 0, -2293772, 1, 0, -2293771, 1, 0, -2293770, 1, 0, -2293769, 1, 0, -2293768, 1, 0, -2293767, 1, 0, -2293766, 1, 0, -2293765, 1, 0, -2293764, 1, 0, -2293763, 1, 0, -2293762, 1, 0, -2293761, 1, 0, -2359296, 1, 0, -2359295, 1, 0, -2359294, 1, 0, -2359293, 1, 0, -2359292, 1, 0, -2359291, 1, 0, -2359290, 1, 0, -2359289, 1, 0, -2359288, 1, 0, -2359287, 1, 0, -2359286, 1, 0, -2359285, 1, 0, -2359284, 1, 0, -2359283, 1, 0, -2359282, 1, 0, -2359281, 1, 0, -2359280, 1, 0, -2359279, 1, 0, -2359278, 1, 0, -2359277, 1, 0, -2359276, 1, 0, -2359275, 1, 0, -2359274, 1, 0, -2359273, 1, 0, -2359272, 1, 0, -2359271, 1, 0, -2359270, 1, 0, -2359269, 1, 0, -2359268, 1, 0, -2228267, 1, 0, -2228266, 1, 0, -2228265, 1, 0, -2228264, 1, 0, -2228263, 1, 0, -2228262, 1, 0, -2228261, 1, 0, -2228260, 1, 0, -2228259, 1, 0, -2228258, 1, 0, -2228257, 1, 0, -2228256, 1, 0, -2228255, 1, 0, -2228254, 1, 0, -2228253, 1, 0, -2228252, 1, 0, -2228251, 1, 0, -2228250, 1, 0, -2228249, 1, 0, -2228248, 1, 0, -2228247, 1, 0, -2228246, 1, 0, -2228245, 1, 0, -2228244, 1, 0, -2228243, 1, 0, -2228242, 1, 0, -2228241, 1, 0, -2228240, 1, 0, -2228239, 1, 0, -2228238, 1, 0, -2228237, 1, 0, -2228236, 1, 0, -2228235, 1, 0, -2228234, 1, 0, -2228233, 1, 0, -2228232, 1, 0, -2228231, 1, 0, -2228230, 1, 0, -2228229, 1, 0, -2228228, 1, 0, -2228227, 1, 0, -2228226, 1, 0, -2228225, 1, 0, -2293760, 1, 0, -2293759, 1, 0, -2293758, 1, 0, -2293757, 1, 0, -2293756, 1, 0, -2293755, 1, 0, -2293754, 1, 0, -2293753, 1, 0, -2293752, 1, 0, -2293751, 1, 0, -2293750, 1, 0, -2293749, 1, 0, -2293748, 1, 0, -2293747, 1, 0, -2293746, 1, 0, -2293745, 1, 0, -2293744, 1, 0, -2293743, 1, 0, -2293742, 1, 0, -2293741, 1, 0, -2293740, 1, 0, -2293739, 1, 0, -2293738, 1, 0, -2293737, 1, 0, -2293736, 1, 0, -2293735, 1, 0, -2293734, 1, 0, -2293733, 1, 0, -2293732, 1, 0, -2293731, 1, 0, -2293730, 1, 0, -2293729, 1, 0, -2293728, 1, 0, -2162731, 1, 0, -2162730, 1, 0, -2162729, 1, 0, -2162728, 1, 0, -2162727, 1, 0, -2162726, 1, 0, -2162725, 1, 0, -2162724, 1, 0, -2162723, 1, 0, -2162722, 1, 0, -2162721, 1, 0, -2162720, 1, 0, -2162719, 1, 0, -2162718, 1, 0, -2162717, 1, 0, -2162716, 1, 0, -2162715, 1, 0, -2162714, 1, 0, -2162713, 1, 0, -2162712, 1, 0, -2162711, 1, 0, -2162710, 1, 0, -2162709, 1, 0, -2162708, 1, 0, -2162707, 1, 0, -2162706, 1, 0, -2162705, 1, 0, -2162704, 1, 0, -2162703, 1, 0, -2162702, 1, 0, -2162701, 1, 0, -2162700, 1, 0, -2162699, 1, 0, -2162698, 1, 0, -2162697, 1, 0, -2162696, 1, 0, -2162695, 1, 0, -2162694, 1, 0, -2162693, 1, 0, -2162692, 1, 0, -2162691, 1, 0, -2162690, 1, 0, -2162689, 1, 0, -2228224, 1, 0, -2228223, 1, 0, -2228222, 1, 0, -2228221, 1, 0, -2228220, 1, 0, -2228219, 1, 0, -2228218, 1, 0, -2228217, 1, 0, -2228216, 1, 0, -2228215, 1, 0, -2228214, 1, 0, -2228213, 1, 0, -2228212, 1, 0, -2228211, 1, 0, -2228210, 1, 0, -2228209, 1, 0, -2228208, 1, 0, -2228207, 1, 0, -2228206, 1, 0, -2228205, 1, 0, -2228204, 1, 0, -2228203, 1, 0, -2228202, 1, 0, -2228201, 1, 0, -2228200, 1, 0, -2228199, 1, 0, -2228198, 1, 0, -2228197, 1, 0, -2228196, 1, 0, -2228195, 1, 0, -2228194, 1, 0, -2228193, 1, 0, -2228192, 1, 0, -2097194, 1, 0, -2097193, 1, 0, -2097192, 1, 0, -2097191, 1, 0, -2097190, 1, 0, -2097189, 1, 0, -2097188, 1, 0, -2097187, 1, 0, -2097186, 1, 0, -2097185, 1, 0, -2097184, 1, 0, -2097183, 1, 0, -2097182, 1, 0, -2097181, 1, 0, -2097180, 1, 0, -2097179, 1, 0, -2097178, 1, 0, -2097177, 1, 0, -2097176, 1, 0, -2097175, 1, 0, -2097174, 1, 0, -2097173, 1, 0, -2097172, 1, 0, -2097171, 1, 0, -2097170, 1, 0, -2097169, 1, 0, -2097168, 1, 0, -2097167, 1, 0, -2097166, 1, 0, -2097165, 1, 0, -2097164, 1, 0, -2097163, 1, 0, -2097162, 1, 0, -2097161, 1, 0, -2097160, 1, 0, -2097159, 1, 0, -2097158, 1, 0, -2097157, 1, 0, -2097156, 1, 0, -2097155, 1, 0, -2097154, 1, 0, -2097153, 1, 0, -2162688, 1, 0, -2162687, 1, 0, -2162686, 1, 0, -2162685, 1, 0, -2162684, 1, 0, -2162683, 1, 0, -2162682, 1, 0, -2162681, 1, 0, -2162680, 1, 0, -2162679, 1, 0, -2162678, 1, 0, -2162677, 1, 0, -2162676, 1, 0, -2162675, 1, 0, -2162674, 1, 0, -2162673, 1, 0, -2162672, 1, 0, -2162671, 1, 0, -2162670, 1, 0, -2162669, 1, 0, -2162668, 1, 0, -2162667, 1, 0, -2162666, 1, 0, -2162665, 1, 0, -2162664, 1, 0, -2162663, 1, 0, -2162662, 1, 0, -2162661, 1, 0, -2162660, 1, 0, -2162659, 1, 0, -2162658, 1, 0, -2162657, 1, 0, -2162656, 1, 0, -2162655, 1, 0, -2162654, 1, 0, -2031658, 1, 0, -2031657, 1, 0, -2031656, 1, 0, -2031655, 1, 0, -2031654, 1, 0, -2031653, 1, 0, -2031652, 1, 0, -2031651, 1, 0, -2031650, 1, 0, -2031649, 1, 0, -2031648, 1, 0, -2031647, 1, 0, -2031646, 1, 0, -2031645, 1, 0, -2031644, 1, 0, -2031643, 1, 0, -2031642, 1, 0, -2031641, 1, 0, -2031640, 1, 0, -2031639, 1, 0, -2031638, 1, 0, -2031637, 1, 0, -2031636, 1, 0, -2031635, 1, 0, -2031634, 1, 0, -2031633, 1, 0, -2031632, 1, 0, -2031631, 1, 0, -2031630, 1, 0, -2031629, 1, 0, -2031628, 1, 0, -2031627, 1, 0, -2031626, 1, 0, -2031625, 1, 0, -2031624, 1, 0, -2031623, 1, 0, -2031622, 1, 0, -2031621, 1, 0, -2031620, 1, 0, -2031619, 1, 0, -2031618, 1, 0, -2031617, 1, 0, -2097152, 1, 0, -2097151, 1, 0, -2097150, 1, 0, -2097149, 1, 0, -2097148, 1, 0, -2097147, 1, 0, -2097146, 1, 0, -2097145, 1, 0, -2097144, 1, 0, -2097143, 1, 0, -2097142, 1, 0, -2097141, 1, 0, -2097140, 1, 0, -2097139, 1, 0, -2097138, 1, 0, -2097137, 1, 0, -2097136, 1, 0, -2097135, 1, 0, -2097134, 1, 0, -2097133, 1, 0, -2097132, 1, 0, -2097131, 1, 0, -2097130, 1, 0, -2097129, 1, 0, -2097128, 1, 0, -2097127, 1, 0, -2097126, 1, 0, -2097125, 1, 0, -2097124, 1, 0, -2097123, 1, 0, -2097122, 1, 0, -2097121, 1, 0, -2097120, 1, 0, -2097119, 1, 0, -2097118, 1, 0, -2097117, 1, 0, -2097116, 1, 0, -1966122, 1, 0, -1966121, 1, 0, -1966120, 1, 0, -1966119, 1, 0, -1966118, 1, 0, -1966117, 1, 0, -1966116, 1, 0, -1966115, 1, 0, -1966114, 1, 0, -1966113, 1, 0, -1966112, 1, 0, -1966111, 1, 0, -1966110, 1, 0, -1966109, 1, 0, -1966108, 1, 0, -1966107, 1, 0, -1966106, 1, 0, -1966105, 1, 0, -1966104, 1, 0, -1966103, 1, 0, -1966102, 1, 0, -1966101, 1, 0, -1966100, 1, 0, -1966099, 1, 0, -1966098, 1, 0, -1966097, 1, 0, -1966096, 1, 0, -1966095, 1, 0, -1966094, 1, 0, -1966093, 1, 0, -1966092, 1, 0, -1966091, 1, 0, -1966090, 1, 0, -1966089, 1, 0, -1966088, 1, 0, -1966087, 1, 0, -1966086, 1, 0, -1966085, 1, 0, -1966084, 1, 0, -1966083, 1, 0, -1966082, 1, 0, -1966081, 1, 0, -2031616, 1, 0, -2031615, 1, 0, -2031614, 1, 0, -2031613, 1, 0, -2031612, 1, 0, -2031611, 1, 0, -2031610, 1, 0, -2031609, 1, 0, -2031608, 1, 0, -2031607, 1, 0, -2031606, 1, 0, -2031605, 1, 0, -2031604, 1, 0, -2031603, 1, 0, -2031602, 1, 0, -2031601, 1, 0, -2031600, 1, 0, -2031599, 1, 0, -2031598, 1, 0, -2031597, 1, 0, -2031596, 1, 0, -2031595, 1, 0, -2031594, 1, 0, -2031593, 1, 0, -2031592, 1, 0, -2031591, 1, 0, -2031590, 1, 0, -2031589, 1, 0, -2031588, 1, 0, -2031587, 1, 0, -2031586, 1, 0, -2031585, 1, 0, -2031584, 1, 0, -2031583, 1, 0, -2031582, 1, 0, -2031581, 1, 0, -2031580, 1, 0, -2031579, 1, 0, -2031578, 1, 0, -1900586, 1, 0, -1900585, 1, 0, -1900584, 1, 0, -1900583, 1, 0, -1900582, 1, 0, -1900581, 1, 0, -1900580, 1, 0, -1900579, 1, 0, -1900578, 1, 0, -1900577, 1, 0, -1900576, 1, 0, -1900575, 1, 0, -1900574, 1, 0, -1900573, 1, 0, -1900572, 1, 0, -1900571, 1, 0, -1900570, 1, 0, -1900569, 1, 0, -1900568, 1, 0, -1900567, 1, 0, -1900566, 1, 0, -1900565, 1, 0, -1900564, 1, 0, -1900563, 1, 0, -1900562, 1, 0, -1900561, 1, 0, -1900560, 1, 0, -1900559, 1, 0, -1900558, 1, 0, -1900557, 1, 0, -1900556, 1, 0, -1900555, 1, 0, -1900554, 1, 0, -1900553, 1, 0, -1900552, 1, 0, -1900551, 1, 0, -1900550, 1, 0, -1900549, 1, 0, -1900548, 1, 0, -1900547, 1, 0, -1900546, 1, 0, -1900545, 1, 0, -1966080, 1, 0, -1966079, 1, 0, -1966078, 1, 0, -1966077, 1, 0, -1966076, 1, 0, -1966075, 1, 0, -1966074, 1, 0, -1966073, 1, 0, -1966072, 1, 0, -1966071, 1, 0, -1966070, 1, 0, -1966069, 1, 0, -1966068, 1, 0, -1966067, 1, 0, -1966066, 1, 0, -1966065, 1, 0, -1966064, 1, 0, -1966063, 1, 0, -1966062, 1, 0, -1966061, 1, 0, -1966060, 1, 0, -1966059, 1, 0, -1966058, 1, 0, -1966057, 1, 0, -1966056, 1, 0, -1966055, 1, 0, -1966054, 1, 0, -1966053, 1, 0, -1966052, 1, 0, -1966051, 1, 0, -1966050, 1, 0, -1966049, 1, 0, -1966048, 1, 0, -1966047, 1, 0, -1966046, 1, 0, -1966045, 1, 0, -1966044, 1, 0, -1966043, 1, 0, -1966042, 1, 0, -1966041, 1, 0, -1966040, 1, 0, -1835050, 1, 0, -1835049, 1, 0, -1835048, 1, 0, -1835047, 1, 0, -1835046, 1, 0, -1835045, 1, 0, -1835044, 1, 0, -1835043, 1, 0, -1835042, 1, 0, -1835041, 1, 0, -1835040, 1, 0, -1835039, 1, 0, -1835038, 1, 0, -1835037, 1, 0, -1835036, 1, 0, -1835035, 1, 0, -1835034, 1, 0, -1835033, 1, 0, -1835032, 1, 0, -1835031, 1, 0, -1835030, 1, 0, -1835029, 1, 0, -1835028, 1, 0, -1835027, 1, 0, -1835026, 1, 0, -1835025, 1, 0, -1835024, 1, 0, -1835023, 1, 0, -1835022, 1, 0, -1835021, 1, 0, -1835020, 1, 0, -1835019, 1, 0, -1835018, 1, 0, -1835017, 1, 0, -1835016, 1, 0, -1835015, 1, 0, -1835014, 1, 0, -1835013, 1, 0, -1835012, 1, 0, -1835011, 1, 0, -1835010, 1, 0, -1835009, 1, 0, -1900544, 1, 0, -1900543, 1, 0, -1900542, 1, 0, -1900541, 1, 0, -1900540, 1, 0, -1900539, 1, 0, -1900538, 1, 0, -1900537, 1, 0, -1900536, 1, 0, -1900535, 1, 0, -1900534, 1, 0, -1900533, 1, 0, -1900532, 1, 0, -1900531, 1, 0, -1900530, 1, 0, -1900529, 1, 0, -1900528, 1, 0, -1900527, 1, 0, -1900526, 1, 0, -1900525, 1, 0, -1900524, 1, 0, -1900523, 1, 0, -1900522, 1, 0, -1900521, 1, 0, -1900520, 1, 0, -1900519, 1, 0, -1900518, 1, 0, -1900517, 1, 0, -1900516, 1, 0, -1900515, 1, 0, -1900514, 1, 0, -1900513, 1, 0, -1900512, 1, 0, -1900511, 1, 0, -1900510, 1, 0, -1900509, 1, 0, -1900508, 1, 0, -1900507, 1, 0, -1900506, 1, 0, -1900505, 1, 0, -1900504, 1, 0, -1900503, 1, 0, -1769514, 1, 0, -1769513, 1, 0, -1769512, 1, 0, -1769511, 1, 0, -1769510, 1, 0, -1769509, 1, 0, -1769508, 1, 0, -1769507, 1, 0, -1769506, 1, 0, -1769505, 1, 0, -1769504, 1, 0, -1769503, 1, 0, -1769502, 1, 0, -1769501, 1, 0, -1769500, 1, 0, -1769499, 1, 0, -1769498, 1, 0, -1769497, 1, 0, -1769496, 1, 0, -1769495, 1, 0, -1769494, 1, 0, -1769493, 1, 0, -1769492, 1, 0, -1769491, 1, 0, -1769490, 1, 0, -1769489, 1, 0, -1769488, 1, 0, -1769487, 1, 0, -1769486, 1, 0, -1769485, 1, 0, -1769484, 1, 0, -1769483, 1, 0, -1769482, 1, 0, -1769481, 1, 0, -1769480, 1, 0, -1769479, 1, 0, -1769478, 1, 0, -1769477, 1, 0, -1769476, 1, 0, -1769475, 1, 0, -1769474, 1, 0, -1769473, 1, 0, -1835008, 1, 0, -1835007, 1, 0, -1835006, 1, 0, -1835005, 1, 0, -1835004, 1, 0, -1835003, 1, 0, -1835002, 1, 0, -1835001, 1, 0, -1835000, 1, 0, -1834999, 1, 0, -1834998, 1, 0, -1834997, 1, 0, -1834996, 1, 0, -1834995, 1, 0, -1834994, 1, 0, -1834993, 1, 0, -1834992, 1, 0, -1834991, 1, 0, -1834990, 1, 0, -1834989, 1, 0, -1834988, 1, 0, -1834987, 1, 0, -1834986, 1, 0, -1834985, 1, 0, -1834984, 1, 0, -1834983, 1, 0, -1834982, 1, 0, -1834981, 1, 0, -1834980, 1, 0, -1834979, 1, 0, -1834978, 1, 0, -1834977, 1, 0, -1834976, 1, 0, -1834975, 1, 0, -1834974, 1, 0, -1834973, 1, 0, -1834972, 1, 0, -1834971, 1, 0, -1834970, 1, 0, -1834969, 1, 0, -1834968, 1, 0, -1834967, 1, 0, -1834966, 1, 0, -1703977, 1, 0, -1703976, 1, 0, -1703975, 1, 0, -1703974, 1, 0, -1703973, 1, 0, -1703972, 1, 0, -1703971, 1, 0, -1703970, 1, 0, -1703969, 1, 0, -1703968, 1, 0, -1703967, 1, 0, -1703966, 1, 0, -1703965, 1, 0, -1703964, 1, 0, -1703963, 1, 0, -1703962, 1, 0, -1703961, 1, 0, -1703960, 1, 0, -1703959, 1, 0, -1703958, 1, 0, -1703957, 1, 0, -1703956, 1, 0, -1703955, 1, 0, -1703954, 1, 0, -1703953, 1, 0, -1703952, 1, 0, -1703951, 1, 0, -1703950, 1, 0, -1703949, 1, 0, -1703948, 1, 0, -1703947, 1, 0, -1703946, 1, 0, -1703945, 1, 0, -1703944, 1, 0, -1703943, 1, 0, -1703942, 1, 0, -1703941, 1, 0, -1703940, 1, 0, -1703939, 1, 0, -1703938, 1, 0, -1703937, 1, 0, -1769472, 1, 0, -1769471, 1, 0, -1769470, 1, 0, -1769469, 1, 0, -1769468, 1, 0, -1769467, 1, 0, -1769466, 1, 0, -1769465, 1, 0, -1769464, 1, 0, -1769463, 1, 0, -1769462, 1, 0, -1769461, 1, 0, -1769460, 1, 0, -1769459, 1, 0, -1769458, 1, 0, -1769457, 1, 0, -1769456, 1, 0, -1769455, 1, 0, -1769454, 1, 0, -1769453, 1, 0, -1769452, 1, 0, -1769451, 1, 0, -1769450, 1, 0, -1769449, 1, 0, -1769448, 1, 0, -1769447, 1, 0, -1769446, 1, 0, -1769445, 1, 0, -1769444, 1, 0, -1769443, 1, 0, -1769442, 1, 0, -1769441, 1, 0, -1769440, 1, 0, -1769439, 1, 0, -1769438, 1, 0, -1769437, 1, 0, -1769436, 1, 0, -1769435, 1, 0, -1769434, 1, 0, -1769433, 1, 0, -1769432, 1, 0, -1769431, 1, 0, -1769430, 1, 0, -1769429, 1, 0, -1769428, 1, 0, -1638441, 1, 0, -1638440, 1, 0, -1638439, 1, 0, -1638438, 1, 0, -1638437, 1, 0, -1638436, 1, 0, -1638435, 1, 0, -1638434, 1, 0, -1638433, 1, 0, -1638432, 1, 0, -1638431, 1, 0, -1638430, 1, 0, -1638429, 1, 0, -1638428, 1, 0, -1638427, 1, 0, -1638426, 1, 0, -1638425, 1, 0, -1638424, 1, 0, -1638423, 1, 0, -1638422, 1, 0, -1638421, 1, 0, -1638420, 1, 0, -1638419, 1, 0, -1638418, 1, 0, -1638417, 1, 0, -1638416, 1, 0, -1638415, 1, 0, -1638414, 1, 0, -1638413, 1, 0, -1638412, 1, 0, -1638411, 1, 0, -1638410, 1, 0, -1638409, 1, 0, -1638408, 1, 0, -1638407, 1, 0, -1638406, 1, 0, -1638405, 1, 0, -1638404, 1, 0, -1638403, 1, 0, -1638402, 1, 0, -1638401, 1, 0, -1703936, 1, 0, -1703935, 1, 0, -1703934, 1, 0, -1703933, 1, 0, -1703932, 1, 0, -1703931, 1, 0, -1703930, 1, 0, -1703929, 1, 0, -1703928, 1, 0, -1703927, 1, 0, -1703926, 1, 0, -1703925, 1, 0, -1703924, 1, 0, -1703923, 1, 0, -1703922, 1, 0, -1703921, 1, 0, -1703920, 1, 0, -1703919, 1, 0, -1703918, 1, 0, -1703917, 1, 0, -1703916, 1, 0, -1703915, 1, 0, -1703914, 1, 0, -1703913, 1, 0, -1703912, 1, 0, -1703911, 1, 0, -1703910, 1, 0, -1703909, 1, 0, -1703908, 1, 0, -1703907, 1, 0, -1703906, 1, 0, -1703905, 1, 0, -1703904, 1, 0, -1703903, 1, 0, -1703902, 1, 0, -1703901, 1, 0, -1703900, 1, 0, -1703899, 1, 0, -1703898, 1, 0, -1703897, 1, 0, -1703896, 1, 0, -1703895, 1, 0, -1703894, 1, 0, -1703893, 1, 0, -1703892, 1, 0, -1703891, 1, 0, -1572905, 1, 0, -1572904, 1, 0, -1572903, 1, 0, -1572902, 1, 0, -1572901, 1, 0, -1572900, 1, 0, -1572899, 1, 0, -1572898, 1, 0, -1572897, 1, 0, -1572896, 1, 0, -1572895, 1, 0, -1572894, 1, 0, -1572893, 1, 0, -1572892, 1, 0, -1572891, 1, 0, -1572890, 1, 0, -1572889, 1, 0, -1572888, 1, 0, -1572887, 1, 0, -1572886, 1, 0, -1572885, 1, 0, -1572884, 1, 0, -1572883, 1, 0, -1572882, 1, 0, -1572881, 1, 0, -1572880, 1, 0, -1572879, 1, 0, -1572878, 1, 0, -1572877, 1, 0, -1572876, 1, 0, -1572875, 1, 0, -1572874, 1, 0, -1572873, 1, 0, -1572872, 1, 0, -1572871, 1, 0, -1572870, 1, 0, -1572869, 1, 0, -1572868, 1, 0, -1572867, 1, 0, -1572866, 1, 0, -1572865, 1, 0, -1638400, 1, 0, -1638399, 1, 0, -1638398, 1, 0, -1638397, 1, 0, -1638396, 1, 0, -1638395, 1, 0, -1638394, 1, 0, -1638393, 1, 0, -1638392, 1, 0, -1638391, 1, 0, -1638390, 1, 0, -1638389, 1, 0, -1638388, 1, 0, -1638387, 1, 0, -1638386, 1, 0, -1638385, 1, 0, -1638384, 1, 0, -1638383, 1, 0, -1638382, 1, 0, -1638381, 1, 0, -1638380, 1, 0, -1638379, 1, 0, -1638378, 1, 0, -1638377, 1, 0, -1638376, 1, 0, -1638375, 1, 0, -1638374, 1, 0, -1638373, 1, 0, -1638372, 1, 0, -1638371, 1, 0, -1638370, 1, 0, -1638369, 1, 0, -1638368, 1, 0, -1638367, 1, 0, -1638366, 1, 0, -1638365, 1, 0, -1638364, 1, 0, -1638363, 1, 0, -1638362, 1, 0, -1638361, 1, 0, -1638360, 1, 0, -1638359, 1, 0, -1638358, 1, 0, -1638357, 1, 0, -1638356, 1, 0, -1638355, 1, 0, -1638354, 1, 0, -1507369, 1, 0, -1507368, 1, 0, -1507367, 1, 0, -1507366, 1, 0, -1507365, 1, 0, -1507364, 1, 0, -1507363, 1, 0, -1507362, 1, 0, -1507361, 1, 0, -1507360, 1, 0, -1507359, 1, 0, -1507358, 1, 0, -1507357, 1, 0, -1507356, 1, 0, -1507355, 1, 0, -1507354, 1, 0, -1507353, 1, 0, -1507352, 1, 0, -1507351, 1, 0, -1507350, 1, 0, -1507349, 1, 0, -1507348, 1, 0, -1507347, 1, 0, -1507346, 1, 0, -1507345, 1, 0, -1507344, 1, 0, -1507343, 1, 0, -1507342, 1, 0, -1507341, 1, 0, -1507340, 1, 0, -1507339, 1, 0, -1507338, 1, 0, -1507337, 1, 0, -1507336, 1, 0, -1507335, 1, 0, -1507334, 1, 0, -1507333, 1, 0, -1507332, 1, 0, -1507331, 1, 0, -1507330, 1, 0, -1507329, 1, 0, -1572864, 1, 0, -1572863, 1, 0, -1572862, 1, 0, -1572861, 1, 0, -1572860, 1, 0, -1572859, 1, 0, -1572858, 1, 0, -1572857, 1, 0, -1572856, 1, 0, -1572855, 1, 0, -1572854, 1, 0, -1572853, 1, 0, -1572852, 1, 0, -1572851, 1, 0, -1572850, 1, 0, -1572849, 1, 0, -1572848, 1, 0, -1572847, 1, 0, -1572846, 1, 0, -1572845, 1, 0, -1572844, 1, 0, -1572843, 1, 0, -1572842, 1, 0, -1572841, 1, 0, -1572840, 1, 0, -1572839, 1, 0, -1572838, 1, 0, -1572837, 1, 0, -1572836, 1, 0, -1572835, 1, 0, -1572834, 1, 0, -1572833, 1, 0, -1572832, 1, 0, -1572831, 1, 0, -1572830, 1, 0, -1572829, 1, 0, -1572828, 1, 0, -1572827, 1, 0, -1572826, 1, 0, -1572825, 1, 0, -1572824, 1, 0, -1572823, 1, 0, -1572822, 1, 0, -1572821, 1, 0, -1572820, 1, 0, -1572819, 1, 0, -1572818, 1, 0, -1572817, 1, 0, -1441833, 1, 0, -1441832, 1, 0, -1441831, 1, 0, -1441830, 1, 0, -1441829, 1, 0, -1441828, 1, 0, -1441827, 1, 0, -1441826, 1, 0, -1441825, 1, 0, -1441824, 1, 0, -1441823, 1, 0, -1441822, 1, 0, -1441821, 1, 0, -1441820, 1, 0, -1441819, 1, 0, -1441818, 1, 0, -1441817, 1, 0, -1441816, 1, 0, -1441815, 1, 0, -1441814, 1, 0, -1441813, 1, 0, -1441812, 1, 0, -1441811, 1, 0, -1441810, 1, 0, -1441809, 1, 0, -1441808, 1, 0, -1441807, 1, 0, -1441806, 1, 0, -1441805, 1, 0, -1441804, 1, 0, -1441803, 1, 0, -1441802, 1, 0, -1441801, 1, 0, -1441800, 1, 0, -1441799, 1, 0, -1441798, 1, 0, -1441797, 1, 0, -1441796, 1, 0, -1441795, 1, 0, -1441794, 1, 0, -1441793, 1, 0, -1507328, 1, 0, -1507327, 1, 0, -1507326, 1, 0, -1507325, 1, 0, -1507324, 1, 0, -1507323, 1, 0, -1507322, 1, 0, -1507321, 1, 0, -1507320, 1, 0, -1507319, 1, 0, -1507318, 1, 0, -1507317, 1, 0, -1507316, 1, 0, -1507315, 1, 0, -1507314, 1, 0, -1507313, 1, 0, -1507312, 1, 0, -1507311, 1, 0, -1507310, 1, 0, -1507309, 1, 0, -1507308, 1, 0, -1507307, 1, 0, -1507306, 1, 0, -1507305, 1, 0, -1507304, 1, 0, -1507303, 1, 0, -1507302, 1, 0, -1507301, 1, 0, -1507300, 1, 0, -1507299, 1, 0, -1507298, 1, 0, -1507297, 1, 0, -1507296, 1, 0, -1507295, 1, 0, -1507294, 1, 0, -1507293, 1, 0, -1507292, 1, 0, -1507291, 1, 0, -1507290, 1, 0, -1507289, 1, 0, -1507288, 1, 0, -1507287, 1, 0, -1507286, 1, 0, -1507285, 1, 0, -1507284, 1, 0, -1507283, 1, 0, -1507282, 1, 0, -1507281, 1, 0, -1507280, 1, 0, -1376297, 1, 0, -1376296, 1, 0, -1376295, 1, 0, -1376294, 1, 0, -1376293, 1, 0, -1376292, 1, 0, -1376291, 1, 0, -1376290, 1, 0, -1376289, 1, 0, -1376288, 1, 0, -1376287, 1, 0, -1376286, 1, 0, -1376285, 1, 0, -1376284, 1, 0, -1376283, 1, 0, -1376282, 1, 0, -1376281, 1, 0, -1376280, 1, 0, -1376279, 1, 0, -1376278, 1, 0, -1376277, 1, 0, -1376276, 1, 0, -1376275, 1, 0, -1376274, 1, 0, -1376273, 1, 0, -1376272, 1, 0, -1376271, 1, 0, -1376270, 1, 0, -1376269, 1, 0, -1376268, 1, 0, -1376267, 1, 0, -1376266, 1, 0, -1376265, 1, 0, -1376264, 1, 0, -1376263, 1, 0, -1376262, 1, 0, -1376261, 1, 0, -1376260, 1, 0, -1376259, 1, 0, -1376258, 1, 0, -1376257, 1, 0, -1441792, 1, 0, -1441791, 1, 0, -1441790, 1, 0, -1441789, 1, 0, -1441788, 1, 0, -1441787, 1, 0, -1441786, 1, 0, -1441785, 1, 0, -1441784, 1, 0, -1441783, 1, 0, -1441782, 1, 0, -1441781, 1, 0, -1441780, 1, 0, -1441779, 1, 0, -1441778, 1, 0, -1441777, 1, 0, -1441776, 1, 0, -1441775, 1, 0, -1441774, 1, 0, -1441773, 1, 0, -1441772, 1, 0, -1441771, 1, 0, -1441770, 1, 0, -1441769, 1, 0, -1441768, 1, 0, -1441767, 1, 0, -1441766, 1, 0, -1441765, 1, 0, -1441764, 1, 0, -1441763, 1, 0, -1441762, 1, 0, -1441761, 1, 0, -1441760, 1, 0, -1441759, 1, 0, -1441758, 1, 0, -1441757, 1, 0, -1441756, 1, 0, -1441755, 1, 0, -1441754, 1, 0, -1441753, 1, 0, -1441752, 1, 0, -1441751, 1, 0, -1441750, 1, 0, -1441749, 1, 0, -1441748, 1, 0, -1441747, 1, 0, -1441746, 1, 0, -1441745, 1, 0, -1441744, 1, 0, -1310760, 1, 0, -1310759, 1, 0, -1310758, 1, 0, -1310757, 1, 0, -1310756, 1, 0, -1310755, 1, 0, -1310754, 1, 0, -1310753, 1, 0, -1310752, 1, 0, -1310751, 1, 0, -1310750, 1, 0, -1310749, 1, 0, -1310748, 1, 0, -1310747, 1, 0, -1310746, 1, 0, -1310745, 1, 0, -1310744, 1, 0, -1310743, 1, 0, -1310742, 1, 0, -1310741, 1, 0, -1310740, 1, 0, -1310739, 1, 0, -1310738, 1, 0, -1310737, 1, 0, -1310736, 1, 0, -1310735, 1, 0, -1310734, 1, 0, -1310733, 1, 0, -1310732, 1, 0, -1310731, 1, 0, -1310730, 1, 0, -1310729, 1, 0, -1310728, 1, 0, -1310727, 1, 0, -1310726, 1, 0, -1310725, 1, 0, -1310724, 1, 0, -1310723, 1, 0, -1310722, 1, 0, -1310721, 1, 0, -1376256, 1, 0, -1376255, 1, 0, -1376254, 1, 0, -1376253, 1, 0, -1376252, 1, 0, -1376251, 1, 0, -1376250, 1, 0, -1376249, 1, 0, -1376248, 1, 0, -1376247, 1, 0, -1376246, 1, 0, -1376245, 1, 0, -1376244, 1, 0, -1376243, 1, 0, -1376242, 1, 0, -1376241, 1, 0, -1376240, 1, 0, -1376239, 1, 0, -1376238, 1, 0, -1376237, 1, 0, -1376236, 1, 0, -1376235, 1, 0, -1376234, 1, 0, -1376233, 1, 0, -1376232, 1, 0, -1376231, 1, 0, -1376230, 1, 0, -1376229, 1, 0, -1376228, 1, 0, -1376227, 1, 0, -1376226, 1, 0, -1376225, 1, 0, -1376224, 1, 0, -1376223, 1, 0, -1376222, 1, 0, -1376221, 1, 0, -1376220, 1, 0, -1376219, 1, 0, -1376218, 1, 0, -1376217, 1, 0, -1376216, 1, 0, -1376215, 1, 0, -1376214, 1, 0, -1376213, 1, 0, -1376212, 1, 0, -1376211, 1, 0, -1376210, 1, 0, -1376209, 1, 0, -1376208, 1, 0, -1376207, 1, 0, -1245224, 1, 0, -1245223, 1, 0, -1245222, 1, 0, -1245221, 1, 0, -1245220, 1, 0, -1245219, 1, 0, -1245218, 1, 0, -1245217, 1, 0, -1245216, 1, 0, -1245215, 1, 0, -1245214, 1, 0, -1245213, 1, 0, -1245212, 1, 0, -1245211, 1, 0, -1245210, 1, 0, -1245209, 1, 0, -1245208, 1, 0, -1245207, 1, 0, -1245206, 1, 0, -1245205, 1, 0, -1245204, 1, 0, -1245203, 1, 0, -1245202, 1, 0, -1245201, 1, 0, -1245200, 1, 0, -1245199, 1, 0, -1245198, 1, 0, -1245197, 1, 0, -1245196, 1, 0, -1245195, 1, 0, -1245194, 1, 0, -1245193, 1, 0, -1245192, 1, 0, -1245191, 1, 0, -1245190, 1, 0, -1245189, 1, 0, -1245188, 1, 0, -1245187, 1, 0, -1245186, 1, 0, -1245185, 1, 0, -1310720, 1, 0, -1310719, 1, 0, -1310718, 1, 0, -1310717, 1, 0, -1310716, 1, 0, -1310715, 1, 0, -1310714, 1, 0, -1310713, 1, 0, -1310712, 1, 0, -1310711, 1, 0, -1310710, 1, 0, -1310709, 1, 0, -1310708, 1, 0, -1310707, 1, 0, -1310706, 1, 0, -1310705, 1, 0, -1310704, 1, 0, -1310703, 1, 0, -1310702, 1, 0, -1310701, 1, 0, -1310700, 1, 0, -1310699, 1, 0, -1310698, 1, 0, -1310697, 1, 0, -1310696, 1, 0, -1310695, 1, 0, -1310694, 1, 0, -1310693, 1, 0, -1310692, 1, 0, -1310691, 1, 0, -1310690, 1, 0, -1310689, 1, 0, -1310688, 1, 0, -1310687, 1, 0, -1310686, 1, 0, -1310685, 1, 0, -1310684, 1, 0, -1310683, 1, 0, -1310682, 1, 0, -1310681, 1, 0, -1310680, 1, 0, -1310679, 1, 0, -1310678, 1, 0, -1310677, 1, 0, -1310676, 1, 0, -1310675, 1, 0, -1310674, 1, 0, -1310673, 1, 0, -1310672, 1, 0, -1310671, 1, 0, -1310670, 1, 0, -1310669, 1, 0, -1179688, 1, 0, -1179687, 1, 0, -1179686, 1, 0, -1179685, 1, 0, -1179684, 1, 0, -1179683, 1, 0, -1179682, 1, 0, -1179681, 1, 0, -1179680, 1, 0, -1179679, 1, 0, -1179678, 1, 0, -1179677, 1, 0, -1179676, 1, 0, -1179675, 1, 0, -1179674, 1, 0, -1179673, 1, 0, -1179672, 1, 0, -1179671, 1, 0, -1179670, 1, 0, -1179669, 1, 0, -1179668, 1, 0, -1179667, 1, 0, -1179666, 1, 0, -1179665, 1, 0, -1179664, 1, 0, -1179663, 1, 0, -1179662, 1, 0, -1179661, 1, 0, -1179660, 1, 0, -1179659, 1, 0, -1179658, 1, 0, -1179657, 1, 0, -1179656, 1, 0, -1179655, 1, 0, -1179654, 1, 0, -1179653, 1, 0, -1179652, 1, 0, -1179651, 1, 0, -1179650, 1, 0, -1179649, 1, 0, -1245184, 1, 0, -1245183, 1, 0, -1245182, 1, 0, -1245181, 1, 0, -1245180, 1, 0, -1245179, 1, 0, -1245178, 1, 0, -1245177, 1, 0, -1245176, 1, 0, -1245175, 1, 0, -1245174, 1, 0, -1245173, 1, 0, -1245172, 1, 0, -1245171, 1, 0, -1245170, 1, 0, -1245169, 1, 0, -1245168, 1, 0, -1245167, 1, 0, -1245166, 1, 0, -1245165, 1, 0, -1245164, 1, 0, -1245163, 1, 0, -1245162, 1, 0, -1245161, 1, 0, -1245160, 1, 0, -1245159, 1, 0, -1245158, 1, 0, -1245157, 1, 0, -1245156, 1, 0, -1245155, 1, 0, -1245154, 1, 0, -1245153, 1, 0, -1245152, 1, 0, -1245151, 1, 0, -1245150, 1, 0, -1245149, 1, 0, -1245148, 1, 0, -1245147, 1, 0, -1245146, 1, 0, -1245145, 1, 0, -1245144, 1, 0, -1245143, 1, 0, -1245142, 1, 0, -1245141, 1, 0, -1245140, 1, 0, -1245139, 1, 0, -1245138, 1, 0, -1245137, 1, 0, -1245136, 1, 0, -1245135, 1, 0, -1245134, 1, 0, -1245133, 1, 0, -1245132, 1, 0, -1114152, 1, 0, -1114151, 1, 0, -1114150, 1, 0, -1114149, 1, 0, -1114148, 1, 0, -1114147, 1, 0, -1114146, 1, 0, -1114145, 1, 0, -1114144, 1, 0, -1114143, 1, 0, -1114142, 1, 0, -1114141, 1, 0, -1114140, 1, 0, -1114139, 1, 0, -1114138, 1, 0, -1114137, 1, 0, -1114136, 1, 0, -1114135, 1, 0, -1114134, 1, 0, -1114133, 1, 0, -1114132, 1, 0, -1114131, 1, 0, -1114130, 1, 0, -1114129, 1, 0, -1114128, 1, 0, -1114127, 1, 0, -1114126, 1, 0, -1114125, 1, 0, -1114124, 1, 0, -1114123, 1, 0, -1114122, 1, 0, -1114121, 1, 0, -1114120, 1, 0, -1114119, 1, 0, -1114118, 1, 0, -1114117, 1, 0, -1114116, 1, 0, -1114115, 1, 0, -1114114, 1, 0, -1114113, 1, 0, -1179648, 1, 0, -1179647, 1, 0, -1179646, 1, 0, -1179645, 1, 0, -1179644, 1, 0, -1179643, 1, 0, -1179642, 1, 0, -1179641, 1, 0, -1179640, 1, 0, -1179639, 1, 0, -1179638, 1, 0, -1179637, 1, 0, -1179636, 1, 0, -1179635, 1, 0, -1179634, 1, 0, -1179633, 1, 0, -1179632, 1, 0, -1179631, 1, 0, -1179630, 1, 0, -1179629, 1, 0, -1179628, 1, 0, -1179627, 1, 0, -1179626, 1, 0, -1179625, 1, 0, -1179624, 1, 0, -1179623, 1, 0, -1179622, 1, 0, -1179621, 1, 0, -1179620, 1, 0, -1179619, 1, 0, -1179618, 1, 0, -1179617, 1, 0, -1179616, 1, 0, -1179615, 1, 0, -1179614, 1, 0, -1179613, 1, 0, -1179612, 1, 0, -1179611, 1, 0, -1179610, 1, 0, -1179609, 1, 0, -1179608, 1, 0, -1179607, 1, 0, -1179606, 1, 0, -1179605, 1, 0, -1179604, 1, 0, -1179603, 1, 0, -1179602, 1, 0, -1179601, 1, 0, -1179600, 1, 0, -1179599, 1, 0, -1179598, 1, 0, -1179597, 1, 0, -1179596, 1, 0, -1048615, 1, 0, -1048614, 1, 0, -1048613, 1, 0, -1048612, 1, 0, -1048611, 1, 0, -1048610, 1, 0, -1048609, 1, 0, -1048608, 1, 0, -1048607, 1, 0, -1048606, 1, 0, -1048605, 1, 0, -1048604, 1, 0, -1048603, 1, 0, -1048602, 1, 0, -1048601, 1, 0, -1048600, 1, 0, -1048599, 1, 0, -1048598, 1, 0, -1048597, 1, 0, -1048596, 1, 0, -1048595, 1, 0, -1048594, 1, 0, -1048593, 1, 0, -1048592, 1, 0, -1048591, 1, 0, -1048590, 1, 0, -1048589, 1, 0, -1048588, 1, 0, -1048587, 1, 0, -1048586, 1, 0, -1048585, 1, 0, -1048584, 1, 0, -1048583, 1, 0, -1048582, 1, 0, -1048581, 1, 0, -1048580, 1, 0, -1048579, 1, 0, -1048578, 1, 0, -1048577, 1, 0, -1114112, 1, 0, -1114111, 1, 0, -1114110, 1, 0, -1114109, 1, 0, -1114108, 1, 0, -1114107, 1, 0, -1114106, 1, 0, -1114105, 1, 0, -1114104, 1, 0, -1114103, 1, 0, -1114102, 1, 0, -1114101, 1, 0, -1114100, 1, 0, -1114099, 1, 0, -1114098, 1, 0, -1114097, 1, 0, -1114096, 1, 0, -1114095, 1, 0, -1114094, 1, 0, -1114093, 1, 0, -1114092, 1, 0, -1114091, 1, 0, -1114090, 1, 0, -1114089, 1, 0, -1114088, 1, 0, -1114087, 1, 0, -1114086, 1, 0, -1114085, 1, 0, -1114084, 1, 0, -1114083, 1, 0, -1114082, 1, 0, -1114081, 1, 0, -1114080, 1, 0, -1114079, 1, 0, -1114078, 1, 0, -1114077, 1, 0, -1114076, 1, 0, -1114075, 1, 0, -1114074, 1, 0, -1114073, 1, 0, -1114072, 1, 0, -1114071, 1, 0, -1114070, 1, 0, -1114069, 1, 0, -1114068, 1, 0, -1114067, 1, 0, -1114066, 1, 0, -1114065, 1, 0, -1114064, 1, 0, -1114063, 1, 0, -1114062, 1, 0, -1114061, 1, 0, -1114060, 1, 0, -1114059, 1, 0, -983079, 1, 0, -983078, 1, 0, -983077, 1, 0, -983076, 1, 0, -983075, 1, 0, -983074, 1, 0, -983073, 1, 0, -983072, 1, 0, -983071, 1, 0, -983070, 1, 0, -983069, 1, 0, -983068, 1, 0, -983067, 1, 0, -983066, 1, 0, -983065, 1, 0, -983064, 1, 0, -983063, 1, 0, -983062, 1, 0, -983061, 1, 0, -983060, 1, 0, -983059, 1, 0, -983058, 1, 0, -983057, 1, 0, -983056, 1, 0, -983055, 1, 0, -983054, 1, 0, -983053, 1, 0, -983052, 1, 0, -983051, 1, 0, -983050, 1, 0, -983049, 1, 0, -983048, 1, 0, -983047, 1, 0, -983046, 1, 0, -983045, 1, 0, -983044, 1, 0, -983043, 1, 0, -983042, 1, 0, -983041, 1, 0, -1048576, 1, 0, -1048575, 1, 0, -1048574, 1, 0, -1048573, 1, 0, -1048572, 1, 0, -1048571, 1, 0, -1048570, 1, 0, -1048569, 1, 0, -1048568, 1, 0, -1048567, 1, 0, -1048566, 1, 0, -1048565, 1, 0, -1048564, 1, 0, -1048563, 1, 0, -1048562, 1, 0, -1048561, 1, 0, -1048560, 1, 0, -1048559, 1, 0, -1048558, 1, 0, -1048557, 1, 0, -1048556, 1, 0, -1048555, 1, 0, -1048554, 1, 0, -1048553, 1, 0, -1048552, 1, 0, -1048551, 1, 0, -1048550, 1, 0, -1048549, 1, 0, -1048548, 1, 0, -1048547, 1, 0, -1048546, 1, 0, -1048545, 1, 0, -1048544, 1, 0, -1048543, 1, 0, -1048542, 1, 0, -1048541, 1, 0, -1048540, 1, 0, -1048539, 1, 0, -1048538, 1, 0, -1048537, 1, 0, -1048536, 1, 0, -1048535, 1, 0, -1048534, 1, 0, -1048533, 1, 0, -1048532, 1, 0, -1048531, 1, 0, -1048530, 1, 0, -1048529, 1, 0, -1048528, 1, 0, -1048527, 1, 0, -1048526, 1, 0, -1048525, 1, 0, -1048524, 1, 0, -1048523, 1, 0, -917543, 1, 0, -917542, 1, 0, -917541, 1, 0, -917540, 1, 0, -917539, 1, 0, -917538, 1, 0, -917537, 1, 0, -917536, 1, 0, -917535, 1, 0, -917534, 1, 0, -917533, 1, 0, -917532, 1, 0, -917531, 1, 0, -917530, 1, 0, -917529, 1, 0, -917528, 1, 0, -917527, 1, 0, -917526, 1, 0, -917525, 1, 0, -917524, 1, 0, -917523, 1, 0, -917522, 1, 0, -917521, 1, 0, -917520, 1, 0, -917519, 1, 0, -917518, 1, 0, -917517, 1, 0, -917516, 1, 0, -917515, 1, 0, -917514, 1, 0, -917513, 1, 0, -917512, 1, 0, -917511, 1, 0, -917510, 1, 0, -917509, 1, 0, -917508, 1, 0, -917507, 1, 0, -917506, 1, 0, -917505, 1, 0, -983040, 1, 0, -983039, 1, 0, -983038, 1, 0, -983037, 1, 0, -983036, 1, 0, -983035, 1, 0, -983034, 1, 0, -983033, 1, 0, -983032, 1, 0, -983031, 1, 0, -983030, 1, 0, -983029, 1, 0, -983028, 1, 0, -983027, 1, 0, -983026, 1, 0, -983025, 1, 0, -983024, 1, 0, -983023, 1, 0, -983022, 1, 0, -983021, 1, 0, -983020, 1, 0, -983019, 1, 0, -983018, 1, 0, -983017, 1, 0, -983016, 1, 0, -983015, 1, 0, -983014, 1, 0, -983013, 1, 0, -983012, 1, 0, -983011, 1, 0, -983010, 1, 0, -983009, 1, 0, -983008, 1, 0, -983007, 1, 0, -983006, 1, 0, -983005, 1, 0, -983004, 1, 0, -983003, 1, 0, -983002, 1, 0, -983001, 1, 0, -983000, 1, 0, -982999, 1, 0, -982998, 1, 0, -982997, 1, 0, -982996, 1, 0, -982995, 1, 0, -982994, 1, 0, -982993, 1, 0, -982992, 1, 0, -982991, 1, 0, -982990, 1, 0, -982989, 1, 0, -982988, 1, 0, -982987, 1, 0, -982986, 1, 0, -852007, 1, 0, -852006, 1, 0, -852005, 1, 0, -852004, 1, 0, -852003, 1, 0, -852002, 1, 0, -852001, 1, 0, -852000, 1, 0, -851999, 1, 0, -851998, 1, 0, -851997, 1, 0, -851996, 1, 0, -851995, 1, 0, -851994, 1, 0, -851993, 1, 0, -851992, 1, 0, -851991, 1, 0, -851990, 1, 0, -851989, 1, 0, -851988, 1, 0, -851987, 1, 0, -851986, 1, 0, -851985, 1, 0, -851984, 1, 0, -851983, 1, 0, -851982, 1, 0, -851981, 1, 0, -851980, 1, 0, -851979, 1, 0, -851978, 1, 0, -851977, 1, 0, -851976, 1, 0, -851975, 1, 0, -851974, 1, 0, -851973, 1, 0, -851972, 1, 0, -851971, 1, 0, -851970, 1, 0, -851969, 1, 0, -917504, 1, 0, -917503, 1, 0, -917502, 1, 0, -917501, 1, 0, -917500, 1, 0, -917499, 1, 0, -917498, 1, 0, -917497, 1, 0, -917496, 1, 0, -917495, 1, 0, -917494, 1, 0, -917493, 1, 0, -917492, 1, 0, -917491, 1, 0, -917490, 1, 0, -917489, 1, 0, -917488, 1, 0, -917487, 1, 0, -917486, 1, 0, -917485, 1, 0, -917484, 1, 0, -917483, 1, 0, -917482, 1, 0, -917481, 1, 0, -917480, 1, 0, -917479, 1, 0, -917478, 1, 0, -917477, 1, 0, -917476, 1, 0, -917475, 1, 0, -917474, 1, 0, -917473, 1, 0, -917472, 1, 0, -917471, 1, 0, -917470, 1, 0, -917469, 1, 0, -917468, 1, 0, -917467, 1, 0, -917466, 1, 0, -917465, 1, 0, -917464, 1, 0, -917463, 1, 0, -917462, 1, 0, -917461, 1, 0, -917460, 1, 0, -917459, 1, 0, -917458, 1, 0, -917457, 1, 0, -917456, 1, 0, -917455, 1, 0, -917454, 1, 0, -917453, 1, 0, -917452, 1, 0, -917451, 1, 0, -917450, 1, 0, -786471, 1, 0, -786470, 1, 0, -786469, 1, 0, -786468, 1, 0, -786467, 1, 0, -786466, 1, 0, -786465, 1, 0, -786464, 1, 0, -786463, 1, 0, -786462, 1, 0, -786461, 1, 0, -786460, 1, 0, -786459, 1, 0, -786458, 1, 0, -786457, 1, 0, -786456, 1, 0, -786455, 1, 0, -786454, 1, 0, -786453, 1, 0, -786452, 1, 0, -786451, 1, 0, -786450, 1, 0, -786449, 1, 0, -786448, 1, 0, -786447, 1, 0, -786446, 1, 0, -786445, 1, 0, -786444, 1, 0, -786443, 1, 0, -786442, 1, 0, -786441, 1, 0, -786440, 1, 0, -786439, 1, 0, -786438, 1, 0, -786437, 1, 0, -786436, 1, 0, -786435, 1, 0, -786434, 1, 0, -786433, 1, 0, -851968, 1, 0, -851967, 1, 0, -851966, 1, 0, -851965, 1, 0, -851964, 1, 0, -851963, 1, 0, -851962, 1, 0, -851961, 1, 0, -851960, 1, 0, -851959, 1, 0, -851958, 1, 0, -851957, 1, 0, -851956, 1, 0, -851955, 1, 0, -851954, 1, 0, -851953, 1, 0, -851952, 1, 0, -851951, 1, 0, -851950, 1, 0, -851949, 1, 0, -851948, 1, 0, -851947, 1, 0, -851946, 1, 0, -851945, 1, 0, -851944, 1, 0, -851943, 1, 0, -851942, 1, 0, -851941, 1, 0, -851940, 1, 0, -851939, 1, 0, -851938, 1, 0, -851937, 1, 0, -851936, 1, 0, -851935, 1, 0, -851934, 1, 0, -851933, 1, 0, -851932, 1, 0, -851931, 1, 0, -851930, 1, 0, -851929, 1, 0, -851928, 1, 0, -851927, 1, 0, -851926, 1, 0, -851925, 1, 0, -851924, 1, 0, -851923, 1, 0, -851922, 1, 0, -851921, 1, 0, -851920, 1, 0, -851919, 1, 0, -851918, 1, 0, -851917, 1, 0, -851916, 1, 0, -851915, 1, 0, -851914, 1, 0, -851913, 1, 0, -720934, 1, 0, -720933, 1, 0, -720932, 1, 0, -720931, 1, 0, -720930, 1, 0, -720929, 1, 0, -720928, 1, 0, -720927, 1, 0, -720926, 1, 0, -720925, 1, 0, -720924, 1, 0, -720923, 1, 0, -720922, 1, 0, -720921, 1, 0, -720920, 1, 0, -720919, 1, 0, -720918, 1, 0, -720917, 1, 0, -720916, 1, 0, -720915, 1, 0, -720914, 1, 0, -720913, 1, 0, -720912, 1, 0, -720911, 1, 0, -720910, 1, 0, -720909, 1, 0, -720908, 1, 0, -720907, 1, 0, -720906, 1, 0, -720905, 1, 0, -720904, 1, 0, -720903, 1, 0, -720902, 1, 0, -720901, 1, 0, -720900, 1, 0, -720899, 1, 0, -720898, 1, 0, -720897, 1, 0, -786432, 1, 0, -786431, 1, 0, -786430, 1, 0, -786429, 1, 0, -786428, 1, 0, -786427, 1, 0, -786426, 1, 0, -786425, 1, 0, -786424, 1, 0, -786423, 1, 0, -786422, 1, 0, -786421, 1, 0, -786420, 1, 0, -786419, 1, 0, -786418, 1, 0, -786417, 1, 0, -786416, 1, 0, -786415, 1, 0, -786414, 1, 0, -786413, 1, 0, -786412, 1, 0, -786411, 1, 0, -786410, 1, 0, -786409, 1, 0, -786408, 1, 0, -786407, 1, 0, -786406, 1, 0, -786405, 1, 0, -786404, 1, 0, -786403, 1, 0, -786402, 1, 0, -786401, 1, 0, -786400, 1, 0, -786399, 1, 0, -786398, 1, 0, -786397, 1, 0, -786396, 1, 0, -786395, 1, 0, -786394, 1, 0, -786393, 1, 0, -786392, 1, 0, -786391, 1, 0, -786390, 1, 0, -786389, 1, 0, -786388, 1, 0, -786387, 1, 0, -786386, 1, 0, -786385, 1, 0, -786384, 1, 0, -786383, 1, 0, -786382, 1, 0, -786381, 1, 0, -786380, 1, 0, -786379, 1, 0, -786378, 1, 0, -786377, 1, 0, -655398, 1, 0, -655397, 1, 0, -655396, 1, 0, -655395, 1, 0, -655394, 1, 0, -655393, 1, 0, -655392, 1, 0, -655391, 1, 0, -655390, 1, 0, -655389, 1, 0, -655388, 1, 0, -655387, 1, 0, -655386, 1, 0, -655385, 1, 0, -655384, 1, 0, -655383, 1, 0, -655382, 1, 0, -655381, 1, 0, -655380, 1, 0, -655379, 1, 0, -655378, 1, 0, -655377, 1, 0, -655376, 1, 0, -655375, 1, 0, -655374, 1, 0, -655373, 1, 0, -655372, 1, 0, -655371, 1, 0, -655370, 1, 0, -655369, 1, 0, -655368, 1, 0, -655367, 1, 0, -655366, 1, 0, -655365, 1, 0, -655364, 1, 0, -655363, 1, 0, -655362, 1, 0, -655361, 1, 0, -720896, 1, 0, -720895, 1, 0, -720894, 1, 0, -720893, 1, 0, -720892, 1, 0, -720891, 1, 0, -720890, 1, 0, -720889, 1, 0, -720888, 1, 0, -720887, 1, 0, -720886, 1, 0, -720885, 1, 0, -720884, 1, 0, -720883, 1, 0, -720882, 1, 0, -720881, 1, 0, -720880, 1, 0, -720879, 1, 0, -720878, 1, 0, -720877, 1, 0, -720876, 1, 0, -720875, 1, 0, -720874, 1, 0, -720873, 1, 0, -720872, 1, 0, -720871, 1, 0, -720870, 1, 0, -720869, 1, 0, -720868, 1, 0, -720867, 1, 0, -720866, 1, 0, -720865, 1, 0, -720864, 1, 0, -720863, 1, 0, -720862, 1, 0, -720861, 1, 0, -720860, 1, 0, -720859, 1, 0, -720858, 1, 0, -720857, 1, 0, -720856, 1, 0, -720855, 1, 0, -720854, 1, 0, -720853, 1, 0, -720852, 1, 0, -720851, 1, 0, -720850, 1, 0, -720849, 1, 0, -720848, 1, 0, -720847, 1, 0, -720846, 1, 0, -720845, 1, 0, -720844, 1, 0, -720843, 1, 0, -720842, 1, 0, -720841, 1, 0, -720840, 1, 0, -589862, 1, 0, -589861, 1, 0, -589860, 1, 0, -589859, 1, 0, -589858, 1, 0, -589857, 1, 0, -589856, 1, 0, -589855, 1, 0, -589854, 1, 0, -589853, 1, 0, -589852, 1, 0, -589851, 1, 0, -589850, 1, 0, -589849, 1, 0, -589848, 1, 0, -589847, 1, 0, -589846, 1, 0, -589845, 1, 0, -589844, 1, 0, -589843, 1, 0, -589842, 1, 0, -589841, 1, 0, -589840, 1, 0, -589839, 1, 0, -589838, 1, 0, -589837, 1, 0, -589836, 1, 0, -589835, 1, 0, -589834, 1, 0, -589833, 1, 0, -589832, 1, 0, -589831, 1, 0, -589830, 1, 0, -589829, 1, 0, -589828, 1, 0, -589827, 1, 0, -589826, 1, 0, -589825, 1, 0, -655360, 1, 0, -655359, 1, 0, -655358, 1, 0, -655357, 1, 0, -655356, 1, 0, -655355, 1, 0, -655354, 1, 0, -655353, 1, 0, -655352, 1, 0, -655351, 1, 0, -655350, 1, 0, -655349, 1, 0, -655348, 1, 0, -655347, 1, 0, -655346, 1, 0, -655345, 1, 0, -655344, 1, 0, -655343, 1, 0, -655342, 1, 0, -655341, 1, 0, -655340, 1, 0, -655339, 1, 0, -655338, 1, 0, -655337, 1, 0, -655336, 1, 0, -655335, 1, 0, -655334, 1, 0, -655333, 1, 0, -655332, 1, 0, -655331, 1, 0, -655330, 1, 0, -655329, 1, 0, -655328, 1, 0, -655327, 1, 0, -655326, 1, 0, -655325, 1, 0, -655324, 1, 0, -655323, 1, 0, -655322, 1, 0, -655321, 1, 0, -655320, 1, 0, -655319, 1, 0, -655318, 1, 0, -655317, 1, 0, -655316, 1, 0, -655315, 1, 0, -655314, 1, 0, -655313, 1, 0, -655312, 1, 0, -655311, 1, 0, -655310, 1, 0, -655309, 1, 0, -655308, 1, 0, -655307, 1, 0, -655306, 1, 0, -655305, 1, 0, -655304, 1, 0, -524326, 1, 0, -524325, 1, 0, -524324, 1, 0, -524323, 1, 0, -524322, 1, 0, -524321, 1, 0, -524320, 1, 0, -524319, 1, 0, -524318, 1, 0, -524317, 1, 0, -524316, 1, 0, -524315, 1, 0, -524314, 1, 0, -524313, 1, 0, -524312, 1, 0, -524311, 1, 0, -524310, 1, 0, -524309, 1, 0, -524308, 1, 0, -524307, 1, 0, -524306, 1, 0, -524305, 1, 0, -524304, 1, 0, -524303, 1, 0, -524302, 1, 0, -524301, 1, 0, -524300, 1, 0, -524299, 1, 0, -524298, 1, 0, -524297, 1, 0, -524296, 1, 0, -524295, 1, 0, -524294, 1, 0, -524293, 1, 0, -524292, 1, 0, -524291, 1, 0, -524290, 1, 0, -524289, 1, 0, -589824, 1, 0, -589823, 1, 0, -589822, 1, 0, -589821, 1, 0, -589820, 1, 0, -589819, 1, 0, -589818, 1, 0, -589817, 1, 0, -589816, 1, 0, -589815, 1, 0, -589814, 1, 0, -589813, 1, 0, -589812, 1, 0, -589811, 1, 0, -589810, 1, 0, -589809, 1, 0, -589808, 1, 0, -589807, 1, 0, -589806, 1, 0, -589805, 1, 0, -589804, 1, 0, -589803, 1, 0, -589802, 1, 0, -589801, 1, 0, -589800, 1, 0, -589799, 1, 0, -589798, 1, 0, -589797, 1, 0, -589796, 1, 0, -589795, 1, 0, -589794, 1, 0, -589793, 1, 0, -589792, 1, 0, -589791, 1, 0, -589790, 1, 0, -589789, 1, 0, -589788, 1, 0, -589787, 1, 0, -589786, 1, 0, -589785, 1, 0, -589784, 1, 0, -589783, 1, 0, -589782, 1, 0, -589781, 1, 0, -589780, 1, 0, -589779, 1, 0, -589778, 1, 0, -589777, 1, 0, -589776, 1, 0, -589775, 1, 0, -589774, 1, 0, -589773, 1, 0, -589772, 1, 0, -589771, 1, 0, -589770, 1, 0, -589769, 1, 0, -589768, 1, 0, -458789, 1, 0, -458788, 1, 0, -458787, 1, 0, -458786, 1, 0, -458785, 1, 0, -458784, 1, 0, -458783, 1, 0, -458782, 1, 0, -458781, 1, 0, -458780, 1, 0, -458779, 1, 0, -458778, 1, 0, -458777, 1, 0, -458776, 1, 0, -458775, 1, 0, -458774, 1, 0, -458773, 1, 0, -458772, 1, 0, -458771, 1, 0, -458770, 1, 0, -458769, 1, 0, -458768, 1, 0, -458767, 1, 0, -458766, 1, 0, -458765, 1, 0, -458764, 1, 0, -458763, 1, 0, -458762, 1, 0, -458761, 1, 0, -458760, 1, 0, -458759, 1, 0, -458758, 1, 0, -458757, 1, 0, -458756, 1, 0, -458755, 1, 0, -458754, 1, 0, -458753, 1, 0, -524288, 1, 0, -524287, 1, 0, -524286, 1, 0, -524285, 1, 0, -524284, 1, 0, -524283, 1, 0, -524282, 1, 0, -524281, 1, 0, -524280, 1, 0, -524279, 1, 0, -524278, 1, 0, -524277, 1, 0, -524276, 1, 0, -524275, 1, 0, -524274, 1, 0, -524273, 1, 0, -524272, 1, 0, -524271, 1, 0, -524270, 1, 0, -524269, 1, 0, -524268, 1, 0, -524267, 1, 0, -524266, 1, 0, -524265, 1, 0, -524264, 1, 0, -524263, 1, 0, -524262, 1, 0, -524261, 1, 0, -524260, 1, 0, -524259, 1, 0, -524258, 1, 0, -524257, 1, 0, -524256, 1, 0, -524255, 1, 0, -524254, 1, 0, -524253, 1, 0, -524252, 1, 0, -524251, 1, 0, -524250, 1, 0, -524249, 1, 0, -524248, 1, 0, -524247, 1, 0, -524246, 1, 0, -524245, 1, 0, -524244, 1, 0, -524243, 1, 0, -524242, 1, 0, -524241, 1, 0, -524240, 1, 0, -524239, 1, 0, -524238, 1, 0, -524237, 1, 0, -524236, 1, 0, -524235, 1, 0, -524234, 1, 0, -524233, 1, 0, -524232, 1, 0, -393253, 1, 0, -393252, 1, 0, -393251, 1, 0, -393250, 1, 0, -393249, 1, 0, -393248, 1, 0, -393247, 1, 0, -393246, 1, 0, -393245, 1, 0, -393244, 1, 0, -393243, 1, 0, -393242, 1, 0, -393241, 1, 0, -393240, 1, 0, -393239, 1, 0, -393238, 1, 0, -393237, 1, 0, -393236, 1, 0, -393235, 1, 0, -393234, 1, 0, -393233, 1, 0, -393232, 1, 0, -393231, 1, 0, -393230, 1, 0, -393229, 1, 0, -393228, 1, 0, -393227, 1, 0, -393226, 1, 0, -393225, 1, 0, -393224, 1, 0, -393223, 1, 0, -393222, 1, 0, -393221, 1, 0, -393220, 1, 0, -393219, 1, 0, -393218, 1, 0, -393217, 1, 0, -458752, 1, 0, -458751, 1, 0, -458750, 1, 0, -458749, 1, 0, -458748, 1, 0, -458747, 1, 0, -458746, 1, 0, -458745, 1, 0, -458744, 1, 0, -458743, 1, 0, -458742, 1, 0, -458741, 1, 0, -458740, 1, 0, -458739, 1, 0, -458738, 1, 0, -458737, 1, 0, -458736, 1, 0, -458735, 1, 0, -458734, 1, 0, -458733, 1, 0, -458732, 1, 0, -458731, 1, 0, -458730, 1, 0, -458729, 1, 0, -458728, 1, 0, -458727, 1, 0, -458726, 1, 0, -458725, 1, 0, -458724, 1, 0, -458723, 1, 0, -458722, 1, 0, -458721, 1, 0, -458720, 1, 0, -458719, 1, 0, -458718, 1, 0, -458717, 1, 0, -458716, 1, 0, -458715, 1, 0, -458714, 1, 0, -458713, 1, 0, -458712, 1, 0, -458711, 1, 0, -458710, 1, 0, -458709, 1, 0, -458708, 1, 0, -458707, 1, 0, -458706, 1, 0, -458705, 1, 0, -458704, 1, 0, -458703, 1, 0, -458702, 1, 0, -458701, 1, 0, -458700, 1, 0, -458699, 1, 0, -458698, 1, 0, -458697, 1, 0, -458696, 1, 0, -327717, 1, 0, -327716, 1, 0, -327715, 1, 0, -327714, 1, 0, -327713, 1, 0, -327712, 1, 0, -327711, 1, 0, -327710, 1, 0, -327709, 1, 0, -327708, 1, 0, -327707, 1, 0, -327706, 1, 0, -327705, 1, 0, -327704, 1, 0, -327703, 1, 0, -327702, 1, 0, -327701, 1, 0, -327700, 1, 0, -327699, 1, 0, -327698, 1, 0, -327697, 1, 0, -327696, 1, 0, -327695, 1, 0, -327694, 1, 0, -327693, 1, 0, -327692, 1, 0, -327691, 1, 0, -327690, 1, 0, -327689, 1, 0, -327688, 1, 0, -327687, 1, 0, -327686, 1, 0, -327685, 1, 0, -327684, 1, 0, -327683, 1, 0, -327682, 1, 0, -327681, 1, 0, -393216, 1, 0, -393215, 1, 0, -393214, 1, 0, -393213, 1, 0, -393212, 1, 0, -393211, 1, 0, -393210, 1, 0, -393209, 1, 0, -393208, 1, 0, -393207, 1, 0, -393206, 1, 0, -393205, 1, 0, -393204, 1, 0, -393203, 1, 0, -393202, 1, 0, -393201, 1, 0, -393200, 1, 0, -393199, 1, 0, -393198, 1, 0, -393197, 1, 0, -393196, 1, 0, -393195, 1, 0, -393194, 1, 0, -393193, 1, 0, -393192, 1, 0, -393191, 1, 0, -393190, 1, 0, -393189, 1, 0, -393188, 1, 0, -393187, 1, 0, -393186, 1, 0, -393185, 1, 0, -393184, 1, 0, -393183, 1, 0, -393182, 1, 0, -393181, 1, 0, -393180, 1, 0, -393179, 1, 0, -393178, 1, 0, -393177, 1, 0, -393176, 1, 0, -393175, 1, 0, -393174, 1, 0, -393173, 1, 0, -393172, 1, 0, -393171, 1, 0, -393170, 1, 0, -393169, 1, 0, -393168, 1, 0, -393167, 1, 0, -393166, 1, 0, -393165, 1, 0, -393164, 1, 0, -393163, 1, 0, -393162, 1, 0, -393161, 1, 0, -393160, 1, 0, -393159, 1, 0, -262181, 1, 0, -262180, 1, 0, -262179, 1, 0, -262178, 1, 0, -262177, 1, 0, -262176, 1, 0, -262175, 1, 0, -262174, 1, 0, -262173, 1, 0, -262172, 1, 0, -262171, 1, 0, -262170, 1, 0, -262169, 1, 0, -262168, 1, 0, -262167, 1, 0, -262166, 1, 0, -262165, 1, 0, -262164, 1, 0, -262163, 1, 0, -262162, 1, 0, -262161, 1, 0, -262160, 1, 0, -262159, 1, 0, -262158, 1, 0, -262157, 1, 0, -262156, 1, 0, -262155, 1, 0, -262154, 1, 0, -262153, 1, 0, -262152, 1, 0, -262151, 1, 0, -262150, 1, 0, -262149, 1, 0, -262148, 1, 0, -262147, 1, 0, -262146, 1, 0, -262145, 1, 0, -327680, 1, 0, -327679, 1, 0, -327678, 1, 0, -327677, 1, 0, -327676, 1, 0, -327675, 1, 0, -327674, 1, 0, -327673, 1, 0, -327672, 1, 0, -327671, 1, 0, -327670, 1, 0, -327669, 1, 0, -327668, 1, 0, -327667, 1, 0, -327666, 1, 0, -327665, 1, 0, -327664, 1, 0, -327663, 1, 0, -327662, 1, 0, -327661, 1, 0, -327660, 1, 0, -327659, 1, 0, -327658, 1, 0, -327657, 1, 0, -327656, 1, 0, -327655, 1, 0, -327654, 1, 0, -327653, 1, 0, -327652, 1, 0, -327651, 1, 0, -327650, 1, 0, -327649, 1, 0, -327648, 1, 0, -327647, 1, 0, -327646, 1, 0, -327645, 1, 0, -327644, 1, 0, -327643, 1, 0, -327642, 1, 0, -327641, 1, 0, -327640, 1, 0, -327639, 1, 0, -327638, 1, 0, -327637, 1, 0, -327636, 1, 0, -327635, 1, 0, -327634, 1, 0, -327633, 1, 0, -327632, 1, 0, -327631, 1, 0, -327630, 1, 0, -327629, 1, 0, -327628, 1, 0, -327627, 1, 0, -327626, 1, 0, -327625, 1, 0, -327624, 1, 0, -327623, 1, 0, -196645, 1, 0, -196644, 1, 0, -196643, 1, 0, -196642, 1, 0, -196641, 1, 0, -196640, 1, 0, -196639, 1, 0, -196638, 1, 0, -196637, 1, 0, -196636, 1, 0, -196635, 1, 0, -196634, 1, 0, -196633, 1, 0, -196632, 1, 0, -196631, 1, 0, -196630, 1, 0, -196629, 1, 0, -196628, 1, 0, -196627, 1, 0, -196626, 1, 0, -196625, 1, 0, -196624, 1, 0, -196623, 1, 0, -196622, 1, 0, -196621, 1, 0, -196620, 1, 0, -196619, 1, 0, -196618, 1, 0, -196617, 1, 0, -196616, 1, 0, -196615, 1, 0, -196614, 1, 0, -196613, 1, 0, -196612, 1, 0, -196611, 1, 0, -196610, 1, 0, -196609, 1, 0, -262144, 1, 0, -262143, 1, 0, -262142, 1, 0, -262141, 1, 0, -262140, 1, 0, -262139, 1, 0, -262138, 1, 0, -262137, 1, 0, -262136, 1, 0, -262135, 1, 0, -262134, 1, 0, -262133, 1, 0, -262132, 1, 0, -262131, 1, 0, -262130, 1, 0, -262129, 1, 0, -262128, 1, 0, -262127, 1, 0, -262126, 1, 0, -262125, 1, 0, -262124, 1, 0, -262123, 1, 0, -262122, 1, 0, -262121, 1, 0, -262120, 1, 0, -262119, 1, 0, -262118, 1, 0, -262117, 1, 0, -262116, 1, 0, -262115, 1, 0, -262114, 1, 0, -262113, 1, 0, -262112, 1, 0, -262111, 1, 0, -262110, 1, 0, -262109, 1, 0, -262108, 1, 0, -262107, 1, 0, -262106, 1, 0, -262105, 1, 0, -262104, 1, 0, -262103, 1, 0, -262102, 1, 0, -262101, 1, 0, -262100, 1, 0, -262099, 1, 0, -262098, 1, 0, -262097, 1, 0, -262096, 1, 0, -262095, 1, 0, -262094, 1, 0, -262093, 1, 0, -262092, 1, 0, -262091, 1, 0, -262090, 1, 0, -262089, 1, 0, -262088, 1, 0, -262087, 1, 0, -131108, 1, 0, -131107, 1, 0, -131106, 1, 0, -131105, 1, 0, -131104, 1, 0, -131103, 1, 0, -131102, 1, 0, -131101, 1, 0, -131100, 1, 0, -131099, 1, 0, -131098, 1, 0, -131097, 1, 0, -131096, 1, 0, -131095, 1, 0, -131094, 1, 0, -131093, 1, 0, -131092, 1, 0, -131091, 1, 0, -131090, 1, 0, -131089, 1, 0, -131088, 1, 0, -131087, 1, 0, -131086, 1, 0, -131085, 1, 0, -131084, 1, 0, -131083, 1, 0, -131082, 1, 0, -131081, 1, 0, -131080, 1, 0, -131079, 1, 0, -131078, 1, 0, -131077, 1, 0, -131076, 1, 0, -131075, 1, 0, -131074, 1, 0, -131073, 1, 0, -196608, 1, 0, -196607, 1, 0, -196606, 1, 0, -196605, 1, 0, -196604, 1, 0, -196603, 1, 0, -196602, 1, 0, -196601, 1, 0, -196600, 1, 0, -196599, 1, 0, -196598, 1, 0, -196597, 1, 0, -196596, 1, 0, -196595, 1, 0, -196594, 1, 0, -196593, 1, 0, -196592, 1, 0, -196591, 1, 0, -196590, 1, 0, -196589, 1, 0, -196588, 1, 0, -196587, 1, 0, -196586, 1, 0, -196585, 1, 0, -196584, 1, 0, -196583, 1, 0, -196582, 1, 0, -196581, 1, 0, -196580, 1, 0, -196579, 1, 0, -196578, 1, 0, -196577, 1, 0, -196576, 1, 0, -196575, 1, 0, -196574, 1, 0, -196573, 1, 0, -196572, 1, 0, -196571, 1, 0, -196570, 1, 0, -196569, 1, 0, -196568, 1, 0, -196567, 1, 0, -196566, 1, 0, -196565, 1, 0, -196564, 1, 0, -196563, 1, 0, -196562, 1, 0, -196561, 1, 0, -196560, 1, 0, -196559, 1, 0, -196558, 1, 0, -196557, 1, 0, -196556, 1, 0, -196555, 1, 0, -196554, 1, 0, -196553, 1, 0, -196552, 1, 0, -196551, 1, 0, -65572, 1, 0, -65571, 1, 0, -65570, 1, 0, -65569, 1, 0, -65568, 1, 0, -65567, 1, 0, -65566, 1, 0, -65565, 1, 0, -65564, 1, 0, -65563, 1, 0, -65562, 1, 0, -65561, 1, 0, -65560, 1, 0, -65559, 1, 0, -65558, 1, 0, -65557, 1, 0, -65556, 1, 0, -65555, 1, 0, -65554, 1, 0, -65553, 1, 0, -65552, 1, 0, -65551, 1, 0, -65550, 1, 0, -65549, 1, 0, -65548, 1, 0, -65547, 1, 0, -65546, 1, 0, -65545, 1, 0, -65544, 1, 0, -65543, 1, 0, -65542, 1, 0, -65541, 1, 0, -65540, 1, 0, -65539, 1, 0, -65538, 1, 0, -65537, 1, 0, -131072, 1, 0, -131071, 1, 0, -131070, 1, 0, -131069, 1, 0, -131068, 1, 0, -131067, 1, 0, -131066, 1, 0, -131065, 1, 0, -131064, 1, 0, -131063, 1, 0, -131062, 1, 0, -131061, 1, 0, -131060, 1, 0, -131059, 1, 0, -131058, 1, 0, -131057, 1, 0, -131056, 1, 0, -131055, 1, 0, -131054, 1, 0, -131053, 1, 0, -131052, 1, 0, -131051, 1, 0, -131050, 1, 0, -131049, 1, 0, -131048, 1, 0, -131047, 1, 0, -131046, 1, 0, -131045, 1, 0, -131044, 1, 0, -131043, 1, 0, -131042, 1, 0, -131041, 1, 0, -131040, 1, 0, -131039, 1, 0, -131038, 1, 0, -131037, 1, 0, -131036, 1, 0, -131035, 1, 0, -131034, 1, 0, -131033, 1, 0, -131032, 1, 0, -131031, 1, 0, -131030, 1, 0, -131029, 1, 0, -131028, 1, 0, -131027, 1, 0, -131026, 1, 0, -131025, 1, 0, -131024, 1, 0, -131023, 1, 0, -131022, 1, 0, -131021, 1, 0, -131020, 1, 0, -131019, 1, 0, -131018, 1, 0, -131017, 1, 0, -131016, 1, 0, -131015, 1, 0, -36, 1, 0, -35, 1, 0, -34, 1, 0, -33, 1, 0, -32, 1, 0, -31, 1, 0, -30, 1, 0, -29, 1, 0, -28, 1, 0, -27, 1, 0, -26, 1, 0, -25, 1, 0, -24, 1, 0, -23, 1, 0, -22, 1, 0, -21, 1, 0, -20, 1, 0, -19, 1, 0, -18, 1, 0, -17, 1, 0, -16, 1, 0, -15, 1, 0, -14, 1, 0, -13, 1, 0, -12, 1, 0, -11, 1, 0, -10, 1, 0, -9, 1, 0, -8, 1, 0, -7, 1, 0, -6, 1, 0, -5, 1, 0, -4, 1, 0, -3, 1, 0, -2, 1, 0, -1, 1, 0, -65536, 1, 0, -65535, 1, 0, -65534, 1, 0, -65533, 1, 0, -65532, 1, 0, -65531, 1, 0, -65530, 1, 0, -65529, 1, 0, -65528, 1, 0, -65527, 1, 0, -65526, 1, 0, -65525, 1, 0, -65524, 1, 0, -65523, 1, 0, -65522, 1, 0, -65521, 1, 0, -65520, 1, 0, -65519, 1, 0, -65518, 1, 0, -65517, 1, 0, -65516, 1, 0, -65515, 1, 0, -65514, 1, 0, -65513, 1, 0, -65512, 1, 0, -65511, 1, 0, -65510, 1, 0, -65509, 1, 0, -65508, 1, 0, -65507, 1, 0, -65506, 1, 0, -65505, 1, 0, -65504, 1, 0, -65503, 1, 0, -65502, 1, 0, -65501, 1, 0, -65500, 1, 0, -65499, 1, 0, -65498, 1, 0, -65497, 1, 0, -65496, 1, 0, -65495, 1, 0, -65494, 1, 0, -65493, 1, 0, -65492, 1, 0, -65491, 1, 0, -65490, 1, 0, -65489, 1, 0, -65488, 1, 0, -65487, 1, 0, -65486, 1, 0, -65485, 1, 0, -65484, 1, 0, -65483, 1, 0, -65482, 1, 0, -65481, 1, 0, -65480, 1, 0, -65479, 1, 0, 65500, 1, 0, 65501, 1, 0, 65502, 1, 0, 65503, 1, 0, 65504, 1, 0, 65505, 1, 0, 65506, 1, 0, 65507, 1, 0, 65508, 1, 0, 65509, 1, 0, 65510, 1, 0, 65511, 1, 0, 65512, 1, 0, 65513, 1, 0, 65514, 1, 0, 65515, 1, 0, 65516, 1, 0, 65517, 1, 0, 65518, 1, 0, 65519, 1, 0, 65520, 1, 0, 65521, 1, 0, 65522, 1, 0, 65523, 1, 0, 65524, 1, 0, 65525, 1, 0, 65526, 1, 0, 65527, 1, 0, 65528, 1, 0, 65529, 1, 0, 65530, 1, 0, 65531, 1, 0, 65532, 1, 0, 65533, 1, 0, 65534, 1, 0, 65535, 1, 0, 0, 1, 0, 1, 1, 0, 2, 1, 0, 3, 1, 0, 4, 1, 0, 5, 1, 0, 6, 1, 0, 7, 1, 0, 8, 1, 0, 9, 1, 0, 10, 1, 0, 11, 1, 0, 12, 1, 0, 13, 1, 0, 14, 1, 0, 15, 1, 0, 16, 1, 0, 17, 1, 0, 18, 1, 0, 19, 1, 0, 20, 1, 0, 21, 1, 0, 22, 1, 0, 23, 1, 0, 24, 1, 0, 25, 1, 0, 26, 1, 0, 27, 1, 0, 28, 1, 0, 29, 1, 0, 30, 1, 0, 31, 1, 0, 32, 1, 0, 33, 1, 0, 34, 1, 0, 35, 1, 0, 36, 1, 0, 37, 1, 0, 38, 1, 0, 39, 1, 0, 40, 1, 0, 41, 1, 0, 42, 1, 0, 43, 1, 0, 44, 1, 0, 45, 1, 0, 46, 1, 0, 47, 1, 0, 48, 1, 0, 49, 1, 0, 50, 1, 0, 51, 1, 0, 52, 1, 0, 53, 1, 0, 54, 1, 0, 55, 1, 0, 56, 1, 0, 57, 1, 0, 131037, 1, 0, 131038, 1, 0, 131039, 1, 0, 131040, 1, 0, 131041, 1, 0, 131042, 1, 0, 131043, 1, 0, 131044, 1, 0, 131045, 1, 0, 131046, 1, 0, 131047, 1, 0, 131048, 1, 0, 131049, 1, 0, 131050, 1, 0, 131051, 1, 0, 131052, 1, 0, 131053, 1, 0, 131054, 1, 0, 131055, 1, 0, 131056, 1, 0, 131057, 1, 0, 131058, 1, 0, 131059, 1, 0, 131060, 1, 0, 131061, 1, 0, 131062, 1, 0, 131063, 1, 0, 131064, 1, 0, 131065, 1, 0, 131066, 1, 0, 131067, 1, 0, 131068, 1, 0, 131069, 1, 0, 131070, 1, 0, 131071, 1, 0, 65536, 1, 0, 65537, 1, 0, 65538, 1, 0, 65539, 1, 0, 65540, 1, 0, 65541, 1, 0, 65542, 1, 0, 65543, 1, 0, 65544, 1, 0, 65545, 1, 0, 65546, 1, 0, 65547, 1, 0, 65548, 1, 0, 65549, 1, 0, 65550, 1, 0, 65551, 1, 0, 65552, 1, 0, 65553, 1, 0, 65554, 1, 0, 65555, 1, 0, 65556, 1, 0, 65557, 1, 0, 65558, 1, 0, 65559, 1, 0, 65560, 1, 0, 65561, 1, 0, 65562, 1, 0, 65563, 1, 0, 65564, 1, 0, 65565, 1, 0, 65566, 1, 0, 65567, 1, 0, 65568, 1, 0, 65569, 1, 0, 65570, 1, 0, 65571, 1, 0, 65572, 1, 0, 65573, 1, 0, 65574, 1, 0, 65575, 1, 0, 65576, 1, 0, 65577, 1, 0, 65578, 1, 0, 65579, 1, 0, 65580, 1, 0, 65581, 1, 0, 65582, 1, 0, 65583, 1, 0, 65584, 1, 0, 65585, 1, 0, 65586, 1, 0, 65587, 1, 0, 65588, 1, 0, 65589, 1, 0, 65590, 1, 0, 65591, 1, 0, 65592, 1, 0, 65593, 1, 0, 196573, 1, 0, 196574, 1, 0, 196575, 1, 0, 196576, 1, 0, 196577, 1, 0, 196578, 1, 0, 196579, 1, 0, 196580, 1, 0, 196581, 1, 0, 196582, 1, 0, 196583, 1, 0, 196584, 1, 0, 196585, 1, 0, 196586, 1, 0, 196587, 1, 0, 196588, 1, 0, 196589, 1, 0, 196590, 1, 0, 196591, 1, 0, 196592, 1, 0, 196593, 1, 0, 196594, 1, 0, 196595, 1, 0, 196596, 1, 0, 196597, 1, 0, 196598, 1, 0, 196599, 1, 0, 196600, 1, 0, 196601, 1, 0, 196602, 1, 0, 196603, 1, 0, 196604, 1, 0, 196605, 1, 0, 196606, 1, 0, 196607, 1, 0, 131072, 1, 0, 131073, 1, 0, 131074, 1, 0, 131075, 1, 0, 131076, 1, 0, 131077, 1, 0, 131078, 1, 0, 131079, 1, 0, 131080, 1, 0, 131081, 1, 0, 131082, 1, 0, 131083, 1, 0, 131084, 1, 0, 131085, 1, 0, 131086, 1, 0, 131087, 1, 0, 131088, 1, 0, 131089, 1, 0, 131090, 1, 0, 131091, 1, 0, 131092, 1, 0, 131093, 1, 0, 131094, 1, 0, 131095, 1, 0, 131096, 1, 0, 131097, 1, 0, 131098, 1, 0, 131099, 1, 0, 131100, 1, 0, 131101, 1, 0, 131102, 1, 0, 131103, 1, 0, 131104, 1, 0, 131105, 1, 0, 131106, 1, 0, 131107, 1, 0, 131108, 1, 0, 131109, 1, 0, 131110, 1, 0, 131111, 1, 0, 131112, 1, 0, 131113, 1, 0, 131114, 1, 0, 131115, 1, 0, 131116, 1, 0, 131117, 1, 0, 131118, 1, 0, 131119, 1, 0, 131120, 1, 0, 131121, 1, 0, 131122, 1, 0, 131123, 1, 0, 131124, 1, 0, 131125, 1, 0, 131126, 1, 0, 131127, 1, 0, 131128, 1, 0, 131129, 1, 0, 262109, 1, 0, 262110, 1, 0, 262111, 1, 0, 262112, 1, 0, 262113, 1, 0, 262114, 1, 0, 262115, 1, 0, 262116, 1, 0, 262117, 1, 0, 262118, 1, 0, 262119, 1, 0, 262120, 1, 0, 262121, 1, 0, 262122, 1, 0, 262123, 1, 0, 262124, 1, 0, 262125, 1, 0, 262126, 1, 0, 262127, 1, 0, 262128, 1, 0, 262129, 1, 0, 262130, 1, 0, 262131, 1, 0, 262132, 1, 0, 262133, 1, 0, 262134, 1, 0, 262135, 1, 0, 262136, 1, 0, 262137, 1, 0, 262138, 1, 0, 262139, 1, 0, 262140, 1, 0, 262141, 1, 0, 262142, 1, 0, 262143, 1, 0, 196608, 1, 0, 196609, 1, 0, 196610, 1, 0, 196611, 1, 0, 196612, 1, 0, 196613, 1, 0, 196614, 1, 0, 196615, 1, 0, 196616, 1, 0, 196617, 1, 0, 196618, 1, 0, 196619, 1, 0, 196620, 1, 0, 196621, 1, 0, 196622, 1, 0, 196623, 1, 0, 196624, 1, 0, 196625, 1, 0, 196626, 1, 0, 196627, 1, 0, 196628, 1, 0, 196629, 1, 0, 196630, 1, 0, 196631, 1, 0, 196632, 1, 0, 196633, 1, 0, 196634, 1, 0, 196635, 1, 0, 196636, 1, 0, 196637, 1, 0, 196638, 1, 0, 196639, 1, 0, 196640, 1, 0, 196641, 1, 0, 196642, 1, 0, 196643, 1, 0, 196644, 1, 0, 196645, 1, 0, 196646, 1, 0, 196647, 1, 0, 196648, 1, 0, 196649, 1, 0, 196650, 1, 0, 196651, 1, 0, 196652, 1, 0, 196653, 1, 0, 196654, 1, 0, 196655, 1, 0, 196656, 1, 0, 196657, 1, 0, 196658, 1, 0, 196659, 1, 0, 196660, 1, 0, 196661, 1, 0, 196662, 1, 0, 196663, 1, 0, 196664, 1, 0, 196665, 1, 0, 327645, 1, 0, 327646, 1, 0, 327647, 1, 0, 327648, 1, 0, 327649, 1, 0, 327650, 1, 0, 327651, 1, 0, 327652, 1, 0, 327653, 1, 0, 327654, 1, 0, 327655, 1, 0, 327656, 1, 0, 327657, 1, 0, 327658, 1, 0, 327659, 1, 0, 327660, 1, 0, 327661, 1, 0, 327662, 1, 0, 327663, 1, 0, 327664, 1, 0, 327665, 1, 0, 327666, 1, 0, 327667, 1, 0, 327668, 1, 0, 327669, 1, 0, 327670, 1, 0, 327671, 1, 0, 327672, 1, 0, 327673, 1, 0, 327674, 1, 0, 327675, 1, 0, 327676, 1, 0, 327677, 1, 0, 327678, 1, 0, 327679, 1, 0, 262144, 1, 0, 262145, 1, 0, 262146, 1, 0, 262147, 1, 0, 262148, 1, 0, 262149, 1, 0, 262150, 1, 0, 262151, 1, 0, 262152, 1, 0, 262153, 1, 0, 262154, 1, 0, 262155, 1, 0, 262156, 1, 0, 262157, 1, 0, 262158, 1, 0, 262159, 1, 0, 262160, 1, 0, 262161, 1, 0, 262162, 1, 0, 262163, 1, 0, 262164, 1, 0, 262165, 1, 0, 262166, 1, 0, 262167, 1, 0, 262168, 1, 0, 262169, 1, 0, 262170, 1, 0, 262171, 1, 0, 262172, 1, 0, 262173, 1, 0, 262174, 1, 0, 262175, 1, 0, 262176, 1, 0, 262177, 1, 0, 262178, 1, 0, 262179, 1, 0, 262180, 1, 0, 262181, 1, 0, 262182, 1, 0, 262183, 1, 0, 262184, 1, 0, 262185, 1, 0, 262186, 1, 0, 262187, 1, 0, 262188, 1, 0, 262189, 1, 0, 262190, 1, 0, 262191, 1, 0, 262192, 1, 0, 262193, 1, 0, 262194, 1, 0, 262195, 1, 0, 262196, 1, 0, 262197, 1, 0, 262198, 1, 0, 262199, 1, 0, 262200, 1, 0, 262201, 1, 0, 393182, 1, 0, 393183, 1, 0, 393184, 1, 0, 393185, 1, 0, 393186, 1, 0, 393187, 1, 0, 393188, 1, 0, 393189, 1, 0, 393190, 1, 0, 393191, 1, 0, 393192, 1, 0, 393193, 1, 0, 393194, 1, 0, 393195, 1, 0, 393196, 1, 0, 393197, 1, 0, 393198, 1, 0, 393199, 1, 0, 393200, 1, 0, 393201, 1, 0, 393202, 1, 0, 393203, 1, 0, 393204, 1, 0, 393205, 1, 0, 393206, 1, 0, 393207, 1, 0, 393208, 1, 0, 393209, 1, 0, 393210, 1, 0, 393211, 1, 0, 393212, 1, 0, 393213, 1, 0, 393214, 1, 0, 393215, 1, 0, 327680, 1, 0, 327681, 1, 0, 327682, 1, 0, 327683, 1, 0, 327684, 1, 0, 327685, 1, 0, 327686, 1, 0, 327687, 1, 0, 327688, 1, 0, 327689, 1, 0, 327690, 1, 0, 327691, 1, 0, 327692, 1, 0, 327693, 1, 0, 327694, 1, 0, 327695, 1, 0, 327696, 1, 0, 327697, 1, 0, 327698, 1, 0, 327699, 1, 0, 327700, 1, 0, 327701, 1, 0, 327702, 1, 0, 327703, 1, 0, 327704, 1, 0, 327705, 1, 0, 327706, 1, 0, 327707, 1, 0, 327708, 1, 0, 327709, 1, 0, 327710, 1, 0, 327711, 1, 0, 327712, 1, 0, 327713, 1, 0, 327714, 1, 0, 327715, 1, 0, 327716, 1, 0, 327717, 1, 0, 327718, 1, 0, 327719, 1, 0, 327720, 1, 0, 327721, 1, 0, 327722, 1, 0, 327723, 1, 0, 327724, 1, 0, 327725, 1, 0, 327726, 1, 0, 327727, 1, 0, 327728, 1, 0, 327729, 1, 0, 327730, 1, 0, 327731, 1, 0, 327732, 1, 0, 327733, 1, 0, 327734, 1, 0, 327735, 1, 0, 327736, 1, 0, 458718, 1, 0, 458719, 1, 0, 458720, 1, 0, 458721, 1, 0, 458722, 1, 0, 458723, 1, 0, 458724, 1, 0, 458725, 1, 0, 458726, 1, 0, 458727, 1, 0, 458728, 1, 0, 458729, 1, 0, 458730, 1, 0, 458731, 1, 0, 458732, 1, 0, 458733, 1, 0, 458734, 1, 0, 458735, 1, 0, 458736, 1, 0, 458737, 1, 0, 458738, 1, 0, 458739, 1, 0, 458740, 1, 0, 458741, 1, 0, 458742, 1, 0, 458743, 1, 0, 458744, 1, 0, 458745, 1, 0, 458746, 1, 0, 458747, 1, 0, 458748, 1, 0, 458749, 1, 0, 458750, 1, 0, 458751, 1, 0, 393216, 1, 0, 393217, 1, 0, 393218, 1, 0, 393219, 1, 0, 393220, 1, 0, 393221, 1, 0, 393222, 1, 0, 393223, 1, 0, 393224, 1, 0, 393225, 1, 0, 393226, 1, 0, 393227, 1, 0, 393228, 1, 0, 393229, 1, 0, 393230, 1, 0, 393231, 1, 0, 393232, 1, 0, 393233, 1, 0, 393234, 1, 0, 393235, 1, 0, 393236, 1, 0, 393237, 1, 0, 393238, 1, 0, 393239, 1, 0, 393240, 1, 0, 393241, 1, 0, 393242, 1, 0, 393243, 1, 0, 393244, 1, 0, 393245, 1, 0, 393246, 1, 0, 393247, 1, 0, 393248, 1, 0, 393249, 1, 0, 393250, 1, 0, 393251, 1, 0, 393252, 1, 0, 393253, 1, 0, 393254, 1, 0, 393255, 1, 0, 393256, 1, 0, 393257, 1, 0, 393258, 1, 0, 393259, 1, 0, 393260, 1, 0, 393261, 1, 0, 393262, 1, 0, 393263, 1, 0, 393264, 1, 0, 393265, 1, 0, 393266, 1, 0, 393267, 1, 0, 393268, 1, 0, 393269, 1, 0, 393270, 1, 0, 393271, 1, 0, 393272, 1, 0, 524254, 1, 0, 524255, 1, 0, 524256, 1, 0, 524257, 1, 0, 524258, 1, 0, 524259, 1, 0, 524260, 1, 0, 524261, 1, 0, 524262, 1, 0, 524263, 1, 0, 524264, 1, 0, 524265, 1, 0, 524266, 1, 0, 524267, 1, 0, 524268, 1, 0, 524269, 1, 0, 524270, 1, 0, 524271, 1, 0, 524272, 1, 0, 524273, 1, 0, 524274, 1, 0, 524275, 1, 0, 524276, 1, 0, 524277, 1, 0, 524278, 1, 0, 524279, 1, 0, 524280, 1, 0, 524281, 1, 0, 524282, 1, 0, 524283, 1, 0, 524284, 1, 0, 524285, 1, 0, 524286, 1, 0, 524287, 1, 0, 458752, 1, 0, 458753, 1, 0, 458754, 1, 0, 458755, 1, 0, 458756, 1, 0, 458757, 1, 0, 458758, 1, 0, 458759, 1, 0, 458760, 1, 0, 458761, 1, 0, 458762, 1, 0, 458763, 1, 0, 458764, 1, 0, 458765, 1, 0, 458766, 1, 0, 458767, 1, 0, 458768, 1, 0, 458769, 1, 0, 458770, 1, 0, 458771, 1, 0, 458772, 1, 0, 458773, 1, 0, 458774, 1, 0, 458775, 1, 0, 458776, 1, 0, 458777, 1, 0, 458778, 1, 0, 458779, 1, 0, 458780, 1, 0, 458781, 1, 0, 458782, 1, 0, 458783, 1, 0, 458784, 1, 0, 458785, 1, 0, 458786, 1, 0, 458787, 1, 0, 458788, 1, 0, 458789, 1, 0, 458790, 1, 0, 458791, 1, 0, 458792, 1, 0, 458793, 1, 0, 458794, 1, 0, 458795, 1, 0, 458796, 1, 0, 458797, 1, 0, 458798, 1, 0, 458799, 1, 0, 458800, 1, 0, 458801, 1, 0, 458802, 1, 0, 458803, 1, 0, 458804, 1, 0, 458805, 1, 0, 458806, 1, 0, 458807, 1, 0, 458808, 1, 0, 589790, 1, 0, 589791, 1, 0, 589792, 1, 0, 589793, 1, 0, 589794, 1, 0, 589795, 1, 0, 589796, 1, 0, 589797, 1, 0, 589798, 1, 0, 589799, 1, 0, 589800, 1, 0, 589801, 1, 0, 589802, 1, 0, 589803, 1, 0, 589804, 1, 0, 589805, 1, 0, 589806, 1, 0, 589807, 1, 0, 589808, 1, 0, 589809, 1, 0, 589810, 1, 0, 589811, 1, 0, 589812, 1, 0, 589813, 1, 0, 589814, 1, 0, 589815, 1, 0, 589816, 1, 0, 589817, 1, 0, 589818, 1, 0, 589819, 1, 0, 589820, 1, 0, 589821, 1, 0, 589822, 1, 0, 589823, 1, 0, 524288, 1, 0, 524289, 1, 0, 524290, 1, 0, 524291, 1, 0, 524292, 1, 0, 524293, 1, 0, 524294, 1, 0, 524295, 1, 0, 524296, 1, 0, 524297, 1, 0, 524298, 1, 0, 524299, 1, 0, 524300, 1, 0, 524301, 1, 0, 524302, 1, 0, 524303, 1, 0, 524304, 1, 0, 524305, 1, 0, 524306, 1, 0, 524307, 1, 0, 524308, 1, 0, 524309, 1, 0, 524310, 1, 0, 524311, 1, 0, 524312, 1, 0, 524313, 1, 0, 524314, 1, 0, 524315, 1, 0, 524316, 1, 0, 524317, 1, 0, 524318, 1, 0, 524319, 1, 0, 524320, 1, 0, 524321, 1, 0, 524322, 1, 0, 524323, 1, 0, 524324, 1, 0, 524325, 1, 0, 524326, 1, 0, 524327, 1, 0, 524328, 1, 0, 524329, 1, 0, 524330, 1, 0, 524331, 1, 0, 524332, 1, 0, 524333, 1, 0, 524334, 1, 0, 524335, 1, 0, 524336, 1, 0, 524337, 1, 0, 524338, 1, 0, 524339, 1, 0, 524340, 1, 0, 524341, 1, 0, 524342, 1, 0, 524343, 1, 0, 524344, 1, 0, 655327, 1, 0, 655328, 1, 0, 655329, 1, 0, 655330, 1, 0, 655331, 1, 0, 655332, 1, 0, 655333, 1, 0, 655334, 1, 0, 655335, 1, 0, 655336, 1, 0, 655337, 1, 0, 655338, 1, 0, 655339, 1, 0, 655340, 1, 0, 655341, 1, 0, 655342, 1, 0, 655343, 1, 0, 655344, 1, 0, 655345, 1, 0, 655346, 1, 0, 655347, 1, 0, 655348, 1, 0, 655349, 1, 0, 655350, 1, 0, 655351, 1, 0, 655352, 1, 0, 655353, 1, 0, 655354, 1, 0, 655355, 1, 0, 655356, 1, 0, 655357, 1, 0, 655358, 1, 0, 655359, 1, 0, 589824, 1, 0, 589825, 1, 0, 589826, 1, 0, 589827, 1, 0, 589828, 1, 0, 589829, 1, 0, 589830, 1, 0, 589831, 1, 0, 589832, 1, 0, 589833, 1, 0, 589834, 1, 0, 589835, 1, 0, 589836, 1, 0, 589837, 1, 0, 589838, 1, 0, 589839, 1, 0, 589840, 1, 0, 589841, 1, 0, 589842, 1, 0, 589843, 1, 0, 589844, 1, 0, 589845, 1, 0, 589846, 1, 0, 589847, 1, 0, 589848, 1, 0, 589849, 1, 0, 589850, 1, 0, 589851, 1, 0, 589852, 1, 0, 589853, 1, 0, 589854, 1, 0, 589855, 1, 0, 589856, 1, 0, 589857, 1, 0, 589858, 1, 0, 589859, 1, 0, 589860, 1, 0, 589861, 1, 0, 589862, 1, 0, 589863, 1, 0, 589864, 1, 0, 589865, 1, 0, 589866, 1, 0, 589867, 1, 0, 589868, 1, 0, 589869, 1, 0, 589870, 1, 0, 589871, 1, 0, 589872, 1, 0, 589873, 1, 0, 589874, 1, 0, 589875, 1, 0, 589876, 1, 0, 589877, 1, 0, 589878, 1, 0, 589879, 1, 0, 720863, 1, 0, 720864, 1, 0, 720865, 1, 0, 720866, 1, 0, 720867, 1, 0, 720868, 1, 0, 720869, 1, 0, 720870, 1, 0, 720871, 1, 0, 720872, 1, 0, 720873, 1, 0, 720874, 1, 0, 720875, 1, 0, 720876, 1, 0, 720877, 1, 0, 720878, 1, 0, 720879, 1, 0, 720880, 1, 0, 720881, 1, 0, 720882, 1, 0, 720883, 1, 0, 720884, 1, 0, 720885, 1, 0, 720886, 1, 0, 720887, 1, 0, 720888, 1, 0, 720889, 1, 0, 720890, 1, 0, 720891, 1, 0, 720892, 1, 0, 720893, 1, 0, 720894, 1, 0, 720895, 1, 0, 655360, 1, 0, 655361, 1, 0, 655362, 1, 0, 655363, 1, 0, 655364, 1, 0, 655365, 1, 0, 655366, 1, 0, 655367, 1, 0, 655368, 1, 0, 655369, 1, 0, 655370, 1, 0, 655371, 1, 0, 655372, 1, 0, 655373, 1, 0, 655374, 1, 0, 655375, 1, 0, 655376, 1, 0, 655377, 1, 0, 655378, 1, 0, 655379, 1, 0, 655380, 1, 0, 655381, 1, 0, 655382, 1, 0, 655383, 1, 0, 655384, 1, 0, 655385, 1, 0, 655386, 1, 0, 655387, 1, 0, 655388, 1, 0, 655389, 1, 0, 655390, 1, 0, 655391, 1, 0, 655392, 1, 0, 655393, 1, 0, 655394, 1, 0, 655395, 1, 0, 655396, 1, 0, 655397, 1, 0, 655398, 1, 0, 655399, 1, 0, 655400, 1, 0, 655401, 1, 0, 655402, 1, 0, 655403, 1, 0, 655404, 1, 0, 655405, 1, 0, 655406, 1, 0, 655407, 1, 0, 655408, 1, 0, 655409, 1, 0, 655410, 1, 0, 655411, 1, 0, 655412, 1, 0, 655413, 1, 0, 655414, 1, 0, 655415, 1, 0, 786399, 1, 0, 786400, 1, 0, 786401, 1, 0, 786402, 1, 0, 786403, 1, 0, 786404, 1, 0, 786405, 1, 0, 786406, 1, 0, 786407, 1, 0, 786408, 1, 0, 786409, 1, 0, 786410, 1, 0, 786411, 1, 0, 786412, 1, 0, 786413, 1, 0, 786414, 1, 0, 786415, 1, 0, 786416, 1, 0, 786417, 1, 0, 786418, 1, 0, 786419, 1, 0, 786420, 1, 0, 786421, 1, 0, 786422, 1, 0, 786423, 1, 0, 786424, 1, 0, 786425, 1, 0, 786426, 1, 0, 786427, 1, 0, 786428, 1, 0, 786429, 1, 0, 786430, 1, 0, 786431, 1, 0, 720896, 1, 0, 720897, 1, 0, 720898, 1, 0, 720899, 1, 0, 720900, 1, 0, 720901, 1, 0, 720902, 1, 0, 720903, 1, 0, 720904, 1, 0, 720905, 1, 0, 720906, 1, 0, 720907, 1, 0, 720908, 1, 0, 720909, 1, 0, 720910, 1, 0, 720911, 1, 0, 720912, 1, 0, 720913, 1, 0, 720914, 1, 0, 720915, 1, 0, 720916, 1, 0, 720917, 1, 0, 720918, 1, 0, 720919, 1, 0, 720920, 1, 0, 720921, 1, 0, 720922, 1, 0, 720923, 1, 0, 720924, 1, 0, 720925, 1, 0, 720926, 1, 0, 720927, 1, 0, 720928, 1, 0, 720929, 1, 0, 720930, 1, 0, 720931, 1, 0, 720932, 1, 0, 720933, 1, 0, 720934, 1, 0, 720935, 1, 0, 720936, 1, 0, 720937, 1, 0, 720938, 1, 0, 720939, 1, 0, 720940, 1, 0, 720941, 1, 0, 720942, 1, 0, 720943, 1, 0, 720944, 1, 0, 720945, 1, 0, 720946, 1, 0, 720947, 1, 0, 720948, 1, 0, 720949, 1, 0, 720950, 1, 0, 720951, 1, 0, 851934, 1, 0, 851935, 1, 0, 851936, 1, 0, 851942, 1, 0, 851943, 1, 0, 851944, 1, 0, 851945, 1, 0, 851946, 1, 0, 851947, 1, 0, 851948, 1, 0, 851949, 1, 0, 851950, 1, 0, 851951, 1, 0, 851952, 1, 0, 851953, 1, 0, 851954, 1, 0, 851955, 1, 0, 851956, 1, 0, 851957, 1, 0, 851958, 1, 0, 851959, 1, 0, 851960, 1, 0, 851961, 1, 0, 851962, 1, 0, 851963, 1, 0, 851964, 1, 0, 851965, 1, 0, 851966, 1, 0, 851967, 1, 0, 786432, 1, 0, 786433, 1, 0, 786434, 1, 0, 786435, 1, 0, 786436, 1, 0, 786437, 1, 0, 786438, 1, 0, 786439, 1, 0, 786440, 1, 0, 786441, 1, 0, 786442, 1, 0, 786443, 1, 0, 786444, 1, 0, 786445, 1, 0, 786446, 1, 0, 786447, 1, 0, 786448, 1, 0, 786449, 1, 0, 786450, 1, 0, 786451, 1, 0, 786452, 1, 0, 786453, 1, 0, 786454, 1, 0, 786455, 1, 0, 786456, 1, 0, 786457, 1, 0, 786458, 1, 0, 786459, 1, 0, 786460, 1, 0, 786461, 1, 0, 786462, 1, 0, 786463, 1, 0, 786464, 1, 0, 786465, 1, 0, 786466, 1, 0, 786467, 1, 0, 786468, 1, 0, 786469, 1, 0, 786470, 1, 0, 786471, 1, 0, 786472, 1, 0, 786473, 1, 0, 786474, 1, 0, 786475, 1, 0, 786476, 1, 0, 786477, 1, 0, 786478, 1, 0, 786479, 1, 0, 786480, 1, 0, 786481, 1, 0, 786482, 1, 0, 786483, 1, 0, 786484, 1, 0, 786485, 1, 0, 786486, 1, 0, 917472, 1, 0, 917479, 1, 0, 917480, 1, 0, 917481, 1, 0, 917482, 1, 0, 917483, 1, 0, 917484, 1, 0, 917485, 1, 0, 917486, 1, 0, 917487, 1, 0, 917488, 1, 0, 917489, 1, 0, 917490, 1, 0, 917491, 1, 0, 917492, 1, 0, 917493, 1, 0, 917494, 1, 0, 917495, 1, 0, 917496, 1, 0, 917497, 1, 0, 917498, 1, 0, 917499, 1, 0, 917500, 1, 0, 917501, 1, 0, 917502, 1, 0, 917503, 1, 0, 851968, 1, 0, 851969, 1, 0, 851970, 1, 0, 851971, 1, 0, 851972, 1, 0, 851973, 1, 0, 851974, 1, 0, 851975, 1, 0, 851976, 1, 0, 851977, 1, 0, 851978, 1, 0, 851979, 1, 0, 851980, 1, 0, 851981, 1, 0, 851982, 1, 0, 851983, 1, 0, 851984, 1, 0, 851985, 1, 0, 851986, 1, 0, 851987, 1, 0, 851988, 1, 0, 851989, 1, 0, 851990, 1, 0, 851991, 1, 0, 851992, 1, 0, 851993, 1, 0, 851994, 1, 0, 851995, 1, 0, 851996, 1, 0, 851997, 1, 0, 851998, 1, 0, 851999, 1, 0, 852000, 1, 0, 852001, 1, 0, 852002, 1, 0, 852003, 1, 0, 852004, 1, 0, 852005, 1, 0, 852006, 1, 0, 852007, 1, 0, 852008, 1, 0, 852009, 1, 0, 852010, 1, 0, 852011, 1, 0, 852012, 1, 0, 852013, 1, 0, 852014, 1, 0, 852015, 1, 0, 852016, 1, 0, 852017, 1, 0, 852018, 1, 0, 852019, 1, 0, 852020, 1, 0, 852021, 1, 0, 852022, 1, 0, 983008, 1, 0, 983016, 1, 0, 983017, 1, 0, 983018, 1, 0, 983019, 1, 0, 983020, 1, 0, 983021, 1, 0, 983022, 1, 0, 983023, 1, 0, 983024, 1, 0, 983025, 1, 0, 983026, 1, 0, 983027, 1, 0, 983028, 1, 0, 983029, 1, 0, 983030, 1, 0, 983031, 1, 0, 983032, 1, 0, 983033, 1, 0, 983034, 1, 0, 983035, 1, 0, 983036, 1, 0, 983037, 1, 0, 983038, 1, 0, 983039, 1, 0, 917504, 1, 0, 917505, 1, 0, 917506, 1, 0, 917507, 1, 0, 917508, 1, 0, 917509, 1, 0, 917510, 1, 0, 917511, 1, 0, 917512, 1, 0, 917513, 1, 0, 917514, 1, 0, 917515, 1, 0, 917516, 1, 0, 917517, 1, 0, 917518, 1, 0, 917519, 1, 0, 917520, 1, 0, 917521, 1, 0, 917522, 1, 0, 917523, 1, 0, 917524, 1, 0, 917525, 1, 0, 917526, 1, 0, 917527, 1, 0, 917528, 1, 0, 917529, 1, 0, 917530, 1, 0, 917531, 1, 0, 917532, 1, 0, 917533, 1, 0, 917534, 1, 0, 917535, 1, 0, 917536, 1, 0, 917537, 1, 0, 917538, 1, 0, 917539, 1, 0, 917540, 1, 0, 917541, 1, 0, 917542, 1, 0, 917543, 1, 0, 917544, 1, 0, 917545, 1, 0, 917546, 1, 0, 917547, 1, 0, 917548, 1, 0, 917549, 1, 0, 917550, 1, 0, 917551, 1, 0, 917552, 1, 0, 917553, 1, 0, 917554, 1, 0, 917555, 1, 0, 917556, 1, 0, 917557, 1, 0, 917558, 1, 0, 1048545, 2, 0, 1048553, 1, 0, 1048554, 1, 0, 1048555, 1, 0, 1048556, 1, 0, 1048557, 1, 0, 1048558, 1, 0, 1048559, 1, 0, 1048560, 1, 0, 1048561, 1, 0, 1048562, 1, 0, 1048563, 1, 0, 1048564, 1, 0, 1048565, 1, 0, 1048566, 1, 0, 1048567, 1, 0, 1048568, 1, 0, 1048569, 1, 0, 1048570, 1, 0, 1048571, 1, 0, 1048572, 1, 0, 1048573, 1, 0, 1048574, 1, 0, 1048575, 1, 0, 983040, 1, 0, 983041, 1, 0, 983042, 1, 0, 983043, 1, 0, 983044, 1, 0, 983045, 1, 0, 983046, 1, 0, 983047, 1, 0, 983048, 1, 0, 983049, 1, 0, 983050, 1, 0, 983051, 1, 0, 983052, 1, 0, 983053, 1, 0, 983054, 1, 0, 983055, 1, 0, 983056, 1, 0, 983057, 1, 0, 983058, 1, 0, 983059, 1, 0, 983060, 1, 0, 983061, 1, 0, 983062, 1, 0, 983063, 1, 0, 983064, 1, 0, 983065, 1, 0, 983066, 1, 0, 983067, 1, 0, 983068, 1, 0, 983069, 1, 0, 983070, 1, 0, 983071, 1, 0, 983072, 1, 0, 983073, 1, 0, 983074, 1, 0, 983075, 1, 0, 983076, 1, 0, 983077, 1, 0, 983078, 1, 0, 983079, 1, 0, 983080, 1, 0, 983081, 1, 0, 983082, 1, 0, 983083, 1, 0, 983084, 1, 0, 983085, 1, 0, 983086, 1, 0, 983087, 1, 0, 983088, 1, 0, 983089, 1, 0, 983090, 1, 0, 983091, 1, 0, 983092, 1, 0, 983093, 1, 0, 1114081, 2, 0, 1114090, 1, 0, 1114091, 1, 0, 1114092, 1, 0, 1114093, 1, 0, 1114094, 1, 0, 1114095, 1, 0, 1114096, 1, 0, 1114097, 1, 0, 1114098, 1, 0, 1114099, 1, 0, 1114100, 1, 0, 1114101, 1, 0, 1114102, 1, 0, 1114103, 1, 0, 1114104, 1, 0, 1114105, 1, 0, 1114106, 1, 0, 1114107, 1, 0, 1114108, 1, 0, 1114109, 1, 0, 1114110, 1, 0, 1114111, 1, 0, 1048576, 1, 0, 1048577, 1, 0, 1048578, 1, 0, 1048579, 1, 0, 1048580, 1, 0, 1048581, 1, 0, 1048582, 1, 0, 1048583, 1, 0, 1048584, 1, 0, 1048585, 1, 0, 1048586, 1, 0, 1048587, 1, 0, 1048588, 1, 0, 1048589, 1, 0, 1048590, 1, 0, 1048591, 1, 0, 1048592, 1, 0, 1048593, 1, 0, 1048594, 1, 0, 1048595, 1, 0, 1048596, 1, 0, 1048597, 1, 0, 1048598, 1, 0, 1048599, 1, 0, 1048600, 1, 0, 1048601, 1, 0, 1048602, 1, 0, 1048603, 1, 0, 1048604, 1, 0, 1048605, 1, 0, 1048606, 1, 0, 1048607, 1, 0, 1048608, 1, 0, 1048609, 1, 0, 1048610, 1, 0, 1048611, 1, 0, 1048612, 1, 0, 1048613, 1, 0, 1048614, 1, 0, 1048615, 1, 0, 1048616, 1, 0, 1048617, 1, 0, 1048618, 1, 0, 1048619, 1, 0, 1048620, 1, 0, 1048621, 1, 0, 1048622, 1, 0, 1048623, 1, 0, 1048624, 1, 0, 1048625, 1, 0, 1048626, 1, 0, 1048627, 1, 0, 1048628, 1, 0, 1048629, 1, 0, 1179618, 2, 0, 1179627, 1, 0, 1179628, 1, 0, 1179629, 1, 0, 1179630, 1, 0, 1179631, 1, 0, 1179632, 1, 0, 1179633, 1, 0, 1179634, 1, 0, 1179635, 1, 0, 1179636, 1, 0, 1179637, 1, 0, 1179638, 1, 0, 1179639, 1, 0, 1179640, 1, 0, 1179641, 1, 0, 1179642, 1, 0, 1179643, 1, 0, 1179644, 1, 0, 1179645, 1, 0, 1179646, 1, 0, 1179647, 1, 0, 1114112, 1, 0, 1114113, 1, 0, 1114114, 1, 0, 1114115, 1, 0, 1114116, 1, 0, 1114117, 1, 0, 1114118, 1, 0, 1114119, 1, 0, 1114120, 1, 0, 1114121, 1, 0, 1114122, 1, 0, 1114123, 1, 0, 1114124, 1, 0, 1114125, 1, 0, 1114126, 1, 0, 1114127, 1, 0, 1114128, 1, 0, 1114129, 1, 0, 1114130, 1, 0, 1114131, 1, 0, 1114132, 1, 0, 1114133, 1, 0, 1114134, 1, 0, 1114135, 1, 0, 1114136, 1, 0, 1114137, 1, 0, 1114138, 1, 0, 1114139, 1, 0, 1114140, 1, 0, 1114141, 1, 0, 1114142, 1, 0, 1114143, 1, 0, 1114144, 1, 0, 1114145, 1, 0, 1114146, 1, 0, 1114147, 1, 0, 1114148, 1, 0, 1114149, 1, 0, 1114150, 1, 0, 1114151, 1, 0, 1114152, 1, 0, 1114153, 1, 0, 1114154, 1, 0, 1114155, 1, 0, 1114156, 1, 0, 1114157, 1, 0, 1114158, 1, 0, 1114159, 1, 0, 1114160, 1, 0, 1114161, 1, 0, 1114162, 1, 0, 1114163, 1, 0, 1114164, 1, 0, 1114165, 1, 0, 1245154, 2, 0, 1245164, 1, 0, 1245165, 1, 0, 1245166, 1, 0, 1245167, 1, 0, 1245168, 1, 0, 1245169, 1, 0, 1245170, 1, 0, 1245171, 1, 0, 1245172, 1, 0, 1245173, 1, 0, 1245174, 1, 0, 1245175, 1, 0, 1245176, 1, 0, 1245177, 1, 0, 1245178, 1, 0, 1245179, 1, 0, 1245180, 1, 0, 1245181, 1, 0, 1245182, 1, 0, 1245183, 1, 0, 1179648, 1, 0, 1179649, 1, 0, 1179650, 1, 0, 1179651, 1, 0, 1179652, 1, 0, 1179653, 1, 0, 1179654, 1, 0, 1179655, 1, 0, 1179656, 1, 0, 1179657, 1, 0, 1179658, 1, 0, 1179659, 1, 0, 1179660, 1, 0, 1179661, 1, 0, 1179662, 1, 0, 1179663, 1, 0, 1179664, 1, 0, 1179665, 1, 0, 1179666, 1, 0, 1179667, 1, 0, 1179668, 1, 0, 1179669, 1, 0, 1179670, 1, 0, 1179671, 1, 0, 1179672, 1, 0, 1179673, 1, 0, 1179674, 1, 0, 1179675, 1, 0, 1179676, 1, 0, 1179677, 1, 0, 1179678, 1, 0, 1179679, 1, 0, 1179680, 1, 0, 1179681, 1, 0, 1179682, 1, 0, 1179683, 1, 0, 1179684, 1, 0, 1179685, 1, 0, 1179686, 1, 0, 1179687, 1, 0, 1179688, 1, 0, 1179689, 1, 0, 1179690, 1, 0, 1179691, 1, 0, 1179692, 1, 0, 1179693, 1, 0, 1179694, 1, 0, 1179695, 1, 0, 1179696, 1, 0, 1179697, 1, 0, 1179698, 1, 0, 1179699, 1, 0, 1179700, 1, 0, 1179701, 1, 0, 1310690, 2, 0, 1310701, 1, 0, 1310702, 1, 0, 1310703, 1, 0, 1310704, 1, 0, 1310705, 1, 0, 1310706, 1, 0, 1310707, 1, 0, 1310708, 1, 0, 1310709, 1, 0, 1310710, 1, 0, 1310711, 1, 0, 1310712, 1, 0, 1310713, 1, 0, 1310714, 1, 0, 1310715, 1, 0, 1310716, 1, 0, 1310717, 1, 0, 1310718, 1, 0, 1310719, 1, 0, 1245184, 1, 0, 1245185, 1, 0, 1245186, 1, 0, 1245187, 1, 0, 1245188, 1, 0, 1245189, 1, 0, 1245190, 1, 0, 1245191, 1, 0, 1245192, 1, 0, 1245193, 1, 0, 1245194, 1, 0, 1245195, 1, 0, 1245196, 1, 0, 1245197, 1, 0, 1245198, 1, 0, 1245199, 1, 0, 1245200, 1, 0, 1245201, 1, 0, 1245202, 1, 0, 1245203, 1, 0, 1245204, 1, 0, 1245205, 1, 0, 1245206, 1, 0, 1245207, 1, 0, 1245208, 1, 0, 1245209, 1, 0, 1245210, 1, 0, 1245211, 1, 0, 1245212, 1, 0, 1245213, 1, 0, 1245214, 1, 0, 1245215, 1, 0, 1245216, 1, 0, 1245217, 1, 0, 1245218, 1, 0, 1245219, 1, 0, 1245220, 1, 0, 1245221, 1, 0, 1245222, 1, 0, 1245223, 1, 0, 1245224, 1, 0, 1245225, 1, 0, 1245226, 1, 0, 1245227, 1, 0, 1245228, 1, 0, 1245229, 1, 0, 1245230, 1, 0, 1245231, 1, 0, 1245232, 1, 0, 1245233, 1, 0, 1245234, 1, 0, 1245235, 1, 0, 1245236, 1, 0, 1376238, 1, 0, 1376239, 1, 0, 1376240, 1, 0, 1376241, 1, 0, 1376242, 1, 0, 1376243, 1, 0, 1376244, 1, 0, 1376245, 1, 0, 1376246, 1, 0, 1376247, 1, 0, 1376248, 1, 0, 1376249, 1, 0, 1376250, 1, 0, 1376251, 1, 0, 1376252, 1, 0, 1376253, 1, 0, 1376254, 1, 0, 1376255, 1, 0, 1310720, 1, 0, 1310721, 1, 0, 1310722, 1, 0, 1310723, 1, 0, 1310724, 1, 0, 1310725, 1, 0, 1310726, 1, 0, 1310727, 1, 0, 1310728, 1, 0, 1310729, 1, 0, 1310730, 1, 0, 1310731, 1, 0, 1310732, 1, 0, 1310733, 1, 0, 1310734, 1, 0, 1310735, 1, 0, 1310736, 1, 0, 1310737, 1, 0, 1310738, 1, 0, 1310739, 1, 0, 1310740, 1, 0, 1310741, 1, 0, 1310742, 1, 0, 1310743, 1, 0, 1310744, 1, 0, 1310745, 1, 0, 1310746, 1, 0, 1310747, 1, 0, 1310748, 1, 0, 1310749, 1, 0, 1310750, 1, 0, 1310751, 1, 0, 1310752, 1, 0, 1310753, 1, 0, 1310754, 1, 0, 1310755, 1, 0, 1310756, 1, 0, 1310757, 1, 0, 1310758, 1, 0, 1310759, 1, 0, 1310760, 1, 0, 1310761, 1, 0, 1310762, 1, 0, 1310763, 1, 0, 1310764, 1, 0, 1310765, 1, 0, 1310766, 1, 0, 1310767, 1, 0, 1310768, 1, 0, 1310769, 1, 0, 1310770, 1, 0, 1310771, 1, 0, 1310772, 1, 0, 1441775, 1, 0, 1441776, 1, 0, 1441777, 1, 0, 1441778, 1, 0, 1441779, 1, 0, 1441780, 1, 0, 1441781, 1, 0, 1441782, 1, 0, 1441783, 1, 0, 1441784, 1, 0, 1441785, 1, 0, 1441786, 1, 0, 1441787, 1, 0, 1441788, 1, 0, 1441789, 1, 0, 1441790, 1, 0, 1441791, 1, 0, 1376256, 1, 0, 1376257, 1, 0, 1376258, 1, 0, 1376259, 1, 0, 1376260, 1, 0, 1376261, 1, 0, 1376262, 1, 0, 1376263, 1, 0, 1376264, 1, 0, 1376265, 1, 0, 1376266, 1, 0, 1376267, 1, 0, 1376268, 1, 0, 1376269, 1, 0, 1376270, 1, 0, 1376271, 1, 0, 1376272, 1, 0, 1376273, 1, 0, 1376274, 1, 0, 1376275, 1, 0, 1376276, 1, 0, 1376277, 1, 0, 1376278, 1, 0, 1376279, 1, 0, 1376280, 1, 0, 1376281, 1, 0, 1376282, 1, 0, 1376283, 1, 0, 1376284, 1, 0, 1376285, 1, 0, 1376286, 1, 0, 1376287, 1, 0, 1376288, 1, 0, 1376289, 1, 0, 1376290, 1, 0, 1376291, 1, 0, 1376292, 1, 0, 1376293, 1, 0, 1376294, 1, 0, 1376295, 1, 0, 1376296, 1, 0, 1376297, 1, 0, 1376298, 1, 0, 1376299, 1, 0, 1376300, 1, 0, 1376301, 1, 0, 1376302, 1, 0, 1376303, 1, 0, 1376304, 1, 0, 1376305, 1, 0, 1376306, 1, 0, 1376307, 1, 0, 1376308, 1, 0, 1507312, 1, 0, 1507313, 1, 0, 1507314, 1, 0, 1507315, 1, 0, 1507316, 1, 0, 1507317, 1, 0, 1507318, 1, 0, 1507319, 1, 0, 1507320, 1, 0, 1507321, 1, 0, 1507322, 1, 0, 1507323, 1, 0, 1507324, 1, 0, 1507325, 1, 0, 1507326, 1, 0, 1507327, 1, 0, 1441792, 1, 0, 1441793, 1, 0, 1441794, 1, 0, 1441795, 1, 0, 1441796, 1, 0, 1441797, 1, 0, 1441798, 1, 0, 1441799, 1, 0, 1441800, 1, 0, 1441801, 1, 0, 1441802, 1, 0, 1441803, 1, 0, 1441804, 1, 0, 1441805, 1, 0, 1441806, 1, 0, 1441807, 1, 0, 1441808, 1, 0, 1441809, 1, 0, 1441810, 1, 0, 1441811, 1, 0, 1441812, 1, 0, 1441813, 1, 0, 1441814, 1, 0, 1441815, 1, 0, 1441816, 1, 0, 1441817, 1, 0, 1441818, 1, 0, 1441819, 1, 0, 1441820, 1, 0, 1441821, 1, 0, 1441822, 1, 0, 1441823, 1, 0, 1441824, 1, 0, 1441825, 1, 0, 1441826, 1, 0, 1441827, 1, 0, 1441828, 1, 0, 1441829, 1, 0, 1441830, 1, 0, 1441831, 1, 0, 1441832, 1, 0, 1441833, 1, 0, 1441834, 1, 0, 1441835, 1, 0, 1441836, 1, 0, 1441837, 1, 0, 1441838, 1, 0, 1441839, 1, 0, 1441840, 1, 0, 1441841, 1, 0, 1441842, 1, 0, 1441843, 1, 0, 1572849, 1, 0, 1572850, 1, 0, 1572851, 1, 0, 1572852, 1, 0, 1572853, 1, 0, 1572854, 1, 0, 1572855, 1, 0, 1572856, 1, 0, 1572857, 1, 0, 1572858, 1, 0, 1572859, 1, 0, 1572860, 1, 0, 1572861, 1, 0, 1572862, 1, 0, 1572863, 1, 0, 1507328, 1, 0, 1507329, 1, 0, 1507330, 1, 0, 1507331, 1, 0, 1507332, 1, 0, 1507333, 1, 0, 1507334, 1, 0, 1507335, 1, 0, 1507336, 1, 0, 1507337, 1, 0, 1507338, 1, 0, 1507339, 1, 0, 1507340, 1, 0, 1507341, 1, 0, 1507342, 1, 0, 1507343, 1, 0, 1507344, 1, 0, 1507345, 1, 0, 1507346, 1, 0, 1507347, 1, 0, 1507348, 1, 0, 1507349, 1, 0, 1507350, 1, 0, 1507351, 1, 0, 1507352, 1, 0, 1507353, 1, 0, 1507354, 1, 0, 1507355, 1, 0, 1507356, 1, 0, 1507357, 1, 0, 1507358, 1, 0, 1507359, 1, 0, 1507360, 1, 0, 1507361, 1, 0, 1507362, 1, 0, 1507363, 1, 0, 1507364, 1, 0, 1507365, 1, 0, 1507366, 1, 0, 1507367, 1, 0, 1507368, 1, 0, 1507369, 1, 0, 1507370, 1, 0, 1507371, 1, 0, 1507372, 1, 0, 1507373, 1, 0, 1507374, 1, 0, 1507375, 1, 0, 1507376, 1, 0, 1507377, 1, 0, 1507378, 1, 0, 1507379, 1, 0, 1638385, 1, 0, 1638386, 1, 0, 1638387, 1, 0, 1638388, 1, 0, 1638389, 1, 0, 1638390, 1, 0, 1638391, 1, 0, 1638392, 1, 0, 1638393, 1, 0, 1638394, 1, 0, 1638395, 1, 0, 1638396, 1, 0, 1638397, 1, 0, 1638398, 1, 0, 1638399, 1, 0, 1572864, 1, 0, 1572865, 1, 0, 1572866, 1, 0, 1572867, 1, 0, 1572868, 1, 0, 1572869, 1, 0, 1572870, 1, 0, 1572871, 1, 0, 1572872, 1, 0, 1572873, 1, 0, 1572874, 1, 0, 1572875, 1, 0, 1572876, 1, 0, 1572877, 1, 0, 1572878, 1, 0, 1572879, 1, 0, 1572880, 1, 0, 1572881, 1, 0, 1572882, 1, 0, 1572883, 1, 0, 1572884, 1, 0, 1572885, 1, 0, 1572886, 1, 0, 1572887, 1, 0, 1572888, 1, 0, 1572889, 1, 0, 1572890, 1, 0, 1572891, 1, 0, 1572892, 1, 0, 1572893, 1, 0, 1572894, 1, 0, 1572895, 1, 0, 1572896, 1, 0, 1572897, 1, 0, 1572898, 1, 0, 1572899, 1, 0, 1572900, 1, 0, 1572901, 1, 0, 1572902, 1, 0, 1572903, 1, 0, 1572904, 1, 0, 1572905, 1, 0, 1572906, 1, 0, 1572907, 1, 0, 1572908, 1, 0, 1572909, 1, 0, 1572910, 1, 0, 1572911, 1, 0, 1572912, 1, 0, 1572913, 1, 0, 1572914, 1, 0, 1703922, 1, 0, 1703923, 1, 0, 1703924, 1, 0, 1703925, 1, 0, 1703926, 1, 0, 1703927, 1, 0, 1703928, 1, 0, 1703929, 1, 0, 1703930, 1, 0, 1703931, 1, 0, 1703932, 1, 0, 1703933, 1, 0, 1703934, 1, 0, 1703935, 1, 0, 1638400, 1, 0, 1638401, 1, 0, 1638402, 1, 0, 1638403, 1, 0, 1638404, 1, 0, 1638405, 1, 0, 1638406, 1, 0, 1638407, 1, 0, 1638408, 1, 0, 1638409, 1, 0, 1638410, 1, 0, 1638411, 1, 0, 1638412, 1, 0, 1638413, 1, 0, 1638414, 1, 0, 1638415, 1, 0, 1638416, 1, 0, 1638417, 1, 0, 1638418, 1, 0, 1638419, 1, 0, 1638420, 1, 0, 1638421, 1, 0, 1638422, 1, 0, 1638423, 1, 0, 1638424, 1, 0, 1638425, 1, 0, 1638426, 1, 0, 1638427, 1, 0, 1638428, 1, 0, 1638429, 1, 0, 1638430, 1, 0, 1638431, 1, 0, 1638432, 1, 0, 1638433, 1, 0, 1638434, 1, 0, 1638435, 1, 0, 1638436, 1, 0, 1638437, 1, 0, 1638438, 1, 0, 1638439, 1, 0, 1638440, 1, 0, 1638441, 1, 0, 1638442, 1, 0, 1638443, 1, 0, 1638444, 1, 0, 1638445, 1, 0, 1638446, 1, 0, 1638447, 1, 0, 1638448, 1, 0, 1638449, 1, 0, 1638450, 1, 0, 1769459, 1, 0, 1769460, 1, 0, 1769461, 1, 0, 1769462, 1, 0, 1769463, 1, 0, 1769464, 1, 0, 1769465, 1, 0, 1769466, 1, 0, 1769467, 1, 0, 1769468, 1, 0, 1769469, 1, 0, 1769470, 1, 0, 1769471, 1, 0, 1703936, 1, 0, 1703937, 1, 0, 1703938, 1, 0, 1703939, 1, 0, 1703940, 1, 0, 1703941, 1, 0, 1703942, 1, 0, 1703943, 1, 0, 1703944, 1, 0, 1703945, 1, 0, 1703946, 1, 0, 1703947, 1, 0, 1703948, 1, 0, 1703949, 1, 0, 1703950, 1, 0, 1703951, 1, 0, 1703952, 1, 0, 1703953, 1, 0, 1703954, 1, 0, 1703955, 1, 0, 1703956, 1, 0, 1703957, 1, 0, 1703958, 1, 0, 1703959, 1, 0, 1703960, 1, 0, 1703961, 1, 0, 1703962, 1, 0, 1703963, 1, 0, 1703964, 1, 0, 1703965, 1, 0, 1703966, 1, 0, 1703967, 1, 0, 1703968, 1, 0, 1703969, 1, 0, 1703970, 1, 0, 1703971, 1, 0, 1703972, 1, 0, 1703973, 1, 0, 1703974, 1, 0, 1703975, 1, 0, 1703976, 1, 0, 1703977, 1, 0, 1703978, 1, 0, 1703979, 1, 0, 1703980, 1, 0, 1703981, 1, 0, 1703982, 1, 0, 1703983, 1, 0, 1703984, 1, 0, 1703985, 1, 0, 1834996, 1, 0, 1834997, 1, 0, 1834998, 1, 0, 1834999, 1, 0, 1835000, 1, 0, 1835001, 1, 0, 1835002, 1, 0, 1835003, 1, 0, 1835004, 1, 0, 1835005, 1, 0, 1835006, 1, 0, 1835007, 1, 0, 1769472, 1, 0, 1769473, 1, 0, 1769474, 1, 0, 1769475, 1, 0, 1769476, 1, 0, 1769477, 1, 0, 1769478, 1, 0, 1769479, 1, 0, 1769480, 1, 0, 1769481, 1, 0, 1769482, 1, 0, 1769483, 1, 0, 1769484, 1, 0, 1769485, 1, 0, 1769486, 1, 0, 1769487, 1, 0, 1769488, 1, 0, 1769489, 1, 0, 1769490, 1, 0, 1769491, 1, 0, 1769492, 1, 0, 1769493, 1, 0, 1769494, 1, 0, 1769495, 1, 0, 1769496, 1, 0, 1769497, 1, 0, 1769498, 1, 0, 1769499, 1, 0, 1769500, 1, 0, 1769501, 1, 0, 1769502, 1, 0, 1769503, 1, 0, 1769504, 1, 0, 1769505, 1, 0, 1769506, 1, 0, 1769507, 1, 0, 1769508, 1, 0, 1769509, 1, 0, 1769510, 1, 0, 1769511, 1, 0, 1769512, 1, 0, 1769513, 1, 0, 1769514, 1, 0, 1769515, 1, 0, 1769516, 1, 0, 1769517, 1, 0, 1769518, 1, 0, 1769519, 1, 0, 1769520, 1, 0, 1769521, 1, 0, 1900533, 1, 0, 1900534, 1, 0, 1900535, 1, 0, 1900536, 1, 0, 1900537, 1, 0, 1900538, 1, 0, 1900539, 1, 0, 1900540, 1, 0, 1900541, 1, 0, 1900542, 1, 0, 1900543, 1, 0, 1835008, 1, 0, 1835009, 1, 0, 1835010, 1, 0, 1835011, 1, 0, 1835012, 1, 0, 1835013, 1, 0, 1835014, 1, 0, 1835015, 1, 0, 1835016, 1, 0, 1835017, 1, 0, 1835018, 1, 0, 1835019, 1, 0, 1835020, 1, 0, 1835021, 1, 0, 1835022, 1, 0, 1835023, 1, 0, 1835024, 1, 0, 1835025, 1, 0, 1835026, 1, 0, 1835027, 1, 0, 1835028, 1, 0, 1835029, 1, 0, 1835030, 1, 0, 1835031, 1, 0, 1835032, 1, 0, 1835033, 1, 0, 1835034, 1, 0, 1835035, 1, 0, 1835036, 1, 0, 1835037, 1, 0, 1835038, 1, 0, 1835039, 1, 0, 1835040, 1, 0, 1835041, 1, 0, 1835042, 1, 0, 1835043, 1, 0, 1835044, 1, 0, 1835045, 1, 0, 1835046, 1, 0, 1835047, 1, 0, 1835048, 1, 0, 1835049, 1, 0, 1835050, 1, 0, 1835051, 1, 0, 1835052, 1, 0, 1835053, 1, 0, 1835054, 1, 0, 1835055, 1, 0, 1835056, 1, 0, 1966070, 1, 0, 1966071, 1, 0, 1966072, 1, 0, 1966073, 1, 0, 1966074, 1, 0, 1966075, 1, 0, 1966076, 1, 0, 1966077, 1, 0, 1966078, 1, 0, 1966079, 1, 0, 1900544, 1, 0, 1900545, 1, 0, 1900546, 1, 0, 1900547, 1, 0, 1900548, 1, 0, 1900549, 1, 0, 1900550, 1, 0, 1900551, 1, 0, 1900552, 1, 0, 1900553, 1, 0, 1900554, 1, 0, 1900555, 1, 0, 1900556, 1, 0, 1900557, 1, 0, 1900558, 1, 0, 1900559, 1, 0, 1900560, 1, 0, 1900561, 1, 0, 1900562, 1, 0, 1900563, 1, 0, 1900564, 1, 0, 1900565, 1, 0, 1900566, 1, 0, 1900567, 1, 0, 1900568, 1, 0, 1900569, 1, 0, 1900570, 1, 0, 1900571, 1, 0, 1900572, 1, 0, 1900573, 1, 0, 1900574, 1, 0, 1900575, 1, 0, 1900576, 1, 0, 1900577, 1, 0, 1900578, 1, 0, 1900579, 1, 0, 1900580, 1, 0, 1900581, 1, 0, 1900582, 1, 0, 1900583, 1, 0, 1900584, 1, 0, 1900585, 1, 0, 1900586, 1, 0, 1900587, 1, 0, 1900588, 1, 0, 1900589, 1, 0, 1900590, 1, 0, 1900591, 1, 0, 1900592, 1, 0, 2031607, 1, 0, 2031608, 1, 0, 2031609, 1, 0, 2031610, 1, 0, 2031611, 1, 0, 2031612, 1, 0, 2031613, 1, 0, 2031614, 1, 0, 2031615, 1, 0, 1966080, 1, 0, 1966081, 1, 0, 1966082, 1, 0, 1966083, 1, 0, 1966084, 1, 0, 1966085, 1, 0, 1966086, 1, 0, 1966087, 1, 0, 1966088, 1, 0, 1966089, 1, 0, 1966090, 1, 0, 1966091, 1, 0, 1966092, 1, 0, 1966093, 1, 0, 1966094, 1, 0, 1966095, 1, 0, 1966096, 1, 0, 1966097, 1, 0, 1966098, 1, 0, 1966099, 1, 0, 1966100, 1, 0, 1966101, 1, 0, 1966102, 1, 0, 1966103, 1, 0, 1966104, 1, 0, 1966105, 1, 0, 1966106, 1, 0, 1966107, 1, 0, 1966108, 1, 0, 1966109, 1, 0, 1966110, 1, 0, 1966111, 1, 0, 1966112, 1, 0, 1966113, 1, 0, 1966114, 1, 0, 1966115, 1, 0, 1966116, 1, 0, 1966117, 1, 0, 1966118, 1, 0, 1966119, 1, 0, 1966120, 1, 0, 1966121, 1, 0, 1966122, 1, 0, 1966123, 1, 0, 1966124, 1, 0, 1966125, 1, 0, 1966126, 1, 0, 1966127, 1, 0, 2097144, 1, 0, 2097145, 1, 0, 2097146, 1, 0, 2097147, 1, 0, 2097148, 1, 0, 2097149, 1, 0, 2097150, 1, 0, 2097151, 1, 0, 2031616, 1, 0, 2031617, 1, 0, 2031618, 1, 0, 2031619, 1, 0, 2031620, 1, 0, 2031621, 1, 0, 2031622, 1, 0, 2031623, 1, 0, 2031624, 1, 0, 2031625, 1, 0, 2031626, 1, 0, 2031627, 1, 0, 2031628, 1, 0, 2031629, 1, 0, 2031630, 1, 0, 2031631, 1, 0, 2031632, 1, 0, 2031633, 1, 0, 2031634, 1, 0, 2031635, 1, 0, 2031636, 1, 0, 2031637, 1, 0, 2031638, 1, 0, 2031639, 1, 0, 2031640, 1, 0, 2031641, 1, 0, 2031642, 1, 0, 2031643, 1, 0, 2031644, 1, 0, 2031645, 1, 0, 2031646, 1, 0, 2031647, 1, 0, 2031648, 1, 0, 2031649, 1, 0, 2031650, 1, 0, 2031651, 1, 0, 2031652, 1, 0, 2031653, 1, 0, 2031654, 1, 0, 2031655, 1, 0, 2031656, 1, 0, 2031657, 1, 0, 2031658, 1, 0, 2031659, 1, 0, 2031660, 1, 0, 2031661, 1, 0, 2031662, 1, 0, 2031663, 1, 0, 2162681, 1, 0, 2162682, 1, 0, 2162683, 1, 0, 2162684, 1, 0, 2162685, 1, 0, 2162686, 1, 0, 2162687, 1, 0, 2097152, 1, 0, 2097153, 1, 0, 2097154, 1, 0, 2097155, 1, 0, 2097156, 1, 0, 2097157, 1, 0, 2097158, 1, 0, 2097159, 1, 0, 2097160, 1, 0, 2097161, 1, 0, 2097162, 1, 0, 2097163, 1, 0, 2097164, 1, 0, 2097165, 1, 0, 2097166, 1, 0, 2097167, 1, 0, 2097168, 1, 0, 2097169, 1, 0, 2097170, 1, 0, 2097171, 1, 0, 2097172, 1, 0, 2097173, 1, 0, 2097174, 1, 0, 2097175, 1, 0, 2097176, 1, 0, 2097177, 1, 0, 2097178, 1, 0, 2097179, 1, 0, 2097180, 1, 0, 2097181, 1, 0, 2097182, 1, 0, 2097183, 1, 0, 2097184, 1, 0, 2097185, 1, 0, 2097186, 1, 0, 2097187, 1, 0, 2097188, 1, 0, 2097189, 1, 0, 2097190, 1, 0, 2097191, 1, 0, 2097192, 1, 0, 2097193, 1, 0, 2097194, 1, 0, 2097195, 1, 0, 2097196, 1, 0, 2097197, 1, 0, 2097198, 1, 0, 2097199, 1, 0, 2228218, 1, 0, 2228219, 1, 0, 2228220, 1, 0, 2228221, 1, 0, 2228222, 1, 0, 2228223, 1, 0, 2162688, 1, 0, 2162689, 1, 0, 2162690, 1, 0, 2162691, 1, 0, 2162692, 1, 0, 2162693, 1, 0, 2162694, 1, 0, 2162695, 1, 0, 2162696, 1, 0, 2162697, 1, 0, 2162698, 1, 0, 2162699, 1, 0, 2162700, 1, 0, 2162701, 1, 0, 2162702, 1, 0, 2162703, 1, 0, 2162704, 1, 0, 2162705, 1, 0, 2162706, 1, 0, 2162707, 1, 0, 2162708, 1, 0, 2162709, 1, 0, 2162710, 1, 0, 2162711, 1, 0, 2162712, 1, 0, 2162713, 1, 0, 2162714, 1, 0, 2162715, 1, 0, 2162716, 1, 0, 2162717, 1, 0, 2162718, 1, 0, 2162719, 1, 0, 2162720, 1, 0, 2162721, 1, 0, 2162722, 1, 0, 2162723, 1, 0, 2162724, 1, 0, 2162725, 1, 0, 2162726, 1, 0, 2162727, 1, 0, 2162728, 1, 0, 2162729, 1, 0, 2162730, 1, 0, 2162731, 1, 0, 2162732, 1, 0, 2162733, 1, 0, 2162734, 1, 0, 2293754, 1, 0, 2293755, 1, 0, 2293756, 1, 0, 2293757, 1, 0, 2293758, 1, 0, 2293759, 1, 0, 2228224, 1, 0, 2228225, 1, 0, 2228226, 1, 0, 2228227, 1, 0, 2228228, 1, 0, 2228229, 1, 0, 2228230, 1, 0, 2228231, 1, 0, 2228232, 1, 0, 2228233, 1, 0, 2228234, 1, 0, 2228235, 1, 0, 2228236, 1, 0, 2228237, 1, 0, 2228238, 1, 0, 2228239, 1, 0, 2228240, 1, 0, 2228241, 1, 0, 2228242, 1, 0, 2228243, 1, 0, 2228244, 1, 0, 2228245, 1, 0, 2228246, 1, 0, 2228247, 1, 0, 2228248, 1, 0, 2228249, 1, 0, 2228250, 1, 0, 2228251, 1, 0, 2228252, 1, 0, 2228253, 1, 0, 2228254, 1, 0, 2228255, 1, 0, 2228256, 1, 0, 2228257, 1, 0, 2228258, 1, 0, 2228259, 1, 0, 2228260, 1, 0, 2228261, 1, 0, 2228262, 1, 0, 2228263, 1, 0, 2228264, 1, 0, 2228265, 1, 0, 2228266, 1, 0, 2228267, 1, 0, 2228268, 1, 0, 2228269, 1, 0, 2228270, 1, 0, 2359291, 1, 0, 2359292, 1, 0, 2359293, 1, 0, 2359294, 1, 0, 2359295, 1, 0, 2293760, 1, 0, 2293761, 1, 0, 2293762, 1, 0, 2293763, 1, 0, 2293764, 1, 0, 2293765, 1, 0, 2293766, 1, 0, 2293767, 1, 0, 2293768, 1, 0, 2293769, 1, 0, 2293770, 1, 0, 2293771, 1, 0, 2293772, 1, 0, 2293773, 1, 0, 2293774, 1, 0, 2293775, 1, 0, 2293776, 1, 0, 2293777, 1, 0, 2293778, 1, 0, 2293779, 1, 0, 2293780, 1, 0, 2293781, 1, 0, 2293782, 1, 0, 2293783, 1, 0, 2293784, 1, 0, 2293785, 1, 0, 2293786, 1, 0, 2293787, 1, 0, 2293788, 1, 0, 2293789, 1, 0, 2293790, 1, 0, 2293791, 1, 0, 2293792, 1, 0, 2293793, 1, 0, 2293794, 1, 0, 2293795, 1, 0, 2293796, 1, 0, 2293797, 1, 0, 2293798, 1, 0, 2293799, 1, 0, 2293800, 1, 0, 2293801, 1, 0, 2293802, 1, 0, 2293803, 1, 0, 2293804, 1, 0, 2293805, 1, 0, 2424828, 1, 0, 2424829, 1, 0, 2424830, 1, 0, 2424831, 1, 0, 2359296, 1, 0, 2359297, 1, 0, 2359298, 1, 0, 2359299, 1, 0, 2359300, 1, 0, 2359301, 1, 0, 2359302, 1, 0, 2359303, 1, 0, 2359304, 1, 0, 2359305, 1, 0, 2359306, 1, 0, 2359307, 1, 0, 2359308, 1, 0, 2359309, 1, 0, 2359310, 1, 0, 2359311, 1, 0, 2359312, 1, 0, 2359313, 1, 0, 2359314, 1, 0, 2359315, 1, 0, 2359316, 1, 0, 2359317, 1, 0, 2359318, 1, 0, 2359319, 1, 0, 2359320, 1, 0, 2359321, 1, 0, 2359322, 1, 0, 2359323, 1, 0, 2359324, 1, 0, 2359325, 1, 0, 2359326, 1, 0, 2359327, 1, 0, 2359328, 1, 0, 2359329, 1, 0, 2359330, 1, 0, 2359331, 1, 0, 2359332, 1, 0, 2359333, 1, 0, 2359334, 1, 0, 2359335, 1, 0, 2359336, 1, 0, 2359337, 1, 0, 2359338, 1, 0, 2359339, 1, 0, 2359340, 1, 0, 2490365, 1, 0, 2490366, 1, 0, 2490367, 1, 0, 2424832, 1, 0, 2424833, 1, 0, 2424834, 1, 0, 2424835, 1, 0, 2424836, 1, 0, 2424837, 1, 0, 2424838, 1, 0, 2424839, 1, 0, 2424840, 1, 0, 2424841, 1, 0, 2424842, 1, 0, 2424843, 1, 0, 2424844, 1, 0, 2424845, 1, 0, 2424846, 1, 0, 2424847, 1, 0, 2424848, 1, 0, 2424849, 1, 0, 2424850, 1, 0, 2424851, 1, 0, 2424852, 1, 0, 2424853, 1, 0, 2424854, 1, 0, 2424855, 1, 0, 2424856, 1, 0, 2424857, 1, 0, 2424858, 1, 0, 2424859, 1, 0, 2424860, 1, 0, 2424861, 1, 0, 2424862, 1, 0, 2424863, 1, 0, 2424864, 1, 0, 2424865, 1, 0, 2424866, 1, 0, 2424867, 1, 0, 2424868, 1, 0, 2424869, 1, 0, 2424870, 1, 0, 2424871, 1, 0, 2424872, 1, 0, 2424873, 1, 0, 2424874, 1, 0, 2424875, 1, 0, 2424876, 1, 0, 2555903, 1, 0, 2490368, 1, 0, 2490369, 1, 0, 2490370, 1, 0, 2490371, 1, 0, 2490372, 1, 0, 2490373, 1, 0, 2490374, 1, 0, 2490375, 1, 0, 2490376, 1, 0, 2490377, 1, 0, 2490378, 1, 0, 2490379, 1, 0, 2490380, 1, 0, 2490381, 1, 0, 2490382, 1, 0, 2490383, 1, 0, 2490384, 1, 0, 2490385, 1, 0, 2490386, 1, 0, 2490387, 1, 0, 2490388, 1, 0, 2490389, 1, 0, 2490390, 1, 0, 2490391, 1, 0, 2490392, 1, 0, 2490393, 1, 0, 2490394, 1, 0, 2490395, 1, 0, 2490396, 1, 0, 2490397, 1, 0, 2490398, 1, 0, 2490399, 1, 0, 2490400, 1, 0, 2490401, 1, 0, 2490402, 1, 0, 2490403, 1, 0, 2490404, 1, 0, 2490405, 1, 0, 2490406, 1, 0, 2490407, 1, 0, 2490408, 1, 0, 2490409, 1, 0, 2490410, 1, 0, 2490411, 1, 0, 2555904, 1, 0, 2555905, 1, 0, 2555906, 1, 0, 2555907, 1, 0, 2555908, 1, 0, 2555909, 1, 0, 2555910, 1, 0, 2555911, 1, 0, 2555912, 1, 0, 2555913, 1, 0, 2555914, 1, 0, 2555915, 1, 0, 2555916, 1, 0, 2555917, 1, 0, 2555918, 1, 0, 2555919, 1, 0, 2555920, 1, 0, 2555921, 1, 0, 2555922, 1, 0, 2555923, 1, 0, 2555924, 1, 0, 2555925, 1, 0, 2555926, 1, 0, 2555927, 1, 0, 2555928, 1, 0, 2555929, 1, 0, 2555930, 1, 0, 2555931, 1, 0, 2555932, 1, 0, 2555933, 1, 0, 2555934, 1, 0, 2555935, 1, 0, 2555936, 1, 0, 2555937, 1, 0, 2555938, 1, 0, 2555939, 1, 0, 2555940, 1, 0, 2555941, 1, 0, 2555942, 1, 0, 2555943, 1, 0, 2555944, 1, 0, 2555945, 1, 0, 2555946, 1, 0, 2555947, 1, 0, 2621441, 1, 0, 2621442, 1, 0, 2621443, 1, 0, 2621444, 1, 0, 2621445, 1, 0, 2621446, 1, 0, 2621447, 1, 0, 2621448, 1, 0, 2621449, 1, 0, 2621450, 1, 0, 2621451, 1, 0, 2621452, 1, 0, 2621453, 1, 0, 2621454, 1, 0, 2621455, 1, 0, 2621456, 1, 0, 2621457, 1, 0, 2621458, 1, 0, 2621459, 1, 0, 2621460, 1, 0, 2621461, 1, 0, 2621462, 1, 0, 2621463, 1, 0, 2621464, 1, 0, 2621465, 1, 0, 2621466, 1, 0, 2621467, 1, 0, 2621468, 1, 0, 2621469, 1, 0, 2621470, 1, 0, 2621471, 1, 0, 2621472, 1, 0, 2621473, 1, 0, 2621474, 1, 0, 2621475, 1, 0, 2621476, 1, 0, 2621477, 1, 0, 2621478, 1, 0, 2621479, 1, 0, 2621480, 1, 0, 2621481, 1, 0, 2621482, 1, 0, 2686979, 1, 0, 2686980, 1, 0, 2686981, 1, 0, 2686982, 1, 0, 2686983, 1, 0, 2686984, 1, 0, 2686985, 1, 0, 2686986, 1, 0, 2686987, 1, 0, 2686988, 1, 0, 2686989, 1, 0, 2686990, 1, 0, 2686991, 1, 0, 2686992, 1, 0, 2686993, 1, 0, 2686994, 1, 0, 2686995, 1, 0, 2686996, 1, 0, 2686997, 1, 0, 2686998, 1, 0, 2686999, 1, 0, 2687000, 1, 0, 2687001, 1, 0, 2687002, 1, 0, 2687003, 1, 0, 2687004, 1, 0, 2687005, 1, 0, 2687006, 1, 0, 2687007, 1, 0, 2687008, 1, 0, 2687009, 1, 0, 2687010, 1, 0, 2687011, 1, 0, 2687012, 1, 0, 2687013, 1, 0, 2687014, 1, 0, 2687015, 1, 0, 2687016, 1, 0, 2687017, 1, 0, 2687018, 1, 0, 2752516, 1, 0, 2752517, 1, 0, 2752518, 1, 0, 2752519, 1, 0, 2752520, 1, 0, 2752521, 1, 0, 2752522, 1, 0, 2752523, 1, 0, 2752524, 1, 0, 2752525, 1, 0, 2752526, 1, 0, 2752527, 1, 0, 2752528, 1, 0, 2752529, 1, 0, 2752530, 1, 0, 2752531, 1, 0, 2752532, 1, 0, 2752533, 1, 0, 2752534, 1, 0, 2752535, 1, 0, 2752536, 1, 0, 2752537, 1, 0, 2752538, 1, 0, 2752539, 1, 0, 2752540, 1, 0, 2752541, 1, 0, 2752542, 1, 0, 2752543, 1, 0, 2752544, 1, 0, 2752545, 1, 0, 2752546, 1, 0, 2752547, 1, 0, 2752548, 1, 0, 2752549, 1, 0, 2752550, 1, 0, 2752551, 1, 0, 2752552, 1, 0, 2752553, 1, 0, 2818053, 1, 0, 2818054, 1, 0, 2818055, 1, 0, 2818056, 1, 0, 2818057, 1, 0, 2818058, 1, 0, 2818059, 1, 0, 2818060, 1, 0, 2818061, 1, 0, 2818062, 1, 0, 2818063, 1, 0, 2818064, 1, 0, 2818065, 1, 0, 2818066, 1, 0, 2818067, 1, 0, 2818068, 1, 0, 2818069, 1, 0, 2818070, 1, 0, 2818071, 1, 0, 2818072, 1, 0, 2818073, 1, 0, 2818074, 1, 0, 2818075, 1, 0, 2818076, 1, 0, 2818077, 1, 0, 2818078, 1, 0, 2818079, 1, 0, 2818080, 1, 0, 2818081, 1, 0, 2818082, 1, 0, 2818083, 1, 0, 2818084, 1, 0, 2818085, 1, 0, 2818086, 1, 0, 2818087, 1, 0, 2818088, 1, 0, 2883591, 1, 0, 2883592, 1, 0, 2883593, 1, 0, 2883594, 1, 0, 2883595, 1, 0, 2883596, 1, 0, 2883597, 1, 0, 2883598, 1, 0, 2883599, 1, 0, 2883600, 1, 0, 2883601, 1, 0, 2883602, 1, 0, 2883603, 1, 0, 2883604, 1, 0, 2883605, 1, 0, 2883606, 1, 0, 2883607, 1, 0, 2883608, 1, 0, 2883609, 1, 0, 2883610, 1, 0, 2883611, 1, 0, 2883612, 1, 0, 2883613, 1, 0, 2883614, 1, 0, 2883615, 1, 0, 2883616, 1, 0, 2883617, 1, 0, 2883618, 1, 0, 2883619, 1, 0, 2883620, 1, 0, 2883621, 1, 0, 2883622, 1, 0, 2949128, 1, 0, 2949129, 1, 0, 2949130, 1, 0, 2949131, 1, 0, 2949132, 1, 0, 2949133, 1, 0, 2949134, 1, 0, 2949135, 1, 0, 2949136, 1, 0, 2949137, 1, 0, 2949138, 1, 0, 2949139, 1, 0, 2949140, 1, 0, 2949141, 1, 0, 2949142, 1, 0, 2949143, 1, 0, 2949144, 1, 0, 2949145, 1, 0, 2949146, 1, 0, 2949147, 1, 0, 2949148, 1, 0, 2949149, 1, 0, 2949150, 1, 0, 2949151, 1, 0, 2949152, 1, 0, 2949153, 1, 0, 2949154, 1, 0, 2949155, 1, 0, 2949156, 1, 0, 2949157, 1, 0, 3014665, 1, 0, 3014666, 1, 0, 3014667, 1, 0, 3014668, 1, 0, 3014669, 1, 0, 3014670, 1, 0, 3014671, 1, 0, 3014672, 1, 0, 3014673, 1, 0, 3014674, 1, 0, 3014675, 1, 0, 3014676, 1, 0, 3014677, 1, 0, 3014678, 1, 0, 3014679, 1, 0, 3014680, 1, 0, 3014681, 1, 0, 3014682, 1, 0, 3014683, 1, 0, 3014684, 1, 0, 3014685, 1, 0, 3014686, 1, 0, 3014687, 1, 0, 3014688, 1, 0, 3014689, 1, 0, 3014690, 1, 0, 3014691, 1, 0, 3014692, 1, 0, 3014693, 1, 0, 3080202, 1, 0, 3080203, 1, 0, 3080204, 1, 0, 3080205, 1, 0, 3080206, 1, 0, 3080207, 1, 0, 3080208, 1, 0, 3080209, 1, 0, 3080210, 1, 0, 3080211, 1, 0, 3080212, 1, 0, 3080213, 1, 0, 3080214, 1, 0, 3080215, 1, 0, 3080216, 1, 0, 3080217, 1, 0, 3080218, 1, 0, 3080219, 1, 0, 3080220, 1, 0, 3080221, 1, 0, 3080222, 1, 0, 3080223, 1, 0, 3080224, 1, 0, 3080225, 1, 0, 3080226, 1, 0, 3080227, 1, 0, 3080228, 1, 0, 3145739, 1, 0, 3145740, 1, 0, 3145741, 1, 0, 3145742, 1, 0, 3145743, 1, 0, 3145744, 1, 0, 3145745, 1, 0, 3145746, 1, 0, 3145747, 1, 0, 3145748, 1, 0, 3145749, 1, 0, 3145750, 1, 0, 3145751, 1, 0, 3145752, 1, 0, 3145753, 1, 0, 3145754, 1, 0, 3145755, 1, 0, 3145756, 1, 0, 3145757, 1, 0, 3145758, 1, 0, 3145759, 1, 0, 3145760, 1, 0, 3145761, 1, 0, 3145762, 1, 0, 3145763, 1, 0, 3211276, 1, 0, 3211277, 1, 0, 3211278, 1, 0, 3211279, 1, 0, 3211280, 1, 0, 3211281, 1, 0, 3211282, 1, 0, 3211283, 1, 0, 3211284, 1, 0, 3211285, 1, 0, 3211286, 1, 0, 3211287, 1, 0, 3211288, 1, 0, 3211289, 1, 0, 3211290, 1, 0, 3211291, 1, 0, 3211292, 1, 0, 3211293, 1, 0, 3211294, 1, 0, 3211295, 1, 0, 3211296, 1, 0, 3211297, 1, 0, 3211298, 1, 0, 3276813, 1, 0, 3276814, 1, 0, 3276815, 1, 0, 3276816, 1, 0, 3276817, 1, 0, 3276818, 1, 0, 3276819, 1, 0, 3276820, 1, 0, 3276821, 1, 0, 3276822, 1, 0, 3276823, 1, 0, 3276824, 1, 0, 3276825, 1, 0, 3276826, 1, 0, 3276827, 1, 0, 3276828, 1, 0, 3276829, 1, 0, 3276830, 1, 0, 3276831, 1, 0, 3276832, 1, 0, 3342351, 1, 0, 3342352, 1, 0, 3342353, 1, 0, 3342354, 1, 0, 3342355, 1, 0, 3342356, 1, 0, 3342357, 1, 0, 3342358, 1, 0, 3342359, 1, 0, 3342360, 1, 0, 3342361, 1, 0, 3342362, 1, 0, 3342363, 1, 0, 3342364, 1, 0, 3342365, 1, 0, 3342366, 1, 0, 3342367, 1, 0, 3407888, 1, 0, 3407889, 1, 0, 3407890, 1, 0, 3407891, 1, 0, 3407892, 1, 0, 3407893, 1, 0, 3407894, 1, 0, 3407895, 1, 0, 3407896, 1, 0, 3407897, 1, 0, 3407898, 1, 0, 3407899, 1, 0, 3407900, 1, 0, 3407901, 1, 0, 3473427, 1, 0, 3473428, 1, 0, 3473429, 1, 0, 3473430, 1, 0, 3473431, 1, 0, 3473432, 1, 0, 3473433, 1, 0, 3473434, 1, 0 ) diff --git a/game/test_iso_tileset/TileMap52x28.tscn b/game/test_iso_tileset/TileMap52x28.tscn new file mode 100644 index 0000000..1445b16 --- /dev/null +++ b/game/test_iso_tileset/TileMap52x28.tscn @@ -0,0 +1,11 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://test_iso_tileset/new_tileset.tres" type="TileSet" id=1] + +[node name="TileMap" type="TileMap"] +mode = 1 +tile_set = ExtResource( 1 ) +cell_size = Vector2( 52, 28 ) +cell_y_sort = true +format = 1 +tile_data = PoolIntArray( -3801106, 2, 0, -3670043, 2, 0, -3473452, 0, 0, -3473451, 0, 0, -3473450, 0, 0, -3407917, 0, 0, -3407916, 0, 0, -3407915, 0, 0, -3407914, 0, 0, -3407913, 0, 0, -3407912, 0, 0, -3407911, 0, 0, -3407910, 0, 0, -3407909, 0, 0, -3342381, 0, 0, -3342380, 0, 0, -3342379, 0, 0, -3342378, 0, 0, -3342377, 0, 0, -3342376, 0, 0, -3342375, 0, 0, -3342374, 0, 0, -3342373, 0, 0, -3342372, 0, 0, -3342371, 0, 0, -3342370, 0, 0, -3342369, 0, 0, -3342368, 0, 0, -3342367, 0, 0, -3342366, 0, 0, -3276845, 0, 0, -3276844, 0, 0, -3276843, 0, 0, -3276842, 0, 0, -3276841, 0, 0, -3276840, 0, 0, -3276839, 0, 0, -3276838, 0, 0, -3276837, 0, 0, -3276836, 0, 0, -3276835, 0, 0, -3276834, 0, 0, -3276833, 0, 0, -3276832, 0, 0, -3276831, 0, 0, -3276830, 0, 0, -3276829, 0, 0, -3276828, 0, 0, -3276827, 0, 0, -3276826, 0, 0, -3211309, 0, 0, -3211308, 0, 0, -3211307, 0, 0, -3211306, 0, 0, -3211305, 0, 0, -3211304, 0, 0, -3211303, 0, 0, -3211302, 0, 0, -3211301, 0, 0, -3211300, 0, 0, -3211299, 0, 0, -3211298, 0, 0, -3211297, 0, 0, -3211296, 0, 0, -3211295, 0, 0, -3211294, 0, 0, -3211293, 0, 0, -3211292, 0, 0, -3211291, 0, 0, -3211290, 0, 0, -3211289, 0, 0, -3211288, 0, 0, -3211287, 0, 0, -3211286, 0, 0, -3211285, 0, 0, -3211284, 0, 0, -3211283, 0, 0, -3211282, 0, 0, -3145773, 0, 0, -3145772, 0, 0, -3145771, 0, 0, -3145770, 0, 0, -3145769, 0, 0, -3145768, 0, 0, -3145767, 0, 0, -3145766, 0, 0, -3145765, 0, 0, -3145764, 0, 0, -3145763, 0, 0, -3145762, 0, 0, -3145761, 0, 0, -3145760, 0, 0, -3145759, 0, 0, -3145758, 0, 0, -3145757, 0, 0, -3145756, 0, 0, -3145755, 0, 0, -3145754, 0, 0, -3145753, 0, 0, -3145752, 0, 0, -3145751, 0, 0, -3145750, 0, 0, -3145749, 0, 0, -3145748, 0, 0, -3145747, 0, 0, -3145746, 0, 0, -3145745, 0, 0, -3145744, 0, 0, -3145743, 0, 0, -3145742, 0, 0, -3145741, 0, 0, -3145740, 0, 0, -3145739, 0, 0, -3145738, 0, 0, -3145737, 0, 0, -3080237, 0, 0, -3080236, 0, 0, -3080235, 0, 0, -3080234, 0, 0, -3080233, 0, 0, -3080232, 0, 0, -3080231, 0, 0, -3080230, 0, 0, -3080229, 0, 0, -3080228, 0, 0, -3080227, 0, 0, -3080226, 0, 0, -3080225, 0, 0, -3080224, 0, 0, -3080223, 0, 0, -3080222, 0, 0, -3080221, 0, 0, -3080220, 0, 0, -3080219, 0, 0, -3080218, 0, 0, -3080217, 0, 0, -3080216, 0, 0, -3080215, 0, 0, -3080214, 0, 0, -3080213, 0, 0, -3080212, 0, 0, -3080211, 0, 0, -3080210, 0, 0, -3080209, 0, 0, -3080208, 0, 0, -3080207, 0, 0, -3080206, 0, 0, -3080205, 0, 0, -3080204, 0, 0, -3080203, 0, 0, -3080202, 0, 0, -3080201, 0, 0, -3080200, 0, 0, -3080199, 0, 0, -3080198, 0, 0, -3014701, 0, 0, -3014700, 0, 0, -3014699, 0, 0, -3014698, 0, 0, -3014697, 0, 0, -3014696, 0, 0, -3014695, 0, 0, -3014694, 0, 0, -3014693, 0, 0, -3014692, 0, 0, -3014691, 0, 0, -3014690, 0, 0, -3014689, 0, 0, -3014688, 0, 0, -3014687, 0, 0, -3014686, 0, 0, -3014685, 0, 0, -3014684, 0, 0, -3014683, 0, 0, -3014682, 0, 0, -3014681, 0, 0, -3014680, 0, 0, -3014679, 0, 0, -3014678, 0, 0, -3014677, 0, 0, -3014676, 0, 0, -3014675, 0, 0, -3014674, 0, 0, -3014673, 0, 0, -3014672, 0, 0, -3014671, 0, 0, -3014670, 0, 0, -3014669, 0, 0, -3014668, 0, 0, -3014667, 0, 0, -3014666, 0, 0, -3014665, 0, 0, -3014664, 0, 0, -3014663, 0, 0, -3014662, 0, 0, -3014661, 0, 0, -3014660, 0, 0, -3014659, 0, 0, -3014658, 0, 0, -2949165, 0, 0, -2949164, 0, 0, -2949163, 0, 0, -2949162, 0, 0, -2949161, 0, 0, -2949160, 0, 0, -2949159, 0, 0, -2949158, 0, 0, -2949157, 0, 0, -2949156, 0, 0, -2949155, 0, 0, -2949154, 0, 0, -2949153, 0, 0, -2949152, 0, 0, -2949151, 0, 0, -2949150, 0, 0, -2949149, 0, 0, -2949148, 0, 0, -2949147, 0, 0, -2949146, 0, 0, -2949145, 0, 0, -2949144, 0, 0, -2949143, 0, 0, -2949142, 0, 0, -2949141, 0, 0, -2949140, 0, 0, -2949139, 0, 0, -2949138, 0, 0, -2949137, 0, 0, -2949136, 0, 0, -2949135, 0, 0, -2949134, 0, 0, -2949133, 0, 0, -2949132, 0, 0, -2949131, 0, 0, -2949130, 0, 0, -2949129, 0, 0, -2949128, 0, 0, -2949127, 0, 0, -2949126, 0, 0, -2949125, 0, 0, -2949124, 0, 0, -2949123, 0, 0, -2949122, 0, 0, -2949121, 0, 0, -3014656, 0, 0, -3014655, 0, 0, -3014654, 0, 0, -2883628, 0, 0, -2883627, 0, 0, -2883626, 0, 0, -2883625, 0, 0, -2883624, 0, 0, -2883623, 0, 0, -2883622, 0, 0, -2883621, 0, 0, -2883620, 0, 0, -2883619, 0, 0, -2883618, 0, 0, -2883617, 0, 0, -2883616, 0, 0, -2883615, 0, 0, -2883614, 0, 0, -2883613, 0, 0, -2883612, 0, 0, -2883611, 0, 0, -2883610, 0, 0, -2883609, 0, 0, -2883608, 0, 0, -2883607, 0, 0, -2883606, 0, 0, -2883605, 0, 0, -2883604, 0, 0, -2883603, 0, 0, -2883602, 0, 0, -2883601, 0, 0, -2883600, 0, 0, -2883599, 0, 0, -2883598, 0, 0, -2883597, 0, 0, -2883596, 0, 0, -2883595, 0, 0, -2883594, 0, 0, -2883593, 0, 0, -2883592, 0, 0, -2883591, 0, 0, -2883590, 0, 0, -2883589, 0, 0, -2883588, 0, 0, -2883587, 0, 0, -2883586, 0, 0, -2883585, 0, 0, -2949120, 0, 0, -2949119, 0, 0, -2949118, 0, 0, -2949117, 0, 0, -2949116, 0, 0, -2949115, 0, 0, -2949114, 0, 0, -2818092, 0, 0, -2818091, 0, 0, -2818090, 0, 0, -2818089, 0, 0, -2818088, 0, 0, -2818087, 0, 0, -2818086, 0, 0, -2818085, 0, 0, -2818084, 0, 0, -2818083, 0, 0, -2818082, 0, 0, -2818081, 0, 0, -2818080, 0, 0, -2818079, 0, 0, -2818078, 0, 0, -2818077, 0, 0, -2818076, 0, 0, -2818075, 0, 0, -2818074, 0, 0, -2818073, 0, 0, -2818072, 0, 0, -2818071, 0, 0, -2818070, 0, 0, -2818069, 0, 0, -2818068, 0, 0, -2818067, 0, 0, -2818066, 0, 0, -2818065, 0, 0, -2818064, 0, 0, -2818063, 0, 0, -2818062, 0, 0, -2818061, 0, 0, -2818060, 0, 0, -2818059, 0, 0, -2818058, 0, 0, -2818057, 0, 0, -2818056, 0, 0, -2818055, 0, 0, -2818054, 0, 0, -2818053, 0, 0, -2818052, 0, 0, -2818051, 0, 0, -2818050, 0, 0, -2818049, 0, 0, -2883584, 0, 0, -2883583, 0, 0, -2883582, 0, 0, -2883581, 0, 0, -2883580, 0, 0, -2883579, 0, 0, -2883578, 0, 0, -2883577, 0, 0, -2883576, 0, 0, -2752556, 0, 0, -2752555, 0, 0, -2752554, 0, 0, -2752553, 0, 0, -2752552, 0, 0, -2752551, 0, 0, -2752550, 0, 0, -2752549, 0, 0, -2752548, 0, 0, -2752547, 0, 0, -2752546, 0, 0, -2752545, 0, 0, -2752544, 0, 0, -2752543, 0, 0, -2752542, 0, 0, -2752541, 0, 0, -2752540, 0, 0, -2752539, 0, 0, -2752538, 0, 0, -2752537, 0, 0, -2752536, 0, 0, -2752535, 0, 0, -2752534, 0, 0, -2752533, 0, 0, -2752532, 0, 0, -2752531, 0, 0, -2752530, 0, 0, -2752529, 0, 0, -2752528, 0, 0, -2752527, 0, 0, -2752526, 0, 0, -2752525, 0, 0, -2752524, 0, 0, -2752523, 0, 0, -2752522, 0, 0, -2752521, 0, 0, -2752520, 0, 0, -2752519, 0, 0, -2752518, 0, 0, -2752517, 0, 0, -2752516, 0, 0, -2752515, 0, 0, -2752514, 0, 0, -2752513, 0, 0, -2818048, 0, 0, -2818047, 0, 0, -2818046, 0, 0, -2818045, 0, 0, -2818044, 0, 0, -2818043, 0, 0, -2818042, 0, 0, -2818041, 0, 0, -2818040, 0, 0, -2818039, 0, 0, -2818038, 0, 0, -2818037, 0, 0, -2818036, 0, 0, -2687020, 0, 0, -2687019, 0, 0, -2687018, 0, 0, -2687017, 0, 0, -2687016, 0, 0, -2687015, 0, 0, -2687014, 0, 0, -2687013, 0, 0, -2687012, 0, 0, -2687011, 0, 0, -2687010, 0, 0, -2687009, 0, 0, -2687008, 0, 0, -2687007, 0, 0, -2687006, 0, 0, -2687005, 0, 0, -2687004, 0, 0, -2687003, 0, 0, -2687002, 0, 0, -2687001, 0, 0, -2687000, 0, 0, -2686999, 0, 0, -2686998, 0, 0, -2686997, 0, 0, -2686996, 0, 0, -2686995, 0, 0, -2686994, 0, 0, -2686993, 0, 0, -2686992, 0, 0, -2686991, 0, 0, -2686990, 0, 0, -2686989, 0, 0, -2686988, 0, 0, -2686987, 0, 0, -2686986, 0, 0, -2686985, 0, 0, -2686984, 0, 0, -2686983, 0, 0, -2686982, 0, 0, -2686981, 0, 0, -2686980, 0, 0, -2686979, 0, 0, -2686978, 0, 0, -2686977, 0, 0, -2752512, 0, 0, -2752511, 0, 0, -2752510, 0, 0, -2752509, 0, 0, -2752508, 0, 0, -2752507, 0, 0, -2752506, 0, 0, -2752505, 0, 0, -2752504, 0, 0, -2752503, 0, 0, -2752502, 0, 0, -2752501, 0, 0, -2752500, 0, 0, -2752499, 0, 0, -2752498, 0, 0, -2752497, 0, 0, -2621484, 0, 0, -2621483, 0, 0, -2621482, 0, 0, -2621481, 0, 0, -2621480, 0, 0, -2621479, 0, 0, -2621478, 0, 0, -2621477, 0, 0, -2621476, 0, 0, -2621475, 0, 0, -2621474, 0, 0, -2621473, 0, 0, -2621472, 0, 0, -2621471, 0, 0, -2621470, 0, 0, -2621469, 0, 0, -2621468, 0, 0, -2621467, 0, 0, -2621466, 0, 0, -2621465, 0, 0, -2621464, 0, 0, -2621463, 0, 0, -2621462, 0, 0, -2621461, 0, 0, -2621460, 0, 0, -2621459, 0, 0, -2621458, 0, 0, -2621457, 0, 0, -2621456, 0, 0, -2621455, 0, 0, -2621454, 0, 0, -2621453, 0, 0, -2621452, 0, 0, -2621451, 0, 0, -2621450, 0, 0, -2621449, 0, 0, -2621448, 0, 0, -2621447, 0, 0, -2621446, 0, 0, -2621445, 0, 0, -2621444, 0, 0, -2621443, 0, 0, -2621442, 0, 0, -2621441, 0, 0, -2686976, 0, 0, -2686975, 0, 0, -2686974, 0, 0, -2686973, 0, 0, -2686972, 0, 0, -2686971, 0, 0, -2686970, 0, 0, -2686969, 0, 0, -2686968, 0, 0, -2686967, 0, 0, -2686966, 0, 0, -2686965, 0, 0, -2686964, 0, 0, -2686963, 0, 0, -2686962, 0, 0, -2686961, 0, 0, -2686960, 0, 0, -2686959, 0, 0, -2555948, 0, 0, -2555947, 0, 0, -2555946, 0, 0, -2555945, 0, 0, -2555944, 0, 0, -2555943, 0, 0, -2555942, 0, 0, -2555941, 0, 0, -2555940, 0, 0, -2555939, 0, 0, -2555938, 0, 0, -2555937, 0, 0, -2555936, 0, 0, -2555935, 0, 0, -2555934, 0, 0, -2555933, 0, 0, -2555932, 0, 0, -2555931, 0, 0, -2555930, 0, 0, -2555929, 0, 0, -2555928, 0, 0, -2555927, 0, 0, -2555926, 0, 0, -2555925, 0, 0, -2555924, 0, 0, -2555923, 0, 0, -2555922, 0, 0, -2555921, 0, 0, -2555920, 0, 0, -2555919, 0, 0, -2555918, 0, 0, -2555917, 0, 0, -2555916, 0, 0, -2555915, 0, 0, -2555914, 0, 0, -2555913, 0, 0, -2555912, 0, 0, -2555911, 0, 0, -2555910, 0, 0, -2555909, 0, 0, -2555908, 0, 0, -2555907, 0, 0, -2555906, 0, 0, -2555905, 0, 0, -2621440, 0, 0, -2621439, 0, 0, -2621438, 0, 0, -2621437, 0, 0, -2621436, 0, 0, -2621435, 0, 0, -2621434, 0, 0, -2621433, 0, 0, -2621432, 0, 0, -2621431, 0, 0, -2621430, 0, 0, -2621429, 0, 0, -2621428, 0, 0, -2621427, 0, 0, -2621426, 0, 0, -2621425, 0, 0, -2621424, 0, 0, -2621423, 0, 0, -2621422, 0, 0, -2621421, 0, 0, -2490412, 0, 0, -2490411, 0, 0, -2490410, 0, 0, -2490409, 0, 0, -2490408, 0, 0, -2490407, 0, 0, -2490406, 0, 0, -2490405, 0, 0, -2490404, 0, 0, -2490403, 0, 0, -2490402, 0, 0, -2490401, 0, 0, -2490400, 0, 0, -2490399, 0, 0, -2490398, 0, 0, -2490397, 0, 0, -2490396, 0, 0, -2490395, 0, 0, -2490394, 0, 0, -2490393, 0, 0, -2490392, 0, 0, -2490391, 0, 0, -2490390, 0, 0, -2490389, 0, 0, -2490388, 0, 0, -2490387, 0, 0, -2490386, 0, 0, -2490385, 0, 0, -2490384, 0, 0, -2490383, 0, 0, -2490382, 0, 0, -2490381, 0, 0, -2490380, 0, 0, -2490379, 0, 0, -2490378, 0, 0, -2490377, 0, 0, -2490376, 0, 0, -2490375, 0, 0, -2490374, 0, 0, -2490373, 0, 0, -2490372, 0, 0, -2490371, 0, 0, -2490370, 0, 0, -2490369, 0, 0, -2555904, 0, 0, -2555903, 0, 0, -2555902, 0, 0, -2555901, 0, 0, -2555900, 0, 0, -2555899, 0, 0, -2555898, 0, 0, -2555897, 0, 0, -2555896, 0, 0, -2555895, 0, 0, -2555894, 0, 0, -2555893, 0, 0, -2555892, 0, 0, -2555891, 0, 0, -2555890, 0, 0, -2555889, 0, 0, -2555888, 0, 0, -2555887, 0, 0, -2555886, 0, 0, -2555885, 0, 0, -2555884, 0, 0, -2555883, 0, 0, -2424876, 0, 0, -2424875, 0, 0, -2424874, 0, 0, -2424873, 0, 0, -2424872, 0, 0, -2424871, 0, 0, -2424870, 0, 0, -2424869, 0, 0, -2424868, 0, 0, -2424867, 0, 0, -2424866, 0, 0, -2424865, 0, 0, -2424864, 0, 0, -2424863, 0, 0, -2424862, 0, 0, -2424861, 0, 0, -2424860, 0, 0, -2424859, 0, 0, -2424858, 0, 0, -2424857, 0, 0, -2424856, 0, 0, -2424855, 0, 0, -2424854, 0, 0, -2424853, 0, 0, -2424852, 0, 0, -2424851, 0, 0, -2424850, 0, 0, -2424849, 0, 0, -2424848, 0, 0, -2424847, 0, 0, -2424846, 0, 0, -2424845, 0, 0, -2424844, 0, 0, -2424843, 0, 0, -2424842, 0, 0, -2424841, 0, 0, -2424840, 0, 0, -2424839, 0, 0, -2424838, 0, 0, -2424837, 0, 0, -2424836, 0, 0, -2424835, 0, 0, -2424834, 0, 0, -2424833, 0, 0, -2490368, 0, 0, -2490367, 0, 0, -2490366, 0, 0, -2490365, 0, 0, -2490364, 0, 0, -2490363, 0, 0, -2490362, 0, 0, -2490361, 0, 0, -2490360, 0, 0, -2490359, 0, 0, -2490358, 0, 0, -2490357, 0, 0, -2490356, 0, 0, -2490355, 0, 0, -2490354, 0, 0, -2490353, 0, 0, -2490352, 0, 0, -2490351, 0, 0, -2490350, 0, 0, -2490349, 0, 0, -2490348, 0, 0, -2490347, 0, 0, -2490346, 0, 0, -2490345, 0, 0, -2359339, 0, 0, -2359338, 0, 0, -2359337, 0, 0, -2359336, 0, 0, -2359335, 0, 0, -2359334, 0, 0, -2359333, 0, 0, -2359332, 0, 0, -2359331, 0, 0, -2359330, 0, 0, -2359329, 0, 0, -2359328, 0, 0, -2359327, 0, 0, -2359326, 0, 0, -2359325, 0, 0, -2359324, 0, 0, -2359323, 0, 0, -2359322, 0, 0, -2359321, 0, 0, -2359320, 0, 0, -2359319, 0, 0, -2359318, 0, 0, -2359317, 0, 0, -2359316, 0, 0, -2359315, 0, 0, -2359314, 0, 0, -2359313, 0, 0, -2359312, 0, 0, -2359311, 0, 0, -2359310, 0, 0, -2359309, 0, 0, -2359308, 0, 0, -2359307, 0, 0, -2359306, 0, 0, -2359305, 0, 0, -2359304, 0, 0, -2359303, 0, 0, -2359302, 0, 0, -2359301, 0, 0, -2359300, 0, 0, -2359299, 0, 0, -2359298, 0, 0, -2359297, 0, 0, -2424832, 0, 0, -2424831, 0, 0, -2424830, 0, 0, -2424829, 0, 0, -2424828, 0, 0, -2424827, 0, 0, -2424826, 0, 0, -2424825, 0, 0, -2424824, 0, 0, -2424823, 0, 0, -2424822, 0, 0, -2424821, 0, 0, -2424820, 0, 0, -2424819, 0, 0, -2424818, 0, 0, -2424817, 0, 0, -2424816, 0, 0, -2424815, 0, 0, -2424814, 0, 0, -2424813, 0, 0, -2424812, 0, 0, -2424811, 0, 0, -2424810, 0, 0, -2424809, 0, 0, -2424808, 0, 0, -2424807, 0, 0, -2424806, 0, 0, -2293803, 0, 0, -2293802, 0, 0, -2293801, 0, 0, -2293800, 0, 0, -2293799, 0, 0, -2293798, 0, 0, -2293797, 0, 0, -2293796, 0, 0, -2293795, 0, 0, -2293794, 0, 0, -2293793, 0, 0, -2293792, 0, 0, -2293791, 0, 0, -2293790, 0, 0, -2293789, 0, 0, -2293788, 0, 0, -2293787, 0, 0, -2293786, 0, 0, -2293785, 0, 0, -2293784, 0, 0, -2293783, 0, 0, -2293782, 0, 0, -2293781, 0, 0, -2293780, 0, 0, -2293779, 0, 0, -2293778, 0, 0, -2293777, 0, 0, -2293776, 0, 0, -2293775, 0, 0, -2293774, 0, 0, -2293773, 0, 0, -2293772, 0, 0, -2293771, 0, 0, -2293770, 0, 0, -2293769, 0, 0, -2293768, 0, 0, -2293767, 0, 0, -2293766, 0, 0, -2293765, 0, 0, -2293764, 0, 0, -2293763, 0, 0, -2293762, 0, 0, -2293761, 0, 0, -2359296, 0, 0, -2359295, 0, 0, -2359294, 0, 0, -2359293, 0, 0, -2359292, 0, 0, -2359291, 0, 0, -2359290, 0, 0, -2359289, 0, 0, -2359288, 0, 0, -2359287, 0, 0, -2359286, 0, 0, -2359285, 0, 0, -2359284, 0, 0, -2359283, 0, 0, -2359282, 0, 0, -2359281, 0, 0, -2359280, 0, 0, -2359279, 0, 0, -2359278, 0, 0, -2359277, 0, 0, -2359276, 0, 0, -2359275, 0, 0, -2359274, 0, 0, -2359273, 0, 0, -2359272, 0, 0, -2359271, 0, 0, -2359270, 0, 0, -2359269, 0, 0, -2359268, 0, 0, -2228267, 0, 0, -2228266, 0, 0, -2228265, 0, 0, -2228264, 0, 0, -2228263, 0, 0, -2228262, 0, 0, -2228261, 0, 0, -2228260, 0, 0, -2228259, 0, 0, -2228258, 0, 0, -2228257, 0, 0, -2228256, 0, 0, -2228255, 0, 0, -2228254, 0, 0, -2228253, 0, 0, -2228252, 0, 0, -2228251, 0, 0, -2228250, 0, 0, -2228249, 0, 0, -2228248, 0, 0, -2228247, 0, 0, -2228246, 0, 0, -2228245, 0, 0, -2228244, 0, 0, -2228243, 0, 0, -2228242, 0, 0, -2228241, 0, 0, -2228240, 0, 0, -2228239, 0, 0, -2228238, 0, 0, -2228237, 0, 0, -2228236, 0, 0, -2228235, 0, 0, -2228234, 0, 0, -2228233, 0, 0, -2228232, 0, 0, -2228231, 0, 0, -2228230, 0, 0, -2228229, 0, 0, -2228228, 0, 0, -2228227, 0, 0, -2228226, 0, 0, -2228225, 0, 0, -2293760, 0, 0, -2293759, 0, 0, -2293758, 0, 0, -2293757, 0, 0, -2293756, 0, 0, -2293755, 0, 0, -2293754, 0, 0, -2293753, 0, 0, -2293752, 0, 0, -2293751, 0, 0, -2293750, 0, 0, -2293749, 0, 0, -2293748, 0, 0, -2293747, 0, 0, -2293746, 0, 0, -2293745, 0, 0, -2293744, 0, 0, -2293743, 0, 0, -2293742, 0, 0, -2293741, 0, 0, -2293740, 0, 0, -2293739, 0, 0, -2293738, 0, 0, -2293737, 0, 0, -2293736, 0, 0, -2293735, 0, 0, -2293734, 0, 0, -2293733, 0, 0, -2293732, 0, 0, -2293731, 0, 0, -2293730, 0, 0, -2293729, 0, 0, -2293728, 0, 0, -2162731, 0, 0, -2162730, 0, 0, -2162729, 0, 0, -2162728, 0, 0, -2162727, 0, 0, -2162726, 0, 0, -2162725, 0, 0, -2162724, 0, 0, -2162723, 0, 0, -2162722, 0, 0, -2162721, 0, 0, -2162720, 0, 0, -2162719, 0, 0, -2162718, 0, 0, -2162717, 0, 0, -2162716, 0, 0, -2162715, 0, 0, -2162714, 0, 0, -2162713, 0, 0, -2162712, 0, 0, -2162711, 0, 0, -2162710, 0, 0, -2162709, 0, 0, -2162708, 0, 0, -2162707, 0, 0, -2162706, 0, 0, -2162705, 0, 0, -2162704, 0, 0, -2162703, 0, 0, -2162702, 0, 0, -2162701, 0, 0, -2162700, 0, 0, -2162699, 0, 0, -2162698, 0, 0, -2162697, 0, 0, -2162696, 0, 0, -2162695, 0, 0, -2162694, 0, 0, -2162693, 0, 0, -2162692, 0, 0, -2162691, 0, 0, -2162690, 0, 0, -2162689, 0, 0, -2228224, 0, 0, -2228223, 0, 0, -2228222, 0, 0, -2228221, 0, 0, -2228220, 0, 0, -2228219, 0, 0, -2228218, 0, 0, -2228217, 0, 0, -2228216, 0, 0, -2228215, 0, 0, -2228214, 0, 0, -2228213, 0, 0, -2228212, 0, 0, -2228211, 0, 0, -2228210, 0, 0, -2228209, 0, 0, -2228208, 0, 0, -2228207, 0, 0, -2228206, 0, 0, -2228205, 0, 0, -2228204, 0, 0, -2228203, 0, 0, -2228202, 0, 0, -2228201, 0, 0, -2228200, 0, 0, -2228199, 0, 0, -2228198, 0, 0, -2228197, 0, 0, -2228196, 0, 0, -2228195, 0, 0, -2228194, 0, 0, -2228193, 0, 0, -2228192, 0, 0, -2097194, 0, 0, -2097193, 0, 0, -2097192, 0, 0, -2097191, 0, 0, -2097190, 0, 0, -2097189, 0, 0, -2097188, 0, 0, -2097187, 0, 0, -2097186, 0, 0, -2097185, 0, 0, -2097184, 0, 0, -2097183, 0, 0, -2097182, 0, 0, -2097181, 0, 0, -2097180, 0, 0, -2097179, 0, 0, -2097178, 0, 0, -2097177, 0, 0, -2097176, 0, 0, -2097175, 0, 0, -2097174, 0, 0, -2097173, 0, 0, -2097172, 0, 0, -2097171, 0, 0, -2097170, 0, 0, -2097169, 0, 0, -2097168, 0, 0, -2097167, 0, 0, -2097166, 0, 0, -2097165, 0, 0, -2097164, 0, 0, -2097163, 0, 0, -2097162, 0, 0, -2097161, 0, 0, -2097160, 0, 0, -2097159, 0, 0, -2097158, 0, 0, -2097157, 0, 0, -2097156, 0, 0, -2097155, 0, 0, -2097154, 0, 0, -2097153, 0, 0, -2162688, 0, 0, -2162687, 0, 0, -2162686, 0, 0, -2162685, 0, 0, -2162684, 0, 0, -2162683, 0, 0, -2162682, 0, 0, -2162681, 0, 0, -2162680, 0, 0, -2162679, 0, 0, -2162678, 0, 0, -2162677, 0, 0, -2162676, 0, 0, -2162675, 0, 0, -2162674, 0, 0, -2162673, 0, 0, -2162672, 0, 0, -2162671, 0, 0, -2162670, 0, 0, -2162669, 0, 0, -2162668, 0, 0, -2162667, 0, 0, -2162666, 0, 0, -2162665, 0, 0, -2162664, 0, 0, -2162663, 0, 0, -2162662, 0, 0, -2162661, 0, 0, -2162660, 0, 0, -2162659, 0, 0, -2162658, 0, 0, -2162657, 0, 0, -2162656, 0, 0, -2162655, 0, 0, -2162654, 0, 0, -2031658, 0, 0, -2031657, 0, 0, -2031656, 0, 0, -2031655, 0, 0, -2031654, 0, 0, -2031653, 0, 0, -2031652, 0, 0, -2031651, 0, 0, -2031650, 0, 0, -2031649, 0, 0, -2031648, 0, 0, -2031647, 0, 0, -2031646, 0, 0, -2031645, 0, 0, -2031644, 0, 0, -2031643, 0, 0, -2031642, 0, 0, -2031641, 0, 0, -2031640, 0, 0, -2031639, 0, 0, -2031638, 0, 0, -2031637, 0, 0, -2031636, 0, 0, -2031635, 0, 0, -2031634, 0, 0, -2031633, 0, 0, -2031632, 0, 0, -2031631, 0, 0, -2031630, 0, 0, -2031629, 0, 0, -2031628, 0, 0, -2031627, 0, 0, -2031626, 0, 0, -2031625, 0, 0, -2031624, 0, 0, -2031623, 0, 0, -2031622, 0, 0, -2031621, 0, 0, -2031620, 0, 0, -2031619, 0, 0, -2031618, 0, 0, -2031617, 0, 0, -2097152, 0, 0, -2097151, 0, 0, -2097150, 0, 0, -2097149, 0, 0, -2097148, 0, 0, -2097147, 0, 0, -2097146, 0, 0, -2097145, 0, 0, -2097144, 0, 0, -2097143, 0, 0, -2097142, 0, 0, -2097141, 0, 0, -2097140, 0, 0, -2097139, 0, 0, -2097138, 0, 0, -2097137, 0, 0, -2097136, 0, 0, -2097135, 0, 0, -2097134, 0, 0, -2097133, 0, 0, -2097132, 0, 0, -2097131, 0, 0, -2097130, 0, 0, -2097129, 0, 0, -2097128, 0, 0, -2097127, 0, 0, -2097126, 0, 0, -2097125, 0, 0, -2097124, 0, 0, -2097123, 0, 0, -2097122, 0, 0, -2097121, 0, 0, -2097120, 0, 0, -2097119, 0, 0, -2097118, 0, 0, -2097117, 0, 0, -2097116, 0, 0, -1966122, 0, 0, -1966121, 0, 0, -1966120, 0, 0, -1966119, 0, 0, -1966118, 0, 0, -1966117, 0, 0, -1966116, 0, 0, -1966115, 0, 0, -1966114, 0, 0, -1966113, 0, 0, -1966112, 0, 0, -1966111, 0, 0, -1966110, 0, 0, -1966109, 0, 0, -1966108, 0, 0, -1966107, 0, 0, -1966106, 0, 0, -1966105, 0, 0, -1966104, 0, 0, -1966103, 0, 0, -1966102, 0, 0, -1966101, 0, 0, -1966100, 0, 0, -1966099, 0, 0, -1966098, 0, 0, -1966097, 0, 0, -1966096, 0, 0, -1966095, 0, 0, -1966094, 0, 0, -1966093, 0, 0, -1966092, 0, 0, -1966091, 0, 0, -1966090, 0, 0, -1966089, 0, 0, -1966088, 0, 0, -1966087, 0, 0, -1966086, 0, 0, -1966085, 0, 0, -1966084, 0, 0, -1966083, 0, 0, -1966082, 0, 0, -1966081, 0, 0, -2031616, 0, 0, -2031615, 0, 0, -2031614, 0, 0, -2031613, 0, 0, -2031612, 0, 0, -2031611, 0, 0, -2031610, 0, 0, -2031609, 0, 0, -2031608, 0, 0, -2031607, 0, 0, -2031606, 0, 0, -2031605, 0, 0, -2031604, 0, 0, -2031603, 0, 0, -2031602, 0, 0, -2031601, 0, 0, -2031600, 0, 0, -2031599, 0, 0, -2031598, 0, 0, -2031597, 0, 0, -2031596, 0, 0, -2031595, 0, 0, -2031594, 0, 0, -2031593, 0, 0, -2031592, 0, 0, -2031591, 0, 0, -2031590, 0, 0, -2031589, 0, 0, -2031588, 0, 0, -2031587, 0, 0, -2031586, 0, 0, -2031585, 0, 0, -2031584, 0, 0, -2031583, 0, 0, -2031582, 0, 0, -2031581, 0, 0, -2031580, 0, 0, -2031579, 0, 0, -2031578, 0, 0, -1900586, 0, 0, -1900585, 0, 0, -1900584, 0, 0, -1900583, 0, 0, -1900582, 0, 0, -1900581, 0, 0, -1900580, 0, 0, -1900579, 0, 0, -1900578, 0, 0, -1900577, 0, 0, -1900576, 0, 0, -1900575, 0, 0, -1900574, 0, 0, -1900573, 0, 0, -1900572, 0, 0, -1900571, 0, 0, -1900570, 0, 0, -1900569, 0, 0, -1900568, 0, 0, -1900567, 0, 0, -1900566, 0, 0, -1900565, 0, 0, -1900564, 0, 0, -1900563, 0, 0, -1900562, 0, 0, -1900561, 0, 0, -1900560, 0, 0, -1900559, 0, 0, -1900558, 0, 0, -1900557, 0, 0, -1900556, 0, 0, -1900555, 0, 0, -1900554, 0, 0, -1900553, 0, 0, -1900552, 0, 0, -1900551, 0, 0, -1900550, 0, 0, -1900549, 0, 0, -1900548, 0, 0, -1900547, 0, 0, -1900546, 0, 0, -1900545, 0, 0, -1966080, 0, 0, -1966079, 0, 0, -1966078, 0, 0, -1966077, 0, 0, -1966076, 0, 0, -1966075, 0, 0, -1966074, 0, 0, -1966073, 0, 0, -1966072, 0, 0, -1966071, 0, 0, -1966070, 0, 0, -1966069, 0, 0, -1966068, 0, 0, -1966067, 0, 0, -1966066, 0, 0, -1966065, 0, 0, -1966064, 0, 0, -1966063, 0, 0, -1966062, 0, 0, -1966061, 0, 0, -1966060, 0, 0, -1966059, 0, 0, -1966058, 0, 0, -1966057, 0, 0, -1966056, 0, 0, -1966055, 0, 0, -1966054, 0, 0, -1966053, 0, 0, -1966052, 0, 0, -1966051, 0, 0, -1966050, 0, 0, -1966049, 0, 0, -1966048, 0, 0, -1966047, 0, 0, -1966046, 0, 0, -1966045, 0, 0, -1966044, 0, 0, -1966043, 0, 0, -1966042, 0, 0, -1966041, 0, 0, -1966040, 0, 0, -1835050, 0, 0, -1835049, 0, 0, -1835048, 0, 0, -1835047, 0, 0, -1835046, 0, 0, -1835045, 0, 0, -1835044, 0, 0, -1835043, 0, 0, -1835042, 0, 0, -1835041, 0, 0, -1835040, 0, 0, -1835039, 0, 0, -1835038, 0, 0, -1835037, 0, 0, -1835036, 0, 0, -1835035, 0, 0, -1835034, 0, 0, -1835033, 0, 0, -1835032, 0, 0, -1835031, 0, 0, -1835030, 0, 0, -1835029, 0, 0, -1835028, 0, 0, -1835027, 0, 0, -1835026, 0, 0, -1835025, 0, 0, -1835024, 0, 0, -1835023, 0, 0, -1835022, 0, 0, -1835021, 0, 0, -1835020, 0, 0, -1835019, 0, 0, -1835018, 0, 0, -1835017, 0, 0, -1835016, 0, 0, -1835015, 0, 0, -1835014, 0, 0, -1835013, 0, 0, -1835012, 0, 0, -1835011, 0, 0, -1835010, 0, 0, -1835009, 0, 0, -1900544, 0, 0, -1900543, 0, 0, -1900542, 0, 0, -1900541, 0, 0, -1900540, 0, 0, -1900539, 0, 0, -1900538, 0, 0, -1900537, 0, 0, -1900536, 0, 0, -1900535, 0, 0, -1900534, 0, 0, -1900533, 0, 0, -1900532, 0, 0, -1900531, 0, 0, -1900530, 0, 0, -1900529, 0, 0, -1900528, 0, 0, -1900527, 0, 0, -1900526, 0, 0, -1900525, 0, 0, -1900524, 0, 0, -1900523, 0, 0, -1900522, 0, 0, -1900521, 0, 0, -1900520, 0, 0, -1900519, 0, 0, -1900518, 0, 0, -1900517, 0, 0, -1900516, 0, 0, -1900515, 0, 0, -1900514, 0, 0, -1900513, 0, 0, -1900512, 0, 0, -1900511, 0, 0, -1900510, 0, 0, -1900509, 0, 0, -1900508, 0, 0, -1900507, 0, 0, -1900506, 0, 0, -1900505, 0, 0, -1900504, 0, 0, -1900503, 0, 0, -1769514, 0, 0, -1769513, 0, 0, -1769512, 0, 0, -1769511, 0, 0, -1769510, 0, 0, -1769509, 0, 0, -1769508, 0, 0, -1769507, 0, 0, -1769506, 0, 0, -1769505, 0, 0, -1769504, 0, 0, -1769503, 0, 0, -1769502, 0, 0, -1769501, 0, 0, -1769500, 0, 0, -1769499, 0, 0, -1769498, 0, 0, -1769497, 0, 0, -1769496, 0, 0, -1769495, 0, 0, -1769494, 0, 0, -1769493, 0, 0, -1769492, 0, 0, -1769491, 0, 0, -1769490, 0, 0, -1769489, 0, 0, -1769488, 0, 0, -1769487, 0, 0, -1769486, 0, 0, -1769485, 0, 0, -1769484, 0, 0, -1769483, 0, 0, -1769482, 0, 0, -1769481, 0, 0, -1769480, 0, 0, -1769479, 0, 0, -1769478, 0, 0, -1769477, 0, 0, -1769476, 0, 0, -1769475, 0, 0, -1769474, 0, 0, -1769473, 0, 0, -1835008, 0, 0, -1835007, 0, 0, -1835006, 0, 0, -1835005, 0, 0, -1835004, 0, 0, -1835003, 0, 0, -1835002, 0, 0, -1835001, 0, 0, -1835000, 0, 0, -1834999, 0, 0, -1834998, 0, 0, -1834997, 0, 0, -1834996, 0, 0, -1834995, 0, 0, -1834994, 0, 0, -1834993, 0, 0, -1834992, 0, 0, -1834991, 0, 0, -1834990, 0, 0, -1834989, 0, 0, -1834988, 0, 0, -1834987, 0, 0, -1834986, 0, 0, -1834985, 0, 0, -1834984, 0, 0, -1834983, 0, 0, -1834982, 0, 0, -1834981, 0, 0, -1834980, 0, 0, -1834979, 0, 0, -1834978, 0, 0, -1834977, 0, 0, -1834976, 0, 0, -1834975, 0, 0, -1834974, 0, 0, -1834973, 0, 0, -1834972, 0, 0, -1834971, 0, 0, -1834970, 0, 0, -1834969, 0, 0, -1834968, 0, 0, -1834967, 0, 0, -1834966, 0, 0, -1703977, 0, 0, -1703976, 0, 0, -1703975, 0, 0, -1703974, 0, 0, -1703973, 0, 0, -1703972, 0, 0, -1703971, 0, 0, -1703970, 0, 0, -1703969, 0, 0, -1703968, 0, 0, -1703967, 0, 0, -1703966, 0, 0, -1703965, 0, 0, -1703964, 0, 0, -1703963, 0, 0, -1703962, 0, 0, -1703961, 0, 0, -1703960, 0, 0, -1703959, 0, 0, -1703958, 0, 0, -1703957, 0, 0, -1703956, 0, 0, -1703955, 0, 0, -1703954, 0, 0, -1703953, 0, 0, -1703952, 0, 0, -1703951, 0, 0, -1703950, 0, 0, -1703949, 0, 0, -1703948, 0, 0, -1703947, 0, 0, -1703946, 0, 0, -1703945, 0, 0, -1703944, 0, 0, -1703943, 0, 0, -1703942, 0, 0, -1703941, 0, 0, -1703940, 0, 0, -1703939, 0, 0, -1703938, 0, 0, -1703937, 0, 0, -1769472, 0, 0, -1769471, 0, 0, -1769470, 0, 0, -1769469, 0, 0, -1769468, 0, 0, -1769467, 0, 0, -1769466, 0, 0, -1769465, 0, 0, -1769464, 0, 0, -1769463, 0, 0, -1769462, 0, 0, -1769461, 0, 0, -1769460, 0, 0, -1769459, 0, 0, -1769458, 0, 0, -1769457, 0, 0, -1769456, 0, 0, -1769455, 0, 0, -1769454, 0, 0, -1769453, 0, 0, -1769452, 0, 0, -1769451, 0, 0, -1769450, 0, 0, -1769449, 0, 0, -1769448, 0, 0, -1769447, 0, 0, -1769446, 0, 0, -1769445, 0, 0, -1769444, 0, 0, -1769443, 0, 0, -1769442, 0, 0, -1769441, 0, 0, -1769440, 0, 0, -1769439, 0, 0, -1769438, 0, 0, -1769437, 0, 0, -1769436, 0, 0, -1769435, 0, 0, -1769434, 0, 0, -1769433, 0, 0, -1769432, 0, 0, -1769431, 0, 0, -1769430, 0, 0, -1769429, 0, 0, -1769428, 0, 0, -1638441, 0, 0, -1638440, 0, 0, -1638439, 0, 0, -1638438, 0, 0, -1638437, 0, 0, -1638436, 0, 0, -1638435, 0, 0, -1638434, 0, 0, -1638433, 0, 0, -1638432, 0, 0, -1638431, 0, 0, -1638430, 0, 0, -1638429, 0, 0, -1638428, 0, 0, -1638427, 0, 0, -1638426, 0, 0, -1638425, 0, 0, -1638424, 0, 0, -1638423, 0, 0, -1638422, 0, 0, -1638421, 0, 0, -1638420, 0, 0, -1638419, 0, 0, -1638418, 0, 0, -1638417, 0, 0, -1638416, 0, 0, -1638415, 0, 0, -1638414, 0, 0, -1638413, 0, 0, -1638412, 0, 0, -1638411, 0, 0, -1638410, 0, 0, -1638409, 0, 0, -1638408, 0, 0, -1638407, 0, 0, -1638406, 0, 0, -1638405, 0, 0, -1638404, 0, 0, -1638403, 0, 0, -1638402, 0, 0, -1638401, 0, 0, -1703936, 0, 0, -1703935, 0, 0, -1703934, 0, 0, -1703933, 0, 0, -1703932, 0, 0, -1703931, 0, 0, -1703930, 0, 0, -1703929, 0, 0, -1703928, 0, 0, -1703927, 0, 0, -1703926, 0, 0, -1703925, 0, 0, -1703924, 0, 0, -1703923, 0, 0, -1703922, 0, 0, -1703921, 0, 0, -1703920, 0, 0, -1703919, 0, 0, -1703918, 0, 0, -1703917, 0, 0, -1703916, 0, 0, -1703915, 0, 0, -1703914, 0, 0, -1703913, 0, 0, -1703912, 0, 0, -1703911, 0, 0, -1703910, 0, 0, -1703909, 0, 0, -1703908, 0, 0, -1703907, 0, 0, -1703906, 0, 0, -1703905, 0, 0, -1703904, 0, 0, -1703903, 0, 0, -1703902, 0, 0, -1703901, 0, 0, -1703900, 0, 0, -1703899, 0, 0, -1703898, 0, 0, -1703897, 0, 0, -1703896, 0, 0, -1703895, 0, 0, -1703894, 0, 0, -1703893, 0, 0, -1703892, 0, 0, -1703891, 0, 0, -1572905, 0, 0, -1572904, 0, 0, -1572903, 0, 0, -1572902, 0, 0, -1572901, 0, 0, -1572900, 0, 0, -1572899, 0, 0, -1572898, 0, 0, -1572897, 0, 0, -1572896, 0, 0, -1572895, 0, 0, -1572894, 0, 0, -1572893, 0, 0, -1572892, 0, 0, -1572891, 0, 0, -1572890, 0, 0, -1572889, 0, 0, -1572888, 0, 0, -1572887, 0, 0, -1572886, 0, 0, -1572885, 0, 0, -1572884, 0, 0, -1572883, 0, 0, -1572882, 0, 0, -1572881, 0, 0, -1572880, 0, 0, -1572879, 0, 0, -1572878, 0, 0, -1572877, 0, 0, -1572876, 0, 0, -1572875, 0, 0, -1572874, 0, 0, -1572873, 0, 0, -1572872, 0, 0, -1572871, 0, 0, -1572870, 0, 0, -1572869, 0, 0, -1572868, 0, 0, -1572867, 0, 0, -1572866, 0, 0, -1572865, 0, 0, -1638400, 0, 0, -1638399, 0, 0, -1638398, 0, 0, -1638397, 0, 0, -1638396, 0, 0, -1638395, 0, 0, -1638394, 0, 0, -1638393, 0, 0, -1638392, 0, 0, -1638391, 0, 0, -1638390, 0, 0, -1638389, 0, 0, -1638388, 0, 0, -1638387, 0, 0, -1638386, 0, 0, -1638385, 0, 0, -1638384, 0, 0, -1638383, 0, 0, -1638382, 0, 0, -1638381, 0, 0, -1638380, 0, 0, -1638379, 0, 0, -1638378, 0, 0, -1638377, 0, 0, -1638376, 0, 0, -1638375, 0, 0, -1638374, 0, 0, -1638373, 0, 0, -1638372, 0, 0, -1638371, 0, 0, -1638370, 0, 0, -1638369, 0, 0, -1638368, 0, 0, -1638367, 0, 0, -1638366, 0, 0, -1638365, 0, 0, -1638364, 0, 0, -1638363, 0, 0, -1638362, 0, 0, -1638361, 0, 0, -1638360, 0, 0, -1638359, 0, 0, -1638358, 0, 0, -1638357, 0, 0, -1638356, 0, 0, -1638355, 0, 0, -1638354, 0, 0, -1507369, 0, 0, -1507368, 0, 0, -1507367, 0, 0, -1507366, 0, 0, -1507365, 0, 0, -1507364, 0, 0, -1507363, 0, 0, -1507362, 0, 0, -1507361, 0, 0, -1507360, 0, 0, -1507359, 0, 0, -1507358, 0, 0, -1507357, 0, 0, -1507356, 0, 0, -1507355, 0, 0, -1507354, 0, 0, -1507353, 0, 0, -1507352, 0, 0, -1507351, 0, 0, -1507350, 0, 0, -1507349, 0, 0, -1507348, 0, 0, -1507347, 0, 0, -1507346, 0, 0, -1507345, 0, 0, -1507344, 0, 0, -1507343, 0, 0, -1507342, 0, 0, -1507341, 0, 0, -1507340, 0, 0, -1507339, 0, 0, -1507338, 0, 0, -1507337, 0, 0, -1507336, 0, 0, -1507335, 0, 0, -1507334, 0, 0, -1507333, 0, 0, -1507332, 0, 0, -1507331, 0, 0, -1507330, 0, 0, -1507329, 0, 0, -1572864, 0, 0, -1572863, 0, 0, -1572862, 0, 0, -1572861, 0, 0, -1572860, 0, 0, -1572859, 0, 0, -1572858, 0, 0, -1572857, 0, 0, -1572856, 0, 0, -1572855, 0, 0, -1572854, 0, 0, -1572853, 0, 0, -1572852, 0, 0, -1572851, 0, 0, -1572850, 0, 0, -1572849, 0, 0, -1572848, 0, 0, -1572847, 0, 0, -1572846, 0, 0, -1572845, 0, 0, -1572844, 0, 0, -1572843, 0, 0, -1572842, 0, 0, -1572841, 0, 0, -1572840, 0, 0, -1572839, 0, 0, -1572838, 0, 0, -1572837, 0, 0, -1572836, 0, 0, -1572835, 0, 0, -1572834, 0, 0, -1572833, 0, 0, -1572832, 0, 0, -1572831, 0, 0, -1572830, 0, 0, -1572829, 0, 0, -1572828, 0, 0, -1572827, 0, 0, -1572826, 0, 0, -1572825, 0, 0, -1572824, 0, 0, -1572823, 0, 0, -1572822, 0, 0, -1572821, 0, 0, -1572820, 0, 0, -1572819, 0, 0, -1572818, 0, 0, -1572817, 0, 0, -1441833, 0, 0, -1441832, 0, 0, -1441831, 0, 0, -1441830, 0, 0, -1441829, 0, 0, -1441828, 0, 0, -1441827, 0, 0, -1441826, 0, 0, -1441825, 0, 0, -1441824, 0, 0, -1441823, 0, 0, -1441822, 0, 0, -1441821, 0, 0, -1441820, 0, 0, -1441819, 0, 0, -1441818, 0, 0, -1441817, 0, 0, -1441816, 0, 0, -1441815, 0, 0, -1441814, 0, 0, -1441813, 0, 0, -1441812, 0, 0, -1441811, 0, 0, -1441810, 0, 0, -1441809, 0, 0, -1441808, 0, 0, -1441807, 0, 0, -1441806, 0, 0, -1441805, 0, 0, -1441804, 0, 0, -1441803, 0, 0, -1441802, 0, 0, -1441801, 0, 0, -1441800, 0, 0, -1441799, 0, 0, -1441798, 0, 0, -1441797, 0, 0, -1441796, 0, 0, -1441795, 0, 0, -1441794, 0, 0, -1441793, 0, 0, -1507328, 0, 0, -1507327, 0, 0, -1507326, 0, 0, -1507325, 0, 0, -1507324, 0, 0, -1507323, 0, 0, -1507322, 0, 0, -1507321, 0, 0, -1507320, 0, 0, -1507319, 0, 0, -1507318, 0, 0, -1507317, 0, 0, -1507316, 0, 0, -1507315, 0, 0, -1507314, 0, 0, -1507313, 0, 0, -1507312, 0, 0, -1507311, 0, 0, -1507310, 0, 0, -1507309, 0, 0, -1507308, 0, 0, -1507307, 0, 0, -1507306, 0, 0, -1507305, 0, 0, -1507304, 0, 0, -1507303, 0, 0, -1507302, 0, 0, -1507301, 0, 0, -1507300, 0, 0, -1507299, 0, 0, -1507298, 0, 0, -1507297, 0, 0, -1507296, 0, 0, -1507295, 0, 0, -1507294, 0, 0, -1507293, 0, 0, -1507292, 0, 0, -1507291, 0, 0, -1507290, 0, 0, -1507289, 0, 0, -1507288, 0, 0, -1507287, 0, 0, -1507286, 0, 0, -1507285, 0, 0, -1507284, 0, 0, -1507283, 0, 0, -1507282, 0, 0, -1507281, 0, 0, -1507280, 0, 0, -1376297, 0, 0, -1376296, 0, 0, -1376295, 0, 0, -1376294, 0, 0, -1376293, 0, 0, -1376292, 0, 0, -1376291, 0, 0, -1376290, 0, 0, -1376289, 0, 0, -1376288, 0, 0, -1376287, 0, 0, -1376286, 0, 0, -1376285, 0, 0, -1376284, 0, 0, -1376283, 0, 0, -1376282, 0, 0, -1376281, 0, 0, -1376280, 0, 0, -1376279, 0, 0, -1376278, 0, 0, -1376277, 0, 0, -1376276, 0, 0, -1376275, 0, 0, -1376274, 0, 0, -1376273, 0, 0, -1376272, 0, 0, -1376271, 0, 0, -1376270, 0, 0, -1376269, 0, 0, -1376268, 0, 0, -1376267, 0, 0, -1376266, 0, 0, -1376265, 0, 0, -1376264, 0, 0, -1376263, 0, 0, -1376262, 0, 0, -1376261, 0, 0, -1376260, 0, 0, -1376259, 0, 0, -1376258, 0, 0, -1376257, 0, 0, -1441792, 0, 0, -1441791, 0, 0, -1441790, 0, 0, -1441789, 0, 0, -1441788, 0, 0, -1441787, 0, 0, -1441786, 0, 0, -1441785, 0, 0, -1441784, 0, 0, -1441783, 0, 0, -1441782, 0, 0, -1441781, 0, 0, -1441780, 0, 0, -1441779, 0, 0, -1441778, 0, 0, -1441777, 0, 0, -1441776, 0, 0, -1441775, 0, 0, -1441774, 0, 0, -1441773, 0, 0, -1441772, 0, 0, -1441771, 0, 0, -1441770, 0, 0, -1441769, 0, 0, -1441768, 0, 0, -1441767, 0, 0, -1441766, 0, 0, -1441765, 0, 0, -1441764, 0, 0, -1441763, 0, 0, -1441762, 0, 0, -1441761, 0, 0, -1441760, 0, 0, -1441759, 0, 0, -1441758, 0, 0, -1441757, 0, 0, -1441756, 0, 0, -1441755, 0, 0, -1441754, 0, 0, -1441753, 0, 0, -1441752, 0, 0, -1441751, 0, 0, -1441750, 0, 0, -1441749, 0, 0, -1441748, 0, 0, -1441747, 0, 0, -1441746, 0, 0, -1441745, 0, 0, -1441744, 0, 0, -1310760, 0, 0, -1310759, 0, 0, -1310758, 0, 0, -1310757, 0, 0, -1310756, 0, 0, -1310755, 0, 0, -1310754, 0, 0, -1310753, 0, 0, -1310752, 0, 0, -1310751, 0, 0, -1310750, 0, 0, -1310749, 0, 0, -1310748, 0, 0, -1310747, 0, 0, -1310746, 0, 0, -1310745, 0, 0, -1310744, 0, 0, -1310743, 0, 0, -1310742, 0, 0, -1310741, 0, 0, -1310740, 0, 0, -1310739, 0, 0, -1310738, 0, 0, -1310737, 0, 0, -1310736, 0, 0, -1310735, 0, 0, -1310734, 0, 0, -1310733, 0, 0, -1310732, 0, 0, -1310731, 0, 0, -1310730, 0, 0, -1310729, 0, 0, -1310728, 0, 0, -1310727, 0, 0, -1310726, 0, 0, -1310725, 0, 0, -1310724, 0, 0, -1310723, 0, 0, -1310722, 0, 0, -1310721, 0, 0, -1376256, 0, 0, -1376255, 0, 0, -1376254, 0, 0, -1376253, 0, 0, -1376252, 0, 0, -1376251, 0, 0, -1376250, 0, 0, -1376249, 0, 0, -1376248, 0, 0, -1376247, 0, 0, -1376246, 0, 0, -1376245, 0, 0, -1376244, 0, 0, -1376243, 0, 0, -1376242, 0, 0, -1376241, 0, 0, -1376240, 0, 0, -1376239, 0, 0, -1376238, 0, 0, -1376237, 0, 0, -1376236, 0, 0, -1376235, 0, 0, -1376234, 0, 0, -1376233, 0, 0, -1376232, 0, 0, -1376231, 0, 0, -1376230, 0, 0, -1376229, 0, 0, -1376228, 0, 0, -1376227, 0, 0, -1376226, 0, 0, -1376225, 0, 0, -1376224, 0, 0, -1376223, 0, 0, -1376222, 0, 0, -1376221, 0, 0, -1376220, 0, 0, -1376219, 0, 0, -1376218, 0, 0, -1376217, 0, 0, -1376216, 0, 0, -1376215, 0, 0, -1376214, 0, 0, -1376213, 0, 0, -1376212, 0, 0, -1376211, 0, 0, -1376210, 0, 0, -1376209, 0, 0, -1376208, 0, 0, -1376207, 0, 0, -1245224, 0, 0, -1245223, 0, 0, -1245222, 0, 0, -1245221, 0, 0, -1245220, 0, 0, -1245219, 0, 0, -1245218, 0, 0, -1245217, 0, 0, -1245216, 0, 0, -1245215, 0, 0, -1245214, 0, 0, -1245213, 0, 0, -1245212, 0, 0, -1245211, 0, 0, -1245210, 0, 0, -1245209, 0, 0, -1245208, 0, 0, -1245207, 0, 0, -1245206, 0, 0, -1245205, 0, 0, -1245204, 0, 0, -1245203, 0, 0, -1245202, 0, 0, -1245201, 0, 0, -1245200, 0, 0, -1245199, 0, 0, -1245198, 0, 0, -1245197, 0, 0, -1245196, 0, 0, -1245195, 0, 0, -1245194, 0, 0, -1245193, 0, 0, -1245192, 0, 0, -1245191, 0, 0, -1245190, 0, 0, -1245189, 0, 0, -1245188, 0, 0, -1245187, 0, 0, -1245186, 0, 0, -1245185, 0, 0, -1310720, 0, 0, -1310719, 0, 0, -1310718, 0, 0, -1310717, 0, 0, -1310716, 0, 0, -1310715, 0, 0, -1310714, 0, 0, -1310713, 0, 0, -1310712, 0, 0, -1310711, 0, 0, -1310710, 0, 0, -1310709, 0, 0, -1310708, 0, 0, -1310707, 0, 0, -1310706, 0, 0, -1310705, 0, 0, -1310704, 0, 0, -1310703, 0, 0, -1310702, 0, 0, -1310701, 0, 0, -1310700, 0, 0, -1310699, 0, 0, -1310698, 0, 0, -1310697, 0, 0, -1310696, 0, 0, -1310695, 0, 0, -1310694, 0, 0, -1310693, 0, 0, -1310692, 0, 0, -1310691, 0, 0, -1310690, 0, 0, -1310689, 0, 0, -1310688, 0, 0, -1310687, 0, 0, -1310686, 0, 0, -1310685, 0, 0, -1310684, 0, 0, -1310683, 0, 0, -1310682, 0, 0, -1310681, 0, 0, -1310680, 0, 0, -1310679, 0, 0, -1310678, 0, 0, -1310677, 0, 0, -1310676, 0, 0, -1310675, 0, 0, -1310674, 0, 0, -1310673, 0, 0, -1310672, 0, 0, -1310671, 0, 0, -1310670, 0, 0, -1310669, 0, 0, -1179688, 0, 0, -1179687, 0, 0, -1179686, 0, 0, -1179685, 0, 0, -1179684, 0, 0, -1179683, 0, 0, -1179682, 0, 0, -1179681, 0, 0, -1179680, 0, 0, -1179679, 0, 0, -1179678, 0, 0, -1179677, 0, 0, -1179676, 0, 0, -1179675, 0, 0, -1179674, 0, 0, -1179673, 0, 0, -1179672, 0, 0, -1179671, 0, 0, -1179670, 0, 0, -1179669, 0, 0, -1179668, 0, 0, -1179667, 0, 0, -1179666, 0, 0, -1179665, 0, 0, -1179664, 0, 0, -1179663, 0, 0, -1179662, 0, 0, -1179661, 0, 0, -1179660, 0, 0, -1179659, 0, 0, -1179658, 0, 0, -1179657, 0, 0, -1179656, 0, 0, -1179655, 0, 0, -1179654, 0, 0, -1179653, 0, 0, -1179652, 0, 0, -1179651, 0, 0, -1179650, 0, 0, -1179649, 0, 0, -1245184, 0, 0, -1245183, 0, 0, -1245182, 0, 0, -1245181, 0, 0, -1245180, 0, 0, -1245179, 0, 0, -1245178, 0, 0, -1245177, 0, 0, -1245176, 0, 0, -1245175, 0, 0, -1245174, 0, 0, -1245173, 0, 0, -1245172, 0, 0, -1245171, 0, 0, -1245170, 0, 0, -1245169, 0, 0, -1245168, 0, 0, -1245167, 0, 0, -1245166, 0, 0, -1245165, 0, 0, -1245164, 0, 0, -1245163, 0, 0, -1245162, 0, 0, -1245161, 0, 0, -1245160, 0, 0, -1245159, 0, 0, -1245158, 0, 0, -1245157, 0, 0, -1245156, 0, 0, -1245155, 0, 0, -1245154, 0, 0, -1245153, 0, 0, -1245152, 0, 0, -1245151, 0, 0, -1245150, 0, 0, -1245149, 0, 0, -1245148, 0, 0, -1245147, 0, 0, -1245146, 0, 0, -1245145, 0, 0, -1245144, 0, 0, -1245143, 0, 0, -1245142, 0, 0, -1245141, 0, 0, -1245140, 0, 0, -1245139, 0, 0, -1245138, 0, 0, -1245137, 0, 0, -1245136, 0, 0, -1245135, 0, 0, -1245134, 0, 0, -1245133, 0, 0, -1245132, 0, 0, -1114152, 0, 0, -1114151, 0, 0, -1114150, 0, 0, -1114149, 0, 0, -1114148, 0, 0, -1114147, 0, 0, -1114146, 0, 0, -1114145, 0, 0, -1114144, 0, 0, -1114143, 0, 0, -1114142, 0, 0, -1114141, 0, 0, -1114140, 0, 0, -1114139, 0, 0, -1114138, 0, 0, -1114137, 0, 0, -1114136, 0, 0, -1114135, 0, 0, -1114134, 0, 0, -1114133, 0, 0, -1114132, 0, 0, -1114131, 0, 0, -1114130, 0, 0, -1114129, 0, 0, -1114128, 0, 0, -1114127, 0, 0, -1114126, 0, 0, -1114125, 0, 0, -1114124, 0, 0, -1114123, 0, 0, -1114122, 0, 0, -1114121, 0, 0, -1114120, 0, 0, -1114119, 0, 0, -1114118, 0, 0, -1114117, 0, 0, -1114116, 0, 0, -1114115, 0, 0, -1114114, 0, 0, -1114113, 0, 0, -1179648, 0, 0, -1179647, 0, 0, -1179646, 0, 0, -1179645, 0, 0, -1179644, 0, 0, -1179643, 0, 0, -1179642, 0, 0, -1179641, 0, 0, -1179640, 0, 0, -1179639, 0, 0, -1179638, 0, 0, -1179637, 0, 0, -1179636, 0, 0, -1179635, 0, 0, -1179634, 0, 0, -1179633, 0, 0, -1179632, 0, 0, -1179631, 0, 0, -1179630, 0, 0, -1179629, 0, 0, -1179628, 0, 0, -1179627, 0, 0, -1179626, 0, 0, -1179625, 0, 0, -1179624, 0, 0, -1179623, 0, 0, -1179622, 0, 0, -1179621, 0, 0, -1179620, 0, 0, -1179619, 0, 0, -1179618, 0, 0, -1179617, 0, 0, -1179616, 0, 0, -1179615, 0, 0, -1179614, 0, 0, -1179613, 0, 0, -1179612, 0, 0, -1179611, 0, 0, -1179610, 0, 0, -1179609, 0, 0, -1179608, 0, 0, -1179607, 0, 0, -1179606, 0, 0, -1179605, 0, 0, -1179604, 0, 0, -1179603, 0, 0, -1179602, 0, 0, -1179601, 0, 0, -1179600, 0, 0, -1179599, 0, 0, -1179598, 0, 0, -1179597, 0, 0, -1179596, 0, 0, -1048615, 0, 0, -1048614, 0, 0, -1048613, 0, 0, -1048612, 0, 0, -1048611, 0, 0, -1048610, 0, 0, -1048609, 0, 0, -1048608, 0, 0, -1048607, 0, 0, -1048606, 0, 0, -1048605, 0, 0, -1048604, 0, 0, -1048603, 0, 0, -1048602, 0, 0, -1048601, 0, 0, -1048600, 0, 0, -1048599, 0, 0, -1048598, 0, 0, -1048597, 0, 0, -1048596, 0, 0, -1048595, 0, 0, -1048594, 0, 0, -1048593, 0, 0, -1048592, 0, 0, -1048591, 0, 0, -1048590, 0, 0, -1048589, 0, 0, -1048588, 0, 0, -1048587, 0, 0, -1048586, 0, 0, -1048585, 0, 0, -1048584, 0, 0, -1048583, 0, 0, -1048582, 0, 0, -1048581, 0, 0, -1048580, 0, 0, -1048579, 0, 0, -1048578, 0, 0, -1048577, 0, 0, -1114112, 0, 0, -1114111, 0, 0, -1114110, 0, 0, -1114109, 0, 0, -1114108, 0, 0, -1114107, 0, 0, -1114106, 0, 0, -1114105, 0, 0, -1114104, 0, 0, -1114103, 0, 0, -1114102, 0, 0, -1114101, 0, 0, -1114100, 0, 0, -1114099, 0, 0, -1114098, 0, 0, -1114097, 0, 0, -1114096, 0, 0, -1114095, 0, 0, -1114094, 0, 0, -1114093, 0, 0, -1114092, 0, 0, -1114091, 0, 0, -1114090, 0, 0, -1114089, 0, 0, -1114088, 0, 0, -1114087, 0, 0, -1114086, 0, 0, -1114085, 0, 0, -1114084, 0, 0, -1114083, 0, 0, -1114082, 0, 0, -1114081, 0, 0, -1114080, 0, 0, -1114079, 0, 0, -1114078, 0, 0, -1114077, 0, 0, -1114076, 0, 0, -1114075, 0, 0, -1114074, 0, 0, -1114073, 0, 0, -1114072, 0, 0, -1114071, 0, 0, -1114070, 0, 0, -1114069, 0, 0, -1114068, 0, 0, -1114067, 0, 0, -1114066, 0, 0, -1114065, 0, 0, -1114064, 0, 0, -1114063, 0, 0, -1114062, 0, 0, -1114061, 0, 0, -1114060, 0, 0, -1114059, 0, 0, -983079, 0, 0, -983078, 0, 0, -983077, 0, 0, -983076, 0, 0, -983075, 0, 0, -983074, 0, 0, -983073, 0, 0, -983072, 0, 0, -983071, 0, 0, -983070, 0, 0, -983069, 0, 0, -983068, 0, 0, -983067, 0, 0, -983066, 0, 0, -983065, 0, 0, -983064, 0, 0, -983063, 0, 0, -983062, 0, 0, -983061, 0, 0, -983060, 0, 0, -983059, 0, 0, -983058, 0, 0, -983057, 0, 0, -983056, 0, 0, -983055, 0, 0, -983054, 0, 0, -983053, 0, 0, -983052, 0, 0, -983051, 0, 0, -983050, 0, 0, -983049, 0, 0, -983048, 0, 0, -983047, 0, 0, -983046, 0, 0, -983045, 0, 0, -983044, 0, 0, -983043, 0, 0, -983042, 0, 0, -983041, 0, 0, -1048576, 0, 0, -1048575, 0, 0, -1048574, 0, 0, -1048573, 0, 0, -1048572, 0, 0, -1048571, 0, 0, -1048570, 0, 0, -1048569, 0, 0, -1048568, 0, 0, -1048567, 0, 0, -1048566, 0, 0, -1048565, 0, 0, -1048564, 0, 0, -1048563, 0, 0, -1048562, 0, 0, -1048561, 0, 0, -1048560, 0, 0, -1048559, 0, 0, -1048558, 0, 0, -1048557, 0, 0, -1048556, 0, 0, -1048555, 0, 0, -1048554, 0, 0, -1048553, 0, 0, -1048552, 0, 0, -1048551, 0, 0, -1048550, 0, 0, -1048549, 0, 0, -1048548, 0, 0, -1048547, 0, 0, -1048546, 0, 0, -1048545, 0, 0, -1048544, 0, 0, -1048543, 0, 0, -1048542, 0, 0, -1048541, 0, 0, -1048540, 0, 0, -1048539, 0, 0, -1048538, 0, 0, -1048537, 0, 0, -1048536, 0, 0, -1048535, 0, 0, -1048534, 0, 0, -1048533, 0, 0, -1048532, 0, 0, -1048531, 0, 0, -1048530, 0, 0, -1048529, 0, 0, -1048528, 0, 0, -1048527, 0, 0, -1048526, 0, 0, -1048525, 0, 0, -1048524, 0, 0, -1048523, 0, 0, -917543, 0, 0, -917542, 0, 0, -917541, 0, 0, -917540, 0, 0, -917539, 0, 0, -917538, 0, 0, -917537, 0, 0, -917536, 0, 0, -917535, 0, 0, -917534, 0, 0, -917533, 0, 0, -917532, 0, 0, -917531, 0, 0, -917530, 0, 0, -917529, 0, 0, -917528, 0, 0, -917527, 0, 0, -917526, 0, 0, -917525, 0, 0, -917524, 0, 0, -917523, 0, 0, -917522, 0, 0, -917521, 0, 0, -917520, 0, 0, -917519, 0, 0, -917518, 0, 0, -917517, 0, 0, -917516, 0, 0, -917515, 0, 0, -917514, 0, 0, -917513, 0, 0, -917512, 0, 0, -917511, 0, 0, -917510, 0, 0, -917509, 0, 0, -917508, 0, 0, -917507, 0, 0, -917506, 0, 0, -917505, 0, 0, -983040, 0, 0, -983039, 0, 0, -983038, 0, 0, -983037, 0, 0, -983036, 0, 0, -983035, 0, 0, -983034, 0, 0, -983033, 0, 0, -983032, 0, 0, -983031, 0, 0, -983030, 0, 0, -983029, 0, 0, -983028, 0, 0, -983027, 0, 0, -983026, 0, 0, -983025, 0, 0, -983024, 0, 0, -983023, 0, 0, -983022, 0, 0, -983021, 0, 0, -983020, 0, 0, -983019, 0, 0, -983018, 0, 0, -983017, 0, 0, -983016, 0, 0, -983015, 0, 0, -983014, 0, 0, -983013, 0, 0, -983012, 0, 0, -983011, 0, 0, -983010, 0, 0, -983009, 0, 0, -983008, 0, 0, -983007, 0, 0, -983006, 0, 0, -983005, 0, 0, -983004, 0, 0, -983003, 0, 0, -983002, 0, 0, -983001, 0, 0, -983000, 0, 0, -982999, 0, 0, -982998, 0, 0, -982997, 0, 0, -982996, 0, 0, -982995, 0, 0, -982994, 0, 0, -982993, 0, 0, -982992, 0, 0, -982991, 0, 0, -982990, 0, 0, -982989, 0, 0, -982988, 0, 0, -982987, 0, 0, -982986, 0, 0, -852007, 0, 0, -852006, 0, 0, -852005, 0, 0, -852004, 0, 0, -852003, 0, 0, -852002, 0, 0, -852001, 0, 0, -852000, 0, 0, -851999, 0, 0, -851998, 0, 0, -851997, 0, 0, -851996, 0, 0, -851995, 0, 0, -851994, 0, 0, -851993, 0, 0, -851992, 0, 0, -851991, 0, 0, -851990, 0, 0, -851989, 0, 0, -851988, 0, 0, -851987, 0, 0, -851986, 0, 0, -851985, 0, 0, -851984, 0, 0, -851983, 0, 0, -851982, 0, 0, -851981, 0, 0, -851980, 0, 0, -851979, 0, 0, -851978, 0, 0, -851977, 0, 0, -851976, 0, 0, -851975, 0, 0, -851974, 0, 0, -851973, 0, 0, -851972, 0, 0, -851971, 0, 0, -851970, 0, 0, -851969, 0, 0, -917504, 0, 0, -917503, 0, 0, -917502, 0, 0, -917501, 0, 0, -917500, 0, 0, -917499, 0, 0, -917498, 0, 0, -917497, 0, 0, -917496, 0, 0, -917495, 0, 0, -917494, 0, 0, -917493, 0, 0, -917492, 0, 0, -917491, 0, 0, -917490, 0, 0, -917489, 0, 0, -917488, 0, 0, -917487, 0, 0, -917486, 0, 0, -917485, 0, 0, -917484, 0, 0, -917483, 0, 0, -917482, 0, 0, -917481, 0, 0, -917480, 0, 0, -917479, 0, 0, -917478, 0, 0, -917477, 0, 0, -917476, 0, 0, -917475, 0, 0, -917474, 0, 0, -917473, 0, 0, -917472, 0, 0, -917471, 0, 0, -917470, 0, 0, -917469, 0, 0, -917468, 0, 0, -917467, 0, 0, -917466, 0, 0, -917465, 0, 0, -917464, 0, 0, -917463, 0, 0, -917462, 0, 0, -917461, 0, 0, -917460, 0, 0, -917459, 0, 0, -917458, 0, 0, -917457, 0, 0, -917456, 0, 0, -917455, 0, 0, -917454, 0, 0, -917453, 0, 0, -917452, 0, 0, -917451, 0, 0, -917450, 0, 0, -786471, 0, 0, -786470, 0, 0, -786469, 0, 0, -786468, 0, 0, -786467, 0, 0, -786466, 0, 0, -786465, 0, 0, -786464, 0, 0, -786463, 0, 0, -786462, 0, 0, -786461, 0, 0, -786460, 0, 0, -786459, 0, 0, -786458, 0, 0, -786457, 0, 0, -786456, 0, 0, -786455, 0, 0, -786454, 0, 0, -786453, 0, 0, -786452, 0, 0, -786451, 0, 0, -786450, 0, 0, -786449, 0, 0, -786448, 0, 0, -786447, 0, 0, -786446, 0, 0, -786445, 0, 0, -786444, 0, 0, -786443, 0, 0, -786442, 0, 0, -786441, 0, 0, -786440, 0, 0, -786439, 0, 0, -786438, 0, 0, -786437, 0, 0, -786436, 0, 0, -786435, 0, 0, -786434, 0, 0, -786433, 0, 0, -851968, 0, 0, -851967, 0, 0, -851966, 0, 0, -851965, 0, 0, -851964, 0, 0, -851963, 0, 0, -851962, 0, 0, -851961, 0, 0, -851960, 0, 0, -851959, 0, 0, -851958, 0, 0, -851957, 0, 0, -851956, 0, 0, -851955, 0, 0, -851954, 0, 0, -851953, 0, 0, -851952, 0, 0, -851951, 0, 0, -851950, 0, 0, -851949, 0, 0, -851948, 0, 0, -851947, 0, 0, -851946, 0, 0, -851945, 0, 0, -851944, 0, 0, -851943, 0, 0, -851942, 0, 0, -851941, 0, 0, -851940, 0, 0, -851939, 0, 0, -851938, 0, 0, -851937, 0, 0, -851936, 0, 0, -851935, 0, 0, -851934, 0, 0, -851933, 0, 0, -851932, 0, 0, -851931, 0, 0, -851930, 0, 0, -851929, 0, 0, -851928, 0, 0, -851927, 0, 0, -851926, 0, 0, -851925, 0, 0, -851924, 0, 0, -851923, 0, 0, -851922, 0, 0, -851921, 0, 0, -851920, 0, 0, -851919, 0, 0, -851918, 0, 0, -851917, 0, 0, -851916, 0, 0, -851915, 0, 0, -851914, 0, 0, -851913, 0, 0, -720934, 0, 0, -720933, 0, 0, -720932, 0, 0, -720931, 0, 0, -720930, 0, 0, -720929, 0, 0, -720928, 0, 0, -720927, 0, 0, -720926, 0, 0, -720925, 0, 0, -720924, 0, 0, -720923, 0, 0, -720922, 0, 0, -720921, 0, 0, -720920, 0, 0, -720919, 0, 0, -720918, 0, 0, -720917, 0, 0, -720916, 0, 0, -720915, 0, 0, -720914, 0, 0, -720913, 0, 0, -720912, 0, 0, -720911, 0, 0, -720910, 0, 0, -720909, 0, 0, -720908, 0, 0, -720907, 0, 0, -720906, 0, 0, -720905, 0, 0, -720904, 0, 0, -720903, 0, 0, -720902, 0, 0, -720901, 0, 0, -720900, 0, 0, -720899, 0, 0, -720898, 0, 0, -720897, 0, 0, -786432, 0, 0, -786431, 0, 0, -786430, 0, 0, -786429, 0, 0, -786428, 0, 0, -786427, 0, 0, -786426, 0, 0, -786425, 0, 0, -786424, 0, 0, -786423, 0, 0, -786422, 0, 0, -786421, 0, 0, -786420, 0, 0, -786419, 0, 0, -786418, 0, 0, -786417, 0, 0, -786416, 0, 0, -786415, 0, 0, -786414, 0, 0, -786413, 0, 0, -786412, 0, 0, -786411, 0, 0, -786410, 0, 0, -786409, 0, 0, -786408, 0, 0, -786407, 0, 0, -786406, 0, 0, -786405, 0, 0, -786404, 0, 0, -786403, 0, 0, -786402, 0, 0, -786401, 0, 0, -786400, 0, 0, -786399, 0, 0, -786398, 0, 0, -786397, 0, 0, -786396, 0, 0, -786395, 0, 0, -786394, 0, 0, -786393, 0, 0, -786392, 0, 0, -786391, 0, 0, -786390, 0, 0, -786389, 0, 0, -786388, 0, 0, -786387, 0, 0, -786386, 0, 0, -786385, 0, 0, -786384, 0, 0, -786383, 0, 0, -786382, 0, 0, -786381, 0, 0, -786380, 0, 0, -786379, 0, 0, -786378, 0, 0, -786377, 0, 0, -655398, 0, 0, -655397, 0, 0, -655396, 0, 0, -655395, 0, 0, -655394, 0, 0, -655393, 0, 0, -655392, 0, 0, -655391, 0, 0, -655390, 0, 0, -655389, 0, 0, -655388, 0, 0, -655387, 0, 0, -655386, 0, 0, -655385, 0, 0, -655384, 0, 0, -655383, 0, 0, -655382, 0, 0, -655381, 0, 0, -655380, 0, 0, -655379, 0, 0, -655378, 0, 0, -655377, 0, 0, -655376, 0, 0, -655375, 0, 0, -655374, 0, 0, -655373, 0, 0, -655372, 0, 0, -655371, 0, 0, -655370, 0, 0, -655369, 0, 0, -655368, 0, 0, -655367, 0, 0, -655366, 0, 0, -655365, 0, 0, -655364, 0, 0, -655363, 0, 0, -655362, 0, 0, -655361, 0, 0, -720896, 0, 0, -720895, 0, 0, -720894, 0, 0, -720893, 0, 0, -720892, 0, 0, -720891, 0, 0, -720890, 0, 0, -720889, 0, 0, -720888, 0, 0, -720887, 0, 0, -720886, 0, 0, -720885, 0, 0, -720884, 0, 0, -720883, 0, 0, -720882, 0, 0, -720881, 0, 0, -720880, 0, 0, -720879, 0, 0, -720878, 0, 0, -720877, 0, 0, -720876, 0, 0, -720875, 0, 0, -720874, 0, 0, -720873, 0, 0, -720872, 0, 0, -720871, 0, 0, -720870, 0, 0, -720869, 0, 0, -720868, 0, 0, -720867, 0, 0, -720866, 0, 0, -720865, 0, 0, -720864, 0, 0, -720863, 0, 0, -720862, 0, 0, -720861, 0, 0, -720860, 0, 0, -720859, 0, 0, -720858, 0, 0, -720857, 0, 0, -720856, 0, 0, -720855, 0, 0, -720854, 0, 0, -720853, 0, 0, -720852, 0, 0, -720851, 0, 0, -720850, 0, 0, -720849, 0, 0, -720848, 0, 0, -720847, 0, 0, -720846, 0, 0, -720845, 0, 0, -720844, 0, 0, -720843, 0, 0, -720842, 0, 0, -720841, 0, 0, -720840, 0, 0, -589862, 0, 0, -589861, 0, 0, -589860, 0, 0, -589859, 0, 0, -589858, 0, 0, -589857, 0, 0, -589856, 0, 0, -589855, 0, 0, -589854, 0, 0, -589853, 0, 0, -589852, 0, 0, -589851, 0, 0, -589850, 0, 0, -589849, 0, 0, -589848, 0, 0, -589847, 0, 0, -589846, 0, 0, -589845, 0, 0, -589844, 0, 0, -589843, 0, 0, -589842, 0, 0, -589841, 0, 0, -589840, 0, 0, -589839, 0, 0, -589838, 0, 0, -589837, 0, 0, -589836, 0, 0, -589835, 0, 0, -589834, 0, 0, -589833, 0, 0, -589832, 0, 0, -589831, 0, 0, -589830, 0, 0, -589829, 0, 0, -589828, 0, 0, -589827, 0, 0, -589826, 0, 0, -589825, 0, 0, -655360, 0, 0, -655359, 0, 0, -655358, 0, 0, -655357, 0, 0, -655356, 0, 0, -655355, 0, 0, -655354, 0, 0, -655353, 0, 0, -655352, 0, 0, -655351, 0, 0, -655350, 0, 0, -655349, 0, 0, -655348, 0, 0, -655347, 0, 0, -655346, 0, 0, -655345, 0, 0, -655344, 0, 0, -655343, 0, 0, -655342, 0, 0, -655341, 0, 0, -655340, 0, 0, -655339, 0, 0, -655338, 0, 0, -655337, 0, 0, -655336, 0, 0, -655335, 0, 0, -655334, 0, 0, -655333, 0, 0, -655332, 0, 0, -655331, 0, 0, -655330, 0, 0, -655329, 0, 0, -655328, 0, 0, -655327, 0, 0, -655326, 0, 0, -655325, 0, 0, -655324, 0, 0, -655323, 0, 0, -655322, 0, 0, -655321, 0, 0, -655320, 0, 0, -655319, 0, 0, -655318, 0, 0, -655317, 0, 0, -655316, 0, 0, -655315, 0, 0, -655314, 0, 0, -655313, 0, 0, -655312, 0, 0, -655311, 0, 0, -655310, 0, 0, -655309, 0, 0, -655308, 0, 0, -655307, 0, 0, -655306, 0, 0, -655305, 0, 0, -655304, 0, 0, -524326, 0, 0, -524325, 0, 0, -524324, 0, 0, -524323, 0, 0, -524322, 0, 0, -524321, 0, 0, -524320, 0, 0, -524319, 0, 0, -524318, 0, 0, -524317, 0, 0, -524316, 0, 0, -524315, 0, 0, -524314, 0, 0, -524313, 0, 0, -524312, 0, 0, -524311, 0, 0, -524310, 0, 0, -524309, 0, 0, -524308, 0, 0, -524307, 0, 0, -524306, 0, 0, -524305, 0, 0, -524304, 0, 0, -524303, 0, 0, -524302, 0, 0, -524301, 0, 0, -524300, 0, 0, -524299, 0, 0, -524298, 0, 0, -524297, 0, 0, -524296, 0, 0, -524295, 0, 0, -524294, 0, 0, -524293, 0, 0, -524292, 0, 0, -524291, 0, 0, -524290, 0, 0, -524289, 0, 0, -589824, 0, 0, -589823, 0, 0, -589822, 0, 0, -589821, 0, 0, -589820, 0, 0, -589819, 0, 0, -589818, 0, 0, -589817, 0, 0, -589816, 0, 0, -589815, 0, 0, -589814, 0, 0, -589813, 0, 0, -589812, 0, 0, -589811, 0, 0, -589810, 0, 0, -589809, 0, 0, -589808, 0, 0, -589807, 0, 0, -589806, 0, 0, -589805, 0, 0, -589804, 0, 0, -589803, 0, 0, -589802, 0, 0, -589801, 0, 0, -589800, 0, 0, -589799, 0, 0, -589798, 0, 0, -589797, 0, 0, -589796, 0, 0, -589795, 0, 0, -589794, 0, 0, -589793, 0, 0, -589792, 0, 0, -589791, 0, 0, -589790, 0, 0, -589789, 0, 0, -589788, 0, 0, -589787, 0, 0, -589786, 0, 0, -589785, 0, 0, -589784, 0, 0, -589783, 0, 0, -589782, 0, 0, -589781, 0, 0, -589780, 0, 0, -589779, 0, 0, -589778, 0, 0, -589777, 0, 0, -589776, 0, 0, -589775, 0, 0, -589774, 0, 0, -589773, 0, 0, -589772, 0, 0, -589771, 0, 0, -589770, 0, 0, -589769, 0, 0, -589768, 0, 0, -458789, 0, 0, -458788, 0, 0, -458787, 0, 0, -458786, 0, 0, -458785, 0, 0, -458784, 0, 0, -458783, 0, 0, -458782, 0, 0, -458781, 0, 0, -458780, 0, 0, -458779, 0, 0, -458778, 0, 0, -458777, 0, 0, -458776, 0, 0, -458775, 0, 0, -458774, 0, 0, -458773, 0, 0, -458772, 0, 0, -458771, 0, 0, -458770, 0, 0, -458769, 0, 0, -458768, 0, 0, -458767, 0, 0, -458766, 0, 0, -458765, 0, 0, -458764, 0, 0, -458763, 0, 0, -458762, 0, 0, -458761, 0, 0, -458760, 0, 0, -458759, 0, 0, -458758, 0, 0, -458757, 0, 0, -458756, 0, 0, -458755, 0, 0, -458754, 0, 0, -458753, 0, 0, -524288, 0, 0, -524287, 0, 0, -524286, 0, 0, -524285, 0, 0, -524284, 0, 0, -524283, 0, 0, -524282, 0, 0, -524281, 0, 0, -524280, 0, 0, -524279, 0, 0, -524278, 0, 0, -524277, 0, 0, -524276, 0, 0, -524275, 0, 0, -524274, 0, 0, -524273, 0, 0, -524272, 0, 0, -524271, 0, 0, -524270, 0, 0, -524269, 0, 0, -524268, 0, 0, -524267, 0, 0, -524266, 0, 0, -524265, 0, 0, -524264, 0, 0, -524263, 0, 0, -524262, 0, 0, -524261, 0, 0, -524260, 0, 0, -524259, 0, 0, -524258, 0, 0, -524257, 0, 0, -524256, 0, 0, -524255, 0, 0, -524254, 0, 0, -524253, 0, 0, -524252, 0, 0, -524251, 0, 0, -524250, 0, 0, -524249, 0, 0, -524248, 0, 0, -524247, 0, 0, -524246, 0, 0, -524245, 0, 0, -524244, 0, 0, -524243, 0, 0, -524242, 0, 0, -524241, 0, 0, -524240, 0, 0, -524239, 0, 0, -524238, 0, 0, -524237, 0, 0, -524236, 0, 0, -524235, 0, 0, -524234, 0, 0, -524233, 0, 0, -524232, 0, 0, -393253, 0, 0, -393252, 0, 0, -393251, 0, 0, -393250, 0, 0, -393249, 0, 0, -393248, 0, 0, -393247, 0, 0, -393246, 0, 0, -393245, 0, 0, -393244, 0, 0, -393243, 0, 0, -393242, 0, 0, -393241, 0, 0, -393240, 0, 0, -393239, 0, 0, -393238, 0, 0, -393237, 0, 0, -393236, 0, 0, -393235, 0, 0, -393234, 0, 0, -393233, 0, 0, -393232, 0, 0, -393231, 0, 0, -393230, 0, 0, -393229, 0, 0, -393228, 0, 0, -393227, 0, 0, -393226, 0, 0, -393225, 0, 0, -393224, 0, 0, -393223, 0, 0, -393222, 0, 0, -393221, 0, 0, -393220, 0, 0, -393219, 0, 0, -393218, 0, 0, -393217, 0, 0, -458752, 0, 0, -458751, 0, 0, -458750, 0, 0, -458749, 0, 0, -458748, 0, 0, -458747, 0, 0, -458746, 0, 0, -458745, 0, 0, -458744, 0, 0, -458743, 0, 0, -458742, 0, 0, -458741, 0, 0, -458740, 0, 0, -458739, 0, 0, -458738, 0, 0, -458737, 0, 0, -458736, 0, 0, -458735, 0, 0, -458734, 0, 0, -458733, 0, 0, -458732, 0, 0, -458731, 0, 0, -458730, 0, 0, -458729, 0, 0, -458728, 0, 0, -458727, 0, 0, -458726, 0, 0, -458725, 0, 0, -458724, 0, 0, -458723, 0, 0, -458722, 0, 0, -458721, 0, 0, -458720, 0, 0, -458719, 0, 0, -458718, 0, 0, -458717, 0, 0, -458716, 0, 0, -458715, 0, 0, -458714, 0, 0, -458713, 0, 0, -458712, 0, 0, -458711, 0, 0, -458710, 0, 0, -458709, 0, 0, -458708, 0, 0, -458707, 0, 0, -458706, 0, 0, -458705, 0, 0, -458704, 0, 0, -458703, 0, 0, -458702, 0, 0, -458701, 0, 0, -458700, 0, 0, -458699, 0, 0, -458698, 0, 0, -458697, 0, 0, -458696, 0, 0, -327717, 0, 0, -327716, 0, 0, -327715, 0, 0, -327714, 0, 0, -327713, 0, 0, -327712, 0, 0, -327711, 0, 0, -327710, 0, 0, -327709, 0, 0, -327708, 0, 0, -327707, 0, 0, -327706, 0, 0, -327705, 0, 0, -327704, 0, 0, -327703, 0, 0, -327702, 0, 0, -327701, 0, 0, -327700, 0, 0, -327699, 0, 0, -327698, 0, 0, -327697, 0, 0, -327696, 0, 0, -327695, 0, 0, -327694, 0, 0, -327693, 0, 0, -327692, 0, 0, -327691, 0, 0, -327690, 0, 0, -327689, 0, 0, -327688, 0, 0, -327687, 0, 0, -327686, 0, 0, -327685, 0, 0, -327684, 0, 0, -327683, 0, 0, -327682, 0, 0, -327681, 0, 0, -393216, 0, 0, -393215, 0, 0, -393214, 0, 0, -393213, 0, 0, -393212, 0, 0, -393211, 0, 0, -393210, 0, 0, -393209, 0, 0, -393208, 0, 0, -393207, 0, 0, -393206, 0, 0, -393205, 0, 0, -393204, 0, 0, -393203, 0, 0, -393202, 0, 0, -393201, 0, 0, -393200, 0, 0, -393199, 0, 0, -393198, 0, 0, -393197, 0, 0, -393196, 0, 0, -393195, 0, 0, -393194, 0, 0, -393193, 0, 0, -393192, 0, 0, -393191, 0, 0, -393190, 0, 0, -393189, 0, 0, -393188, 0, 0, -393187, 0, 0, -393186, 0, 0, -393185, 0, 0, -393184, 0, 0, -393183, 0, 0, -393182, 0, 0, -393181, 0, 0, -393180, 0, 0, -393179, 0, 0, -393178, 0, 0, -393177, 0, 0, -393176, 0, 0, -393175, 0, 0, -393174, 0, 0, -393173, 0, 0, -393172, 0, 0, -393171, 0, 0, -393170, 0, 0, -393169, 0, 0, -393168, 0, 0, -393167, 0, 0, -393166, 0, 0, -393165, 0, 0, -393164, 0, 0, -393163, 0, 0, -393162, 0, 0, -393161, 0, 0, -393160, 0, 0, -393159, 0, 0, -262181, 0, 0, -262180, 0, 0, -262179, 0, 0, -262178, 0, 0, -262177, 0, 0, -262176, 0, 0, -262175, 0, 0, -262174, 0, 0, -262173, 0, 0, -262172, 0, 0, -262171, 0, 0, -262170, 0, 0, -262169, 0, 0, -262168, 0, 0, -262167, 0, 0, -262166, 0, 0, -262165, 0, 0, -262164, 0, 0, -262163, 0, 0, -262162, 0, 0, -262161, 0, 0, -262160, 0, 0, -262159, 0, 0, -262158, 0, 0, -262157, 0, 0, -262156, 0, 0, -262155, 0, 0, -262154, 0, 0, -262153, 0, 0, -262152, 0, 0, -262151, 0, 0, -262150, 0, 0, -262149, 0, 0, -262148, 0, 0, -262147, 0, 0, -262146, 0, 0, -262145, 0, 0, -327680, 0, 0, -327679, 0, 0, -327678, 0, 0, -327677, 0, 0, -327676, 0, 0, -327675, 0, 0, -327674, 0, 0, -327673, 0, 0, -327672, 0, 0, -327671, 0, 0, -327670, 0, 0, -327669, 0, 0, -327668, 0, 0, -327667, 0, 0, -327666, 0, 0, -327665, 0, 0, -327664, 0, 0, -327663, 0, 0, -327662, 0, 0, -327661, 0, 0, -327660, 0, 0, -327659, 0, 0, -327658, 0, 0, -327657, 0, 0, -327656, 0, 0, -327655, 0, 0, -327654, 0, 0, -327653, 0, 0, -327652, 0, 0, -327651, 0, 0, -327650, 0, 0, -327649, 0, 0, -327648, 0, 0, -327647, 0, 0, -327646, 0, 0, -327645, 0, 0, -327644, 0, 0, -327643, 0, 0, -327642, 0, 0, -327641, 0, 0, -327640, 0, 0, -327639, 0, 0, -327638, 0, 0, -327637, 0, 0, -327636, 0, 0, -327635, 0, 0, -327634, 0, 0, -327633, 0, 0, -327632, 0, 0, -327631, 0, 0, -327630, 0, 0, -327629, 0, 0, -327628, 0, 0, -327627, 0, 0, -327626, 0, 0, -327625, 0, 0, -327624, 0, 0, -327623, 0, 0, -196645, 0, 0, -196644, 0, 0, -196643, 0, 0, -196642, 0, 0, -196641, 0, 0, -196640, 0, 0, -196639, 0, 0, -196638, 0, 0, -196637, 0, 0, -196636, 0, 0, -196635, 0, 0, -196634, 0, 0, -196633, 0, 0, -196632, 0, 0, -196631, 0, 0, -196630, 0, 0, -196629, 0, 0, -196628, 0, 0, -196627, 0, 0, -196626, 0, 0, -196625, 0, 0, -196624, 0, 0, -196623, 0, 0, -196622, 0, 0, -196621, 0, 0, -196620, 0, 0, -196619, 0, 0, -196618, 0, 0, -196617, 0, 0, -196616, 0, 0, -196615, 0, 0, -196614, 0, 0, -196613, 0, 0, -196612, 0, 0, -196611, 0, 0, -196610, 0, 0, -196609, 0, 0, -262144, 0, 0, -262143, 0, 0, -262142, 0, 0, -262141, 0, 0, -262140, 0, 0, -262139, 0, 0, -262138, 0, 0, -262137, 0, 0, -262136, 0, 0, -262135, 0, 0, -262134, 0, 0, -262133, 0, 0, -262132, 0, 0, -262131, 0, 0, -262130, 0, 0, -262129, 0, 0, -262128, 0, 0, -262127, 0, 0, -262126, 0, 0, -262125, 0, 0, -262124, 0, 0, -262123, 0, 0, -262122, 0, 0, -262121, 0, 0, -262120, 0, 0, -262119, 0, 0, -262118, 0, 0, -262117, 0, 0, -262116, 0, 0, -262115, 0, 0, -262114, 0, 0, -262113, 0, 0, -262112, 0, 0, -262111, 0, 0, -262110, 0, 0, -262109, 0, 0, -262108, 0, 0, -262107, 0, 0, -262106, 0, 0, -262105, 0, 0, -262104, 0, 0, -262103, 0, 0, -262102, 0, 0, -262101, 0, 0, -262100, 0, 0, -262099, 0, 0, -262098, 0, 0, -262097, 0, 0, -262096, 0, 0, -262095, 0, 0, -262094, 0, 0, -262093, 0, 0, -262092, 0, 0, -262091, 0, 0, -262090, 0, 0, -262089, 0, 0, -262088, 0, 0, -262087, 0, 0, -131108, 0, 0, -131107, 0, 0, -131106, 0, 0, -131105, 0, 0, -131104, 0, 0, -131103, 0, 0, -131102, 0, 0, -131101, 0, 0, -131100, 0, 0, -131099, 0, 0, -131098, 0, 0, -131097, 0, 0, -131096, 0, 0, -131095, 0, 0, -131094, 0, 0, -131093, 0, 0, -131092, 0, 0, -131091, 0, 0, -131090, 0, 0, -131089, 0, 0, -131088, 0, 0, -131087, 0, 0, -131086, 0, 0, -131085, 0, 0, -131084, 0, 0, -131083, 0, 0, -131082, 0, 0, -131081, 0, 0, -131080, 0, 0, -131079, 0, 0, -131078, 0, 0, -131077, 0, 0, -131076, 0, 0, -131075, 0, 0, -131074, 0, 0, -131073, 0, 0, -196608, 0, 0, -196607, 0, 0, -196606, 0, 0, -196605, 0, 0, -196604, 0, 0, -196603, 0, 0, -196602, 0, 0, -196601, 0, 0, -196600, 0, 0, -196599, 0, 0, -196598, 0, 0, -196597, 0, 0, -196596, 0, 0, -196595, 0, 0, -196594, 0, 0, -196593, 0, 0, -196592, 0, 0, -196591, 0, 0, -196590, 0, 0, -196589, 0, 0, -196588, 0, 0, -196587, 0, 0, -196586, 0, 0, -196585, 0, 0, -196584, 0, 0, -196583, 0, 0, -196582, 0, 0, -196581, 0, 0, -196580, 0, 0, -196579, 0, 0, -196578, 0, 0, -196577, 0, 0, -196576, 0, 0, -196575, 0, 0, -196574, 0, 0, -196573, 0, 0, -196572, 0, 0, -196571, 0, 0, -196570, 0, 0, -196569, 0, 0, -196568, 0, 0, -196567, 0, 0, -196566, 0, 0, -196565, 0, 0, -196564, 0, 0, -196563, 0, 0, -196562, 0, 0, -196561, 0, 0, -196560, 0, 0, -196559, 0, 0, -196558, 0, 0, -196557, 0, 0, -196556, 0, 0, -196555, 0, 0, -196554, 0, 0, -196553, 0, 0, -196552, 0, 0, -196551, 0, 0, -65572, 0, 0, -65571, 0, 0, -65570, 0, 0, -65569, 0, 0, -65568, 0, 0, -65567, 0, 0, -65566, 0, 0, -65565, 0, 0, -65564, 0, 0, -65563, 0, 0, -65562, 0, 0, -65561, 0, 0, -65560, 0, 0, -65559, 0, 0, -65558, 0, 0, -65557, 0, 0, -65556, 0, 0, -65555, 0, 0, -65554, 0, 0, -65553, 0, 0, -65552, 0, 0, -65551, 0, 0, -65550, 0, 0, -65549, 0, 0, -65548, 0, 0, -65547, 0, 0, -65546, 0, 0, -65545, 0, 0, -65544, 0, 0, -65543, 0, 0, -65542, 0, 0, -65541, 0, 0, -65540, 0, 0, -65539, 0, 0, -65538, 0, 0, -65537, 0, 0, -131072, 0, 0, -131071, 0, 0, -131070, 0, 0, -131069, 0, 0, -131068, 0, 0, -131067, 0, 0, -131066, 0, 0, -131065, 0, 0, -131064, 0, 0, -131063, 0, 0, -131062, 0, 0, -131061, 0, 0, -131060, 0, 0, -131059, 0, 0, -131058, 0, 0, -131057, 0, 0, -131056, 0, 0, -131055, 0, 0, -131054, 0, 0, -131053, 0, 0, -131052, 0, 0, -131051, 0, 0, -131050, 0, 0, -131049, 0, 0, -131048, 0, 0, -131047, 0, 0, -131046, 0, 0, -131045, 0, 0, -131044, 0, 0, -131043, 0, 0, -131042, 0, 0, -131041, 0, 0, -131040, 0, 0, -131039, 0, 0, -131038, 0, 0, -131037, 0, 0, -131036, 0, 0, -131035, 0, 0, -131034, 0, 0, -131033, 0, 0, -131032, 0, 0, -131031, 0, 0, -131030, 0, 0, -131029, 0, 0, -131028, 0, 0, -131027, 0, 0, -131026, 0, 0, -131025, 0, 0, -131024, 0, 0, -131023, 0, 0, -131022, 0, 0, -131021, 0, 0, -131020, 0, 0, -131019, 0, 0, -131018, 0, 0, -131017, 0, 0, -131016, 0, 0, -131015, 0, 0, -36, 0, 0, -35, 0, 0, -34, 0, 0, -33, 0, 0, -32, 0, 0, -31, 0, 0, -30, 0, 0, -29, 0, 0, -28, 0, 0, -27, 0, 0, -26, 0, 0, -25, 0, 0, -24, 0, 0, -23, 0, 0, -22, 0, 0, -21, 0, 0, -20, 0, 0, -19, 0, 0, -18, 0, 0, -17, 0, 0, -16, 0, 0, -15, 0, 0, -14, 0, 0, -13, 0, 0, -12, 0, 0, -11, 0, 0, -10, 0, 0, -9, 0, 0, -8, 0, 0, -7, 0, 0, -6, 0, 0, -5, 0, 0, -4, 0, 0, -3, 0, 0, -2, 0, 0, -1, 0, 0, -65536, 0, 0, -65535, 0, 0, -65534, 0, 0, -65533, 0, 0, -65532, 0, 0, -65531, 0, 0, -65530, 0, 0, -65529, 0, 0, -65528, 0, 0, -65527, 0, 0, -65526, 0, 0, -65525, 0, 0, -65524, 0, 0, -65523, 0, 0, -65522, 0, 0, -65521, 0, 0, -65520, 0, 0, -65519, 0, 0, -65518, 0, 0, -65517, 0, 0, -65516, 0, 0, -65515, 0, 0, -65514, 0, 0, -65513, 0, 0, -65512, 0, 0, -65511, 0, 0, -65510, 0, 0, -65509, 0, 0, -65508, 0, 0, -65507, 0, 0, -65506, 0, 0, -65505, 0, 0, -65504, 0, 0, -65503, 0, 0, -65502, 0, 0, -65501, 0, 0, -65500, 0, 0, -65499, 0, 0, -65498, 0, 0, -65497, 0, 0, -65496, 0, 0, -65495, 0, 0, -65494, 0, 0, -65493, 0, 0, -65492, 0, 0, -65491, 0, 0, -65490, 0, 0, -65489, 0, 0, -65488, 0, 0, -65487, 0, 0, -65486, 0, 0, -65485, 0, 0, -65484, 0, 0, -65483, 0, 0, -65482, 0, 0, -65481, 0, 0, -65480, 0, 0, -65479, 0, 0, 65500, 0, 0, 65501, 0, 0, 65502, 0, 0, 65503, 0, 0, 65504, 0, 0, 65505, 0, 0, 65506, 0, 0, 65507, 0, 0, 65508, 0, 0, 65509, 0, 0, 65510, 0, 0, 65511, 0, 0, 65512, 0, 0, 65513, 0, 0, 65514, 0, 0, 65515, 0, 0, 65516, 0, 0, 65517, 0, 0, 65518, 0, 0, 65519, 0, 0, 65520, 0, 0, 65521, 0, 0, 65522, 0, 0, 65523, 0, 0, 65524, 0, 0, 65525, 0, 0, 65526, 0, 0, 65527, 0, 0, 65528, 0, 0, 65529, 0, 0, 65530, 0, 0, 65531, 0, 0, 65532, 0, 0, 65533, 0, 0, 65534, 0, 0, 65535, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 3, 0, 0, 4, 0, 0, 5, 0, 0, 6, 0, 0, 7, 0, 0, 8, 0, 0, 9, 0, 0, 10, 0, 0, 11, 0, 0, 12, 0, 0, 13, 0, 0, 14, 0, 0, 15, 0, 0, 16, 0, 0, 17, 0, 0, 18, 0, 0, 19, 0, 0, 20, 0, 0, 21, 0, 0, 22, 0, 0, 23, 0, 0, 24, 0, 0, 25, 0, 0, 26, 0, 0, 27, 0, 0, 28, 0, 0, 29, 0, 0, 30, 0, 0, 31, 0, 0, 32, 0, 0, 33, 0, 0, 34, 0, 0, 35, 0, 0, 36, 0, 0, 37, 0, 0, 38, 0, 0, 39, 0, 0, 40, 0, 0, 41, 0, 0, 42, 0, 0, 43, 0, 0, 44, 0, 0, 45, 0, 0, 46, 0, 0, 47, 0, 0, 48, 0, 0, 49, 0, 0, 50, 0, 0, 51, 0, 0, 52, 0, 0, 53, 0, 0, 54, 0, 0, 55, 0, 0, 56, 0, 0, 57, 0, 0, 131037, 0, 0, 131038, 0, 0, 131039, 0, 0, 131040, 0, 0, 131041, 0, 0, 131042, 0, 0, 131043, 0, 0, 131044, 0, 0, 131045, 0, 0, 131046, 0, 0, 131047, 0, 0, 131048, 0, 0, 131049, 0, 0, 131050, 0, 0, 131051, 0, 0, 131052, 0, 0, 131053, 0, 0, 131054, 0, 0, 131055, 0, 0, 131056, 0, 0, 131057, 0, 0, 131058, 0, 0, 131059, 0, 0, 131060, 0, 0, 131061, 0, 0, 131062, 0, 0, 131063, 0, 0, 131064, 0, 0, 131065, 0, 0, 131066, 0, 0, 131067, 0, 0, 131068, 0, 0, 131069, 0, 0, 131070, 0, 0, 131071, 0, 0, 65536, 0, 0, 65537, 0, 0, 65538, 0, 0, 65539, 0, 0, 65540, 0, 0, 65541, 0, 0, 65542, 0, 0, 65543, 0, 0, 65544, 0, 0, 65545, 0, 0, 65546, 0, 0, 65547, 0, 0, 65548, 0, 0, 65549, 0, 0, 65550, 0, 0, 65551, 0, 0, 65552, 0, 0, 65553, 0, 0, 65554, 0, 0, 65555, 0, 0, 65556, 0, 0, 65557, 0, 0, 65558, 0, 0, 65559, 0, 0, 65560, 0, 0, 65561, 0, 0, 65562, 0, 0, 65563, 0, 0, 65564, 0, 0, 65565, 0, 0, 65566, 0, 0, 65567, 0, 0, 65568, 0, 0, 65569, 0, 0, 65570, 0, 0, 65571, 0, 0, 65572, 0, 0, 65573, 0, 0, 65574, 0, 0, 65575, 0, 0, 65576, 0, 0, 65577, 0, 0, 65578, 0, 0, 65579, 0, 0, 65580, 0, 0, 65581, 0, 0, 65582, 0, 0, 65583, 0, 0, 65584, 0, 0, 65585, 0, 0, 65586, 0, 0, 65587, 0, 0, 65588, 0, 0, 65589, 0, 0, 65590, 0, 0, 65591, 0, 0, 65592, 0, 0, 65593, 0, 0, 196573, 0, 0, 196574, 0, 0, 196575, 0, 0, 196576, 0, 0, 196577, 0, 0, 196578, 0, 0, 196579, 0, 0, 196580, 0, 0, 196581, 0, 0, 196582, 0, 0, 196583, 0, 0, 196584, 0, 0, 196585, 0, 0, 196586, 0, 0, 196587, 0, 0, 196588, 0, 0, 196589, 0, 0, 196590, 0, 0, 196591, 0, 0, 196592, 0, 0, 196593, 0, 0, 196594, 0, 0, 196595, 0, 0, 196596, 0, 0, 196597, 0, 0, 196598, 0, 0, 196599, 0, 0, 196600, 0, 0, 196601, 0, 0, 196602, 0, 0, 196603, 0, 0, 196604, 0, 0, 196605, 0, 0, 196606, 0, 0, 196607, 0, 0, 131072, 0, 0, 131073, 0, 0, 131074, 0, 0, 131075, 0, 0, 131076, 0, 0, 131077, 0, 0, 131078, 0, 0, 131079, 0, 0, 131080, 0, 0, 131081, 0, 0, 131082, 0, 0, 131083, 0, 0, 131084, 0, 0, 131085, 0, 0, 131086, 0, 0, 131087, 0, 0, 131088, 0, 0, 131089, 0, 0, 131090, 0, 0, 131091, 0, 0, 131092, 0, 0, 131093, 0, 0, 131094, 0, 0, 131095, 0, 0, 131096, 0, 0, 131097, 0, 0, 131098, 0, 0, 131099, 0, 0, 131100, 0, 0, 131101, 0, 0, 131102, 0, 0, 131103, 0, 0, 131104, 0, 0, 131105, 0, 0, 131106, 0, 0, 131107, 0, 0, 131108, 0, 0, 131109, 0, 0, 131110, 0, 0, 131111, 0, 0, 131112, 0, 0, 131113, 0, 0, 131114, 0, 0, 131115, 0, 0, 131116, 0, 0, 131117, 0, 0, 131118, 0, 0, 131119, 0, 0, 131120, 0, 0, 131121, 0, 0, 131122, 0, 0, 131123, 0, 0, 131124, 0, 0, 131125, 0, 0, 131126, 0, 0, 131127, 0, 0, 131128, 0, 0, 131129, 0, 0, 262109, 0, 0, 262110, 0, 0, 262111, 0, 0, 262112, 0, 0, 262113, 0, 0, 262114, 0, 0, 262115, 0, 0, 262116, 0, 0, 262117, 0, 0, 262118, 0, 0, 262119, 0, 0, 262120, 0, 0, 262121, 0, 0, 262122, 0, 0, 262123, 0, 0, 262124, 0, 0, 262125, 0, 0, 262126, 0, 0, 262127, 0, 0, 262128, 0, 0, 262129, 0, 0, 262130, 0, 0, 262131, 0, 0, 262132, 0, 0, 262133, 0, 0, 262134, 0, 0, 262135, 0, 0, 262136, 0, 0, 262137, 0, 0, 262138, 0, 0, 262139, 0, 0, 262140, 0, 0, 262141, 0, 0, 262142, 0, 0, 262143, 0, 0, 196608, 0, 0, 196609, 0, 0, 196610, 0, 0, 196611, 0, 0, 196612, 0, 0, 196613, 0, 0, 196614, 0, 0, 196615, 0, 0, 196616, 0, 0, 196617, 0, 0, 196618, 0, 0, 196619, 0, 0, 196620, 0, 0, 196621, 0, 0, 196622, 0, 0, 196623, 0, 0, 196624, 0, 0, 196625, 0, 0, 196626, 0, 0, 196627, 0, 0, 196628, 0, 0, 196629, 0, 0, 196630, 0, 0, 196631, 0, 0, 196632, 0, 0, 196633, 0, 0, 196634, 0, 0, 196635, 0, 0, 196636, 0, 0, 196637, 0, 0, 196638, 0, 0, 196639, 0, 0, 196640, 0, 0, 196641, 0, 0, 196642, 0, 0, 196643, 0, 0, 196644, 0, 0, 196645, 0, 0, 196646, 0, 0, 196647, 0, 0, 196648, 0, 0, 196649, 0, 0, 196650, 0, 0, 196651, 0, 0, 196652, 0, 0, 196653, 0, 0, 196654, 0, 0, 196655, 0, 0, 196656, 0, 0, 196657, 0, 0, 196658, 0, 0, 196659, 0, 0, 196660, 0, 0, 196661, 0, 0, 196662, 0, 0, 196663, 0, 0, 196664, 0, 0, 196665, 0, 0, 327645, 0, 0, 327646, 0, 0, 327647, 0, 0, 327648, 0, 0, 327649, 0, 0, 327650, 0, 0, 327651, 0, 0, 327652, 0, 0, 327653, 0, 0, 327654, 0, 0, 327655, 0, 0, 327656, 0, 0, 327657, 0, 0, 327658, 0, 0, 327659, 0, 0, 327660, 0, 0, 327661, 0, 0, 327662, 0, 0, 327663, 0, 0, 327664, 0, 0, 327665, 0, 0, 327666, 0, 0, 327667, 0, 0, 327668, 0, 0, 327669, 0, 0, 327670, 0, 0, 327671, 0, 0, 327672, 0, 0, 327673, 0, 0, 327674, 0, 0, 327675, 0, 0, 327676, 0, 0, 327677, 0, 0, 327678, 0, 0, 327679, 0, 0, 262144, 0, 0, 262145, 0, 0, 262146, 0, 0, 262147, 0, 0, 262148, 0, 0, 262149, 0, 0, 262150, 0, 0, 262151, 0, 0, 262152, 0, 0, 262153, 0, 0, 262154, 0, 0, 262155, 0, 0, 262156, 0, 0, 262157, 0, 0, 262158, 0, 0, 262159, 0, 0, 262160, 0, 0, 262161, 0, 0, 262162, 0, 0, 262163, 0, 0, 262164, 0, 0, 262165, 0, 0, 262166, 0, 0, 262167, 0, 0, 262168, 0, 0, 262169, 0, 0, 262170, 0, 0, 262171, 0, 0, 262172, 0, 0, 262173, 0, 0, 262174, 0, 0, 262175, 0, 0, 262176, 0, 0, 262177, 0, 0, 262178, 0, 0, 262179, 0, 0, 262180, 0, 0, 262181, 0, 0, 262182, 0, 0, 262183, 0, 0, 262184, 0, 0, 262185, 0, 0, 262186, 0, 0, 262187, 0, 0, 262188, 0, 0, 262189, 0, 0, 262190, 0, 0, 262191, 0, 0, 262192, 0, 0, 262193, 0, 0, 262194, 0, 0, 262195, 0, 0, 262196, 0, 0, 262197, 0, 0, 262198, 0, 0, 262199, 0, 0, 262200, 0, 0, 262201, 0, 0, 393182, 0, 0, 393183, 0, 0, 393184, 0, 0, 393185, 0, 0, 393186, 0, 0, 393187, 0, 0, 393188, 0, 0, 393189, 0, 0, 393190, 0, 0, 393191, 0, 0, 393192, 0, 0, 393193, 0, 0, 393194, 0, 0, 393195, 0, 0, 393196, 0, 0, 393197, 0, 0, 393198, 0, 0, 393199, 0, 0, 393200, 0, 0, 393201, 0, 0, 393202, 0, 0, 393203, 0, 0, 393204, 0, 0, 393205, 0, 0, 393206, 0, 0, 393207, 0, 0, 393208, 0, 0, 393209, 0, 0, 393210, 0, 0, 393211, 0, 0, 393212, 0, 0, 393213, 0, 0, 393214, 0, 0, 393215, 0, 0, 327680, 0, 0, 327681, 0, 0, 327682, 0, 0, 327683, 0, 0, 327684, 0, 0, 327685, 0, 0, 327686, 0, 0, 327687, 0, 0, 327688, 0, 0, 327689, 0, 0, 327690, 0, 0, 327691, 0, 0, 327692, 0, 0, 327693, 0, 0, 327694, 0, 0, 327695, 0, 0, 327696, 0, 0, 327697, 0, 0, 327698, 0, 0, 327699, 0, 0, 327700, 0, 0, 327701, 0, 0, 327702, 0, 0, 327703, 0, 0, 327704, 0, 0, 327705, 0, 0, 327706, 0, 0, 327707, 0, 0, 327708, 0, 0, 327709, 0, 0, 327710, 0, 0, 327711, 0, 0, 327712, 0, 0, 327713, 0, 0, 327714, 0, 0, 327715, 0, 0, 327716, 0, 0, 327717, 0, 0, 327718, 0, 0, 327719, 0, 0, 327720, 0, 0, 327721, 0, 0, 327722, 0, 0, 327723, 0, 0, 327724, 0, 0, 327725, 0, 0, 327726, 0, 0, 327727, 0, 0, 327728, 0, 0, 327729, 0, 0, 327730, 0, 0, 327731, 0, 0, 327732, 0, 0, 327733, 0, 0, 327734, 0, 0, 327735, 0, 0, 327736, 0, 0, 458718, 0, 0, 458719, 0, 0, 458720, 0, 0, 458721, 0, 0, 458722, 0, 0, 458723, 0, 0, 458724, 0, 0, 458725, 0, 0, 458726, 0, 0, 458727, 0, 0, 458728, 0, 0, 458729, 0, 0, 458730, 0, 0, 458731, 0, 0, 458732, 0, 0, 458733, 0, 0, 458734, 0, 0, 458735, 0, 0, 458736, 0, 0, 458737, 0, 0, 458738, 0, 0, 458739, 0, 0, 458740, 0, 0, 458741, 0, 0, 458742, 0, 0, 458743, 0, 0, 458744, 0, 0, 458745, 0, 0, 458746, 0, 0, 458747, 0, 0, 458748, 0, 0, 458749, 0, 0, 458750, 0, 0, 458751, 0, 0, 393216, 0, 0, 393217, 0, 0, 393218, 0, 0, 393219, 0, 0, 393220, 0, 0, 393221, 0, 0, 393222, 0, 0, 393223, 0, 0, 393224, 0, 0, 393225, 0, 0, 393226, 0, 0, 393227, 0, 0, 393228, 0, 0, 393229, 0, 0, 393230, 0, 0, 393231, 0, 0, 393232, 0, 0, 393233, 0, 0, 393234, 0, 0, 393235, 0, 0, 393236, 0, 0, 393237, 0, 0, 393238, 0, 0, 393239, 0, 0, 393240, 0, 0, 393241, 0, 0, 393242, 0, 0, 393243, 0, 0, 393244, 0, 0, 393245, 0, 0, 393246, 0, 0, 393247, 0, 0, 393248, 0, 0, 393249, 0, 0, 393250, 0, 0, 393251, 0, 0, 393252, 0, 0, 393253, 0, 0, 393254, 0, 0, 393255, 0, 0, 393256, 0, 0, 393257, 0, 0, 393258, 0, 0, 393259, 0, 0, 393260, 0, 0, 393261, 0, 0, 393262, 0, 0, 393263, 0, 0, 393264, 0, 0, 393265, 0, 0, 393266, 0, 0, 393267, 0, 0, 393268, 0, 0, 393269, 0, 0, 393270, 0, 0, 393271, 0, 0, 393272, 0, 0, 524254, 0, 0, 524255, 0, 0, 524256, 0, 0, 524257, 0, 0, 524258, 0, 0, 524259, 0, 0, 524260, 0, 0, 524261, 0, 0, 524262, 0, 0, 524263, 0, 0, 524264, 0, 0, 524265, 0, 0, 524266, 0, 0, 524267, 0, 0, 524268, 0, 0, 524269, 0, 0, 524270, 0, 0, 524271, 0, 0, 524272, 0, 0, 524273, 0, 0, 524274, 0, 0, 524275, 0, 0, 524276, 0, 0, 524277, 0, 0, 524278, 0, 0, 524279, 0, 0, 524280, 0, 0, 524281, 0, 0, 524282, 0, 0, 524283, 0, 0, 524284, 0, 0, 524285, 0, 0, 524286, 0, 0, 524287, 0, 0, 458752, 0, 0, 458753, 0, 0, 458754, 0, 0, 458755, 0, 0, 458756, 0, 0, 458757, 0, 0, 458758, 0, 0, 458759, 0, 0, 458760, 0, 0, 458761, 0, 0, 458762, 0, 0, 458763, 0, 0, 458764, 0, 0, 458765, 0, 0, 458766, 0, 0, 458767, 0, 0, 458768, 0, 0, 458769, 0, 0, 458770, 0, 0, 458771, 0, 0, 458772, 0, 0, 458773, 0, 0, 458774, 0, 0, 458775, 0, 0, 458776, 0, 0, 458777, 0, 0, 458778, 0, 0, 458779, 0, 0, 458780, 0, 0, 458781, 0, 0, 458782, 0, 0, 458783, 0, 0, 458784, 0, 0, 458785, 0, 0, 458786, 0, 0, 458787, 0, 0, 458788, 0, 0, 458789, 0, 0, 458790, 0, 0, 458791, 0, 0, 458792, 0, 0, 458793, 0, 0, 458794, 0, 0, 458795, 0, 0, 458796, 0, 0, 458797, 0, 0, 458798, 0, 0, 458799, 0, 0, 458800, 0, 0, 458801, 0, 0, 458802, 0, 0, 458803, 0, 0, 458804, 0, 0, 458805, 0, 0, 458806, 0, 0, 458807, 0, 0, 458808, 0, 0, 589790, 0, 0, 589791, 0, 0, 589792, 0, 0, 589793, 0, 0, 589794, 0, 0, 589795, 0, 0, 589796, 0, 0, 589797, 0, 0, 589798, 0, 0, 589799, 0, 0, 589800, 0, 0, 589801, 0, 0, 589802, 0, 0, 589803, 0, 0, 589804, 0, 0, 589805, 0, 0, 589806, 0, 0, 589807, 0, 0, 589808, 0, 0, 589809, 0, 0, 589810, 0, 0, 589811, 0, 0, 589812, 0, 0, 589813, 0, 0, 589814, 0, 0, 589815, 0, 0, 589816, 0, 0, 589817, 0, 0, 589818, 0, 0, 589819, 0, 0, 589820, 0, 0, 589821, 0, 0, 589822, 0, 0, 589823, 0, 0, 524288, 0, 0, 524289, 0, 0, 524290, 0, 0, 524291, 0, 0, 524292, 0, 0, 524293, 0, 0, 524294, 0, 0, 524295, 0, 0, 524296, 0, 0, 524297, 0, 0, 524298, 0, 0, 524299, 0, 0, 524300, 0, 0, 524301, 0, 0, 524302, 0, 0, 524303, 0, 0, 524304, 0, 0, 524305, 0, 0, 524306, 0, 0, 524307, 0, 0, 524308, 0, 0, 524309, 0, 0, 524310, 0, 0, 524311, 0, 0, 524312, 0, 0, 524313, 0, 0, 524314, 0, 0, 524315, 0, 0, 524316, 0, 0, 524317, 0, 0, 524318, 0, 0, 524319, 0, 0, 524320, 0, 0, 524321, 0, 0, 524322, 0, 0, 524323, 0, 0, 524324, 0, 0, 524325, 0, 0, 524326, 0, 0, 524327, 0, 0, 524328, 0, 0, 524329, 0, 0, 524330, 0, 0, 524331, 0, 0, 524332, 0, 0, 524333, 0, 0, 524334, 0, 0, 524335, 0, 0, 524336, 0, 0, 524337, 0, 0, 524338, 0, 0, 524339, 0, 0, 524340, 0, 0, 524341, 0, 0, 524342, 0, 0, 524343, 0, 0, 524344, 0, 0, 655327, 0, 0, 655328, 0, 0, 655329, 0, 0, 655330, 0, 0, 655331, 0, 0, 655332, 0, 0, 655333, 0, 0, 655334, 0, 0, 655335, 0, 0, 655336, 0, 0, 655337, 0, 0, 655338, 0, 0, 655339, 0, 0, 655340, 0, 0, 655341, 0, 0, 655342, 0, 0, 655343, 0, 0, 655344, 0, 0, 655345, 0, 0, 655346, 0, 0, 655347, 0, 0, 655348, 0, 0, 655349, 0, 0, 655350, 0, 0, 655351, 0, 0, 655352, 0, 0, 655353, 0, 0, 655354, 0, 0, 655355, 0, 0, 655356, 0, 0, 655357, 0, 0, 655358, 0, 0, 655359, 0, 0, 589824, 0, 0, 589825, 0, 0, 589826, 0, 0, 589827, 0, 0, 589828, 0, 0, 589829, 0, 0, 589830, 0, 0, 589831, 0, 0, 589832, 0, 0, 589833, 0, 0, 589834, 0, 0, 589835, 0, 0, 589836, 0, 0, 589837, 0, 0, 589838, 0, 0, 589839, 0, 0, 589840, 0, 0, 589841, 0, 0, 589842, 0, 0, 589843, 0, 0, 589844, 0, 0, 589845, 0, 0, 589846, 0, 0, 589847, 0, 0, 589848, 0, 0, 589849, 0, 0, 589850, 0, 0, 589851, 0, 0, 589852, 0, 0, 589853, 0, 0, 589854, 0, 0, 589855, 0, 0, 589856, 0, 0, 589857, 0, 0, 589858, 0, 0, 589859, 0, 0, 589860, 0, 0, 589861, 0, 0, 589862, 0, 0, 589863, 0, 0, 589864, 0, 0, 589865, 0, 0, 589866, 0, 0, 589867, 0, 0, 589868, 0, 0, 589869, 0, 0, 589870, 0, 0, 589871, 0, 0, 589872, 0, 0, 589873, 0, 0, 589874, 0, 0, 589875, 0, 0, 589876, 0, 0, 589877, 0, 0, 589878, 0, 0, 589879, 0, 0, 720863, 0, 0, 720864, 0, 0, 720865, 0, 0, 720866, 0, 0, 720867, 0, 0, 720868, 0, 0, 720869, 0, 0, 720870, 0, 0, 720871, 0, 0, 720872, 0, 0, 720873, 0, 0, 720874, 0, 0, 720875, 0, 0, 720876, 0, 0, 720877, 0, 0, 720878, 0, 0, 720879, 0, 0, 720880, 0, 0, 720881, 0, 0, 720882, 0, 0, 720883, 0, 0, 720884, 0, 0, 720885, 0, 0, 720886, 0, 0, 720887, 0, 0, 720888, 0, 0, 720889, 0, 0, 720890, 0, 0, 720891, 0, 0, 720892, 0, 0, 720893, 0, 0, 720894, 0, 0, 720895, 0, 0, 655360, 0, 0, 655361, 0, 0, 655362, 0, 0, 655363, 0, 0, 655364, 0, 0, 655365, 0, 0, 655366, 0, 0, 655367, 0, 0, 655368, 0, 0, 655369, 0, 0, 655370, 0, 0, 655371, 0, 0, 655372, 0, 0, 655373, 0, 0, 655374, 0, 0, 655375, 0, 0, 655376, 0, 0, 655377, 0, 0, 655378, 0, 0, 655379, 0, 0, 655380, 0, 0, 655381, 0, 0, 655382, 0, 0, 655383, 0, 0, 655384, 0, 0, 655385, 0, 0, 655386, 0, 0, 655387, 0, 0, 655388, 0, 0, 655389, 0, 0, 655390, 0, 0, 655391, 0, 0, 655392, 0, 0, 655393, 0, 0, 655394, 0, 0, 655395, 0, 0, 655396, 0, 0, 655397, 0, 0, 655398, 0, 0, 655399, 0, 0, 655400, 0, 0, 655401, 0, 0, 655402, 0, 0, 655403, 0, 0, 655404, 0, 0, 655405, 0, 0, 655406, 0, 0, 655407, 0, 0, 655408, 0, 0, 655409, 0, 0, 655410, 0, 0, 655411, 0, 0, 655412, 0, 0, 655413, 0, 0, 655414, 0, 0, 655415, 0, 0, 786399, 0, 0, 786400, 0, 0, 786401, 0, 0, 786402, 0, 0, 786403, 0, 0, 786404, 0, 0, 786405, 0, 0, 786406, 0, 0, 786407, 0, 0, 786408, 0, 0, 786409, 0, 0, 786410, 0, 0, 786411, 0, 0, 786412, 0, 0, 786413, 0, 0, 786414, 0, 0, 786415, 0, 0, 786416, 0, 0, 786417, 0, 0, 786418, 0, 0, 786419, 0, 0, 786420, 0, 0, 786421, 0, 0, 786422, 0, 0, 786423, 0, 0, 786424, 0, 0, 786425, 0, 0, 786426, 0, 0, 786427, 0, 0, 786428, 0, 0, 786429, 0, 0, 786430, 0, 0, 786431, 0, 0, 720896, 0, 0, 720897, 0, 0, 720898, 0, 0, 720899, 0, 0, 720900, 0, 0, 720901, 0, 0, 720902, 0, 0, 720903, 0, 0, 720904, 0, 0, 720905, 0, 0, 720906, 0, 0, 720907, 0, 0, 720908, 0, 0, 720909, 0, 0, 720910, 0, 0, 720911, 0, 0, 720912, 0, 0, 720913, 0, 0, 720914, 0, 0, 720915, 0, 0, 720916, 0, 0, 720917, 0, 0, 720918, 0, 0, 720919, 0, 0, 720920, 0, 0, 720921, 0, 0, 720922, 0, 0, 720923, 0, 0, 720924, 0, 0, 720925, 0, 0, 720926, 0, 0, 720927, 0, 0, 720928, 0, 0, 720929, 0, 0, 720930, 0, 0, 720931, 0, 0, 720932, 0, 0, 720933, 0, 0, 720934, 0, 0, 720935, 0, 0, 720936, 0, 0, 720937, 0, 0, 720938, 0, 0, 720939, 0, 0, 720940, 0, 0, 720941, 0, 0, 720942, 0, 0, 720943, 0, 0, 720944, 0, 0, 720945, 0, 0, 720946, 0, 0, 720947, 0, 0, 720948, 0, 0, 720949, 0, 0, 720950, 0, 0, 720951, 0, 0, 851934, 0, 0, 851935, 0, 0, 851936, 0, 0, 851942, 0, 0, 851943, 0, 0, 851944, 0, 0, 851945, 0, 0, 851946, 0, 0, 851947, 0, 0, 851948, 0, 0, 851949, 0, 0, 851950, 0, 0, 851951, 0, 0, 851952, 0, 0, 851953, 0, 0, 851954, 0, 0, 851955, 0, 0, 851956, 0, 0, 851957, 0, 0, 851958, 0, 0, 851959, 0, 0, 851960, 0, 0, 851961, 0, 0, 851962, 0, 0, 851963, 0, 0, 851964, 0, 0, 851965, 0, 0, 851966, 0, 0, 851967, 0, 0, 786432, 0, 0, 786433, 0, 0, 786434, 0, 0, 786435, 0, 0, 786436, 0, 0, 786437, 0, 0, 786438, 0, 0, 786439, 0, 0, 786440, 0, 0, 786441, 0, 0, 786442, 0, 0, 786443, 0, 0, 786444, 0, 0, 786445, 0, 0, 786446, 0, 0, 786447, 0, 0, 786448, 0, 0, 786449, 0, 0, 786450, 0, 0, 786451, 0, 0, 786452, 0, 0, 786453, 0, 0, 786454, 0, 0, 786455, 0, 0, 786456, 0, 0, 786457, 0, 0, 786458, 0, 0, 786459, 0, 0, 786460, 0, 0, 786461, 0, 0, 786462, 0, 0, 786463, 0, 0, 786464, 0, 0, 786465, 0, 0, 786466, 0, 0, 786467, 0, 0, 786468, 0, 0, 786469, 0, 0, 786470, 0, 0, 786471, 0, 0, 786472, 0, 0, 786473, 0, 0, 786474, 0, 0, 786475, 0, 0, 786476, 0, 0, 786477, 0, 0, 786478, 0, 0, 786479, 0, 0, 786480, 0, 0, 786481, 0, 0, 786482, 0, 0, 786483, 0, 0, 786484, 0, 0, 786485, 0, 0, 786486, 0, 0, 917472, 0, 0, 917479, 0, 0, 917480, 0, 0, 917481, 0, 0, 917482, 0, 0, 917483, 0, 0, 917484, 0, 0, 917485, 0, 0, 917486, 0, 0, 917487, 0, 0, 917488, 0, 0, 917489, 0, 0, 917490, 0, 0, 917491, 0, 0, 917492, 0, 0, 917493, 0, 0, 917494, 0, 0, 917495, 0, 0, 917496, 0, 0, 917497, 0, 0, 917498, 0, 0, 917499, 0, 0, 917500, 0, 0, 917501, 0, 0, 917502, 0, 0, 917503, 0, 0, 851968, 0, 0, 851969, 0, 0, 851970, 0, 0, 851971, 0, 0, 851972, 0, 0, 851973, 0, 0, 851974, 0, 0, 851975, 0, 0, 851976, 0, 0, 851977, 0, 0, 851978, 0, 0, 851979, 0, 0, 851980, 0, 0, 851981, 0, 0, 851982, 0, 0, 851983, 0, 0, 851984, 0, 0, 851985, 0, 0, 851986, 0, 0, 851987, 0, 0, 851988, 0, 0, 851989, 0, 0, 851990, 0, 0, 851991, 0, 0, 851992, 0, 0, 851993, 0, 0, 851994, 0, 0, 851995, 0, 0, 851996, 0, 0, 851997, 0, 0, 851998, 0, 0, 851999, 0, 0, 852000, 0, 0, 852001, 0, 0, 852002, 0, 0, 852003, 0, 0, 852004, 0, 0, 852005, 0, 0, 852006, 0, 0, 852007, 0, 0, 852008, 0, 0, 852009, 0, 0, 852010, 0, 0, 852011, 0, 0, 852012, 0, 0, 852013, 0, 0, 852014, 0, 0, 852015, 0, 0, 852016, 0, 0, 852017, 0, 0, 852018, 0, 0, 852019, 0, 0, 852020, 0, 0, 852021, 0, 0, 852022, 0, 0, 983008, 0, 0, 983016, 0, 0, 983017, 0, 0, 983018, 0, 0, 983019, 0, 0, 983020, 0, 0, 983021, 0, 0, 983022, 0, 0, 983023, 0, 0, 983024, 0, 0, 983025, 0, 0, 983026, 0, 0, 983027, 0, 0, 983028, 0, 0, 983029, 0, 0, 983030, 0, 0, 983031, 0, 0, 983032, 0, 0, 983033, 0, 0, 983034, 0, 0, 983035, 0, 0, 983036, 0, 0, 983037, 0, 0, 983038, 0, 0, 983039, 0, 0, 917504, 0, 0, 917505, 0, 0, 917506, 0, 0, 917507, 0, 0, 917508, 0, 0, 917509, 0, 0, 917510, 0, 0, 917511, 0, 0, 917512, 0, 0, 917513, 0, 0, 917514, 0, 0, 917515, 0, 0, 917516, 0, 0, 917517, 0, 0, 917518, 0, 0, 917519, 0, 0, 917520, 0, 0, 917521, 0, 0, 917522, 0, 0, 917523, 0, 0, 917524, 0, 0, 917525, 0, 0, 917526, 0, 0, 917527, 0, 0, 917528, 0, 0, 917529, 0, 0, 917530, 0, 0, 917531, 0, 0, 917532, 0, 0, 917533, 0, 0, 917534, 0, 0, 917535, 0, 0, 917536, 0, 0, 917537, 0, 0, 917538, 0, 0, 917539, 0, 0, 917540, 0, 0, 917541, 0, 0, 917542, 0, 0, 917543, 0, 0, 917544, 0, 0, 917545, 0, 0, 917546, 0, 0, 917547, 0, 0, 917548, 0, 0, 917549, 0, 0, 917550, 0, 0, 917551, 0, 0, 917552, 0, 0, 917553, 0, 0, 917554, 0, 0, 917555, 0, 0, 917556, 0, 0, 917557, 0, 0, 917558, 0, 0, 1048545, 2, 0, 1048553, 0, 0, 1048554, 0, 0, 1048555, 0, 0, 1048556, 0, 0, 1048557, 0, 0, 1048558, 0, 0, 1048559, 0, 0, 1048560, 0, 0, 1048561, 0, 0, 1048562, 0, 0, 1048563, 0, 0, 1048564, 0, 0, 1048565, 0, 0, 1048566, 0, 0, 1048567, 0, 0, 1048568, 0, 0, 1048569, 0, 0, 1048570, 0, 0, 1048571, 0, 0, 1048572, 0, 0, 1048573, 0, 0, 1048574, 0, 0, 1048575, 0, 0, 983040, 0, 0, 983041, 0, 0, 983042, 0, 0, 983043, 0, 0, 983044, 0, 0, 983045, 0, 0, 983046, 0, 0, 983047, 0, 0, 983048, 0, 0, 983049, 0, 0, 983050, 0, 0, 983051, 0, 0, 983052, 0, 0, 983053, 0, 0, 983054, 0, 0, 983055, 0, 0, 983056, 0, 0, 983057, 0, 0, 983058, 0, 0, 983059, 0, 0, 983060, 0, 0, 983061, 0, 0, 983062, 0, 0, 983063, 0, 0, 983064, 0, 0, 983065, 0, 0, 983066, 0, 0, 983067, 0, 0, 983068, 0, 0, 983069, 0, 0, 983070, 0, 0, 983071, 0, 0, 983072, 0, 0, 983073, 0, 0, 983074, 0, 0, 983075, 0, 0, 983076, 0, 0, 983077, 0, 0, 983078, 0, 0, 983079, 0, 0, 983080, 0, 0, 983081, 0, 0, 983082, 0, 0, 983083, 0, 0, 983084, 0, 0, 983085, 0, 0, 983086, 0, 0, 983087, 0, 0, 983088, 0, 0, 983089, 0, 0, 983090, 0, 0, 983091, 0, 0, 983092, 0, 0, 983093, 0, 0, 1114081, 2, 0, 1114090, 0, 0, 1114091, 0, 0, 1114092, 0, 0, 1114093, 0, 0, 1114094, 0, 0, 1114095, 0, 0, 1114096, 0, 0, 1114097, 0, 0, 1114098, 0, 0, 1114099, 0, 0, 1114100, 0, 0, 1114101, 0, 0, 1114102, 0, 0, 1114103, 0, 0, 1114104, 0, 0, 1114105, 0, 0, 1114106, 0, 0, 1114107, 0, 0, 1114108, 0, 0, 1114109, 0, 0, 1114110, 0, 0, 1114111, 0, 0, 1048576, 0, 0, 1048577, 0, 0, 1048578, 0, 0, 1048579, 0, 0, 1048580, 0, 0, 1048581, 0, 0, 1048582, 0, 0, 1048583, 0, 0, 1048584, 0, 0, 1048585, 0, 0, 1048586, 0, 0, 1048587, 0, 0, 1048588, 0, 0, 1048589, 0, 0, 1048590, 0, 0, 1048591, 0, 0, 1048592, 0, 0, 1048593, 0, 0, 1048594, 0, 0, 1048595, 0, 0, 1048596, 0, 0, 1048597, 0, 0, 1048598, 0, 0, 1048599, 0, 0, 1048600, 0, 0, 1048601, 0, 0, 1048602, 0, 0, 1048603, 0, 0, 1048604, 0, 0, 1048605, 0, 0, 1048606, 0, 0, 1048607, 0, 0, 1048608, 0, 0, 1048609, 0, 0, 1048610, 0, 0, 1048611, 0, 0, 1048612, 0, 0, 1048613, 0, 0, 1048614, 0, 0, 1048615, 0, 0, 1048616, 0, 0, 1048617, 0, 0, 1048618, 0, 0, 1048619, 0, 0, 1048620, 0, 0, 1048621, 0, 0, 1048622, 0, 0, 1048623, 0, 0, 1048624, 0, 0, 1048625, 0, 0, 1048626, 0, 0, 1048627, 0, 0, 1048628, 0, 0, 1048629, 0, 0, 1179618, 2, 0, 1179627, 0, 0, 1179628, 0, 0, 1179629, 0, 0, 1179630, 0, 0, 1179631, 0, 0, 1179632, 0, 0, 1179633, 0, 0, 1179634, 0, 0, 1179635, 0, 0, 1179636, 0, 0, 1179637, 0, 0, 1179638, 0, 0, 1179639, 0, 0, 1179640, 0, 0, 1179641, 0, 0, 1179642, 0, 0, 1179643, 0, 0, 1179644, 0, 0, 1179645, 0, 0, 1179646, 0, 0, 1179647, 0, 0, 1114112, 0, 0, 1114113, 0, 0, 1114114, 0, 0, 1114115, 0, 0, 1114116, 0, 0, 1114117, 0, 0, 1114118, 0, 0, 1114119, 0, 0, 1114120, 0, 0, 1114121, 0, 0, 1114122, 0, 0, 1114123, 0, 0, 1114124, 0, 0, 1114125, 0, 0, 1114126, 0, 0, 1114127, 0, 0, 1114128, 0, 0, 1114129, 0, 0, 1114130, 0, 0, 1114131, 0, 0, 1114132, 0, 0, 1114133, 0, 0, 1114134, 0, 0, 1114135, 0, 0, 1114136, 0, 0, 1114137, 0, 0, 1114138, 0, 0, 1114139, 0, 0, 1114140, 0, 0, 1114141, 0, 0, 1114142, 0, 0, 1114143, 0, 0, 1114144, 0, 0, 1114145, 0, 0, 1114146, 0, 0, 1114147, 0, 0, 1114148, 0, 0, 1114149, 0, 0, 1114150, 0, 0, 1114151, 0, 0, 1114152, 0, 0, 1114153, 0, 0, 1114154, 0, 0, 1114155, 0, 0, 1114156, 0, 0, 1114157, 0, 0, 1114158, 0, 0, 1114159, 0, 0, 1114160, 0, 0, 1114161, 0, 0, 1114162, 0, 0, 1114163, 0, 0, 1114164, 0, 0, 1114165, 0, 0, 1245154, 2, 0, 1245164, 0, 0, 1245165, 0, 0, 1245166, 0, 0, 1245167, 0, 0, 1245168, 0, 0, 1245169, 0, 0, 1245170, 0, 0, 1245171, 0, 0, 1245172, 0, 0, 1245173, 0, 0, 1245174, 0, 0, 1245175, 0, 0, 1245176, 0, 0, 1245177, 0, 0, 1245178, 0, 0, 1245179, 0, 0, 1245180, 0, 0, 1245181, 0, 0, 1245182, 0, 0, 1245183, 0, 0, 1179648, 0, 0, 1179649, 0, 0, 1179650, 0, 0, 1179651, 0, 0, 1179652, 0, 0, 1179653, 0, 0, 1179654, 0, 0, 1179655, 0, 0, 1179656, 0, 0, 1179657, 0, 0, 1179658, 0, 0, 1179659, 0, 0, 1179660, 0, 0, 1179661, 0, 0, 1179662, 0, 0, 1179663, 0, 0, 1179664, 0, 0, 1179665, 0, 0, 1179666, 0, 0, 1179667, 0, 0, 1179668, 0, 0, 1179669, 0, 0, 1179670, 0, 0, 1179671, 0, 0, 1179672, 0, 0, 1179673, 0, 0, 1179674, 0, 0, 1179675, 0, 0, 1179676, 0, 0, 1179677, 0, 0, 1179678, 0, 0, 1179679, 0, 0, 1179680, 0, 0, 1179681, 0, 0, 1179682, 0, 0, 1179683, 0, 0, 1179684, 0, 0, 1179685, 0, 0, 1179686, 0, 0, 1179687, 0, 0, 1179688, 0, 0, 1179689, 0, 0, 1179690, 0, 0, 1179691, 0, 0, 1179692, 0, 0, 1179693, 0, 0, 1179694, 0, 0, 1179695, 0, 0, 1179696, 0, 0, 1179697, 0, 0, 1179698, 0, 0, 1179699, 0, 0, 1179700, 0, 0, 1179701, 0, 0, 1310690, 2, 0, 1310701, 0, 0, 1310702, 0, 0, 1310703, 0, 0, 1310704, 0, 0, 1310705, 0, 0, 1310706, 0, 0, 1310707, 0, 0, 1310708, 0, 0, 1310709, 0, 0, 1310710, 0, 0, 1310711, 0, 0, 1310712, 0, 0, 1310713, 0, 0, 1310714, 0, 0, 1310715, 0, 0, 1310716, 0, 0, 1310717, 0, 0, 1310718, 0, 0, 1310719, 0, 0, 1245184, 0, 0, 1245185, 0, 0, 1245186, 0, 0, 1245187, 0, 0, 1245188, 0, 0, 1245189, 0, 0, 1245190, 0, 0, 1245191, 0, 0, 1245192, 0, 0, 1245193, 0, 0, 1245194, 0, 0, 1245195, 0, 0, 1245196, 0, 0, 1245197, 0, 0, 1245198, 0, 0, 1245199, 0, 0, 1245200, 0, 0, 1245201, 0, 0, 1245202, 0, 0, 1245203, 0, 0, 1245204, 0, 0, 1245205, 0, 0, 1245206, 0, 0, 1245207, 0, 0, 1245208, 0, 0, 1245209, 0, 0, 1245210, 0, 0, 1245211, 0, 0, 1245212, 0, 0, 1245213, 0, 0, 1245214, 0, 0, 1245215, 0, 0, 1245216, 0, 0, 1245217, 0, 0, 1245218, 0, 0, 1245219, 0, 0, 1245220, 0, 0, 1245221, 0, 0, 1245222, 0, 0, 1245223, 0, 0, 1245224, 0, 0, 1245225, 0, 0, 1245226, 0, 0, 1245227, 0, 0, 1245228, 0, 0, 1245229, 0, 0, 1245230, 0, 0, 1245231, 0, 0, 1245232, 0, 0, 1245233, 0, 0, 1245234, 0, 0, 1245235, 0, 0, 1245236, 0, 0, 1376238, 0, 0, 1376239, 0, 0, 1376240, 0, 0, 1376241, 0, 0, 1376242, 0, 0, 1376243, 0, 0, 1376244, 0, 0, 1376245, 0, 0, 1376246, 0, 0, 1376247, 0, 0, 1376248, 0, 0, 1376249, 0, 0, 1376250, 0, 0, 1376251, 0, 0, 1376252, 0, 0, 1376253, 0, 0, 1376254, 0, 0, 1376255, 0, 0, 1310720, 0, 0, 1310721, 0, 0, 1310722, 0, 0, 1310723, 0, 0, 1310724, 0, 0, 1310725, 0, 0, 1310726, 0, 0, 1310727, 0, 0, 1310728, 0, 0, 1310729, 0, 0, 1310730, 0, 0, 1310731, 0, 0, 1310732, 0, 0, 1310733, 0, 0, 1310734, 0, 0, 1310735, 0, 0, 1310736, 0, 0, 1310737, 0, 0, 1310738, 0, 0, 1310739, 0, 0, 1310740, 0, 0, 1310741, 0, 0, 1310742, 0, 0, 1310743, 0, 0, 1310744, 0, 0, 1310745, 0, 0, 1310746, 0, 0, 1310747, 0, 0, 1310748, 0, 0, 1310749, 0, 0, 1310750, 0, 0, 1310751, 0, 0, 1310752, 0, 0, 1310753, 0, 0, 1310754, 0, 0, 1310755, 0, 0, 1310756, 0, 0, 1310757, 0, 0, 1310758, 0, 0, 1310759, 0, 0, 1310760, 0, 0, 1310761, 0, 0, 1310762, 0, 0, 1310763, 0, 0, 1310764, 0, 0, 1310765, 0, 0, 1310766, 0, 0, 1310767, 0, 0, 1310768, 0, 0, 1310769, 0, 0, 1310770, 0, 0, 1310771, 0, 0, 1310772, 0, 0, 1441775, 0, 0, 1441776, 0, 0, 1441777, 0, 0, 1441778, 0, 0, 1441779, 0, 0, 1441780, 0, 0, 1441781, 0, 0, 1441782, 0, 0, 1441783, 0, 0, 1441784, 0, 0, 1441785, 0, 0, 1441786, 0, 0, 1441787, 0, 0, 1441788, 0, 0, 1441789, 0, 0, 1441790, 0, 0, 1441791, 0, 0, 1376256, 0, 0, 1376257, 0, 0, 1376258, 0, 0, 1376259, 0, 0, 1376260, 0, 0, 1376261, 0, 0, 1376262, 0, 0, 1376263, 0, 0, 1376264, 0, 0, 1376265, 0, 0, 1376266, 0, 0, 1376267, 0, 0, 1376268, 0, 0, 1376269, 0, 0, 1376270, 0, 0, 1376271, 0, 0, 1376272, 0, 0, 1376273, 0, 0, 1376274, 0, 0, 1376275, 0, 0, 1376276, 0, 0, 1376277, 0, 0, 1376278, 0, 0, 1376279, 0, 0, 1376280, 0, 0, 1376281, 0, 0, 1376282, 0, 0, 1376283, 0, 0, 1376284, 0, 0, 1376285, 0, 0, 1376286, 0, 0, 1376287, 0, 0, 1376288, 0, 0, 1376289, 0, 0, 1376290, 0, 0, 1376291, 0, 0, 1376292, 0, 0, 1376293, 0, 0, 1376294, 0, 0, 1376295, 0, 0, 1376296, 0, 0, 1376297, 0, 0, 1376298, 0, 0, 1376299, 0, 0, 1376300, 0, 0, 1376301, 0, 0, 1376302, 0, 0, 1376303, 0, 0, 1376304, 0, 0, 1376305, 0, 0, 1376306, 0, 0, 1376307, 0, 0, 1376308, 0, 0, 1507312, 0, 0, 1507313, 0, 0, 1507314, 0, 0, 1507315, 0, 0, 1507316, 0, 0, 1507317, 0, 0, 1507318, 0, 0, 1507319, 0, 0, 1507320, 0, 0, 1507321, 0, 0, 1507322, 0, 0, 1507323, 0, 0, 1507324, 0, 0, 1507325, 0, 0, 1507326, 0, 0, 1507327, 0, 0, 1441792, 0, 0, 1441793, 0, 0, 1441794, 0, 0, 1441795, 0, 0, 1441796, 0, 0, 1441797, 0, 0, 1441798, 0, 0, 1441799, 0, 0, 1441800, 0, 0, 1441801, 0, 0, 1441802, 0, 0, 1441803, 0, 0, 1441804, 0, 0, 1441805, 0, 0, 1441806, 0, 0, 1441807, 0, 0, 1441808, 0, 0, 1441809, 0, 0, 1441810, 0, 0, 1441811, 0, 0, 1441812, 0, 0, 1441813, 0, 0, 1441814, 0, 0, 1441815, 0, 0, 1441816, 0, 0, 1441817, 0, 0, 1441818, 0, 0, 1441819, 0, 0, 1441820, 0, 0, 1441821, 0, 0, 1441822, 0, 0, 1441823, 0, 0, 1441824, 0, 0, 1441825, 0, 0, 1441826, 0, 0, 1441827, 0, 0, 1441828, 0, 0, 1441829, 0, 0, 1441830, 0, 0, 1441831, 0, 0, 1441832, 0, 0, 1441833, 0, 0, 1441834, 0, 0, 1441835, 0, 0, 1441836, 0, 0, 1441837, 0, 0, 1441838, 0, 0, 1441839, 0, 0, 1441840, 0, 0, 1441841, 0, 0, 1441842, 0, 0, 1441843, 0, 0, 1572849, 0, 0, 1572850, 0, 0, 1572851, 0, 0, 1572852, 0, 0, 1572853, 0, 0, 1572854, 0, 0, 1572855, 0, 0, 1572856, 0, 0, 1572857, 0, 0, 1572858, 0, 0, 1572859, 0, 0, 1572860, 0, 0, 1572861, 0, 0, 1572862, 0, 0, 1572863, 0, 0, 1507328, 0, 0, 1507329, 0, 0, 1507330, 0, 0, 1507331, 0, 0, 1507332, 0, 0, 1507333, 0, 0, 1507334, 0, 0, 1507335, 0, 0, 1507336, 0, 0, 1507337, 0, 0, 1507338, 0, 0, 1507339, 0, 0, 1507340, 0, 0, 1507341, 0, 0, 1507342, 0, 0, 1507343, 0, 0, 1507344, 0, 0, 1507345, 0, 0, 1507346, 0, 0, 1507347, 0, 0, 1507348, 0, 0, 1507349, 0, 0, 1507350, 0, 0, 1507351, 0, 0, 1507352, 0, 0, 1507353, 0, 0, 1507354, 0, 0, 1507355, 0, 0, 1507356, 0, 0, 1507357, 0, 0, 1507358, 0, 0, 1507359, 0, 0, 1507360, 0, 0, 1507361, 0, 0, 1507362, 0, 0, 1507363, 0, 0, 1507364, 0, 0, 1507365, 0, 0, 1507366, 0, 0, 1507367, 0, 0, 1507368, 0, 0, 1507369, 0, 0, 1507370, 0, 0, 1507371, 0, 0, 1507372, 0, 0, 1507373, 0, 0, 1507374, 0, 0, 1507375, 0, 0, 1507376, 0, 0, 1507377, 0, 0, 1507378, 0, 0, 1507379, 0, 0, 1638385, 0, 0, 1638386, 0, 0, 1638387, 0, 0, 1638388, 0, 0, 1638389, 0, 0, 1638390, 0, 0, 1638391, 0, 0, 1638392, 0, 0, 1638393, 0, 0, 1638394, 0, 0, 1638395, 0, 0, 1638396, 0, 0, 1638397, 0, 0, 1638398, 0, 0, 1638399, 0, 0, 1572864, 0, 0, 1572865, 0, 0, 1572866, 0, 0, 1572867, 0, 0, 1572868, 0, 0, 1572869, 0, 0, 1572870, 0, 0, 1572871, 0, 0, 1572872, 0, 0, 1572873, 0, 0, 1572874, 0, 0, 1572875, 0, 0, 1572876, 0, 0, 1572877, 0, 0, 1572878, 0, 0, 1572879, 0, 0, 1572880, 0, 0, 1572881, 0, 0, 1572882, 0, 0, 1572883, 0, 0, 1572884, 0, 0, 1572885, 0, 0, 1572886, 0, 0, 1572887, 0, 0, 1572888, 0, 0, 1572889, 0, 0, 1572890, 0, 0, 1572891, 0, 0, 1572892, 0, 0, 1572893, 0, 0, 1572894, 0, 0, 1572895, 0, 0, 1572896, 0, 0, 1572897, 0, 0, 1572898, 0, 0, 1572899, 0, 0, 1572900, 0, 0, 1572901, 0, 0, 1572902, 0, 0, 1572903, 0, 0, 1572904, 0, 0, 1572905, 0, 0, 1572906, 0, 0, 1572907, 0, 0, 1572908, 0, 0, 1572909, 0, 0, 1572910, 0, 0, 1572911, 0, 0, 1572912, 0, 0, 1572913, 0, 0, 1572914, 0, 0, 1703922, 0, 0, 1703923, 0, 0, 1703924, 0, 0, 1703925, 0, 0, 1703926, 0, 0, 1703927, 0, 0, 1703928, 0, 0, 1703929, 0, 0, 1703930, 0, 0, 1703931, 0, 0, 1703932, 0, 0, 1703933, 0, 0, 1703934, 0, 0, 1703935, 0, 0, 1638400, 0, 0, 1638401, 0, 0, 1638402, 0, 0, 1638403, 0, 0, 1638404, 0, 0, 1638405, 0, 0, 1638406, 0, 0, 1638407, 0, 0, 1638408, 0, 0, 1638409, 0, 0, 1638410, 0, 0, 1638411, 0, 0, 1638412, 0, 0, 1638413, 0, 0, 1638414, 0, 0, 1638415, 0, 0, 1638416, 0, 0, 1638417, 0, 0, 1638418, 0, 0, 1638419, 0, 0, 1638420, 0, 0, 1638421, 0, 0, 1638422, 0, 0, 1638423, 0, 0, 1638424, 0, 0, 1638425, 0, 0, 1638426, 0, 0, 1638427, 0, 0, 1638428, 0, 0, 1638429, 0, 0, 1638430, 0, 0, 1638431, 0, 0, 1638432, 0, 0, 1638433, 0, 0, 1638434, 0, 0, 1638435, 0, 0, 1638436, 0, 0, 1638437, 0, 0, 1638438, 0, 0, 1638439, 0, 0, 1638440, 0, 0, 1638441, 0, 0, 1638442, 0, 0, 1638443, 0, 0, 1638444, 0, 0, 1638445, 0, 0, 1638446, 0, 0, 1638447, 0, 0, 1638448, 0, 0, 1638449, 0, 0, 1638450, 0, 0, 1769459, 0, 0, 1769460, 0, 0, 1769461, 0, 0, 1769462, 0, 0, 1769463, 0, 0, 1769464, 0, 0, 1769465, 0, 0, 1769466, 0, 0, 1769467, 0, 0, 1769468, 0, 0, 1769469, 0, 0, 1769470, 0, 0, 1769471, 0, 0, 1703936, 0, 0, 1703937, 0, 0, 1703938, 0, 0, 1703939, 0, 0, 1703940, 0, 0, 1703941, 0, 0, 1703942, 0, 0, 1703943, 0, 0, 1703944, 0, 0, 1703945, 0, 0, 1703946, 0, 0, 1703947, 0, 0, 1703948, 0, 0, 1703949, 0, 0, 1703950, 0, 0, 1703951, 0, 0, 1703952, 0, 0, 1703953, 0, 0, 1703954, 0, 0, 1703955, 0, 0, 1703956, 0, 0, 1703957, 0, 0, 1703958, 0, 0, 1703959, 0, 0, 1703960, 0, 0, 1703961, 0, 0, 1703962, 0, 0, 1703963, 0, 0, 1703964, 0, 0, 1703965, 0, 0, 1703966, 0, 0, 1703967, 0, 0, 1703968, 0, 0, 1703969, 0, 0, 1703970, 0, 0, 1703971, 0, 0, 1703972, 0, 0, 1703973, 0, 0, 1703974, 0, 0, 1703975, 0, 0, 1703976, 0, 0, 1703977, 0, 0, 1703978, 0, 0, 1703979, 0, 0, 1703980, 0, 0, 1703981, 0, 0, 1703982, 0, 0, 1703983, 0, 0, 1703984, 0, 0, 1703985, 0, 0, 1834996, 0, 0, 1834997, 0, 0, 1834998, 0, 0, 1834999, 0, 0, 1835000, 0, 0, 1835001, 0, 0, 1835002, 0, 0, 1835003, 0, 0, 1835004, 0, 0, 1835005, 0, 0, 1835006, 0, 0, 1835007, 0, 0, 1769472, 0, 0, 1769473, 0, 0, 1769474, 0, 0, 1769475, 0, 0, 1769476, 0, 0, 1769477, 0, 0, 1769478, 0, 0, 1769479, 0, 0, 1769480, 0, 0, 1769481, 0, 0, 1769482, 0, 0, 1769483, 0, 0, 1769484, 0, 0, 1769485, 0, 0, 1769486, 0, 0, 1769487, 0, 0, 1769488, 0, 0, 1769489, 0, 0, 1769490, 0, 0, 1769491, 0, 0, 1769492, 0, 0, 1769493, 0, 0, 1769494, 0, 0, 1769495, 0, 0, 1769496, 0, 0, 1769497, 0, 0, 1769498, 0, 0, 1769499, 0, 0, 1769500, 0, 0, 1769501, 0, 0, 1769502, 0, 0, 1769503, 0, 0, 1769504, 0, 0, 1769505, 0, 0, 1769506, 0, 0, 1769507, 0, 0, 1769508, 0, 0, 1769509, 0, 0, 1769510, 0, 0, 1769511, 0, 0, 1769512, 0, 0, 1769513, 0, 0, 1769514, 0, 0, 1769515, 0, 0, 1769516, 0, 0, 1769517, 0, 0, 1769518, 0, 0, 1769519, 0, 0, 1769520, 0, 0, 1769521, 0, 0, 1900533, 0, 0, 1900534, 0, 0, 1900535, 0, 0, 1900536, 0, 0, 1900537, 0, 0, 1900538, 0, 0, 1900539, 0, 0, 1900540, 0, 0, 1900541, 0, 0, 1900542, 0, 0, 1900543, 0, 0, 1835008, 0, 0, 1835009, 0, 0, 1835010, 0, 0, 1835011, 0, 0, 1835012, 0, 0, 1835013, 0, 0, 1835014, 0, 0, 1835015, 0, 0, 1835016, 0, 0, 1835017, 0, 0, 1835018, 0, 0, 1835019, 0, 0, 1835020, 0, 0, 1835021, 0, 0, 1835022, 0, 0, 1835023, 0, 0, 1835024, 0, 0, 1835025, 0, 0, 1835026, 0, 0, 1835027, 0, 0, 1835028, 0, 0, 1835029, 0, 0, 1835030, 0, 0, 1835031, 0, 0, 1835032, 0, 0, 1835033, 0, 0, 1835034, 0, 0, 1835035, 0, 0, 1835036, 0, 0, 1835037, 0, 0, 1835038, 0, 0, 1835039, 0, 0, 1835040, 0, 0, 1835041, 0, 0, 1835042, 0, 0, 1835043, 0, 0, 1835044, 0, 0, 1835045, 0, 0, 1835046, 0, 0, 1835047, 0, 0, 1835048, 0, 0, 1835049, 0, 0, 1835050, 0, 0, 1835051, 0, 0, 1835052, 0, 0, 1835053, 0, 0, 1835054, 0, 0, 1835055, 0, 0, 1835056, 0, 0, 1966070, 0, 0, 1966071, 0, 0, 1966072, 0, 0, 1966073, 0, 0, 1966074, 0, 0, 1966075, 0, 0, 1966076, 0, 0, 1966077, 0, 0, 1966078, 0, 0, 1966079, 0, 0, 1900544, 0, 0, 1900545, 0, 0, 1900546, 0, 0, 1900547, 0, 0, 1900548, 0, 0, 1900549, 0, 0, 1900550, 0, 0, 1900551, 0, 0, 1900552, 0, 0, 1900553, 0, 0, 1900554, 0, 0, 1900555, 0, 0, 1900556, 0, 0, 1900557, 0, 0, 1900558, 0, 0, 1900559, 0, 0, 1900560, 0, 0, 1900561, 0, 0, 1900562, 0, 0, 1900563, 0, 0, 1900564, 0, 0, 1900565, 0, 0, 1900566, 0, 0, 1900567, 0, 0, 1900568, 0, 0, 1900569, 0, 0, 1900570, 0, 0, 1900571, 0, 0, 1900572, 0, 0, 1900573, 0, 0, 1900574, 0, 0, 1900575, 0, 0, 1900576, 0, 0, 1900577, 0, 0, 1900578, 0, 0, 1900579, 0, 0, 1900580, 0, 0, 1900581, 0, 0, 1900582, 0, 0, 1900583, 0, 0, 1900584, 0, 0, 1900585, 0, 0, 1900586, 0, 0, 1900587, 0, 0, 1900588, 0, 0, 1900589, 0, 0, 1900590, 0, 0, 1900591, 0, 0, 1900592, 0, 0, 2031607, 0, 0, 2031608, 0, 0, 2031609, 0, 0, 2031610, 0, 0, 2031611, 0, 0, 2031612, 0, 0, 2031613, 0, 0, 2031614, 0, 0, 2031615, 0, 0, 1966080, 0, 0, 1966081, 0, 0, 1966082, 0, 0, 1966083, 0, 0, 1966084, 0, 0, 1966085, 0, 0, 1966086, 0, 0, 1966087, 0, 0, 1966088, 0, 0, 1966089, 0, 0, 1966090, 0, 0, 1966091, 0, 0, 1966092, 0, 0, 1966093, 0, 0, 1966094, 0, 0, 1966095, 0, 0, 1966096, 0, 0, 1966097, 0, 0, 1966098, 0, 0, 1966099, 0, 0, 1966100, 0, 0, 1966101, 0, 0, 1966102, 0, 0, 1966103, 0, 0, 1966104, 0, 0, 1966105, 0, 0, 1966106, 0, 0, 1966107, 0, 0, 1966108, 0, 0, 1966109, 0, 0, 1966110, 0, 0, 1966111, 0, 0, 1966112, 0, 0, 1966113, 0, 0, 1966114, 0, 0, 1966115, 0, 0, 1966116, 0, 0, 1966117, 0, 0, 1966118, 0, 0, 1966119, 0, 0, 1966120, 0, 0, 1966121, 0, 0, 1966122, 0, 0, 1966123, 0, 0, 1966124, 0, 0, 1966125, 0, 0, 1966126, 0, 0, 1966127, 0, 0, 2097144, 0, 0, 2097145, 0, 0, 2097146, 0, 0, 2097147, 0, 0, 2097148, 0, 0, 2097149, 0, 0, 2097150, 0, 0, 2097151, 0, 0, 2031616, 0, 0, 2031617, 0, 0, 2031618, 0, 0, 2031619, 0, 0, 2031620, 0, 0, 2031621, 0, 0, 2031622, 0, 0, 2031623, 0, 0, 2031624, 0, 0, 2031625, 0, 0, 2031626, 0, 0, 2031627, 0, 0, 2031628, 0, 0, 2031629, 0, 0, 2031630, 0, 0, 2031631, 0, 0, 2031632, 0, 0, 2031633, 0, 0, 2031634, 0, 0, 2031635, 0, 0, 2031636, 0, 0, 2031637, 0, 0, 2031638, 0, 0, 2031639, 0, 0, 2031640, 0, 0, 2031641, 0, 0, 2031642, 0, 0, 2031643, 0, 0, 2031644, 0, 0, 2031645, 0, 0, 2031646, 0, 0, 2031647, 0, 0, 2031648, 0, 0, 2031649, 0, 0, 2031650, 0, 0, 2031651, 0, 0, 2031652, 0, 0, 2031653, 0, 0, 2031654, 0, 0, 2031655, 0, 0, 2031656, 0, 0, 2031657, 0, 0, 2031658, 0, 0, 2031659, 0, 0, 2031660, 0, 0, 2031661, 0, 0, 2031662, 0, 0, 2031663, 0, 0, 2162681, 0, 0, 2162682, 0, 0, 2162683, 0, 0, 2162684, 0, 0, 2162685, 0, 0, 2162686, 0, 0, 2162687, 0, 0, 2097152, 0, 0, 2097153, 0, 0, 2097154, 0, 0, 2097155, 0, 0, 2097156, 0, 0, 2097157, 0, 0, 2097158, 0, 0, 2097159, 0, 0, 2097160, 0, 0, 2097161, 0, 0, 2097162, 0, 0, 2097163, 0, 0, 2097164, 0, 0, 2097165, 0, 0, 2097166, 0, 0, 2097167, 0, 0, 2097168, 0, 0, 2097169, 0, 0, 2097170, 0, 0, 2097171, 0, 0, 2097172, 0, 0, 2097173, 0, 0, 2097174, 0, 0, 2097175, 0, 0, 2097176, 0, 0, 2097177, 0, 0, 2097178, 0, 0, 2097179, 0, 0, 2097180, 0, 0, 2097181, 0, 0, 2097182, 0, 0, 2097183, 0, 0, 2097184, 0, 0, 2097185, 0, 0, 2097186, 0, 0, 2097187, 0, 0, 2097188, 0, 0, 2097189, 0, 0, 2097190, 0, 0, 2097191, 0, 0, 2097192, 0, 0, 2097193, 0, 0, 2097194, 0, 0, 2097195, 0, 0, 2097196, 0, 0, 2097197, 0, 0, 2097198, 0, 0, 2097199, 0, 0, 2228218, 0, 0, 2228219, 0, 0, 2228220, 0, 0, 2228221, 0, 0, 2228222, 0, 0, 2228223, 0, 0, 2162688, 0, 0, 2162689, 0, 0, 2162690, 0, 0, 2162691, 0, 0, 2162692, 0, 0, 2162693, 0, 0, 2162694, 0, 0, 2162695, 0, 0, 2162696, 0, 0, 2162697, 0, 0, 2162698, 0, 0, 2162699, 0, 0, 2162700, 0, 0, 2162701, 0, 0, 2162702, 0, 0, 2162703, 0, 0, 2162704, 0, 0, 2162705, 0, 0, 2162706, 0, 0, 2162707, 0, 0, 2162708, 0, 0, 2162709, 0, 0, 2162710, 0, 0, 2162711, 0, 0, 2162712, 0, 0, 2162713, 0, 0, 2162714, 0, 0, 2162715, 0, 0, 2162716, 0, 0, 2162717, 0, 0, 2162718, 0, 0, 2162719, 0, 0, 2162720, 0, 0, 2162721, 0, 0, 2162722, 0, 0, 2162723, 0, 0, 2162724, 0, 0, 2162725, 0, 0, 2162726, 0, 0, 2162727, 0, 0, 2162728, 0, 0, 2162729, 0, 0, 2162730, 0, 0, 2162731, 0, 0, 2162732, 0, 0, 2162733, 0, 0, 2162734, 0, 0, 2293754, 0, 0, 2293755, 0, 0, 2293756, 0, 0, 2293757, 0, 0, 2293758, 0, 0, 2293759, 0, 0, 2228224, 0, 0, 2228225, 0, 0, 2228226, 0, 0, 2228227, 0, 0, 2228228, 0, 0, 2228229, 0, 0, 2228230, 0, 0, 2228231, 0, 0, 2228232, 0, 0, 2228233, 0, 0, 2228234, 0, 0, 2228235, 0, 0, 2228236, 0, 0, 2228237, 0, 0, 2228238, 0, 0, 2228239, 0, 0, 2228240, 0, 0, 2228241, 0, 0, 2228242, 0, 0, 2228243, 0, 0, 2228244, 0, 0, 2228245, 0, 0, 2228246, 0, 0, 2228247, 0, 0, 2228248, 0, 0, 2228249, 0, 0, 2228250, 0, 0, 2228251, 0, 0, 2228252, 0, 0, 2228253, 0, 0, 2228254, 0, 0, 2228255, 0, 0, 2228256, 0, 0, 2228257, 0, 0, 2228258, 0, 0, 2228259, 0, 0, 2228260, 0, 0, 2228261, 0, 0, 2228262, 0, 0, 2228263, 0, 0, 2228264, 0, 0, 2228265, 0, 0, 2228266, 0, 0, 2228267, 0, 0, 2228268, 0, 0, 2228269, 0, 0, 2228270, 0, 0, 2359291, 0, 0, 2359292, 0, 0, 2359293, 0, 0, 2359294, 0, 0, 2359295, 0, 0, 2293760, 0, 0, 2293761, 0, 0, 2293762, 0, 0, 2293763, 0, 0, 2293764, 0, 0, 2293765, 0, 0, 2293766, 0, 0, 2293767, 0, 0, 2293768, 0, 0, 2293769, 0, 0, 2293770, 0, 0, 2293771, 0, 0, 2293772, 0, 0, 2293773, 0, 0, 2293774, 0, 0, 2293775, 0, 0, 2293776, 0, 0, 2293777, 0, 0, 2293778, 0, 0, 2293779, 0, 0, 2293780, 0, 0, 2293781, 0, 0, 2293782, 0, 0, 2293783, 0, 0, 2293784, 0, 0, 2293785, 0, 0, 2293786, 0, 0, 2293787, 0, 0, 2293788, 0, 0, 2293789, 0, 0, 2293790, 0, 0, 2293791, 0, 0, 2293792, 0, 0, 2293793, 0, 0, 2293794, 0, 0, 2293795, 0, 0, 2293796, 0, 0, 2293797, 0, 0, 2293798, 0, 0, 2293799, 0, 0, 2293800, 0, 0, 2293801, 0, 0, 2293802, 0, 0, 2293803, 0, 0, 2293804, 0, 0, 2293805, 0, 0, 2424828, 0, 0, 2424829, 0, 0, 2424830, 0, 0, 2424831, 0, 0, 2359296, 0, 0, 2359297, 0, 0, 2359298, 0, 0, 2359299, 0, 0, 2359300, 0, 0, 2359301, 0, 0, 2359302, 0, 0, 2359303, 0, 0, 2359304, 0, 0, 2359305, 0, 0, 2359306, 0, 0, 2359307, 0, 0, 2359308, 0, 0, 2359309, 0, 0, 2359310, 0, 0, 2359311, 0, 0, 2359312, 0, 0, 2359313, 0, 0, 2359314, 0, 0, 2359315, 0, 0, 2359316, 0, 0, 2359317, 0, 0, 2359318, 0, 0, 2359319, 0, 0, 2359320, 0, 0, 2359321, 0, 0, 2359322, 0, 0, 2359323, 0, 0, 2359324, 0, 0, 2359325, 0, 0, 2359326, 0, 0, 2359327, 0, 0, 2359328, 0, 0, 2359329, 0, 0, 2359330, 0, 0, 2359331, 0, 0, 2359332, 0, 0, 2359333, 0, 0, 2359334, 0, 0, 2359335, 0, 0, 2359336, 0, 0, 2359337, 0, 0, 2359338, 0, 0, 2359339, 0, 0, 2359340, 0, 0, 2490365, 0, 0, 2490366, 0, 0, 2490367, 0, 0, 2424832, 0, 0, 2424833, 0, 0, 2424834, 0, 0, 2424835, 0, 0, 2424836, 0, 0, 2424837, 0, 0, 2424838, 0, 0, 2424839, 0, 0, 2424840, 0, 0, 2424841, 0, 0, 2424842, 0, 0, 2424843, 0, 0, 2424844, 0, 0, 2424845, 0, 0, 2424846, 0, 0, 2424847, 0, 0, 2424848, 0, 0, 2424849, 0, 0, 2424850, 0, 0, 2424851, 0, 0, 2424852, 0, 0, 2424853, 0, 0, 2424854, 0, 0, 2424855, 0, 0, 2424856, 0, 0, 2424857, 0, 0, 2424858, 0, 0, 2424859, 0, 0, 2424860, 0, 0, 2424861, 0, 0, 2424862, 0, 0, 2424863, 0, 0, 2424864, 0, 0, 2424865, 0, 0, 2424866, 0, 0, 2424867, 0, 0, 2424868, 0, 0, 2424869, 0, 0, 2424870, 0, 0, 2424871, 0, 0, 2424872, 0, 0, 2424873, 0, 0, 2424874, 0, 0, 2424875, 0, 0, 2424876, 0, 0, 2555903, 0, 0, 2490368, 0, 0, 2490369, 0, 0, 2490370, 0, 0, 2490371, 0, 0, 2490372, 0, 0, 2490373, 0, 0, 2490374, 0, 0, 2490375, 0, 0, 2490376, 0, 0, 2490377, 0, 0, 2490378, 0, 0, 2490379, 0, 0, 2490380, 0, 0, 2490381, 0, 0, 2490382, 0, 0, 2490383, 0, 0, 2490384, 0, 0, 2490385, 0, 0, 2490386, 0, 0, 2490387, 0, 0, 2490388, 0, 0, 2490389, 0, 0, 2490390, 0, 0, 2490391, 0, 0, 2490392, 0, 0, 2490393, 0, 0, 2490394, 0, 0, 2490395, 0, 0, 2490396, 0, 0, 2490397, 0, 0, 2490398, 0, 0, 2490399, 0, 0, 2490400, 0, 0, 2490401, 0, 0, 2490402, 0, 0, 2490403, 0, 0, 2490404, 0, 0, 2490405, 0, 0, 2490406, 0, 0, 2490407, 0, 0, 2490408, 0, 0, 2490409, 0, 0, 2490410, 0, 0, 2490411, 0, 0, 2555904, 0, 0, 2555905, 0, 0, 2555906, 0, 0, 2555907, 0, 0, 2555908, 0, 0, 2555909, 0, 0, 2555910, 0, 0, 2555911, 0, 0, 2555912, 0, 0, 2555913, 0, 0, 2555914, 0, 0, 2555915, 0, 0, 2555916, 0, 0, 2555917, 0, 0, 2555918, 0, 0, 2555919, 0, 0, 2555920, 0, 0, 2555921, 0, 0, 2555922, 0, 0, 2555923, 0, 0, 2555924, 0, 0, 2555925, 0, 0, 2555926, 0, 0, 2555927, 0, 0, 2555928, 0, 0, 2555929, 0, 0, 2555930, 0, 0, 2555931, 0, 0, 2555932, 0, 0, 2555933, 0, 0, 2555934, 0, 0, 2555935, 0, 0, 2555936, 0, 0, 2555937, 0, 0, 2555938, 0, 0, 2555939, 0, 0, 2555940, 0, 0, 2555941, 0, 0, 2555942, 0, 0, 2555943, 0, 0, 2555944, 0, 0, 2555945, 0, 0, 2555946, 0, 0, 2555947, 0, 0, 2621441, 0, 0, 2621442, 0, 0, 2621443, 0, 0, 2621444, 0, 0, 2621445, 0, 0, 2621446, 0, 0, 2621447, 0, 0, 2621448, 0, 0, 2621449, 0, 0, 2621450, 0, 0, 2621451, 0, 0, 2621452, 0, 0, 2621453, 0, 0, 2621454, 0, 0, 2621455, 0, 0, 2621456, 0, 0, 2621457, 0, 0, 2621458, 0, 0, 2621459, 0, 0, 2621460, 0, 0, 2621461, 0, 0, 2621462, 0, 0, 2621463, 0, 0, 2621464, 0, 0, 2621465, 0, 0, 2621466, 0, 0, 2621467, 0, 0, 2621468, 0, 0, 2621469, 0, 0, 2621470, 0, 0, 2621471, 0, 0, 2621472, 0, 0, 2621473, 0, 0, 2621474, 0, 0, 2621475, 0, 0, 2621476, 0, 0, 2621477, 0, 0, 2621478, 0, 0, 2621479, 0, 0, 2621480, 0, 0, 2621481, 0, 0, 2621482, 0, 0, 2686979, 0, 0, 2686980, 0, 0, 2686981, 0, 0, 2686982, 0, 0, 2686983, 0, 0, 2686984, 0, 0, 2686985, 0, 0, 2686986, 0, 0, 2686987, 0, 0, 2686988, 0, 0, 2686989, 0, 0, 2686990, 0, 0, 2686991, 0, 0, 2686992, 0, 0, 2686993, 0, 0, 2686994, 0, 0, 2686995, 0, 0, 2686996, 0, 0, 2686997, 0, 0, 2686998, 0, 0, 2686999, 0, 0, 2687000, 0, 0, 2687001, 0, 0, 2687002, 0, 0, 2687003, 0, 0, 2687004, 0, 0, 2687005, 0, 0, 2687006, 0, 0, 2687007, 0, 0, 2687008, 0, 0, 2687009, 0, 0, 2687010, 0, 0, 2687011, 0, 0, 2687012, 0, 0, 2687013, 0, 0, 2687014, 0, 0, 2687015, 0, 0, 2687016, 0, 0, 2687017, 0, 0, 2687018, 0, 0, 2752516, 0, 0, 2752517, 0, 0, 2752518, 0, 0, 2752519, 0, 0, 2752520, 0, 0, 2752521, 0, 0, 2752522, 0, 0, 2752523, 0, 0, 2752524, 0, 0, 2752525, 0, 0, 2752526, 0, 0, 2752527, 0, 0, 2752528, 0, 0, 2752529, 0, 0, 2752530, 0, 0, 2752531, 0, 0, 2752532, 0, 0, 2752533, 0, 0, 2752534, 0, 0, 2752535, 0, 0, 2752536, 0, 0, 2752537, 0, 0, 2752538, 0, 0, 2752539, 0, 0, 2752540, 0, 0, 2752541, 0, 0, 2752542, 0, 0, 2752543, 0, 0, 2752544, 0, 0, 2752545, 0, 0, 2752546, 0, 0, 2752547, 0, 0, 2752548, 0, 0, 2752549, 0, 0, 2752550, 0, 0, 2752551, 0, 0, 2752552, 0, 0, 2752553, 0, 0, 2818053, 0, 0, 2818054, 0, 0, 2818055, 0, 0, 2818056, 0, 0, 2818057, 0, 0, 2818058, 0, 0, 2818059, 0, 0, 2818060, 0, 0, 2818061, 0, 0, 2818062, 0, 0, 2818063, 0, 0, 2818064, 0, 0, 2818065, 0, 0, 2818066, 0, 0, 2818067, 0, 0, 2818068, 0, 0, 2818069, 0, 0, 2818070, 0, 0, 2818071, 0, 0, 2818072, 0, 0, 2818073, 0, 0, 2818074, 0, 0, 2818075, 0, 0, 2818076, 0, 0, 2818077, 0, 0, 2818078, 0, 0, 2818079, 0, 0, 2818080, 0, 0, 2818081, 0, 0, 2818082, 0, 0, 2818083, 0, 0, 2818084, 0, 0, 2818085, 0, 0, 2818086, 0, 0, 2818087, 0, 0, 2818088, 0, 0, 2883591, 0, 0, 2883592, 0, 0, 2883593, 0, 0, 2883594, 0, 0, 2883595, 0, 0, 2883596, 0, 0, 2883597, 0, 0, 2883598, 0, 0, 2883599, 0, 0, 2883600, 0, 0, 2883601, 0, 0, 2883602, 0, 0, 2883603, 0, 0, 2883604, 0, 0, 2883605, 0, 0, 2883606, 0, 0, 2883607, 0, 0, 2883608, 0, 0, 2883609, 0, 0, 2883610, 0, 0, 2883611, 0, 0, 2883612, 0, 0, 2883613, 0, 0, 2883614, 0, 0, 2883615, 0, 0, 2883616, 0, 0, 2883617, 0, 0, 2883618, 0, 0, 2883619, 0, 0, 2883620, 0, 0, 2883621, 0, 0, 2883622, 0, 0, 2949128, 0, 0, 2949129, 0, 0, 2949130, 0, 0, 2949131, 0, 0, 2949132, 0, 0, 2949133, 0, 0, 2949134, 0, 0, 2949135, 0, 0, 2949136, 0, 0, 2949137, 0, 0, 2949138, 0, 0, 2949139, 0, 0, 2949140, 0, 0, 2949141, 0, 0, 2949142, 0, 0, 2949143, 0, 0, 2949144, 0, 0, 2949145, 0, 0, 2949146, 0, 0, 2949147, 0, 0, 2949148, 0, 0, 2949149, 0, 0, 2949150, 0, 0, 2949151, 0, 0, 2949152, 0, 0, 2949153, 0, 0, 2949154, 0, 0, 2949155, 0, 0, 2949156, 0, 0, 2949157, 0, 0, 3014665, 0, 0, 3014666, 0, 0, 3014667, 0, 0, 3014668, 0, 0, 3014669, 0, 0, 3014670, 0, 0, 3014671, 0, 0, 3014672, 0, 0, 3014673, 0, 0, 3014674, 0, 0, 3014675, 0, 0, 3014676, 0, 0, 3014677, 0, 0, 3014678, 0, 0, 3014679, 0, 0, 3014680, 0, 0, 3014681, 0, 0, 3014682, 0, 0, 3014683, 0, 0, 3014684, 0, 0, 3014685, 0, 0, 3014686, 0, 0, 3014687, 0, 0, 3014688, 0, 0, 3014689, 0, 0, 3014690, 0, 0, 3014691, 0, 0, 3014692, 0, 0, 3014693, 0, 0, 3080202, 0, 0, 3080203, 0, 0, 3080204, 0, 0, 3080205, 0, 0, 3080206, 0, 0, 3080207, 0, 0, 3080208, 0, 0, 3080209, 0, 0, 3080210, 0, 0, 3080211, 0, 0, 3080212, 0, 0, 3080213, 0, 0, 3080214, 0, 0, 3080215, 0, 0, 3080216, 0, 0, 3080217, 0, 0, 3080218, 0, 0, 3080219, 0, 0, 3080220, 0, 0, 3080221, 0, 0, 3080222, 0, 0, 3080223, 0, 0, 3080224, 0, 0, 3080225, 0, 0, 3080226, 0, 0, 3080227, 0, 0, 3080228, 0, 0, 3145739, 0, 0, 3145740, 0, 0, 3145741, 0, 0, 3145742, 0, 0, 3145743, 0, 0, 3145744, 0, 0, 3145745, 0, 0, 3145746, 0, 0, 3145747, 0, 0, 3145748, 0, 0, 3145749, 0, 0, 3145750, 0, 0, 3145751, 0, 0, 3145752, 0, 0, 3145753, 0, 0, 3145754, 0, 0, 3145755, 0, 0, 3145756, 0, 0, 3145757, 0, 0, 3145758, 0, 0, 3145759, 0, 0, 3145760, 0, 0, 3145761, 0, 0, 3145762, 0, 0, 3145763, 0, 0, 3211276, 0, 0, 3211277, 0, 0, 3211278, 0, 0, 3211279, 0, 0, 3211280, 0, 0, 3211281, 0, 0, 3211282, 0, 0, 3211283, 0, 0, 3211284, 0, 0, 3211285, 0, 0, 3211286, 0, 0, 3211287, 0, 0, 3211288, 0, 0, 3211289, 0, 0, 3211290, 0, 0, 3211291, 0, 0, 3211292, 0, 0, 3211293, 0, 0, 3211294, 0, 0, 3211295, 0, 0, 3211296, 0, 0, 3211297, 0, 0, 3211298, 0, 0, 3276813, 0, 0, 3276814, 0, 0, 3276815, 0, 0, 3276816, 0, 0, 3276817, 0, 0, 3276818, 0, 0, 3276819, 0, 0, 3276820, 0, 0, 3276821, 0, 0, 3276822, 0, 0, 3276823, 0, 0, 3276824, 0, 0, 3276825, 0, 0, 3276826, 0, 0, 3276827, 0, 0, 3276828, 0, 0, 3276829, 0, 0, 3276830, 0, 0, 3276831, 0, 0, 3276832, 0, 0, 3342351, 0, 0, 3342352, 0, 0, 3342353, 0, 0, 3342354, 0, 0, 3342355, 0, 0, 3342356, 0, 0, 3342357, 0, 0, 3342358, 0, 0, 3342359, 0, 0, 3342360, 0, 0, 3342361, 0, 0, 3342362, 0, 0, 3342363, 0, 0, 3342364, 0, 0, 3342365, 0, 0, 3342366, 0, 0, 3342367, 0, 0, 3407888, 0, 0, 3407889, 0, 0, 3407890, 0, 0, 3407891, 0, 0, 3407892, 0, 0, 3407893, 0, 0, 3407894, 0, 0, 3407895, 0, 0, 3407896, 0, 0, 3407897, 0, 0, 3407898, 0, 0, 3407899, 0, 0, 3407900, 0, 0, 3407901, 0, 0, 3473427, 0, 0, 3473428, 0, 0, 3473429, 0, 0, 3473430, 0, 0, 3473431, 0, 0, 3473432, 0, 0, 3473433, 0, 0, 3473434, 0, 0 ) diff --git a/game/test_iso_tileset/new_tileset.tres b/game/test_iso_tileset/new_tileset.tres new file mode 100644 index 0000000..04a3b1c --- /dev/null +++ b/game/test_iso_tileset/new_tileset.tres @@ -0,0 +1,47 @@ +[gd_resource type="TileSet" load_steps=2 format=2] + +[ext_resource path="res://test_iso_tileset/test_tiles.png" type="Texture" id=1] + +[resource] +0/name = "t3" +0/texture = ExtResource( 1 ) +0/tex_offset = Vector2( 0, 0 ) +0/modulate = Color( 1, 1, 1, 1 ) +0/region = Rect2( 106, 15, 52, 27 ) +0/tile_mode = 0 +0/occluder_offset = Vector2( 0, 0 ) +0/navigation_offset = Vector2( 0, 0 ) +0/shape_offset = Vector2( 0, 0 ) +0/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) +0/shape_one_way = false +0/shape_one_way_margin = 0.0 +0/shapes = [ ] +0/z_index = 0 +1/name = "t2" +1/texture = ExtResource( 1 ) +1/tex_offset = Vector2( 0, 0 ) +1/modulate = Color( 1, 1, 1, 1 ) +1/region = Rect2( 47, 8, 44, 23 ) +1/tile_mode = 0 +1/occluder_offset = Vector2( 0, 0 ) +1/navigation_offset = Vector2( 0, 0 ) +1/shape_offset = Vector2( 0, 0 ) +1/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) +1/shape_one_way = false +1/shape_one_way_margin = 0.0 +1/shapes = [ ] +1/z_index = 0 +2/name = "t1" +2/texture = ExtResource( 1 ) +2/tex_offset = Vector2( 0, 0 ) +2/modulate = Color( 1, 1, 1, 1 ) +2/region = Rect2( 1, 2, 32, 17 ) +2/tile_mode = 0 +2/occluder_offset = Vector2( 0, 0 ) +2/navigation_offset = Vector2( 0, 0 ) +2/shape_offset = Vector2( 0, 0 ) +2/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) +2/shape_one_way = false +2/shape_one_way_margin = 0.0 +2/shapes = [ ] +2/z_index = 0 diff --git a/game/test_iso_tileset/test_tiles.png b/game/test_iso_tileset/test_tiles.png new file mode 100644 index 0000000000000000000000000000000000000000..d94192918012307a12050d8cdc75fb0806e3aa42 GIT binary patch literal 1963 zcmeHI{Wp|(6#qVt!HmezmX~3Wq*`Lnq&2EB^fKhN(IPLIUZf}yW%BxFJp2 z008tnJ$BFmfYcBISS_^)J9YQSKVAZz<_;bT%%lKlM|$pX+snK$KIjuWu*)pxL;U3# zEzN7;nLw~D@j;?A>_?+9T$rV7M)#F__$J-Ge;IPfAJNjNpg!N*dsRVeqKQZ9C_FZoMq|0Q8JjK{okPn*6R7#~xrBqbA zwr#ch)_%9+@)4$Sik>9-Yjvw)u8g%BL#yLUwrKX{^Ponj`N_64rjwR?+}6RbNgB;> z_aK(SHw2_D3H7SxQ?YrSe^M2(T8u7DAj zUhaSEyS&&;IZZ6gsOW)5}?D%aya!z=BX{&?UsNukFPhEJjC94M_)8JTH8JAhlv%p{9aM=*JJ~Ch z6EBHu-_cvBD`%4nDCrDEI2={T(ytu8R(V;)wm~`TkrR>UD=d*tV6tq1P5rT z`a`T5iDwM@1Z5ij9dm@@=lxF&xGdRfxzc{*oTRrVA|o7AA3qNgdqv#D&e9_7(b(kA zivB+QjNbGE8&88^KN2)nRj1=Pl1yE%Fh`wqahX=4iV?Wy>Z8nKT~~NShq(t$(qru# z+FS8hF2#v}2!u&b1I1HCeKSIN)C3tr3$Kpwnuf;g&eql_n&^3?d8e5YQ(+$D291TC zWSGWGW=9-)6Tt4LVbnSlbhBGzoV6Q4iB;&e{J1<$k&oYY;)@4(XT!U;n?Xsdc%X;; zy1ato>TU^d!CN2#gLGR-|Mk+|yzCfQVGV+!#RHDd0Vj6Oub0rOY1FCa2d)#MSo2xWYo*~0GS>G0~AiR_881Not zZtS-Oyp7u8o~ToL;HgEI6TpsOK^6{RRsd|EJ;?W~nEq5<1=lw$?BrUf!uq%S>;P>+ zm*Vj#89Y~Binc<=t5zXDagru_ZQrR+vZkD`Q8P3876(;D)q?i~)P_W%k)`A+94yOkqN?U52qKfn<1HWvu=% zt|9z>ghucX%28aUx3vF5qy<7uo?&dBk6e8*!Haot%Y}Md(b>vzObb8vNJ?Q`LX(kY zu}xUzpk8oChQn5eOD=XF=)3u1+)iWbgSm{txB+WGy1g;7oHDrz$Hh$KR;+{_vl0%3SObklhtfbC*Idn=hQI1;8S=0K zM(>UMOrdoXxwb*6K#d>G1J+O*^AwJ&Dd!jL0{aiFM1Fwdauh?yN`S7UjTvGCtQ(Dx zUhMbW*@_{u3xqIEM!SNWL^Xf`5A%H$YXROHSQZ1S refresh_rate): + last_refresh -= refresh_rate + + for ch in viewport.get_children(): + ch.queue_free() + + for ch in get_children(): + if ch.name == "Preview": + continue + + var n = ch.duplicate() + viewport.add_child(n) + + if Engine.editor_hint and DEBUG_TREE: + n.owner = get_tree().edited_scene_root + + if get_children().has(preview_node) and get_child(get_child_count() - 1) != preview_node: + move_child(preview_node, get_child_count() - 1) + + #queued_save = true + + +func save() -> void: + #queued_save = false + + if texture == null: + #print("LayeredTextureMaker: Set a target texture!") + return + + #texture.set_data(viewport.get_texture().get_data()) + viewport.get_texture().get_data().save_png(texture.resource_path) +# texture.property_list_changed_notify() + +func preview_refresh() -> void: + for ch in viewport.get_children(): + ch.queue_free() + + for ch in get_children(): + if ch.name == "Preview": + continue + + viewport.add_child(ch.duplicate()) + +func set_tex_size(size : Vector2) -> void: + texture_size = size + + create_preview() + +func save_set(val): + if val: + save() diff --git a/game/texture_tools/test/ToolTest.tscn b/game/texture_tools/test/ToolTest.tscn new file mode 100644 index 0000000..ee86078 --- /dev/null +++ b/game/texture_tools/test/ToolTest.tscn @@ -0,0 +1,21 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://texture_tools/LayeredTextureMaker.gd" type="Script" id=1] +[ext_resource path="res://icon.png" type="Texture" id=2] +[ext_resource path="res://texture_tools/test/new_packerimageresource.tres" type="Texture" id=3] + +[node name="LayeredTextureMaker" type="Node2D"] +script = ExtResource( 1 ) +__meta__ = { +"_edit_lock_": true +} +texture = ExtResource( 3 ) +refresh_rate = 2.0 + +[node name="Sprite" type="Sprite" parent="."] +modulate = Color( 0.780392, 0.478431, 0.478431, 1 ) +self_modulate = Color( 0.454902, 1, 0.796078, 1 ) +position = Vector2( 8.29768, 10.7308 ) +rotation = 0.724902 +scale = Vector2( 0.152605, 0.115388 ) +texture = ExtResource( 2 ) diff --git a/game/texture_tools/test/new_packerimageresource.tres b/game/texture_tools/test/new_packerimageresource.tres new file mode 100644 index 0000000..876b3d9 --- /dev/null +++ b/game/texture_tools/test/new_packerimageresource.tres @@ -0,0 +1,13 @@ +[gd_resource type="PackerImageResource" load_steps=2 format=2] + +[sub_resource type="Image" id=1] +data = { +"data": PoolByteArray( 73, 101, 123, 70, 79, 86, 75, 75, 75, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 80, 135, 173, 73, 111, 137, 73, 77, 79, 75, 75, 76, 76, 76, 76, 76, 76, 76, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 81, 139, 180, 81, 135, 174, 72, 97, 115, 74, 75, 76, 76, 76, 76, 75, 75, 75, 74, 74, 74, 74, 75, 75, 71, 77, 82, 72, 75, 78, 74, 75, 75, 75, 75, 75, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 81, 140, 181, 81, 139, 180, 80, 125, 157, 73, 93, 106, 74, 77, 79, 72, 74, 76, 73, 75, 76, 67, 79, 87, 69, 109, 136, 73, 109, 134, 70, 88, 100, 72, 76, 78, 75, 75, 75, 76, 76, 76, 76, 76, 76, 76, 76, 76, 81, 140, 181, 81, 140, 181, 81, 138, 179, 79, 132, 168, 74, 120, 152, 73, 103, 124, 70, 92, 108, 72, 106, 130, 73, 125, 161, 72, 135, 176, 74, 134, 174, 75, 113, 139, 70, 81, 89, 74, 74, 74, 76, 76, 76, 76, 76, 76, 81, 140, 181, 81, 140, 181, 81, 141, 181, 78, 139, 182, 75, 136, 185, 72, 135, 187, 73, 133, 177, 74, 131, 170, 73, 136, 179, 74, 141, 187, 74, 141, 187, 74, 138, 182, 75, 124, 158, 71, 85, 94, 74, 74, 74, 76, 76, 76, 82, 142, 182, 81, 141, 181, 81, 140, 182, 75, 139, 187, 73, 138, 190, 72, 138, 191, 72, 137, 190, 73, 140, 188, 74, 141, 188, 74, 142, 189, 74, 142, 189, 74, 141, 188, 74, 134, 176, 73, 105, 127, 72, 75, 76, 75, 75, 75, 120, 169, 200, 91, 146, 185, 110, 136, 158, 89, 135, 174, 72, 138, 191, 72, 138, 191, 72, 138, 191, 72, 138, 191, 73, 140, 190, 74, 142, 189, 74, 142, 189, 74, 142, 189, 74, 139, 184, 67, 96, 115, 73, 74, 75, 76, 76, 76, 206, 224, 232, 189, 208, 221, 175, 183, 189, 132, 139, 151, 93, 134, 171, 72, 138, 191, 72, 138, 191, 72, 138, 191, 72, 138, 191, 73, 140, 190, 74, 142, 189, 74, 141, 188, 74, 138, 181, 72, 105, 127, 72, 76, 78, 75, 75, 75, 159, 166, 172, 169, 171, 179, 197, 204, 210, 171, 181, 187, 126, 134, 147, 96, 133, 166, 72, 138, 191, 72, 138, 191, 72, 138, 191, 72, 138, 191, 72, 139, 191, 74, 142, 189, 74, 141, 187, 74, 133, 173, 68, 95, 113, 73, 75, 77, 77, 78, 80, 86, 88, 91, 111, 115, 118, 206, 210, 216, 141, 146, 157, 118, 127, 141, 96, 133, 165, 72, 138, 191, 72, 138, 191, 72, 138, 191, 72, 138, 191, 72, 139, 191, 74, 142, 189, 74, 141, 187, 74, 134, 175, 69, 99, 122, 87, 89, 91, 69, 69, 70, 76, 78, 80, 116, 117, 121, 203, 207, 212, 131, 144, 158, 90, 136, 171, 73, 141, 190, 72, 138, 191, 72, 138, 191, 72, 138, 191, 72, 138, 191, 72, 139, 191, 74, 142, 189, 74, 141, 188, 74, 135, 177, 167, 174, 175, 98, 101, 103, 71, 72, 74, 131, 133, 135, 222, 226, 233, 125, 165, 193, 76, 143, 189, 74, 142, 189, 74, 141, 189, 72, 138, 191, 72, 138, 191, 72, 138, 191, 72, 138, 191, 72, 138, 191, 74, 141, 189, 74, 142, 189, 153, 160, 162, 191, 197, 199, 148, 151, 153, 178, 182, 183, 128, 161, 183, 80, 144, 187, 74, 142, 189, 75, 142, 189, 74, 142, 189, 74, 142, 189, 72, 139, 191, 72, 138, 191, 72, 138, 191, 72, 138, 191, 72, 138, 191, 73, 141, 190, 96, 143, 174, 122, 125, 130, 155, 162, 163, 139, 169, 187, 87, 144, 183, 82, 144, 186, 79, 144, 189, 77, 143, 189, 77, 143, 189, 75, 142, 189, 74, 142, 189, 72, 139, 191, 72, 138, 191, 72, 138, 191, 72, 138, 191, 72, 138, 191, 86, 145, 185, 91, 142, 177, 106, 133, 153, 91, 146, 182, 86, 145, 185, 87, 147, 188, 86, 148, 190, 86, 149, 192, 97, 155, 196, 78, 143, 189, 75, 143, 189, 74, 142, 189, 72, 139, 191, 72, 138, 191, 72, 138, 191, 72, 138, 191 ), +"format": "RGB8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[resource] +data = SubResource( 1 ) diff --git a/game/tilesets/Terrarin.tscn b/game/tilesets/Terrarin.tscn new file mode 100644 index 0000000..be63332 --- /dev/null +++ b/game/tilesets/Terrarin.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://tilesets/tileset.tres" type="TileSet" id=1] + +[node name="Terrarin" type="TileMap"] +z_index = -10 +tile_set = ExtResource( 1 ) +cell_size = Vector2( 32, 32 ) +format = 1 +tile_data = PoolIntArray( -1572897, 0, 0, -1572896, 0, 0, -1572895, 0, 0, -1572894, 0, 0, -1572893, 0, 0, -1572892, 0, 0, -1572891, 0, 0, -1572890, 0, 0, -1572889, 0, 0, -1572888, 0, 0, -1572887, 0, 0, -1572886, 0, 0, -1572885, 0, 0, -1572884, 0, 0, -1572883, 0, 0, -1572882, 0, 0, -1572881, 0, 0, -1572880, 0, 0, -1572879, 0, 0, -1572878, 0, 0, -1572877, 0, 0, -1572876, 0, 0, -1572875, 0, 0, -1572874, 0, 0, -1572873, 0, 0, -1572872, 0, 0, -1572871, 0, 0, -1572870, 0, 0, -1572869, 0, 0, -1572868, 0, 0, -1572867, 0, 0, -1572866, 0, 0, -1572865, 0, 0, -1638400, 0, 0, -1638399, 0, 0, -1507362, 0, 0, -1507361, 0, 0, -1507360, 0, 0, -1507359, 0, 0, -1507358, 0, 0, -1507357, 0, 0, -1507356, 0, 0, -1507355, 0, 0, -1507354, 0, 0, -1507353, 0, 0, -1507352, 0, 0, -1507351, 0, 0, -1507350, 0, 0, -1507349, 0, 0, -1507348, 0, 0, -1507347, 0, 0, -1507346, 0, 0, -1507345, 0, 0, -1507344, 0, 0, -1507343, 0, 0, -1507342, 0, 0, -1507341, 0, 0, -1507340, 0, 0, -1507339, 0, 0, -1507338, 0, 0, -1507337, 0, 0, -1507336, 0, 0, -1507335, 0, 0, -1507334, 0, 0, -1507333, 0, 0, -1507332, 0, 0, -1507331, 0, 0, -1507330, 0, 0, -1507329, 0, 0, -1572864, 0, 0, -1572863, 0, 0, -1572862, 0, 0, -1572861, 0, 0, -1572860, 0, 0, -1572859, 0, 0, -1572858, 0, 0, -1572857, 0, 0, -1572856, 0, 0, -1572855, 0, 0, -1572820, 0, 0, -1441826, 0, 0, -1441825, 0, 0, -1441824, 0, 0, -1441823, 0, 0, -1441822, 0, 0, -1441821, 0, 0, -1441820, 0, 0, -1441819, 0, 0, -1441818, 0, 0, -1441817, 0, 0, -1441816, 0, 0, -1441815, 0, 0, -1441814, 0, 0, -1441813, 0, 0, -1441812, 0, 0, -1441811, 0, 0, -1441810, 0, 0, -1441809, 0, 0, -1441808, 0, 0, -1441807, 0, 0, -1441806, 0, 0, -1441805, 0, 0, -1441804, 0, 0, -1441803, 0, 0, -1441802, 0, 0, -1441801, 0, 0, -1441800, 0, 0, -1441799, 0, 0, -1441798, 0, 0, -1441797, 0, 0, -1441796, 0, 0, -1441795, 0, 0, -1441794, 0, 0, -1441793, 0, 0, -1507328, 0, 0, -1507327, 0, 0, -1507326, 0, 0, -1507325, 0, 0, -1507324, 0, 0, -1507323, 0, 0, -1507322, 0, 0, -1507321, 0, 0, -1507320, 0, 0, -1507319, 0, 0, -1507318, 0, 0, -1507317, 0, 0, -1507316, 0, 0, -1507315, 0, 0, -1507314, 0, 0, -1507313, 0, 0, -1507312, 0, 0, -1507311, 0, 0, -1507310, 0, 0, -1507309, 0, 0, -1507308, 0, 0, -1507307, 0, 0, -1507306, 0, 0, -1507305, 0, 0, -1507304, 0, 0, -1507303, 0, 0, -1507284, 0, 0, -1507272, 0, 0, -1507271, 0, 0, -1507270, 0, 0, -1507269, 0, 0, -1507268, 0, 0, -1376291, 0, 0, -1376290, 0, 0, -1376289, 0, 0, -1376288, 0, 0, -1376287, 0, 0, -1376286, 0, 0, -1376285, 0, 0, -1376284, 0, 0, -1376283, 0, 0, -1376282, 0, 0, -1376281, 0, 0, -1376280, 0, 0, -1376279, 0, 0, -1376278, 0, 0, -1376277, 0, 0, -1376276, 0, 0, -1376275, 0, 0, -1376274, 0, 0, -1376273, 0, 0, -1376272, 0, 0, -1376271, 0, 0, -1376270, 0, 0, -1376269, 0, 0, -1376268, 0, 0, -1376267, 0, 0, -1376266, 0, 0, -1376265, 0, 0, -1376264, 0, 0, -1376263, 0, 0, -1376262, 0, 0, -1376261, 0, 0, -1376260, 0, 0, -1376259, 0, 0, -1376258, 0, 0, -1376257, 0, 0, -1441792, 0, 0, -1441791, 0, 0, -1441790, 0, 0, -1441789, 0, 0, -1441788, 0, 0, -1441787, 0, 0, -1441786, 0, 0, -1441785, 0, 0, -1441784, 0, 0, -1441783, 0, 0, -1441782, 0, 0, -1441781, 0, 0, -1441780, 0, 0, -1441779, 0, 0, -1441778, 0, 0, -1441777, 0, 0, -1441776, 0, 0, -1441775, 0, 0, -1441774, 0, 0, -1441773, 0, 0, -1441772, 0, 0, -1441771, 0, 0, -1441770, 0, 0, -1441769, 0, 0, -1441768, 0, 0, -1441767, 0, 0, -1441766, 0, 0, -1441765, 0, 0, -1441764, 0, 0, -1441763, 0, 0, -1441762, 0, 0, -1441761, 0, 0, -1441760, 0, 0, -1441759, 0, 0, -1441758, 0, 0, -1441757, 0, 0, -1441756, 0, 0, -1441755, 0, 0, -1441754, 0, 0, -1441753, 0, 0, -1441752, 0, 0, -1441751, 0, 0, -1441750, 0, 0, -1441749, 0, 0, -1441748, 0, 0, -1441747, 0, 0, -1441746, 0, 0, -1441745, 0, 0, -1441744, 0, 0, -1441743, 0, 0, -1441742, 0, 0, -1441741, 0, 0, -1441740, 0, 0, -1441739, 0, 0, -1441738, 0, 0, -1441737, 0, 0, -1441736, 0, 0, -1441735, 0, 0, -1441734, 0, 0, -1441733, 0, 0, -1310755, 0, 0, -1310754, 0, 0, -1310753, 0, 0, -1310752, 0, 0, -1310751, 0, 0, -1310750, 0, 0, -1310749, 0, 0, -1310748, 0, 0, -1310747, 0, 0, -1310746, 0, 0, -1310745, 0, 0, -1310744, 0, 0, -1310743, 0, 0, -1310742, 0, 0, -1310741, 0, 0, -1310740, 0, 0, -1310739, 0, 0, -1310738, 0, 0, -1310737, 0, 0, -1310736, 0, 0, -1310735, 0, 0, -1310734, 0, 0, -1310733, 0, 0, -1310732, 0, 0, -1310731, 0, 0, -1310730, 0, 0, -1310729, 0, 0, -1310728, 0, 0, -1310727, 0, 0, -1310726, 0, 0, -1310725, 0, 0, -1310724, 0, 0, -1310723, 0, 0, -1310722, 0, 0, -1310721, 0, 0, -1376256, 0, 0, -1376255, 0, 0, -1376254, 0, 0, -1376253, 0, 0, -1376252, 0, 0, -1376251, 0, 0, -1376250, 0, 0, -1376249, 0, 0, -1376248, 0, 0, -1376247, 0, 0, -1376246, 0, 0, -1376245, 0, 0, -1376244, 0, 0, -1376243, 0, 0, -1376242, 0, 0, -1376241, 0, 0, -1376240, 0, 0, -1376239, 0, 0, -1376238, 0, 0, -1376237, 0, 0, -1376236, 0, 0, -1376235, 0, 0, -1376234, 0, 0, -1376233, 0, 0, -1376232, 0, 0, -1376231, 0, 0, -1376230, 0, 0, -1376229, 0, 0, -1376228, 0, 0, -1376227, 0, 0, -1376226, 0, 0, -1376225, 0, 0, -1376224, 0, 0, -1376223, 0, 0, -1376222, 0, 0, -1376221, 0, 0, -1376220, 0, 0, -1376219, 0, 0, -1376218, 0, 0, -1376217, 0, 0, -1376216, 0, 0, -1376215, 0, 0, -1376214, 0, 0, -1376213, 0, 0, -1376212, 0, 0, -1376211, 0, 0, -1376210, 0, 0, -1376209, 0, 0, -1376208, 0, 0, -1376207, 0, 0, -1376206, 0, 0, -1376205, 0, 0, -1376204, 0, 0, -1376203, 0, 0, -1376202, 0, 0, -1376201, 0, 0, -1376200, 0, 0, -1376199, 0, 0, -1376198, 0, 0, -1376197, 0, 0, -1245219, 0, 0, -1245218, 0, 0, -1245217, 0, 0, -1245216, 0, 0, -1245215, 0, 0, -1245214, 0, 0, -1245213, 0, 0, -1245212, 0, 0, -1245211, 0, 0, -1245210, 0, 0, -1245209, 0, 0, -1245208, 0, 0, -1245207, 0, 0, -1245206, 0, 0, -1245205, 0, 0, -1245204, 0, 0, -1245203, 0, 0, -1245202, 0, 0, -1245201, 0, 0, -1245200, 0, 0, -1245199, 0, 0, -1245198, 0, 0, -1245197, 0, 0, -1245196, 0, 0, -1245195, 0, 0, -1245194, 0, 0, -1245193, 0, 0, -1245192, 0, 0, -1245191, 0, 0, -1245190, 0, 0, -1245189, 0, 0, -1245188, 0, 0, -1245187, 0, 0, -1245186, 0, 0, -1245185, 0, 0, -1310720, 0, 0, -1310719, 0, 0, -1310718, 0, 0, -1310717, 0, 0, -1310716, 0, 0, -1310715, 0, 0, -1310714, 0, 0, -1310713, 0, 0, -1310712, 0, 0, -1310711, 0, 0, -1310710, 0, 0, -1310709, 0, 0, -1310708, 0, 0, -1310707, 0, 0, -1310706, 0, 0, -1310705, 0, 0, -1310704, 0, 0, -1310703, 0, 0, -1310702, 0, 0, -1310701, 0, 0, -1310700, 0, 0, -1310699, 0, 0, -1310698, 0, 0, -1310697, 0, 0, -1310696, 0, 0, -1310695, 0, 0, -1310694, 0, 0, -1310693, 0, 0, -1310692, 0, 0, -1310691, 0, 0, -1310690, 0, 0, -1310689, 0, 0, -1310688, 0, 0, -1310687, 0, 0, -1310686, 0, 0, -1310685, 0, 0, -1310684, 0, 0, -1310683, 0, 0, -1310682, 0, 0, -1310681, 0, 0, -1310680, 0, 0, -1310679, 0, 0, -1310678, 0, 0, -1310677, 0, 0, -1310676, 0, 0, -1310675, 0, 0, -1310674, 0, 0, -1310673, 0, 0, -1310672, 0, 0, -1310671, 0, 0, -1310670, 0, 0, -1310669, 0, 0, -1310668, 0, 0, -1310667, 0, 0, -1310666, 0, 0, -1310665, 0, 0, -1310664, 0, 0, -1310663, 0, 0, -1310662, 0, 0, -1310661, 0, 0, -1179683, 0, 0, -1179682, 0, 0, -1179681, 0, 0, -1179680, 0, 0, -1179679, 0, 0, -1179678, 0, 0, -1179677, 0, 0, -1179676, 0, 0, -1179675, 0, 0, -1179674, 0, 0, -1179673, 0, 0, -1179672, 0, 0, -1179671, 0, 0, -1179670, 0, 0, -1179669, 0, 0, -1179668, 0, 0, -1179667, 0, 0, -1179666, 0, 0, -1179665, 0, 0, -1179664, 0, 0, -1179663, 0, 0, -1179662, 0, 0, -1179661, 0, 0, -1179660, 0, 0, -1179659, 0, 0, -1179658, 0, 0, -1179657, 0, 0, -1179656, 0, 0, -1179655, 0, 0, -1179654, 0, 0, -1179653, 0, 0, -1179652, 0, 0, -1179651, 0, 0, -1179650, 0, 0, -1179649, 0, 0, -1245184, 0, 0, -1245183, 0, 0, -1245182, 0, 0, -1245181, 0, 0, -1245180, 0, 0, -1245179, 0, 0, -1245178, 0, 0, -1245177, 0, 0, -1245176, 0, 0, -1245175, 0, 0, -1245174, 0, 0, -1245173, 0, 0, -1245172, 0, 0, -1245171, 0, 0, -1245170, 0, 0, -1245169, 0, 0, -1245168, 0, 0, -1245167, 0, 0, -1245166, 0, 0, -1245165, 0, 0, -1245164, 0, 0, -1245163, 0, 0, -1245162, 0, 0, -1245161, 0, 0, -1245160, 0, 0, -1245159, 0, 0, -1245158, 0, 0, -1245157, 0, 0, -1245156, 0, 0, -1245155, 0, 0, -1245154, 0, 0, -1245153, 0, 0, -1245152, 0, 0, -1245151, 0, 0, -1245150, 0, 0, -1245149, 0, 0, -1245148, 0, 0, -1245147, 0, 0, -1245146, 0, 0, -1245145, 0, 0, -1245144, 0, 0, -1245143, 0, 0, -1245142, 0, 0, -1245141, 0, 0, -1245140, 0, 0, -1245139, 0, 0, -1245138, 0, 0, -1245137, 0, 0, -1245136, 0, 0, -1245135, 0, 0, -1245134, 0, 0, -1245133, 0, 0, -1245132, 0, 0, -1245131, 0, 0, -1245130, 0, 0, -1245129, 0, 0, -1245128, 0, 0, -1245127, 0, 0, -1245126, 0, 0, -1114148, 0, 0, -1114147, 0, 0, -1114146, 0, 0, -1114145, 0, 0, -1114144, 0, 0, -1114143, 0, 0, -1114142, 0, 0, -1114141, 0, 0, -1114140, 0, 0, -1114139, 0, 0, -1114138, 0, 0, -1114137, 0, 0, -1114136, 0, 0, -1114135, 0, 0, -1114134, 0, 0, -1114133, 0, 0, -1114132, 0, 0, -1114131, 0, 0, -1114130, 0, 0, -1114129, 0, 0, -1114128, 0, 0, -1114127, 0, 0, -1114126, 0, 0, -1114125, 0, 0, -1114124, 0, 0, -1114123, 0, 0, -1114122, 0, 0, -1114121, 0, 0, -1114120, 0, 0, -1114119, 0, 0, -1114118, 0, 0, -1114117, 0, 0, -1114116, 0, 0, -1114115, 0, 0, -1114114, 0, 0, -1114113, 0, 0, -1179648, 0, 0, -1179647, 0, 0, -1179646, 0, 0, -1179645, 0, 0, -1179644, 0, 0, -1179643, 0, 0, -1179642, 0, 0, -1179641, 0, 0, -1179640, 0, 0, -1179639, 0, 0, -1179638, 2, 0, -1179637, 2, 0, -1179636, 0, 0, -1179635, 0, 0, -1179634, 0, 0, -1179633, 0, 0, -1179632, 0, 0, -1179631, 2, 0, -1179630, 2, 0, -1179629, 0, 0, -1179628, 0, 0, -1179627, 0, 0, -1179626, 0, 0, -1179625, 0, 0, -1179624, 0, 0, -1179623, 0, 0, -1179622, 0, 0, -1179621, 0, 0, -1179620, 0, 0, -1179619, 0, 0, -1179618, 0, 0, -1179617, 0, 0, -1179616, 0, 0, -1179615, 0, 0, -1179614, 0, 0, -1179613, 0, 0, -1179612, 0, 0, -1179611, 0, 0, -1179610, 0, 0, -1179609, 0, 0, -1179608, 0, 0, -1179607, 0, 0, -1179606, 0, 0, -1179605, 0, 0, -1179604, 0, 0, -1179603, 0, 0, -1179602, 0, 0, -1179601, 0, 0, -1179600, 0, 0, -1179599, 0, 0, -1179598, 0, 0, -1179597, 0, 0, -1179596, 0, 0, -1179595, 0, 0, -1179594, 0, 0, -1179593, 0, 0, -1179592, 0, 0, -1179591, 0, 0, -1048612, 0, 0, -1048611, 0, 0, -1048610, 0, 0, -1048609, 0, 0, -1048608, 0, 0, -1048607, 0, 0, -1048606, 0, 0, -1048605, 0, 0, -1048604, 0, 0, -1048603, 0, 0, -1048602, 0, 0, -1048601, 0, 0, -1048600, 0, 0, -1048599, 0, 0, -1048598, 0, 0, -1048597, 0, 0, -1048596, 0, 0, -1048595, 0, 0, -1048594, 0, 0, -1048593, 0, 0, -1048592, 0, 0, -1048591, 0, 0, -1048590, 0, 0, -1048589, 0, 0, -1048588, 0, 0, -1048587, 0, 0, -1048586, 0, 0, -1048585, 0, 0, -1048584, 0, 0, -1048583, 0, 0, -1048582, 0, 0, -1048581, 0, 0, -1048580, 0, 0, -1048579, 0, 0, -1048578, 0, 0, -1048577, 0, 0, -1114112, 0, 0, -1114111, 0, 0, -1114110, 0, 0, -1114109, 0, 0, -1114108, 0, 0, -1114107, 0, 0, -1114106, 0, 0, -1114105, 0, 0, -1114104, 0, 0, -1114103, 0, 0, -1114102, 2, 0, -1114101, 0, 0, -1114100, 0, 0, -1114099, 0, 0, -1114098, 0, 0, -1114097, 0, 0, -1114096, 0, 0, -1114095, 0, 0, -1114094, 0, 0, -1114093, 0, 0, -1114092, 2, 0, -1114091, 2, 0, -1114090, 2, 0, -1114089, 0, 0, -1114088, 0, 0, -1114087, 0, 0, -1114086, 0, 0, -1114085, 0, 0, -1114084, 0, 0, -1114083, 0, 0, -1114082, 0, 0, -1114081, 0, 0, -1114080, 0, 0, -1114079, 0, 0, -1114078, 0, 0, -1114077, 0, 0, -1114076, 0, 0, -1114075, 0, 0, -1114074, 0, 0, -1114073, 0, 0, -1114072, 0, 0, -1114071, 0, 0, -1114070, 0, 0, -1114069, 0, 0, -1114068, 0, 0, -1114067, 0, 0, -1114066, 0, 0, -1114065, 0, 0, -1114064, 0, 0, -1114063, 0, 0, -1114062, 0, 0, -1114061, 0, 0, -1114060, 0, 0, -1114059, 0, 0, -1114058, 0, 0, -1114057, 0, 0, -1114056, 0, 0, -1114055, 0, 0, -983076, 0, 0, -983075, 0, 0, -983074, 0, 0, -983073, 0, 0, -983072, 0, 0, -983071, 0, 0, -983070, 0, 0, -983069, 0, 0, -983068, 0, 0, -983067, 0, 0, -983066, 0, 0, -983065, 0, 0, -983064, 0, 0, -983063, 0, 0, -983062, 0, 0, -983061, 0, 0, -983060, 0, 0, -983059, 0, 0, -983058, 0, 0, -983057, 0, 0, -983056, 0, 0, -983055, 0, 0, -983054, 0, 0, -983053, 0, 0, -983052, 0, 0, -983051, 0, 0, -983050, 0, 0, -983049, 0, 0, -983048, 0, 0, -983047, 0, 0, -983046, 0, 0, -983045, 0, 0, -983044, 0, 0, -983043, 0, 0, -983042, 0, 0, -983041, 0, 0, -1048576, 0, 0, -1048575, 0, 0, -1048574, 0, 0, -1048573, 0, 0, -1048572, 0, 0, -1048571, 0, 0, -1048570, 0, 0, -1048569, 0, 0, -1048568, 0, 0, -1048567, 0, 0, -1048566, 2, 0, -1048565, 0, 0, -1048564, 0, 0, -1048563, 0, 0, -1048562, 0, 0, -1048561, 0, 0, -1048560, 0, 0, -1048559, 0, 0, -1048558, 2, 0, -1048557, 2, 0, -1048556, 2, 0, -1048555, 2, 0, -1048554, 2, 0, -1048553, 0, 0, -1048552, 0, 0, -1048551, 0, 0, -1048550, 0, 0, -1048549, 0, 0, -1048548, 0, 0, -1048547, 0, 0, -1048546, 0, 0, -1048545, 0, 0, -1048544, 0, 0, -1048543, 0, 0, -1048542, 0, 0, -1048541, 0, 0, -1048540, 0, 0, -1048539, 0, 0, -1048538, 0, 0, -1048537, 0, 0, -1048536, 0, 0, -1048535, 0, 0, -1048534, 0, 0, -1048533, 0, 0, -1048532, 0, 0, -1048531, 0, 0, -1048530, 0, 0, -1048529, 0, 0, -1048528, 0, 0, -1048527, 0, 0, -1048526, 0, 0, -1048525, 0, 0, -1048524, 0, 0, -1048523, 0, 0, -1048522, 0, 0, -1048521, 0, 0, -1048520, 0, 0, -1048519, 0, 0, -917540, 0, 0, -917539, 0, 0, -917538, 0, 0, -917537, 0, 0, -917536, 0, 0, -917535, 0, 0, -917534, 0, 0, -917533, 0, 0, -917532, 0, 0, -917531, 0, 0, -917530, 0, 0, -917529, 0, 0, -917528, 0, 0, -917527, 0, 0, -917526, 0, 0, -917525, 0, 0, -917524, 0, 0, -917523, 0, 0, -917522, 0, 0, -917521, 0, 0, -917520, 0, 0, -917519, 0, 0, -917518, 0, 0, -917517, 0, 0, -917516, 0, 0, -917515, 0, 0, -917514, 0, 0, -917513, 0, 0, -917512, 0, 0, -917511, 0, 0, -917510, 0, 0, -917509, 0, 0, -917508, 0, 0, -917507, 0, 0, -917506, 0, 0, -917505, 0, 0, -983040, 0, 0, -983039, 0, 0, -983038, 0, 0, -983037, 0, 0, -983036, 0, 0, -983035, 0, 0, -983034, 0, 0, -983033, 0, 0, -983032, 0, 0, -983031, 0, 0, -983030, 0, 0, -983029, 0, 0, -983028, 0, 0, -983027, 0, 0, -983026, 0, 0, -983025, 0, 0, -983024, 0, 0, -983023, 0, 0, -983022, 2, 0, -983021, 1, 0, -983020, 1, 0, -983019, 2, 0, -983018, 2, 0, -983017, 0, 0, -983016, 0, 0, -983015, 0, 0, -983014, 0, 0, -983013, 0, 0, -983012, 0, 0, -983011, 0, 0, -983010, 0, 0, -983009, 0, 0, -983008, 0, 0, -983007, 0, 0, -983006, 0, 0, -983005, 0, 0, -983004, 0, 0, -983003, 0, 0, -983002, 0, 0, -983001, 0, 0, -983000, 0, 0, -982999, 0, 0, -982998, 0, 0, -982997, 0, 0, -982996, 0, 0, -982995, 0, 0, -982994, 0, 0, -982993, 0, 0, -982992, 0, 0, -982991, 0, 0, -982990, 0, 0, -982989, 0, 0, -982988, 0, 0, -982987, 0, 0, -982986, 0, 0, -982985, 0, 0, -982984, 0, 0, -982983, 0, 0, -852004, 0, 0, -852003, 0, 0, -852002, 0, 0, -852001, 0, 0, -852000, 0, 0, -851999, 0, 0, -851998, 0, 0, -851997, 0, 0, -851996, 0, 0, -851995, 0, 0, -851994, 0, 0, -851993, 0, 0, -851992, 0, 0, -851991, 0, 0, -851990, 0, 0, -851989, 0, 0, -851988, 0, 0, -851987, 0, 0, -851986, 0, 0, -851985, 0, 0, -851984, 0, 0, -851983, 0, 0, -851982, 0, 0, -851981, 0, 0, -851980, 0, 0, -851979, 0, 0, -851978, 0, 0, -851977, 0, 0, -851976, 0, 0, -851975, 0, 0, -851974, 0, 0, -851973, 0, 0, -851972, 0, 0, -851971, 0, 0, -851970, 0, 0, -851969, 0, 0, -917504, 0, 0, -917503, 0, 0, -917502, 0, 0, -917501, 0, 0, -917500, 0, 0, -917499, 0, 0, -917498, 0, 0, -917497, 0, 0, -917496, 0, 0, -917495, 0, 0, -917494, 0, 0, -917493, 0, 0, -917492, 0, 0, -917491, 0, 0, -917490, 0, 0, -917489, 2, 0, -917488, 2, 0, -917487, 2, 0, -917486, 2, 0, -917485, 1, 0, -917484, 1, 0, -917483, 2, 0, -917482, 2, 0, -917481, 0, 0, -917480, 2, 0, -917479, 0, 0, -917478, 0, 0, -917477, 0, 0, -917476, 0, 0, -917475, 0, 0, -917474, 0, 0, -917473, 0, 0, -917472, 0, 0, -917471, 0, 0, -917470, 0, 0, -917469, 0, 0, -917468, 0, 0, -917467, 0, 0, -917466, 0, 0, -917465, 0, 0, -917464, 0, 0, -917463, 0, 0, -917462, 0, 0, -917461, 0, 0, -917460, 0, 0, -917459, 0, 0, -917458, 0, 0, -917457, 0, 0, -917456, 0, 0, -917455, 0, 0, -917454, 0, 0, -917453, 0, 0, -917452, 0, 0, -917451, 0, 0, -917450, 0, 0, -917449, 0, 0, -917448, 0, 0, -917447, 0, 0, -786468, 0, 0, -786467, 0, 0, -786466, 0, 0, -786465, 0, 0, -786464, 0, 0, -786463, 0, 0, -786462, 0, 0, -786461, 0, 0, -786460, 0, 0, -786459, 0, 0, -786458, 0, 0, -786457, 0, 0, -786456, 0, 0, -786455, 0, 0, -786454, 0, 0, -786453, 0, 0, -786452, 0, 0, -786451, 0, 0, -786450, 0, 0, -786449, 0, 0, -786448, 0, 0, -786447, 0, 0, -786446, 0, 0, -786445, 0, 0, -786444, 0, 0, -786443, 0, 0, -786442, 0, 0, -786441, 0, 0, -786440, 0, 0, -786439, 0, 0, -786438, 0, 0, -786437, 0, 0, -786436, 0, 0, -786435, 0, 0, -786434, 0, 0, -786433, 0, 0, -851968, 0, 0, -851967, 0, 0, -851966, 0, 0, -851965, 0, 0, -851964, 0, 0, -851963, 0, 0, -851962, 0, 0, -851961, 0, 0, -851960, 0, 0, -851959, 0, 0, -851958, 0, 0, -851957, 0, 0, -851956, 0, 0, -851955, 0, 0, -851954, 0, 0, -851953, 2, 0, -851952, 2, 0, -851951, 0, 0, -851950, 2, 0, -851949, 2, 0, -851948, 1, 0, -851947, 1, 0, -851946, 2, 0, -851945, 2, 0, -851944, 2, 0, -851943, 0, 0, -851942, 0, 0, -851941, 0, 0, -851940, 0, 0, -851939, 0, 0, -851938, 0, 0, -851937, 0, 0, -851936, 0, 0, -851935, 0, 0, -851934, 0, 0, -851933, 0, 0, -851932, 0, 0, -851931, 0, 0, -851930, 0, 0, -851929, 0, 0, -851928, 0, 0, -851927, 0, 0, -851926, 0, 0, -851925, 0, 0, -851924, 0, 0, -851923, 0, 0, -851922, 0, 0, -851921, 0, 0, -851920, 0, 0, -851919, 0, 0, -851918, 0, 0, -851917, 0, 0, -851916, 0, 0, -851915, 0, 0, -851914, 0, 0, -851913, 0, 0, -851912, 0, 0, -851911, 0, 0, -720933, 0, 0, -720932, 0, 0, -720931, 0, 0, -720930, 0, 0, -720929, 0, 0, -720928, 0, 0, -720927, 0, 0, -720926, 0, 0, -720925, 0, 0, -720924, 0, 0, -720923, 0, 0, -720922, 0, 0, -720921, 0, 0, -720920, 0, 0, -720919, 0, 0, -720918, 0, 0, -720917, 0, 0, -720916, 0, 0, -720915, 0, 0, -720914, 0, 0, -720913, 0, 0, -720912, 0, 0, -720911, 0, 0, -720910, 0, 0, -720909, 0, 0, -720908, 0, 0, -720907, 0, 0, -720906, 0, 0, -720905, 0, 0, -720904, 0, 0, -720903, 0, 0, -720902, 0, 0, -720901, 0, 0, -720900, 0, 0, -720899, 0, 0, -720898, 0, 0, -720897, 0, 0, -786432, 0, 0, -786431, 0, 0, -786430, 0, 0, -786429, 0, 0, -786428, 0, 0, -786427, 0, 0, -786426, 0, 0, -786425, 0, 0, -786424, 0, 0, -786423, 0, 0, -786422, 0, 0, -786421, 0, 0, -786420, 0, 0, -786419, 2, 0, -786418, 0, 0, -786417, 0, 0, -786416, 0, 0, -786415, 0, 0, -786414, 0, 0, -786413, 2, 0, -786412, 1, 0, -786411, 1, 0, -786410, 2, 0, -786409, 2, 0, -786408, 2, 0, -786407, 0, 0, -786406, 0, 0, -786405, 0, 0, -786404, 0, 0, -786403, 0, 0, -786402, 0, 0, -786401, 0, 0, -786400, 0, 0, -786399, 0, 0, -786398, 0, 0, -786397, 0, 0, -786396, 0, 0, -786395, 0, 0, -786394, 0, 0, -786393, 0, 0, -786392, 0, 0, -786391, 0, 0, -786390, 0, 0, -786389, 0, 0, -786388, 0, 0, -786387, 0, 0, -786386, 0, 0, -786385, 0, 0, -786384, 0, 0, -786383, 0, 0, -786382, 0, 0, -786381, 0, 0, -786380, 0, 0, -786379, 0, 0, -786378, 0, 0, -786377, 0, 0, -786376, 0, 0, -655397, 0, 0, -655396, 0, 0, -655395, 0, 0, -655394, 0, 0, -655393, 0, 0, -655392, 0, 0, -655391, 0, 0, -655390, 0, 0, -655389, 0, 0, -655388, 0, 0, -655387, 0, 0, -655386, 0, 0, -655385, 0, 0, -655384, 0, 0, -655383, 0, 0, -655382, 0, 0, -655381, 0, 0, -655380, 0, 0, -655379, 0, 0, -655378, 0, 0, -655377, 0, 0, -655376, 0, 0, -655375, 0, 0, -655374, 0, 0, -655373, 0, 0, -655372, 0, 0, -655371, 0, 0, -655370, 0, 0, -655369, 0, 0, -655368, 0, 0, -655367, 0, 0, -655366, 0, 0, -655365, 0, 0, -655364, 0, 0, -655363, 0, 0, -655362, 0, 0, -655361, 0, 0, -720896, 0, 0, -720895, 0, 0, -720894, 0, 0, -720893, 0, 0, -720892, 0, 0, -720891, 0, 0, -720890, 0, 0, -720889, 0, 0, -720888, 0, 0, -720887, 0, 0, -720886, 2, 0, -720885, 0, 0, -720884, 0, 0, -720883, 2, 0, -720882, 2, 0, -720881, 2, 0, -720880, 0, 0, -720879, 0, 0, -720878, 0, 0, -720877, 2, 0, -720876, 2, 0, -720875, 2, 0, -720874, 2, 0, -720873, 2, 0, -720872, 0, 0, -720871, 0, 0, -720870, 0, 0, -720869, 0, 0, -720868, 0, 0, -720867, 0, 0, -720866, 0, 0, -720865, 0, 0, -720864, 0, 0, -720863, 0, 0, -720862, 0, 0, -720861, 0, 0, -720860, 0, 0, -720859, 0, 0, -720858, 0, 0, -720857, 0, 0, -720856, 0, 0, -720855, 0, 0, -720854, 0, 0, -720853, 0, 0, -720852, 0, 0, -720851, 0, 0, -720850, 0, 0, -720849, 0, 0, -720848, 0, 0, -720847, 0, 0, -720846, 0, 0, -720845, 0, 0, -720844, 0, 0, -720843, 0, 0, -720842, 0, 0, -720841, 0, 0, -720840, 0, 0, -589861, 0, 0, -589860, 0, 0, -589859, 0, 0, -589858, 0, 0, -589857, 0, 0, -589856, 0, 0, -589855, 0, 0, -589854, 0, 0, -589853, 0, 0, -589852, 0, 0, -589851, 0, 0, -589850, 0, 0, -589849, 0, 0, -589848, 0, 0, -589847, 0, 0, -589846, 0, 0, -589845, 0, 0, -589844, 0, 0, -589843, 0, 0, -589842, 0, 0, -589841, 0, 0, -589840, 0, 0, -589839, 0, 0, -589838, 0, 0, -589837, 0, 0, -589836, 0, 0, -589835, 0, 0, -589834, 0, 0, -589833, 2, 0, -589832, 2, 0, -589831, 0, 0, -589830, 0, 0, -589829, 0, 0, -589828, 0, 0, -589827, 0, 0, -589826, 0, 0, -589825, 0, 0, -655360, 0, 0, -655359, 0, 0, -655358, 2, 0, -655357, 2, 0, -655356, 2, 0, -655355, 2, 0, -655354, 0, 0, -655353, 0, 0, -655352, 0, 0, -655351, 0, 0, -655350, 2, 0, -655349, 2, 0, -655348, 2, 0, -655347, 0, 0, -655346, 0, 0, -655345, 0, 0, -655344, 0, 0, -655343, 0, 0, -655342, 0, 0, -655341, 0, 0, -655340, 2, 0, -655339, 2, 0, -655338, 2, 0, -655337, 0, 0, -655336, 0, 0, -655335, 0, 0, -655334, 0, 0, -655333, 0, 0, -655332, 0, 0, -655331, 0, 0, -655330, 0, 0, -655329, 0, 0, -655328, 0, 0, -655327, 0, 0, -655326, 0, 0, -655325, 0, 0, -655324, 0, 0, -655323, 0, 0, -655322, 0, 0, -655321, 0, 0, -655320, 0, 0, -655319, 0, 0, -655318, 0, 0, -655317, 0, 0, -655316, 0, 0, -655315, 0, 0, -655314, 0, 0, -655313, 0, 0, -655312, 0, 0, -655311, 0, 0, -655310, 0, 0, -655309, 0, 0, -655308, 0, 0, -655307, 0, 0, -655306, 0, 0, -655305, 0, 0, -655304, 0, 0, -524325, 0, 0, -524324, 0, 0, -524323, 0, 0, -524322, 0, 0, -524321, 0, 0, -524320, 0, 0, -524319, 0, 0, -524318, 0, 0, -524317, 0, 0, -524316, 0, 0, -524315, 0, 0, -524314, 0, 0, -524313, 0, 0, -524312, 0, 0, -524311, 0, 0, -524310, 0, 0, -524309, 0, 0, -524308, 0, 0, -524307, 0, 0, -524306, 0, 0, -524305, 0, 0, -524304, 0, 0, -524303, 0, 0, -524302, 0, 0, -524301, 0, 0, -524300, 0, 0, -524299, 0, 0, -524298, 0, 0, -524297, 2, 0, -524296, 2, 0, -524295, 0, 0, -524294, 0, 0, -524293, 0, 0, -524292, 0, 0, -524291, 0, 0, -524290, 0, 0, -524289, 0, 0, -589824, 0, 0, -589823, 0, 0, -589822, 2, 0, -589821, 2, 0, -589820, 2, 0, -589819, 2, 0, -589818, 0, 0, -589817, 2, 0, -589816, 0, 0, -589815, 0, 0, -589814, 0, 0, -589813, 0, 0, -589812, 0, 0, -589811, 0, 0, -589810, 0, 0, -589809, 0, 0, -589808, 0, 0, -589807, 0, 0, -589806, 0, 0, -589805, 0, 0, -589804, 0, 0, -589803, 2, 0, -589802, 2, 0, -589801, 2, 0, -589800, 0, 0, -589799, 0, 0, -589798, 0, 0, -589797, 0, 0, -589796, 0, 0, -589795, 0, 0, -589794, 0, 0, -589793, 0, 0, -589792, 0, 0, -589791, 0, 0, -589790, 0, 0, -589789, 0, 0, -589788, 0, 0, -589787, 0, 0, -589786, 0, 0, -589785, 0, 0, -589784, 0, 0, -589783, 0, 0, -589782, 0, 0, -589781, 0, 0, -589780, 0, 0, -589779, 0, 0, -589778, 0, 0, -589777, 0, 0, -589776, 0, 0, -589775, 0, 0, -589774, 0, 0, -589773, 0, 0, -589772, 0, 0, -589771, 0, 0, -589770, 0, 0, -589769, 0, 0, -589768, 0, 0, -458788, 0, 0, -458787, 0, 0, -458786, 0, 0, -458785, 0, 0, -458784, 0, 0, -458783, 0, 0, -458782, 0, 0, -458781, 0, 0, -458780, 0, 0, -458779, 0, 0, -458778, 0, 0, -458777, 0, 0, -458776, 0, 0, -458775, 0, 0, -458774, 0, 0, -458773, 0, 0, -458772, 0, 0, -458771, 0, 0, -458770, 0, 0, -458769, 0, 0, -458768, 0, 0, -458767, 0, 0, -458766, 0, 0, -458765, 0, 0, -458764, 0, 0, -458763, 2, 0, -458762, 2, 0, -458761, 0, 0, -458760, 0, 0, -458759, 2, 0, -458758, 2, 0, -458757, 0, 0, -458756, 0, 0, -458755, 2, 0, -458754, 0, 0, -458753, 0, 0, -524288, 2, 0, -524287, 0, 0, -524286, 2, 0, -524285, 2, 0, -524284, 2, 0, -524283, 2, 0, -524282, 0, 0, -524281, 2, 0, -524280, 0, 0, -524279, 0, 0, -524278, 0, 0, -524277, 0, 0, -524276, 0, 0, -524275, 0, 0, -524274, 2, 0, -524273, 0, 0, -524272, 0, 0, -524271, 0, 0, -524270, 0, 0, -524269, 0, 0, -524268, 0, 0, -524267, 0, 0, -524266, 0, 0, -524265, 0, 0, -524264, 0, 0, -524263, 0, 0, -524262, 0, 0, -524261, 0, 0, -524260, 0, 0, -524259, 0, 0, -524258, 0, 0, -524257, 0, 0, -524256, 0, 0, -524255, 0, 0, -524254, 0, 0, -524253, 0, 0, -524252, 0, 0, -524251, 0, 0, -524250, 0, 0, -524249, 0, 0, -524248, 0, 0, -524247, 0, 0, -524246, 0, 0, -524245, 0, 0, -524244, 0, 0, -524243, 0, 0, -524242, 0, 0, -524241, 0, 0, -524240, 0, 0, -524239, 0, 0, -524238, 0, 0, -524237, 0, 0, -524236, 0, 0, -524235, 0, 0, -524234, 0, 0, -524233, 0, 0, -524232, 0, 0, -393252, 0, 0, -393251, 0, 0, -393250, 0, 0, -393249, 0, 0, -393248, 0, 0, -393247, 0, 0, -393246, 0, 0, -393245, 0, 0, -393244, 0, 0, -393243, 0, 0, -393242, 0, 0, -393241, 0, 0, -393240, 0, 0, -393239, 0, 0, -393238, 0, 0, -393237, 0, 0, -393236, 0, 0, -393235, 0, 0, -393234, 0, 0, -393233, 0, 0, -393232, 0, 0, -393231, 0, 0, -393230, 0, 0, -393229, 0, 0, -393228, 0, 0, -393227, 0, 0, -393226, 0, 0, -393225, 2, 0, -393224, 2, 0, -393223, 2, 0, -393222, 2, 0, -393221, 2, 0, -393220, 2, 0, -393219, 2, 0, -393218, 2, 0, -393217, 0, 0, -458752, 2, 0, -458751, 2, 0, -458750, 2, 0, -458749, 2, 0, -458748, 2, 0, -458747, 0, 0, -458746, 2, 0, -458745, 0, 0, -458744, 0, 0, -458743, 0, 0, -458742, 0, 0, -458741, 0, 0, -458740, 0, 0, -458739, 0, 0, -458738, 0, 0, -458737, 2, 0, -458736, 2, 0, -458735, 0, 0, -458734, 0, 0, -458733, 0, 0, -458732, 0, 0, -458731, 0, 0, -458730, 0, 0, -458729, 0, 0, -458728, 0, 0, -458727, 0, 0, -458726, 0, 0, -458725, 0, 0, -458724, 0, 0, -458723, 0, 0, -458722, 0, 0, -458721, 0, 0, -458720, 0, 0, -458719, 0, 0, -458718, 0, 0, -458717, 0, 0, -458716, 0, 0, -458715, 0, 0, -458714, 0, 0, -458713, 0, 0, -458712, 0, 0, -458711, 0, 0, -458710, 0, 0, -458709, 0, 0, -458708, 0, 0, -458707, 0, 0, -458706, 0, 0, -458705, 0, 0, -458704, 0, 0, -458703, 0, 0, -458702, 0, 0, -458701, 0, 0, -458700, 0, 0, -458699, 0, 0, -458698, 0, 0, -458697, 0, 0, -458696, 0, 0, -327716, 0, 0, -327715, 0, 0, -327714, 0, 0, -327713, 0, 0, -327712, 0, 0, -327711, 0, 0, -327710, 0, 0, -327709, 0, 0, -327708, 0, 0, -327707, 0, 0, -327706, 0, 0, -327705, 0, 0, -327704, 0, 0, -327703, 0, 0, -327702, 0, 0, -327701, 0, 0, -327700, 0, 0, -327699, 0, 0, -327698, 0, 0, -327697, 0, 0, -327696, 0, 0, -327695, 0, 0, -327694, 0, 0, -327693, 0, 0, -327692, 0, 0, -327691, 0, 0, -327690, 2, 0, -327689, 2, 0, -327688, 2, 0, -327687, 1, 0, -327686, 1, 0, -327685, 2, 0, -327684, 2, 0, -327683, 2, 0, -327682, 2, 0, -327681, 0, 0, -393216, 0, 0, -393215, 2, 0, -393214, 2, 0, -393213, 1, 0, -393212, 2, 0, -393211, 2, 0, -393210, 0, 0, -393209, 0, 0, -393208, 0, 0, -393207, 2, 0, -393206, 2, 0, -393205, 0, 0, -393204, 0, 0, -393203, 0, 0, -393202, 0, 0, -393201, 0, 0, -393200, 0, 0, -393199, 0, 0, -393198, 0, 0, -393197, 0, 0, -393196, 0, 0, -393195, 0, 0, -393194, 0, 0, -393193, 0, 0, -393192, 0, 0, -393191, 0, 0, -393190, 0, 0, -393189, 0, 0, -393188, 0, 0, -393187, 0, 0, -393186, 0, 0, -393185, 0, 0, -393184, 0, 0, -393183, 0, 0, -393182, 0, 0, -393181, 0, 0, -393180, 0, 0, -393179, 0, 0, -393178, 0, 0, -393177, 0, 0, -393176, 0, 0, -393175, 0, 0, -393174, 0, 0, -393173, 0, 0, -393172, 0, 0, -393171, 0, 0, -393170, 0, 0, -393169, 0, 0, -393168, 0, 0, -393167, 0, 0, -393166, 0, 0, -393165, 0, 0, -393164, 0, 0, -393163, 0, 0, -393162, 0, 0, -393161, 0, 0, -262180, 0, 0, -262179, 0, 0, -262178, 0, 0, -262177, 0, 0, -262176, 0, 0, -262175, 0, 0, -262174, 0, 0, -262173, 0, 0, -262172, 0, 0, -262171, 0, 0, -262170, 0, 0, -262169, 0, 0, -262168, 0, 0, -262167, 0, 0, -262166, 0, 0, -262165, 0, 0, -262164, 0, 0, -262163, 0, 0, -262162, 0, 0, -262161, 0, 0, -262160, 0, 0, -262159, 2, 0, -262158, 0, 0, -262157, 0, 0, -262156, 0, 0, -262155, 0, 0, -262154, 0, 0, -262153, 2, 0, -262152, 2, 0, -262151, 1, 0, -262150, 1, 0, -262149, 1, 0, -262148, 2, 0, -262147, 0, 0, -262146, 0, 0, -262145, 0, 0, -327680, 2, 0, -327679, 2, 0, -327678, 2, 0, -327677, 1, 0, -327676, 2, 0, -327675, 2, 0, -327674, 0, 0, -327673, 0, 0, -327672, 2, 0, -327671, 1, 0, -327670, 1, 0, -327669, 2, 0, -327668, 0, 0, -327667, 0, 0, -327666, 0, 0, -327665, 0, 0, -327664, 0, 0, -327663, 0, 0, -327662, 0, 0, -327661, 0, 0, -327660, 0, 0, -327659, 0, 0, -327658, 0, 0, -327657, 0, 0, -327656, 0, 0, -327655, 0, 0, -327654, 0, 0, -327653, 0, 0, -327652, 0, 0, -327651, 0, 0, -327650, 0, 0, -327649, 0, 0, -327648, 0, 0, -327647, 0, 0, -327646, 0, 0, -327645, 0, 0, -327644, 0, 0, -327643, 0, 0, -327642, 0, 0, -327641, 0, 0, -327640, 0, 0, -327639, 0, 0, -327638, 0, 0, -327637, 0, 0, -327636, 0, 0, -327635, 0, 0, -327634, 0, 0, -327633, 0, 0, -327632, 0, 0, -327631, 0, 0, -327630, 0, 0, -327629, 0, 0, -327628, 0, 0, -327627, 0, 0, -327626, 0, 0, -327625, 0, 0, -196644, 0, 0, -196643, 0, 0, -196642, 0, 0, -196641, 0, 0, -196640, 0, 0, -196639, 0, 0, -196638, 0, 0, -196637, 0, 0, -196636, 0, 0, -196635, 0, 0, -196634, 0, 0, -196633, 0, 0, -196632, 0, 0, -196631, 0, 0, -196630, 0, 0, -196629, 0, 0, -196628, 0, 0, -196627, 0, 0, -196626, 0, 0, -196625, 2, 0, -196624, 2, 0, -196623, 2, 0, -196622, 2, 0, -196621, 0, 0, -196620, 0, 0, -196619, 0, 0, -196618, 0, 0, -196617, 2, 0, -196616, 2, 0, -196615, 1, 0, -196614, 1, 0, -196613, 1, 0, -196612, 2, 0, -196611, 0, 0, -196610, 0, 0, -196609, 0, 0, -262144, 2, 0, -262143, 0, 0, -262142, 2, 0, -262141, 1, 0, -262140, 2, 0, -262139, 0, 0, -262138, 0, 0, -262137, 2, 0, -262136, 1, 0, -262135, 1, 0, -262134, 1, 0, -262133, 1, 0, -262132, 2, 0, -262131, 2, 0, -262130, 0, 0, -262129, 0, 0, -262128, 0, 0, -262127, 0, 0, -262126, 0, 0, -262125, 0, 0, -262124, 0, 0, -262123, 0, 0, -262122, 0, 0, -262121, 0, 0, -262120, 0, 0, -262119, 0, 0, -262118, 0, 0, -262117, 0, 0, -262116, 0, 0, -262115, 0, 0, -262114, 0, 0, -262113, 0, 0, -262112, 0, 0, -262111, 0, 0, -262110, 0, 0, -262109, 0, 0, -262108, 0, 0, -262107, 0, 0, -262106, 0, 0, -262105, 0, 0, -262104, 0, 0, -262103, 0, 0, -262102, 0, 0, -262101, 0, 0, -262100, 0, 0, -262099, 0, 0, -262098, 0, 0, -262097, 0, 0, -262096, 0, 0, -262095, 0, 0, -262094, 0, 0, -262093, 0, 0, -262092, 0, 0, -262091, 0, 0, -262090, 0, 0, -131108, 0, 0, -131107, 0, 0, -131106, 0, 0, -131105, 0, 0, -131104, 0, 0, -131103, 0, 0, -131102, 0, 0, -131101, 0, 0, -131100, 0, 0, -131099, 0, 0, -131098, 0, 0, -131097, 0, 0, -131096, 0, 0, -131095, 0, 0, -131094, 0, 0, -131093, 0, 0, -131092, 0, 0, -131091, 0, 0, -131090, 0, 0, -131089, 2, 0, -131088, 2, 0, -131087, 2, 0, -131086, 2, 0, -131085, 0, 0, -131084, 0, 0, -131083, 2, 0, -131082, 0, 0, -131081, 2, 0, -131080, 2, 0, -131079, 2, 0, -131078, 2, 0, -131077, 2, 0, -131076, 2, 0, -131075, 0, 0, -131074, 2, 0, -131073, 0, 0, -196608, 0, 0, -196607, 0, 0, -196606, 2, 0, -196605, 2, 0, -196604, 2, 0, -196603, 0, 0, -196602, 2, 0, -196601, 2, 0, -196600, 1, 0, -196599, 1, 0, -196598, 1, 0, -196597, 1, 0, -196596, 1, 0, -196595, 2, 0, -196594, 0, 0, -196593, 0, 0, -196592, 0, 0, -196591, 0, 0, -196590, 0, 0, -196589, 0, 0, -196588, 0, 0, -196587, 0, 0, -196586, 0, 0, -196585, 0, 0, -196584, 0, 0, -196583, 0, 0, -196582, 0, 0, -196581, 0, 0, -196580, 0, 0, -196579, 0, 0, -196578, 0, 0, -196577, 0, 0, -196576, 0, 0, -196575, 0, 0, -196574, 0, 0, -196573, 0, 0, -196572, 0, 0, -196571, 0, 0, -196570, 0, 0, -196569, 0, 0, -196568, 0, 0, -196567, 0, 0, -196566, 0, 0, -196565, 0, 0, -196564, 0, 0, -196563, 0, 0, -196562, 0, 0, -196561, 0, 0, -196560, 0, 0, -196559, 0, 0, -196558, 0, 0, -196557, 0, 0, -196556, 0, 0, -196555, 0, 0, -196554, 0, 0, -65572, 0, 0, -65571, 0, 0, -65570, 0, 0, -65569, 0, 0, -65568, 0, 0, -65567, 0, 0, -65566, 0, 0, -65565, 0, 0, -65564, 0, 0, -65563, 0, 0, -65562, 0, 0, -65561, 0, 0, -65560, 0, 0, -65559, 0, 0, -65558, 0, 0, -65557, 0, 0, -65556, 0, 0, -65555, 0, 0, -65554, 2, 0, -65553, 2, 0, -65552, 2, 0, -65551, 2, 0, -65550, 2, 0, -65549, 2, 0, -65548, 2, 0, -65547, 2, 0, -65546, 0, 0, -65545, 0, 0, -65544, 2, 0, -65543, 2, 0, -65542, 2, 0, -65541, 2, 0, -65540, 0, 0, -65539, 0, 0, -65538, 2, 0, -65537, 2, 0, -131072, 0, 0, -131071, 0, 0, -131070, 0, 0, -131069, 0, 0, -131068, 0, 0, -131067, 0, 0, -131066, 2, 0, -131065, 2, 0, -131064, 2, 0, -131063, 2, 0, -131062, 2, 0, -131061, 2, 0, -131060, 2, 0, -131059, 2, 0, -131058, 0, 0, -131057, 0, 0, -131056, 0, 0, -131055, 0, 0, -131054, 0, 0, -131053, 0, 0, -131052, 0, 0, -131051, 0, 0, -131050, 0, 0, -131049, 0, 0, -131048, 0, 0, -131047, 0, 0, -131046, 0, 0, -131045, 0, 0, -131044, 0, 0, -131043, 0, 0, -131042, 0, 0, -131041, 0, 0, -131040, 0, 0, -131039, 0, 0, -131038, 0, 0, -131037, 0, 0, -131036, 0, 0, -131035, 0, 0, -131034, 0, 0, -131033, 0, 0, -131032, 0, 0, -131031, 0, 0, -131030, 0, 0, -131029, 0, 0, -131028, 0, 0, -131027, 0, 0, -131026, 0, 0, -131025, 0, 0, -131024, 0, 0, -131023, 0, 0, -131022, 0, 0, -131021, 0, 0, -131020, 0, 0, -131019, 0, 0, -131018, 0, 0, -36, 0, 0, -35, 0, 0, -34, 0, 0, -33, 0, 0, -32, 0, 0, -31, 0, 0, -30, 0, 0, -29, 0, 0, -28, 0, 0, -27, 0, 0, -26, 0, 0, -25, 0, 0, -24, 0, 0, -23, 0, 0, -22, 0, 0, -21, 0, 0, -20, 0, 0, -19, 0, 0, -18, 2, 0, -17, 2, 0, -16, 2, 0, -15, 1, 0, -14, 1, 0, -13, 2, 0, -12, 2, 0, -11, 0, 0, -10, 0, 0, -9, 0, 0, -8, 0, 0, -7, 0, 0, -6, 0, 0, -5, 0, 0, -4, 0, 0, -3, 0, 0, -2, 0, 0, -1, 0, 0, -65536, 2, 0, -65535, 0, 0, -65534, 2, 0, -65533, 0, 0, -65532, 0, 0, -65531, 0, 0, -65530, 0, 0, -65529, 0, 0, -65528, 0, 0, -65527, 0, 0, -65526, 0, 0, -65525, 0, 0, -65524, 0, 0, -65523, 0, 0, -65522, 0, 0, -65521, 0, 0, -65520, 0, 0, -65519, 0, 0, -65518, 0, 0, -65517, 0, 0, -65516, 0, 0, -65515, 0, 0, -65514, 0, 0, -65513, 0, 0, -65512, 0, 0, -65511, 0, 0, -65510, 0, 0, -65509, 0, 0, -65508, 0, 0, -65507, 0, 0, -65506, 0, 0, -65505, 0, 0, -65504, 0, 0, -65503, 0, 0, -65502, 0, 0, -65501, 0, 0, -65500, 0, 0, -65499, 0, 0, -65498, 0, 0, -65497, 0, 0, -65496, 0, 0, -65495, 0, 0, -65494, 0, 0, -65493, 0, 0, -65492, 0, 0, -65491, 0, 0, -65490, 0, 0, -65489, 0, 0, -65488, 0, 0, -65487, 0, 0, -65486, 0, 0, -65485, 0, 0, -65484, 0, 0, -65483, 0, 0, -65482, 0, 0, 65500, 0, 0, 65501, 0, 0, 65502, 0, 0, 65503, 0, 0, 65504, 0, 0, 65505, 0, 0, 65506, 0, 0, 65507, 0, 0, 65508, 0, 0, 65509, 0, 0, 65510, 0, 0, 65511, 0, 0, 65512, 0, 0, 65513, 0, 0, 65514, 0, 0, 65515, 0, 0, 65516, 0, 0, 65517, 0, 0, 65518, 2, 0, 65519, 2, 0, 65520, 2, 0, 65521, 1, 0, 65522, 1, 0, 65523, 2, 0, 65524, 2, 0, 65525, 2, 0, 65526, 0, 0, 65527, 0, 0, 65528, 0, 0, 65529, 0, 0, 65530, 0, 0, 65531, 0, 0, 65532, 2, 0, 65533, 2, 0, 65534, 0, 0, 65535, 0, 0, 0, 0, 0, 1, 0, 0, 2, 2, 0, 3, 2, 0, 4, 2, 0, 5, 0, 0, 6, 0, 0, 7, 0, 0, 8, 0, 0, 9, 0, 0, 10, 0, 0, 11, 0, 0, 12, 0, 0, 13, 0, 0, 14, 0, 0, 15, 0, 0, 16, 0, 0, 17, 0, 0, 18, 0, 0, 19, 0, 0, 20, 0, 0, 21, 0, 0, 22, 0, 0, 23, 0, 0, 24, 0, 0, 25, 0, 0, 26, 0, 0, 27, 0, 0, 28, 0, 0, 29, 0, 0, 30, 0, 0, 31, 0, 0, 32, 0, 0, 33, 0, 0, 34, 0, 0, 35, 0, 0, 36, 0, 0, 37, 0, 0, 38, 0, 0, 39, 0, 0, 40, 0, 0, 41, 0, 0, 42, 0, 0, 43, 0, 0, 44, 0, 0, 45, 0, 0, 46, 0, 0, 47, 0, 0, 48, 0, 0, 49, 0, 0, 50, 0, 0, 51, 0, 0, 52, 0, 0, 53, 0, 0, 131036, 0, 0, 131037, 0, 0, 131038, 0, 0, 131039, 0, 0, 131040, 0, 0, 131041, 0, 0, 131042, 0, 0, 131043, 0, 0, 131044, 0, 0, 131045, 0, 0, 131046, 0, 0, 131047, 0, 0, 131048, 0, 0, 131049, 0, 0, 131050, 0, 0, 131051, 0, 0, 131052, 0, 0, 131053, 0, 0, 131054, 2, 0, 131055, 2, 0, 131056, 2, 0, 131057, 1, 0, 131058, 1, 0, 131059, 2, 0, 131060, 2, 0, 131061, 2, 0, 131062, 2, 0, 131063, 0, 0, 131064, 0, 0, 131065, 2, 0, 131066, 0, 0, 131067, 0, 0, 131068, 0, 0, 131069, 2, 0, 131070, 2, 0, 131071, 2, 0, 65536, 2, 0, 65537, 0, 0, 65538, 0, 0, 65539, 0, 0, 65540, 0, 0, 65541, 0, 0, 65542, 2, 0, 65543, 0, 0, 65544, 0, 0, 65545, 0, 0, 65546, 0, 0, 65547, 0, 0, 65548, 0, 0, 65549, 0, 0, 65550, 0, 0, 65551, 0, 0, 65552, 0, 0, 65553, 0, 0, 65554, 0, 0, 65555, 0, 0, 65556, 0, 0, 65557, 0, 0, 65558, 0, 0, 65559, 0, 0, 65560, 0, 0, 65561, 0, 0, 65562, 0, 0, 65563, 0, 0, 65564, 0, 0, 65565, 0, 0, 65566, 0, 0, 65567, 0, 0, 65568, 0, 0, 65569, 0, 0, 65570, 0, 0, 65571, 0, 0, 65572, 0, 0, 65573, 0, 0, 65574, 0, 0, 65575, 0, 0, 65576, 0, 0, 65577, 0, 0, 65578, 0, 0, 65579, 0, 0, 65580, 0, 0, 65581, 0, 0, 65582, 0, 0, 65583, 0, 0, 65584, 0, 0, 65585, 0, 0, 65586, 0, 0, 65587, 0, 0, 65588, 0, 0, 65589, 0, 0, 196572, 0, 0, 196573, 0, 0, 196574, 0, 0, 196575, 0, 0, 196576, 0, 0, 196577, 0, 0, 196578, 0, 0, 196579, 0, 0, 196580, 0, 0, 196581, 0, 0, 196582, 0, 0, 196583, 0, 0, 196584, 0, 0, 196585, 0, 0, 196586, 0, 0, 196587, 0, 0, 196588, 0, 0, 196589, 0, 0, 196590, 2, 0, 196591, 2, 0, 196592, 2, 0, 196593, 2, 0, 196594, 2, 0, 196595, 2, 0, 196596, 0, 0, 196597, 0, 0, 196598, 0, 0, 196599, 2, 0, 196600, 0, 0, 196601, 0, 0, 196602, 2, 0, 196603, 2, 0, 196604, 2, 0, 196605, 2, 0, 196606, 2, 0, 196607, 2, 0, 131072, 2, 0, 131073, 2, 0, 131074, 2, 0, 131075, 0, 0, 131076, 0, 0, 131077, 0, 0, 131078, 0, 0, 131079, 0, 0, 131080, 0, 0, 131081, 2, 0, 131082, 2, 0, 131083, 0, 0, 131084, 0, 0, 131085, 2, 0, 131086, 2, 0, 131087, 2, 0, 131088, 0, 0, 131089, 0, 0, 131090, 0, 0, 131091, 0, 0, 131092, 0, 0, 131093, 0, 0, 131094, 0, 0, 131095, 0, 0, 131096, 0, 0, 131097, 0, 0, 131098, 0, 0, 131099, 0, 0, 131100, 0, 0, 131101, 0, 0, 131102, 0, 0, 131103, 0, 0, 131104, 0, 0, 131105, 0, 0, 131106, 0, 0, 131107, 0, 0, 131108, 0, 0, 131109, 0, 0, 131110, 0, 0, 131111, 0, 0, 131112, 0, 0, 131113, 0, 0, 131114, 0, 0, 131115, 0, 0, 131116, 0, 0, 131117, 0, 0, 131118, 0, 0, 131119, 0, 0, 131120, 0, 0, 131121, 0, 0, 131122, 0, 0, 131123, 0, 0, 131124, 0, 0, 131125, 0, 0, 262108, 0, 0, 262109, 0, 0, 262110, 0, 0, 262111, 0, 0, 262112, 0, 0, 262113, 0, 0, 262114, 0, 0, 262115, 0, 0, 262116, 0, 0, 262117, 0, 0, 262118, 0, 0, 262119, 0, 0, 262120, 0, 0, 262121, 0, 0, 262122, 0, 0, 262123, 0, 0, 262124, 0, 0, 262125, 0, 0, 262126, 0, 0, 262127, 0, 0, 262128, 0, 0, 262129, 2, 0, 262130, 0, 0, 262131, 0, 0, 262132, 0, 0, 262133, 0, 0, 262134, 0, 0, 262135, 0, 0, 262136, 0, 0, 262137, 0, 0, 262138, 0, 0, 262139, 2, 0, 262140, 1, 0, 262141, 1, 0, 262142, 1, 0, 262143, 1, 0, 196608, 1, 0, 196609, 2, 0, 196610, 2, 0, 196611, 2, 0, 196612, 0, 0, 196613, 0, 0, 196614, 2, 0, 196615, 0, 0, 196616, 0, 0, 196617, 0, 0, 196618, 0, 0, 196619, 0, 0, 196620, 0, 0, 196621, 0, 0, 196622, 0, 0, 196623, 0, 0, 196624, 0, 0, 196625, 0, 0, 196626, 2, 0, 196627, 2, 0, 196628, 0, 0, 196629, 0, 0, 196630, 0, 0, 196631, 0, 0, 196632, 0, 0, 196633, 0, 0, 196634, 0, 0, 196635, 0, 0, 196636, 0, 0, 196637, 0, 0, 196638, 0, 0, 196639, 0, 0, 196640, 0, 0, 196641, 0, 0, 196642, 0, 0, 196643, 0, 0, 196644, 0, 0, 196645, 0, 0, 196646, 0, 0, 196647, 0, 0, 196648, 0, 0, 196649, 0, 0, 196650, 0, 0, 196651, 0, 0, 196652, 0, 0, 196653, 0, 0, 196654, 0, 0, 196655, 0, 0, 196656, 0, 0, 196657, 0, 0, 196658, 0, 0, 196659, 0, 0, 196660, 0, 0, 327644, 0, 0, 327645, 0, 0, 327646, 0, 0, 327647, 0, 0, 327648, 0, 0, 327649, 0, 0, 327650, 0, 0, 327651, 0, 0, 327652, 0, 0, 327653, 0, 0, 327654, 0, 0, 327655, 0, 0, 327656, 0, 0, 327657, 0, 0, 327658, 0, 0, 327659, 0, 0, 327660, 0, 0, 327661, 0, 0, 327662, 2, 0, 327663, 2, 0, 327664, 2, 0, 327665, 2, 0, 327666, 2, 0, 327667, 2, 0, 327668, 2, 0, 327669, 2, 0, 327670, 2, 0, 327671, 2, 0, 327672, 0, 0, 327673, 0, 0, 327674, 0, 0, 327675, 2, 0, 327676, 2, 0, 327677, 1, 0, 327678, 1, 0, 327679, 1, 0, 262144, 1, 0, 262145, 2, 0, 262146, 2, 0, 262147, 2, 0, 262148, 0, 0, 262149, 0, 0, 262150, 2, 0, 262151, 0, 0, 262152, 0, 0, 262153, 0, 0, 262154, 2, 0, 262155, 0, 0, 262156, 0, 0, 262157, 0, 0, 262158, 0, 0, 262159, 0, 0, 262160, 0, 0, 262161, 0, 0, 262162, 2, 0, 262163, 0, 0, 262164, 0, 0, 262165, 0, 0, 262166, 0, 0, 262167, 0, 0, 262168, 2, 0, 262169, 0, 0, 262170, 0, 0, 262171, 0, 0, 262172, 0, 0, 262173, 0, 0, 262174, 0, 0, 262175, 0, 0, 262176, 0, 0, 262177, 0, 0, 262178, 0, 0, 262179, 0, 0, 262180, 0, 0, 262181, 0, 0, 262182, 0, 0, 262183, 0, 0, 262184, 0, 0, 262185, 0, 0, 262186, 0, 0, 262187, 0, 0, 262188, 0, 0, 262189, 0, 0, 262190, 0, 0, 262191, 0, 0, 262192, 0, 0, 262193, 0, 0, 262194, 0, 0, 262195, 0, 0, 262196, 0, 0, 393180, 0, 0, 393181, 0, 0, 393182, 0, 0, 393183, 0, 0, 393184, 0, 0, 393185, 0, 0, 393186, 0, 0, 393187, 0, 0, 393188, 0, 0, 393189, 0, 0, 393190, 0, 0, 393191, 0, 0, 393192, 0, 0, 393193, 0, 0, 393194, 0, 0, 393195, 0, 0, 393196, 0, 0, 393197, 0, 0, 393198, 2, 0, 393199, 2, 0, 393200, 2, 0, 393201, 2, 0, 393202, 2, 0, 393203, 2, 0, 393204, 2, 0, 393205, 2, 0, 393206, 2, 0, 393207, 2, 0, 393208, 0, 0, 393209, 0, 0, 393210, 0, 0, 393211, 2, 0, 393212, 2, 0, 393213, 2, 0, 393214, 2, 0, 393215, 2, 0, 327680, 2, 0, 327681, 2, 0, 327682, 2, 0, 327683, 2, 0, 327684, 0, 0, 327685, 0, 0, 327686, 0, 0, 327687, 0, 0, 327688, 0, 0, 327689, 0, 0, 327690, 2, 0, 327691, 0, 0, 327692, 2, 0, 327693, 0, 0, 327694, 0, 0, 327695, 0, 0, 327696, 0, 0, 327697, 0, 0, 327698, 0, 0, 327699, 2, 0, 327700, 2, 0, 327701, 2, 0, 327702, 0, 0, 327703, 2, 0, 327704, 2, 0, 327705, 0, 0, 327706, 0, 0, 327707, 0, 0, 327708, 0, 0, 327709, 0, 0, 327710, 0, 0, 327711, 0, 0, 327712, 0, 0, 327713, 0, 0, 327714, 0, 0, 327715, 0, 0, 327716, 0, 0, 327717, 0, 0, 327718, 0, 0, 327719, 0, 0, 327720, 0, 0, 327721, 0, 0, 327722, 0, 0, 327723, 0, 0, 327724, 0, 0, 327725, 0, 0, 327726, 0, 0, 327727, 0, 0, 327728, 0, 0, 327729, 0, 0, 327730, 0, 0, 327731, 0, 0, 458716, 0, 0, 458717, 0, 0, 458718, 0, 0, 458719, 0, 0, 458720, 0, 0, 458721, 0, 0, 458722, 0, 0, 458723, 0, 0, 458724, 0, 0, 458725, 0, 0, 458726, 0, 0, 458727, 0, 0, 458728, 0, 0, 458729, 0, 0, 458730, 0, 0, 458731, 0, 0, 458732, 0, 0, 458733, 2, 0, 458734, 2, 0, 458735, 2, 0, 458736, 1, 0, 458737, 1, 0, 458738, 1, 0, 458739, 1, 0, 458740, 1, 0, 458741, 1, 0, 458742, 2, 0, 458743, 2, 0, 458744, 2, 0, 458745, 0, 0, 458746, 0, 0, 458747, 0, 0, 458748, 2, 0, 458749, 2, 0, 458750, 2, 0, 458751, 2, 0, 393216, 2, 0, 393217, 2, 0, 393218, 2, 0, 393219, 0, 0, 393220, 0, 0, 393221, 0, 0, 393222, 0, 0, 393223, 0, 0, 393224, 0, 0, 393225, 0, 0, 393226, 0, 0, 393227, 0, 0, 393228, 0, 0, 393229, 0, 0, 393230, 0, 0, 393231, 0, 0, 393232, 2, 0, 393233, 2, 0, 393234, 0, 0, 393235, 0, 0, 393236, 0, 0, 393237, 0, 0, 393238, 0, 0, 393239, 0, 0, 393240, 2, 0, 393241, 0, 0, 393242, 0, 0, 393243, 0, 0, 393244, 0, 0, 393245, 0, 0, 393246, 0, 0, 393247, 0, 0, 393248, 0, 0, 393249, 0, 0, 393250, 0, 0, 393251, 0, 0, 393252, 0, 0, 393253, 0, 0, 393254, 0, 0, 393255, 0, 0, 393256, 0, 0, 393257, 0, 0, 393258, 0, 0, 393259, 0, 0, 393260, 0, 0, 393261, 0, 0, 393262, 0, 0, 393263, 0, 0, 393264, 0, 0, 393265, 0, 0, 393266, 0, 0, 393267, 0, 0, 524252, 0, 0, 524253, 0, 0, 524254, 0, 0, 524255, 0, 0, 524256, 0, 0, 524257, 0, 0, 524258, 0, 0, 524259, 0, 0, 524260, 0, 0, 524261, 0, 0, 524262, 0, 0, 524263, 0, 0, 524264, 0, 0, 524265, 0, 0, 524266, 0, 0, 524267, 0, 0, 524268, 0, 0, 524269, 2, 0, 524270, 2, 0, 524271, 2, 0, 524272, 1, 0, 524273, 1, 0, 524274, 1, 0, 524275, 1, 0, 524276, 1, 0, 524277, 1, 0, 524278, 1, 0, 524279, 2, 0, 524280, 2, 0, 524281, 0, 0, 524282, 0, 0, 524283, 0, 0, 524284, 0, 0, 524285, 0, 0, 524286, 0, 0, 524287, 0, 0, 458752, 0, 0, 458753, 0, 0, 458754, 0, 0, 458755, 0, 0, 458756, 0, 0, 458757, 2, 0, 458758, 2, 0, 458759, 2, 0, 458760, 2, 0, 458761, 2, 0, 458762, 2, 0, 458763, 2, 0, 458764, 0, 0, 458765, 0, 0, 458766, 0, 0, 458767, 0, 0, 458768, 0, 0, 458769, 2, 0, 458770, 0, 0, 458771, 0, 0, 458772, 0, 0, 458773, 0, 0, 458774, 0, 0, 458775, 2, 0, 458776, 2, 0, 458777, 0, 0, 458778, 0, 0, 458779, 0, 0, 458780, 0, 0, 458781, 0, 0, 458782, 0, 0, 458783, 0, 0, 458784, 0, 0, 458785, 0, 0, 458786, 0, 0, 458787, 0, 0, 458788, 0, 0, 458789, 0, 0, 458790, 0, 0, 458791, 0, 0, 458792, 0, 0, 458793, 0, 0, 458794, 0, 0, 458795, 0, 0, 458796, 0, 0, 458797, 0, 0, 458798, 0, 0, 458799, 0, 0, 458800, 0, 0, 458801, 0, 0, 458802, 0, 0, 458803, 0, 0, 589788, 0, 0, 589789, 0, 0, 589790, 0, 0, 589791, 0, 0, 589792, 0, 0, 589793, 0, 0, 589794, 0, 0, 589795, 0, 0, 589796, 0, 0, 589797, 0, 0, 589798, 0, 0, 589799, 0, 0, 589800, 0, 0, 589801, 0, 0, 589802, 0, 0, 589803, 0, 0, 589804, 0, 0, 589805, 2, 0, 589806, 2, 0, 589807, 2, 0, 589808, 1, 0, 589809, 1, 0, 589810, 1, 0, 589811, 1, 0, 589812, 1, 0, 589813, 2, 0, 589814, 2, 0, 589815, 2, 0, 589816, 2, 0, 589817, 0, 0, 589818, 0, 0, 589819, 0, 0, 589820, 2, 0, 589821, 0, 0, 589822, 0, 0, 589823, 0, 0, 524288, 0, 0, 524289, 0, 0, 524290, 0, 0, 524291, 0, 0, 524292, 2, 0, 524293, 2, 0, 524294, 1, 0, 524295, 1, 0, 524296, 1, 0, 524297, 1, 0, 524298, 2, 0, 524299, 2, 0, 524300, 0, 0, 524301, 0, 0, 524302, 0, 0, 524303, 0, 0, 524304, 0, 0, 524305, 0, 0, 524306, 2, 0, 524307, 0, 0, 524308, 0, 0, 524309, 0, 0, 524310, 2, 0, 524311, 2, 0, 524312, 0, 0, 524313, 0, 0, 524314, 0, 0, 524315, 0, 0, 524316, 0, 0, 524317, 0, 0, 524318, 0, 0, 524319, 0, 0, 524320, 0, 0, 524321, 0, 0, 524322, 0, 0, 524323, 0, 0, 524324, 0, 0, 524325, 0, 0, 524326, 0, 0, 524327, 0, 0, 524328, 0, 0, 524329, 0, 0, 524330, 0, 0, 524331, 0, 0, 524332, 0, 0, 524333, 0, 0, 524334, 0, 0, 524335, 0, 0, 524336, 0, 0, 524337, 0, 0, 524338, 0, 0, 524339, 0, 0, 655324, 0, 0, 655325, 0, 0, 655326, 0, 0, 655327, 0, 0, 655328, 0, 0, 655329, 0, 0, 655330, 0, 0, 655331, 0, 0, 655332, 0, 0, 655333, 0, 0, 655334, 0, 0, 655335, 0, 0, 655336, 0, 0, 655337, 0, 0, 655338, 0, 0, 655339, 0, 0, 655340, 0, 0, 655341, 2, 0, 655342, 2, 0, 655343, 2, 0, 655344, 2, 0, 655345, 2, 0, 655346, 2, 0, 655347, 2, 0, 655348, 2, 0, 655349, 2, 0, 655350, 2, 0, 655351, 2, 0, 655352, 2, 0, 655353, 0, 0, 655354, 0, 0, 655355, 0, 0, 655356, 2, 0, 655357, 2, 0, 655358, 0, 0, 655359, 0, 0, 589824, 0, 0, 589825, 0, 0, 589826, 0, 0, 589827, 0, 0, 589828, 2, 0, 589829, 2, 0, 589830, 1, 0, 589831, 1, 0, 589832, 1, 0, 589833, 2, 0, 589834, 2, 0, 589835, 2, 0, 589836, 0, 0, 589837, 0, 0, 589838, 0, 0, 589839, 0, 0, 589840, 0, 0, 589841, 0, 0, 589842, 2, 0, 589843, 2, 0, 589844, 0, 0, 589845, 0, 0, 589846, 2, 0, 589847, 0, 0, 589848, 0, 0, 589849, 0, 0, 589850, 0, 0, 589851, 0, 0, 589852, 0, 0, 589853, 0, 0, 589854, 0, 0, 589855, 0, 0, 589856, 0, 0, 589857, 0, 0, 589858, 0, 0, 589859, 0, 0, 589860, 0, 0, 589861, 0, 0, 589862, 0, 0, 589863, 0, 0, 589864, 0, 0, 589865, 0, 0, 589866, 0, 0, 589867, 0, 0, 589868, 0, 0, 589869, 0, 0, 589870, 0, 0, 589871, 0, 0, 589872, 0, 0, 589873, 0, 0, 589874, 0, 0, 720860, 0, 0, 720861, 0, 0, 720862, 0, 0, 720863, 0, 0, 720864, 0, 0, 720865, 0, 0, 720866, 0, 0, 720867, 0, 0, 720868, 0, 0, 720869, 0, 0, 720870, 0, 0, 720871, 0, 0, 720872, 0, 0, 720873, 0, 0, 720874, 0, 0, 720875, 0, 0, 720876, 0, 0, 720877, 2, 0, 720878, 2, 0, 720879, 2, 0, 720880, 2, 0, 720881, 2, 0, 720882, 2, 0, 720883, 2, 0, 720884, 2, 0, 720885, 2, 0, 720886, 2, 0, 720887, 2, 0, 720888, 2, 0, 720889, 2, 0, 720890, 0, 0, 720891, 0, 0, 720892, 0, 0, 720893, 2, 0, 720894, 2, 0, 720895, 0, 0, 655360, 0, 0, 655361, 0, 0, 655362, 0, 0, 655363, 0, 0, 655364, 2, 0, 655365, 2, 0, 655366, 2, 0, 655367, 2, 0, 655368, 2, 0, 655369, 2, 0, 655370, 2, 0, 655371, 2, 0, 655372, 0, 0, 655373, 0, 0, 655374, 0, 0, 655375, 0, 0, 655376, 0, 0, 655377, 2, 0, 655378, 2, 0, 655379, 0, 0, 655380, 0, 0, 655381, 0, 0, 655382, 0, 0, 655383, 0, 0, 655384, 0, 0, 655385, 0, 0, 655386, 0, 0, 655387, 0, 0, 655388, 0, 0, 655389, 0, 0, 655390, 0, 0, 655391, 0, 0, 655392, 0, 0, 655393, 0, 0, 655394, 0, 0, 655395, 0, 0, 655396, 0, 0, 655397, 0, 0, 655398, 0, 0, 655399, 0, 0, 655400, 0, 0, 655401, 0, 0, 655402, 0, 0, 655403, 0, 0, 655404, 0, 0, 655405, 0, 0, 655406, 0, 0, 655407, 0, 0, 655408, 0, 0, 655409, 0, 0, 655410, 0, 0, 786396, 0, 0, 786397, 0, 0, 786398, 0, 0, 786399, 0, 0, 786400, 0, 0, 786401, 0, 0, 786402, 0, 0, 786403, 0, 0, 786404, 0, 0, 786405, 0, 0, 786406, 0, 0, 786407, 0, 0, 786408, 0, 0, 786409, 0, 0, 786410, 0, 0, 786411, 0, 0, 786412, 0, 0, 786413, 0, 0, 786414, 2, 0, 786415, 2, 0, 786416, 2, 0, 786417, 2, 0, 786418, 2, 0, 786419, 0, 0, 786420, 2, 0, 786421, 2, 0, 786422, 2, 0, 786423, 2, 0, 786424, 0, 0, 786425, 0, 0, 786426, 0, 0, 786427, 0, 0, 786428, 2, 0, 786429, 0, 0, 786430, 2, 0, 786431, 0, 0, 720896, 0, 0, 720897, 0, 0, 720898, 0, 0, 720899, 0, 0, 720900, 2, 0, 720901, 2, 0, 720902, 2, 0, 720903, 2, 0, 720904, 2, 0, 720905, 2, 0, 720906, 2, 0, 720907, 2, 0, 720908, 2, 0, 720909, 0, 0, 720910, 0, 0, 720911, 0, 0, 720912, 0, 0, 720913, 0, 0, 720914, 0, 0, 720915, 0, 0, 720916, 0, 0, 720917, 0, 0, 720918, 0, 0, 720919, 0, 0, 720920, 0, 0, 720921, 0, 0, 720922, 0, 0, 720923, 0, 0, 720924, 0, 0, 720925, 0, 0, 720926, 0, 0, 720927, 0, 0, 720928, 0, 0, 720929, 0, 0, 720930, 0, 0, 720931, 0, 0, 720932, 0, 0, 720933, 0, 0, 720934, 0, 0, 720935, 0, 0, 720936, 0, 0, 720937, 0, 0, 720938, 0, 0, 720939, 0, 0, 720940, 0, 0, 720941, 0, 0, 720942, 0, 0, 720943, 0, 0, 720944, 0, 0, 720945, 0, 0, 720946, 0, 0, 851932, 0, 0, 851933, 0, 0, 851934, 0, 0, 851935, 0, 0, 851936, 0, 0, 851937, 0, 0, 851938, 0, 0, 851939, 0, 0, 851940, 0, 0, 851941, 0, 0, 851942, 0, 0, 851943, 0, 0, 851944, 0, 0, 851945, 0, 0, 851946, 0, 0, 851947, 0, 0, 851948, 0, 0, 851949, 0, 0, 851950, 0, 0, 851951, 0, 0, 851952, 0, 0, 851953, 0, 0, 851954, 0, 0, 851955, 0, 0, 851956, 0, 0, 851957, 0, 0, 851958, 0, 0, 851959, 0, 0, 851960, 0, 0, 851961, 0, 0, 851962, 0, 0, 851963, 0, 0, 851964, 2, 0, 851965, 2, 0, 851966, 2, 0, 851967, 0, 0, 786432, 0, 0, 786433, 0, 0, 786434, 0, 0, 786435, 0, 0, 786436, 0, 0, 786437, 0, 0, 786438, 0, 0, 786439, 0, 0, 786440, 0, 0, 786441, 0, 0, 786442, 0, 0, 786443, 0, 0, 786444, 0, 0, 786445, 0, 0, 786446, 0, 0, 786447, 0, 0, 786448, 0, 0, 786449, 0, 0, 786450, 0, 0, 786451, 0, 0, 786452, 0, 0, 786453, 0, 0, 786454, 0, 0, 786455, 0, 0, 786456, 0, 0, 786457, 0, 0, 786458, 0, 0, 786459, 0, 0, 786460, 0, 0, 786461, 0, 0, 786462, 0, 0, 786463, 0, 0, 786464, 0, 0, 786465, 0, 0, 786466, 0, 0, 786467, 0, 0, 786468, 0, 0, 786469, 0, 0, 786470, 0, 0, 786471, 0, 0, 786472, 0, 0, 786473, 0, 0, 786474, 0, 0, 786475, 0, 0, 786476, 0, 0, 786477, 0, 0, 786478, 0, 0, 786479, 0, 0, 786480, 0, 0, 786481, 0, 0, 786482, 0, 0, 917468, 0, 0, 917469, 0, 0, 917470, 0, 0, 917471, 0, 0, 917472, 0, 0, 917473, 0, 0, 917474, 0, 0, 917475, 0, 0, 917476, 0, 0, 917477, 0, 0, 917478, 0, 0, 917479, 0, 0, 917480, 0, 0, 917481, 0, 0, 917482, 0, 0, 917483, 0, 0, 917484, 0, 0, 917485, 0, 0, 917486, 0, 0, 917487, 0, 0, 917488, 0, 0, 917489, 0, 0, 917490, 0, 0, 917491, 0, 0, 917492, 0, 0, 917493, 0, 0, 917494, 0, 0, 917495, 0, 0, 917496, 0, 0, 917497, 0, 0, 917498, 0, 0, 917499, 0, 0, 917500, 0, 0, 917501, 2, 0, 917502, 2, 0, 917503, 2, 0, 851968, 0, 0, 851969, 0, 0, 851970, 0, 0, 851971, 0, 0, 851972, 0, 0, 851973, 0, 0, 851974, 0, 0, 851975, 0, 0, 851976, 0, 0, 851977, 0, 0, 851978, 0, 0, 851979, 0, 0, 851980, 0, 0, 851981, 0, 0, 851982, 0, 0, 851983, 0, 0, 851984, 0, 0, 851985, 0, 0, 851986, 0, 0, 851987, 0, 0, 851988, 0, 0, 851989, 0, 0, 851990, 0, 0, 851991, 0, 0, 851992, 0, 0, 851993, 0, 0, 851994, 0, 0, 851995, 0, 0, 851996, 0, 0, 851997, 0, 0, 851998, 0, 0, 851999, 0, 0, 852000, 0, 0, 852001, 0, 0, 852002, 0, 0, 852003, 0, 0, 852004, 0, 0, 852005, 0, 0, 852006, 0, 0, 852007, 0, 0, 852008, 0, 0, 852009, 0, 0, 852010, 0, 0, 852011, 0, 0, 852012, 0, 0, 852013, 0, 0, 852014, 0, 0, 852015, 0, 0, 852016, 0, 0, 852017, 0, 0, 852018, 0, 0, 983004, 0, 0, 983005, 0, 0, 983006, 0, 0, 983007, 0, 0, 983008, 0, 0, 983009, 0, 0, 983010, 0, 0, 983011, 0, 0, 983012, 0, 0, 983013, 0, 0, 983014, 0, 0, 983015, 0, 0, 983016, 0, 0, 983017, 0, 0, 983018, 0, 0, 983019, 0, 0, 983020, 0, 0, 983021, 0, 0, 983022, 0, 0, 983023, 0, 0, 983024, 0, 0, 983025, 0, 0, 983026, 0, 0, 983027, 0, 0, 983028, 0, 0, 983029, 0, 0, 983030, 0, 0, 983031, 0, 0, 983032, 0, 0, 983033, 0, 0, 983034, 0, 0, 983035, 0, 0, 983036, 2, 0, 983037, 2, 0, 983038, 2, 0, 983039, 0, 0, 917504, 0, 0, 917505, 0, 0, 917506, 0, 0, 917507, 0, 0, 917508, 0, 0, 917509, 0, 0, 917510, 0, 0, 917511, 0, 0, 917512, 0, 0, 917513, 0, 0, 917514, 0, 0, 917515, 0, 0, 917516, 0, 0, 917517, 0, 0, 917518, 0, 0, 917519, 0, 0, 917520, 0, 0, 917521, 0, 0, 917522, 2, 0, 917523, 0, 0, 917524, 0, 0, 917525, 0, 0, 917526, 0, 0, 917527, 0, 0, 917528, 0, 0, 917529, 0, 0, 917530, 0, 0, 917531, 0, 0, 917532, 0, 0, 917533, 0, 0, 917534, 0, 0, 917535, 0, 0, 917536, 0, 0, 917537, 0, 0, 917538, 0, 0, 917539, 0, 0, 917540, 0, 0, 917541, 0, 0, 917542, 0, 0, 917543, 0, 0, 917544, 0, 0, 917545, 0, 0, 917546, 0, 0, 917547, 0, 0, 917548, 0, 0, 917549, 0, 0, 917550, 0, 0, 917551, 0, 0, 917552, 0, 0, 917553, 0, 0, 917554, 0, 0, 1048540, 0, 0, 1048541, 0, 0, 1048542, 0, 0, 1048543, 0, 0, 1048544, 0, 0, 1048545, 0, 0, 1048546, 0, 0, 1048547, 0, 0, 1048548, 0, 0, 1048549, 0, 0, 1048550, 0, 0, 1048551, 0, 0, 1048552, 0, 0, 1048553, 0, 0, 1048554, 0, 0, 1048555, 0, 0, 1048556, 0, 0, 1048557, 0, 0, 1048558, 0, 0, 1048559, 0, 0, 1048560, 0, 0, 1048561, 0, 0, 1048562, 0, 0, 1048563, 0, 0, 1048564, 0, 0, 1048565, 0, 0, 1048566, 0, 0, 1048567, 0, 0, 1048568, 0, 0, 1048569, 0, 0, 1048570, 0, 0, 1048571, 0, 0, 1048572, 0, 0, 1048573, 2, 0, 1048574, 2, 0, 1048575, 0, 0, 983040, 0, 0, 983041, 0, 0, 983042, 0, 0, 983043, 0, 0, 983044, 0, 0, 983045, 0, 0, 983046, 0, 0, 983047, 0, 0, 983048, 0, 0, 983049, 0, 0, 983050, 0, 0, 983051, 0, 0, 983052, 0, 0, 983053, 0, 0, 983054, 0, 0, 983055, 2, 0, 983056, 2, 0, 983057, 2, 0, 983058, 2, 0, 983059, 0, 0, 983060, 0, 0, 983061, 0, 0, 983062, 0, 0, 983063, 0, 0, 983064, 0, 0, 983065, 0, 0, 983066, 0, 0, 983067, 0, 0, 983068, 0, 0, 983069, 0, 0, 983070, 0, 0, 983071, 0, 0, 983072, 0, 0, 983073, 0, 0, 983074, 0, 0, 983075, 0, 0, 983076, 0, 0, 983077, 0, 0, 983078, 0, 0, 983079, 0, 0, 983080, 0, 0, 983081, 0, 0, 983082, 0, 0, 983083, 0, 0, 983084, 0, 0, 983085, 0, 0, 983086, 0, 0, 983087, 0, 0, 983088, 0, 0, 983089, 0, 0, 983090, 0, 0, 1114076, 0, 0, 1114077, 0, 0, 1114078, 0, 0, 1114079, 0, 0, 1114080, 0, 0, 1114081, 0, 0, 1114082, 0, 0, 1114083, 0, 0, 1114084, 0, 0, 1114085, 0, 0, 1114086, 0, 0, 1114087, 0, 0, 1114088, 0, 0, 1114089, 0, 0, 1114090, 0, 0, 1114091, 0, 0, 1114092, 0, 0, 1114093, 0, 0, 1114094, 0, 0, 1114095, 0, 0, 1114096, 0, 0, 1114097, 0, 0, 1114098, 0, 0, 1114099, 0, 0, 1114100, 0, 0, 1114101, 0, 0, 1114102, 0, 0, 1114103, 0, 0, 1114104, 0, 0, 1114105, 0, 0, 1114106, 0, 0, 1114107, 0, 0, 1114108, 0, 0, 1114109, 0, 0, 1114110, 0, 0, 1114111, 0, 0, 1048576, 0, 0, 1048577, 2, 0, 1048578, 2, 0, 1048579, 0, 0, 1048580, 0, 0, 1048581, 0, 0, 1048582, 0, 0, 1048583, 0, 0, 1048584, 0, 0, 1048585, 0, 0, 1048586, 0, 0, 1048587, 0, 0, 1048588, 0, 0, 1048589, 0, 0, 1048590, 2, 0, 1048591, 0, 0, 1048592, 0, 0, 1048593, 2, 0, 1048594, 0, 0, 1048595, 0, 0, 1048596, 0, 0, 1048597, 0, 0, 1048598, 0, 0, 1048599, 0, 0, 1048600, 0, 0, 1048601, 0, 0, 1048602, 0, 0, 1048603, 0, 0, 1048604, 0, 0, 1048605, 0, 0, 1048606, 0, 0, 1048607, 0, 0, 1048608, 0, 0, 1048609, 0, 0, 1048610, 0, 0, 1048611, 0, 0, 1048612, 0, 0, 1048613, 0, 0, 1048614, 0, 0, 1048615, 0, 0, 1048616, 0, 0, 1048617, 0, 0, 1048618, 0, 0, 1048619, 0, 0, 1048620, 0, 0, 1048621, 0, 0, 1048622, 0, 0, 1048623, 0, 0, 1048624, 0, 0, 1048625, 0, 0, 1048626, 0, 0, 1179613, 0, 0, 1179614, 0, 0, 1179615, 0, 0, 1179616, 0, 0, 1179617, 0, 0, 1179618, 0, 0, 1179619, 0, 0, 1179620, 0, 0, 1179621, 0, 0, 1179622, 0, 0, 1179623, 0, 0, 1179624, 0, 0, 1179625, 0, 0, 1179626, 0, 0, 1179627, 0, 0, 1179628, 0, 0, 1179629, 0, 0, 1179630, 0, 0, 1179631, 0, 0, 1179632, 0, 0, 1179633, 0, 0, 1179634, 0, 0, 1179635, 0, 0, 1179636, 0, 0, 1179637, 0, 0, 1179638, 0, 0, 1179639, 0, 0, 1179640, 0, 0, 1179641, 0, 0, 1179642, 0, 0, 1179643, 0, 0, 1179644, 0, 0, 1179645, 0, 0, 1179646, 0, 0, 1179647, 0, 0, 1114112, 0, 0, 1114113, 0, 0, 1114114, 2, 0, 1114115, 2, 0, 1114116, 2, 0, 1114117, 2, 0, 1114118, 0, 0, 1114119, 0, 0, 1114120, 0, 0, 1114121, 0, 0, 1114122, 0, 0, 1114123, 0, 0, 1114124, 0, 0, 1114125, 0, 0, 1114126, 0, 0, 1114127, 2, 0, 1114128, 0, 0, 1114129, 2, 0, 1114130, 2, 0, 1114131, 0, 0, 1114132, 0, 0, 1114133, 0, 0, 1114134, 0, 0, 1114135, 0, 0, 1114136, 0, 0, 1114137, 0, 0, 1114138, 0, 0, 1114139, 0, 0, 1114140, 0, 0, 1114141, 0, 0, 1114142, 0, 0, 1114143, 0, 0, 1114144, 0, 0, 1114145, 0, 0, 1114146, 0, 0, 1114147, 0, 0, 1114148, 0, 0, 1114149, 0, 0, 1114150, 0, 0, 1114151, 0, 0, 1114152, 0, 0, 1114153, 0, 0, 1114154, 0, 0, 1114155, 0, 0, 1114156, 0, 0, 1114157, 0, 0, 1114158, 0, 0, 1114159, 0, 0, 1114160, 0, 0, 1114161, 0, 0, 1114162, 0, 0, 1245149, 0, 0, 1245150, 0, 0, 1245151, 0, 0, 1245152, 0, 0, 1245153, 0, 0, 1245154, 0, 0, 1245155, 0, 0, 1245156, 0, 0, 1245157, 0, 0, 1245158, 0, 0, 1245159, 0, 0, 1245160, 0, 0, 1245161, 0, 0, 1245162, 0, 0, 1245163, 0, 0, 1245164, 0, 0, 1245165, 0, 0, 1245166, 0, 0, 1245167, 0, 0, 1245168, 0, 0, 1245169, 0, 0, 1245170, 0, 0, 1245171, 0, 0, 1245172, 0, 0, 1245173, 0, 0, 1245174, 0, 0, 1245175, 0, 0, 1245176, 0, 0, 1245177, 0, 0, 1245178, 0, 0, 1245179, 0, 0, 1245180, 0, 0, 1245181, 0, 0, 1245182, 0, 0, 1245183, 0, 0, 1179648, 0, 0, 1179649, 0, 0, 1179650, 0, 0, 1179651, 0, 0, 1179652, 2, 0, 1179653, 2, 0, 1179654, 2, 0, 1179655, 0, 0, 1179656, 0, 0, 1179657, 0, 0, 1179658, 0, 0, 1179659, 0, 0, 1179660, 0, 0, 1179661, 0, 0, 1179662, 0, 0, 1179663, 0, 0, 1179664, 2, 0, 1179665, 2, 0, 1179666, 2, 0, 1179667, 0, 0, 1179668, 0, 0, 1179669, 0, 0, 1179670, 0, 0, 1179671, 0, 0, 1179672, 0, 0, 1179673, 0, 0, 1179674, 0, 0, 1179675, 0, 0, 1179676, 0, 0, 1179677, 0, 0, 1179678, 0, 0, 1179679, 0, 0, 1179680, 0, 0, 1179681, 0, 0, 1179682, 0, 0, 1179683, 0, 0, 1179684, 0, 0, 1179685, 0, 0, 1179686, 0, 0, 1179687, 0, 0, 1179688, 0, 0, 1179689, 0, 0, 1179690, 0, 0, 1179691, 0, 0, 1179692, 0, 0, 1179693, 0, 0, 1179694, 0, 0, 1179695, 0, 0, 1179696, 0, 0, 1179697, 0, 0, 1310685, 0, 0, 1310686, 0, 0, 1310687, 0, 0, 1310688, 0, 0, 1310689, 0, 0, 1310690, 0, 0, 1310691, 0, 0, 1310692, 0, 0, 1310693, 0, 0, 1310694, 0, 0, 1310695, 0, 0, 1310696, 0, 0, 1310697, 0, 0, 1310698, 0, 0, 1310699, 0, 0, 1310700, 0, 0, 1310701, 0, 0, 1310702, 0, 0, 1310703, 0, 0, 1310704, 0, 0, 1310705, 0, 0, 1310706, 0, 0, 1310707, 0, 0, 1310708, 0, 0, 1310709, 0, 0, 1310710, 0, 0, 1310711, 0, 0, 1310712, 0, 0, 1310713, 0, 0, 1310714, 0, 0, 1310715, 0, 0, 1310716, 0, 0, 1310717, 0, 0, 1310718, 0, 0, 1310719, 0, 0, 1245184, 0, 0, 1245185, 0, 0, 1245186, 0, 0, 1245187, 0, 0, 1245188, 0, 0, 1245189, 2, 0, 1245190, 0, 0, 1245191, 0, 0, 1245192, 0, 0, 1245193, 0, 0, 1245194, 0, 0, 1245195, 0, 0, 1245196, 0, 0, 1245197, 0, 0, 1245198, 0, 0, 1245199, 0, 0, 1245200, 2, 0, 1245201, 0, 0, 1245202, 0, 0, 1245203, 0, 0, 1245204, 0, 0, 1245205, 0, 0, 1245206, 0, 0, 1245207, 0, 0, 1245208, 0, 0, 1245209, 0, 0, 1245210, 0, 0, 1245211, 0, 0, 1245212, 0, 0, 1245213, 0, 0, 1245214, 0, 0, 1245215, 0, 0, 1245216, 0, 0, 1245217, 0, 0, 1245218, 0, 0, 1245219, 0, 0, 1245220, 0, 0, 1245221, 0, 0, 1245222, 0, 0, 1245223, 0, 0, 1245224, 0, 0, 1245225, 0, 0, 1245226, 0, 0, 1245227, 0, 0, 1245228, 0, 0, 1245229, 0, 0, 1245230, 0, 0, 1245231, 0, 0, 1245232, 0, 0, 1376221, 0, 0, 1376222, 0, 0, 1376223, 0, 0, 1376224, 0, 0, 1376225, 0, 0, 1376226, 0, 0, 1376227, 0, 0, 1376228, 0, 0, 1376229, 0, 0, 1376230, 0, 0, 1376231, 0, 0, 1376232, 0, 0, 1376233, 0, 0, 1376234, 0, 0, 1376235, 0, 0, 1376236, 0, 0, 1376237, 0, 0, 1376238, 0, 0, 1376239, 0, 0, 1376240, 0, 0, 1376241, 0, 0, 1376242, 0, 0, 1376243, 0, 0, 1376244, 0, 0, 1376245, 0, 0, 1376246, 0, 0, 1376247, 0, 0, 1376248, 0, 0, 1376249, 0, 0, 1376250, 0, 0, 1376251, 0, 0, 1376252, 0, 0, 1376253, 0, 0, 1376254, 0, 0, 1376255, 0, 0, 1310720, 0, 0, 1310721, 0, 0, 1310722, 0, 0, 1310723, 0, 0, 1310724, 2, 0, 1310725, 2, 0, 1310726, 0, 0, 1310727, 0, 0, 1310728, 0, 0, 1310729, 0, 0, 1310730, 0, 0, 1310731, 0, 0, 1310732, 0, 0, 1310733, 0, 0, 1310734, 0, 0, 1310735, 0, 0, 1310736, 0, 0, 1310737, 0, 0, 1310738, 0, 0, 1310739, 0, 0, 1310740, 0, 0, 1310741, 0, 0, 1310742, 0, 0, 1310743, 0, 0, 1310744, 0, 0, 1310745, 0, 0, 1310746, 0, 0, 1310747, 0, 0, 1310748, 0, 0, 1310749, 0, 0, 1310750, 0, 0, 1310751, 0, 0, 1310752, 0, 0, 1310753, 0, 0, 1310754, 0, 0, 1310755, 0, 0, 1310756, 0, 0, 1310757, 0, 0, 1310758, 0, 0, 1310759, 0, 0, 1310760, 0, 0, 1310761, 0, 0, 1310762, 0, 0, 1310763, 0, 0, 1310764, 0, 0, 1310765, 0, 0, 1310766, 0, 0, 1310767, 0, 0, 1310768, 0, 0, 1441757, 0, 0, 1441758, 0, 0, 1441759, 0, 0, 1441760, 0, 0, 1441761, 0, 0, 1441762, 0, 0, 1441763, 0, 0, 1441764, 0, 0, 1441765, 0, 0, 1441766, 0, 0, 1441767, 0, 0, 1441768, 0, 0, 1441769, 0, 0, 1441770, 0, 0, 1441771, 0, 0, 1441772, 0, 0, 1441773, 0, 0, 1441774, 0, 0, 1441775, 0, 0, 1441776, 0, 0, 1441777, 0, 0, 1441778, 0, 0, 1441779, 0, 0, 1441780, 0, 0, 1441781, 0, 0, 1441782, 0, 0, 1441783, 0, 0, 1441784, 0, 0, 1441785, 0, 0, 1441786, 0, 0, 1441787, 0, 0, 1441788, 0, 0, 1441789, 0, 0, 1441790, 0, 0, 1441791, 0, 0, 1376256, 0, 0, 1376257, 0, 0, 1376258, 0, 0, 1376259, 0, 0, 1376260, 0, 0, 1376261, 0, 0, 1376262, 0, 0, 1376263, 0, 0, 1376264, 0, 0, 1376265, 0, 0, 1376266, 0, 0, 1376267, 0, 0, 1376268, 0, 0, 1376269, 0, 0, 1376270, 0, 0, 1376271, 0, 0, 1376272, 0, 0, 1376273, 0, 0, 1376274, 0, 0, 1376275, 0, 0, 1376276, 0, 0, 1376277, 0, 0, 1376278, 0, 0, 1376279, 0, 0, 1376280, 0, 0, 1376281, 0, 0, 1376282, 0, 0, 1376283, 0, 0, 1376284, 0, 0, 1376285, 0, 0, 1376286, 0, 0, 1376287, 0, 0, 1376288, 0, 0, 1376289, 0, 0, 1376290, 0, 0, 1376291, 0, 0, 1376292, 0, 0, 1376293, 0, 0, 1376294, 0, 0, 1376295, 0, 0, 1376296, 0, 0, 1376297, 0, 0, 1376298, 0, 0, 1376299, 0, 0, 1376300, 0, 0, 1376301, 0, 0, 1376302, 0, 0, 1376303, 0, 0, 1376304, 0, 0, 1507293, 0, 0, 1507294, 0, 0, 1507295, 0, 0, 1507296, 0, 0, 1507297, 0, 0, 1507298, 0, 0, 1507299, 0, 0, 1507300, 0, 0, 1507301, 0, 0, 1507302, 0, 0, 1507303, 0, 0, 1507304, 0, 0, 1507305, 0, 0, 1507306, 0, 0, 1507307, 0, 0, 1507308, 0, 0, 1507309, 0, 0, 1507310, 0, 0, 1507311, 0, 0, 1507312, 0, 0, 1507313, 0, 0, 1507314, 0, 0, 1507315, 0, 0, 1507316, 0, 0, 1507317, 0, 0, 1507318, 0, 0, 1507319, 0, 0, 1507320, 0, 0, 1507321, 0, 0, 1507322, 0, 0, 1507323, 0, 0, 1507324, 0, 0, 1507325, 0, 0, 1507326, 0, 0, 1507327, 0, 0, 1441792, 0, 0, 1441793, 0, 0, 1441794, 0, 0, 1441795, 0, 0, 1441796, 0, 0, 1441797, 0, 0, 1441798, 0, 0, 1441799, 0, 0, 1441800, 0, 0, 1441801, 0, 0, 1441802, 0, 0, 1441803, 0, 0, 1441804, 0, 0, 1441805, 0, 0, 1441806, 0, 0, 1441807, 0, 0, 1441808, 0, 0, 1441809, 0, 0, 1441810, 0, 0, 1441811, 0, 0, 1441812, 0, 0, 1441813, 0, 0, 1441814, 0, 0, 1441815, 0, 0, 1441816, 0, 0, 1441817, 0, 0, 1441818, 0, 0, 1441819, 0, 0, 1441820, 0, 0, 1441821, 0, 0, 1441822, 0, 0, 1441823, 0, 0, 1441824, 0, 0, 1441825, 0, 0, 1441826, 0, 0, 1441827, 0, 0, 1441828, 0, 0, 1441829, 0, 0, 1441830, 0, 0, 1441831, 0, 0, 1441832, 0, 0, 1441833, 0, 0, 1441834, 0, 0, 1441835, 0, 0, 1441836, 0, 0, 1441837, 0, 0, 1441838, 0, 0, 1441839, 0, 0, 1441840, 0, 0, 1572829, 0, 0, 1572830, 0, 0, 1572831, 0, 0, 1572832, 0, 0, 1572833, 0, 0, 1572834, 0, 0, 1572835, 0, 0, 1572836, 0, 0, 1572837, 0, 0, 1572838, 0, 0, 1572839, 0, 0, 1572840, 0, 0, 1572841, 0, 0, 1572842, 0, 0, 1572843, 0, 0, 1572844, 0, 0, 1572845, 0, 0, 1572846, 0, 0, 1572847, 0, 0, 1572848, 0, 0, 1572849, 0, 0, 1572850, 0, 0, 1572851, 0, 0, 1572852, 0, 0, 1572853, 0, 0, 1572854, 0, 0, 1572855, 0, 0, 1572856, 0, 0, 1572857, 0, 0, 1572858, 0, 0, 1572859, 0, 0, 1572860, 0, 0, 1572861, 0, 0, 1572862, 0, 0, 1572863, 0, 0, 1507328, 0, 0, 1507329, 0, 0, 1507330, 0, 0, 1507331, 0, 0, 1507332, 0, 0, 1507333, 0, 0, 1507334, 0, 0, 1507335, 0, 0, 1507336, 0, 0, 1507337, 0, 0, 1507338, 0, 0, 1507339, 0, 0, 1507340, 0, 0, 1507341, 0, 0, 1507342, 0, 0, 1507343, 0, 0, 1507344, 0, 0, 1507345, 0, 0, 1507346, 0, 0, 1507347, 0, 0, 1507348, 0, 0, 1507349, 0, 0, 1507350, 0, 0, 1507351, 0, 0, 1507352, 0, 0, 1507353, 0, 0, 1507354, 0, 0, 1507355, 0, 0, 1507356, 0, 0, 1507357, 0, 0, 1507358, 0, 0, 1507359, 0, 0, 1507360, 0, 0, 1507361, 0, 0, 1507362, 0, 0, 1507363, 0, 0, 1507364, 0, 0, 1507365, 0, 0, 1507366, 0, 0, 1507367, 0, 0, 1507368, 0, 0, 1507369, 0, 0, 1507370, 0, 0, 1507371, 0, 0, 1507372, 0, 0, 1507373, 0, 0, 1507374, 0, 0, 1507375, 0, 0, 1507376, 0, 0, 1638365, 0, 0, 1638366, 0, 0, 1638367, 0, 0, 1638368, 0, 0, 1638369, 0, 0, 1638370, 0, 0, 1638371, 0, 0, 1638372, 0, 0, 1638373, 0, 0, 1638374, 0, 0, 1638375, 0, 0, 1638376, 0, 0, 1638377, 0, 0, 1638378, 0, 0, 1638379, 0, 0, 1638380, 0, 0, 1638381, 0, 0, 1638382, 0, 0, 1638383, 0, 0, 1638384, 0, 0, 1638385, 0, 0, 1638386, 0, 0, 1638387, 0, 0, 1638388, 0, 0, 1638389, 0, 0, 1638390, 0, 0, 1638391, 0, 0, 1638392, 0, 0, 1638393, 0, 0, 1638394, 0, 0, 1638395, 0, 0, 1638396, 0, 0, 1638397, 0, 0, 1638398, 0, 0, 1638399, 0, 0, 1572864, 0, 0, 1572865, 0, 0, 1572866, 0, 0, 1572867, 0, 0, 1572868, 0, 0, 1572869, 0, 0, 1572870, 0, 0, 1572871, 0, 0, 1572872, 0, 0, 1572873, 0, 0, 1572874, 0, 0, 1572875, 0, 0, 1572876, 0, 0, 1572877, 0, 0, 1572878, 0, 0, 1572879, 0, 0, 1572880, 0, 0, 1572881, 0, 0, 1572882, 0, 0, 1572883, 0, 0, 1572884, 0, 0, 1572885, 0, 0, 1572886, 0, 0, 1572887, 0, 0, 1572888, 0, 0, 1572889, 0, 0, 1572890, 0, 0, 1572891, 0, 0, 1572892, 0, 0, 1572893, 0, 0, 1572894, 0, 0, 1572895, 0, 0, 1572896, 0, 0, 1572897, 0, 0, 1572898, 0, 0, 1572899, 0, 0, 1572900, 0, 0, 1572901, 0, 0, 1572902, 0, 0, 1572903, 0, 0, 1572904, 0, 0, 1572905, 0, 0, 1572906, 0, 0, 1572907, 0, 0, 1572908, 0, 0, 1572909, 0, 0, 1572910, 0, 0, 1572911, 0, 0, 1572912, 0, 0, 1703902, 0, 0, 1703903, 0, 0, 1703904, 0, 0, 1703905, 0, 0, 1703906, 0, 0, 1703907, 0, 0, 1703908, 0, 0, 1703909, 0, 0, 1703910, 0, 0, 1703911, 0, 0, 1703912, 0, 0, 1703913, 0, 0, 1703914, 0, 0, 1703915, 0, 0, 1703916, 0, 0, 1703917, 0, 0, 1703918, 0, 0, 1703919, 0, 0, 1703920, 0, 0, 1703921, 0, 0, 1703922, 0, 0, 1703923, 0, 0, 1703924, 0, 0, 1703925, 0, 0, 1703926, 0, 0, 1703927, 0, 0, 1703928, 0, 0, 1703929, 0, 0, 1703930, 0, 0, 1703931, 0, 0, 1703932, 0, 0, 1703933, 0, 0, 1703934, 0, 0, 1703935, 0, 0, 1638400, 0, 0, 1638401, 0, 0, 1638402, 0, 0, 1638403, 0, 0, 1638404, 0, 0, 1638405, 0, 0, 1638406, 0, 0, 1638407, 0, 0, 1638408, 0, 0, 1638409, 0, 0, 1638410, 0, 0, 1638411, 0, 0, 1638412, 0, 0, 1638413, 0, 0, 1638414, 0, 0, 1638415, 0, 0, 1638416, 0, 0, 1638417, 0, 0, 1638418, 0, 0, 1638419, 0, 0, 1638420, 0, 0, 1638421, 0, 0, 1638422, 0, 0, 1638423, 0, 0, 1638424, 0, 0, 1638425, 0, 0, 1638426, 0, 0, 1638427, 0, 0, 1638428, 0, 0, 1638429, 0, 0, 1638430, 0, 0, 1638431, 0, 0, 1638432, 0, 0, 1638433, 0, 0, 1638434, 0, 0, 1638435, 0, 0, 1638436, 0, 0, 1638437, 0, 0, 1638438, 0, 0, 1638439, 0, 0, 1638440, 0, 0, 1638441, 0, 0, 1638442, 0, 0, 1638443, 0, 0, 1638444, 0, 0, 1638445, 0, 0, 1638446, 0, 0, 1638447, 0, 0, 1638448, 0, 0, 1769438, 0, 0, 1769439, 0, 0, 1769440, 0, 0, 1769441, 0, 0, 1769442, 0, 0, 1769443, 0, 0, 1769444, 0, 0, 1769445, 0, 0, 1769446, 0, 0, 1769447, 0, 0, 1769448, 0, 0, 1769449, 0, 0, 1769450, 0, 0, 1769451, 0, 0, 1769452, 0, 0, 1769453, 0, 0, 1769454, 0, 0, 1769455, 0, 0, 1769456, 0, 0, 1769457, 0, 0, 1769458, 0, 0, 1769459, 0, 0, 1769460, 0, 0, 1769461, 0, 0, 1769462, 0, 0, 1769463, 0, 0, 1769464, 0, 0, 1769465, 0, 0, 1769466, 0, 0, 1769467, 0, 0, 1769468, 0, 0, 1769469, 0, 0, 1769470, 0, 0, 1769471, 0, 0, 1703936, 0, 0, 1703937, 0, 0, 1703938, 0, 0, 1703939, 0, 0, 1703940, 0, 0, 1703941, 0, 0, 1703942, 0, 0, 1703943, 0, 0, 1703944, 0, 0, 1703945, 0, 0, 1703946, 0, 0, 1703947, 0, 0, 1703948, 0, 0, 1703949, 0, 0, 1703950, 0, 0, 1703951, 0, 0, 1703952, 0, 0, 1703953, 0, 0, 1703954, 0, 0, 1703955, 0, 0, 1703956, 0, 0, 1703957, 0, 0, 1703958, 0, 0, 1703959, 0, 0, 1703960, 0, 0, 1703961, 0, 0, 1703962, 0, 0, 1703963, 0, 0, 1703964, 0, 0, 1703965, 0, 0, 1703966, 0, 0, 1703967, 0, 0, 1703968, 0, 0, 1703969, 0, 0, 1703970, 0, 0, 1703971, 0, 0, 1703972, 0, 0, 1703973, 0, 0, 1703974, 0, 0, 1703975, 0, 0, 1703976, 0, 0, 1703977, 0, 0, 1703978, 0, 0, 1703979, 0, 0, 1703980, 0, 0, 1703981, 0, 0, 1703982, 0, 0, 1703983, 0, 0, 1703984, 0, 0, 1834974, 0, 0, 1834975, 0, 0, 1834976, 0, 0, 1834977, 0, 0, 1834978, 0, 0, 1834979, 0, 0, 1834980, 0, 0, 1834981, 0, 0, 1834982, 0, 0, 1834983, 0, 0, 1834984, 0, 0, 1834985, 0, 0, 1834986, 0, 0, 1834987, 0, 0, 1834988, 0, 0, 1834989, 0, 0, 1834990, 0, 0, 1834991, 0, 0, 1834992, 0, 0, 1834993, 0, 0, 1834994, 0, 0, 1834995, 0, 0, 1834996, 0, 0, 1834997, 0, 0, 1834998, 0, 0, 1834999, 0, 0, 1835000, 0, 0, 1835001, 0, 0, 1835002, 0, 0, 1835003, 0, 0, 1835004, 0, 0, 1835005, 0, 0, 1835006, 0, 0, 1835007, 0, 0, 1769472, 0, 0, 1769473, 0, 0, 1769474, 0, 0, 1769475, 0, 0, 1769476, 0, 0, 1769477, 0, 0, 1769478, 0, 0, 1769479, 0, 0, 1769480, 0, 0, 1769481, 0, 0, 1769482, 0, 0, 1769483, 0, 0, 1769484, 0, 0, 1769485, 0, 0, 1769486, 0, 0, 1769487, 0, 0, 1769488, 0, 0, 1769489, 0, 0, 1769490, 0, 0, 1769491, 0, 0, 1769492, 0, 0, 1769493, 0, 0, 1769494, 0, 0, 1769495, 0, 0, 1769496, 0, 0, 1769497, 0, 0, 1769498, 0, 0, 1769499, 0, 0, 1769500, 0, 0, 1769501, 0, 0, 1769502, 0, 0, 1769503, 0, 0, 1769504, 0, 0, 1769505, 0, 0, 1769506, 0, 0, 1769507, 0, 0, 1769508, 0, 0, 1769509, 0, 0, 1769510, 0, 0, 1769511, 0, 0, 1769512, 0, 0, 1769513, 0, 0, 1769514, 0, 0, 1769515, 0, 0, 1769516, 0, 0, 1769517, 0, 0, 1769518, 0, 0, 1769519, 0, 0, 1900511, 0, 0, 1900512, 0, 0, 1900513, 0, 0, 1900514, 0, 0, 1900515, 0, 0, 1900516, 0, 0, 1900517, 0, 0, 1900518, 0, 0, 1900519, 0, 0, 1900520, 0, 0, 1900521, 0, 0, 1900522, 0, 0, 1900523, 0, 0, 1900524, 0, 0, 1900525, 0, 0, 1900526, 0, 0, 1900527, 0, 0, 1900528, 0, 0, 1900529, 0, 0, 1900530, 0, 0, 1900531, 0, 0, 1900532, 0, 0, 1900533, 0, 0, 1900534, 0, 0, 1900535, 0, 0, 1900536, 0, 0, 1900537, 0, 0, 1900538, 0, 0, 1900539, 0, 0, 1900540, 0, 0, 1900541, 0, 0, 1900542, 0, 0, 1900543, 0, 0, 1835008, 0, 0, 1835009, 0, 0, 1835010, 0, 0, 1835011, 0, 0, 1835012, 0, 0, 1835013, 0, 0, 1835014, 0, 0, 1835015, 0, 0, 1835016, 0, 0, 1835017, 0, 0, 1835018, 0, 0, 1835019, 0, 0, 1835020, 0, 0, 1835021, 0, 0, 1835022, 0, 0, 1835023, 0, 0, 1835024, 0, 0, 1835025, 0, 0, 1835026, 0, 0, 1835027, 0, 0, 1835028, 0, 0, 1835029, 0, 0, 1835030, 0, 0, 1835031, 0, 0, 1835032, 0, 0, 1835033, 0, 0, 1835034, 0, 0, 1835035, 0, 0, 1835036, 0, 0, 1835037, 0, 0, 1835038, 0, 0, 1835039, 0, 0, 1835040, 0, 0, 1835041, 0, 0, 1835042, 0, 0, 1835043, 0, 0, 1835044, 0, 0, 1835045, 0, 0, 1835046, 0, 0, 1835047, 0, 0, 1835048, 0, 0, 1835049, 0, 0, 1835050, 0, 0, 1835051, 0, 0, 1835052, 0, 0, 1835053, 0, 0, 1835054, 0, 0, 1835055, 0, 0, 1966047, 0, 0, 1966048, 0, 0, 1966049, 0, 0, 1966050, 0, 0, 1966051, 0, 0, 1966052, 0, 0, 1966053, 0, 0, 1966054, 0, 0, 1966055, 0, 0, 1966056, 0, 0, 1966057, 0, 0, 1966058, 0, 0, 1966059, 0, 0, 1966060, 0, 0, 1966061, 0, 0, 1966062, 0, 0, 1966063, 0, 0, 1966064, 0, 0, 1966065, 0, 0, 1966066, 0, 0, 1966067, 0, 0, 1966068, 0, 0, 1966069, 0, 0, 1966070, 0, 0, 1966071, 0, 0, 1966072, 0, 0, 1966073, 0, 0, 1966074, 0, 0, 1966075, 0, 0, 1966076, 0, 0, 1966077, 0, 0, 1966078, 0, 0, 1966079, 0, 0, 1900544, 0, 0, 1900545, 0, 0, 1900546, 0, 0, 1900547, 0, 0, 1900548, 0, 0, 1900549, 0, 0, 1900550, 0, 0, 1900551, 0, 0, 1900552, 0, 0, 1900553, 0, 0, 1900554, 0, 0, 1900555, 0, 0, 1900556, 0, 0, 1900557, 0, 0, 1900558, 0, 0, 1900559, 0, 0, 1900560, 0, 0, 1900561, 0, 0, 1900562, 0, 0, 1900563, 0, 0, 1900564, 0, 0, 1900565, 0, 0, 1900566, 0, 0, 1900567, 0, 0, 1900568, 0, 0, 1900569, 0, 0, 1900570, 0, 0, 1900571, 0, 0, 1900572, 0, 0, 1900573, 0, 0, 1900574, 0, 0, 1900575, 0, 0, 1900576, 0, 0, 1900577, 0, 0, 1900578, 0, 0, 1900579, 0, 0, 1900580, 0, 0, 1900581, 0, 0, 1900582, 0, 0, 1900583, 0, 0, 1900584, 0, 0, 1900585, 0, 0, 1900586, 0, 0, 1900587, 0, 0, 1900588, 0, 0, 1900589, 0, 0, 1900590, 0, 0, 1900591, 0, 0, 2031583, 0, 0, 2031584, 0, 0, 2031585, 0, 0, 2031586, 0, 0, 2031587, 0, 0, 2031588, 0, 0, 2031589, 0, 0, 2031590, 0, 0, 2031591, 0, 0, 2031592, 0, 0, 2031593, 0, 0, 2031594, 0, 0, 2031595, 0, 0, 2031596, 0, 0, 2031597, 0, 0, 2031598, 0, 0, 2031599, 0, 0, 2031600, 0, 0, 2031601, 0, 0, 2031602, 0, 0, 2031603, 0, 0, 2031604, 0, 0, 2031605, 0, 0, 2031606, 0, 0, 2031607, 0, 0, 2031608, 0, 0, 2031609, 0, 0, 2031610, 0, 0, 2031611, 0, 0, 2031612, 0, 0, 2031613, 0, 0, 2031614, 0, 0, 2031615, 0, 0, 1966080, 0, 0, 1966081, 0, 0, 1966082, 0, 0, 1966083, 0, 0, 1966084, 0, 0, 1966085, 0, 0, 1966086, 0, 0, 1966087, 0, 0, 1966088, 0, 0, 1966089, 0, 0, 1966090, 0, 0, 1966091, 0, 0, 1966092, 0, 0, 1966093, 0, 0, 1966094, 0, 0, 1966095, 0, 0, 1966096, 0, 0, 1966097, 0, 0, 1966098, 0, 0, 1966099, 0, 0, 1966100, 0, 0, 1966101, 0, 0, 1966102, 0, 0, 1966103, 0, 0, 1966104, 0, 0, 1966105, 0, 0, 1966106, 0, 0, 1966107, 0, 0, 1966108, 0, 0, 1966109, 0, 0, 1966110, 0, 0, 1966111, 0, 0, 1966112, 0, 0, 1966113, 0, 0, 1966114, 0, 0, 1966115, 0, 0, 1966116, 0, 0, 1966117, 0, 0, 1966118, 0, 0, 1966119, 0, 0, 1966120, 0, 0, 1966121, 0, 0, 1966122, 0, 0, 1966123, 0, 0, 1966124, 0, 0, 1966125, 0, 0, 1966126, 0, 0, 1966127, 0, 0, 2097119, 0, 0, 2097120, 0, 0, 2097121, 0, 0, 2097122, 0, 0, 2097123, 0, 0, 2097124, 0, 0, 2097125, 0, 0, 2097126, 0, 0, 2097127, 0, 0, 2097128, 0, 0, 2097129, 0, 0, 2097130, 0, 0, 2097131, 0, 0, 2097132, 0, 0, 2097133, 0, 0, 2097134, 0, 0, 2097135, 0, 0, 2097136, 0, 0, 2097137, 0, 0, 2097138, 0, 0, 2097139, 0, 0, 2097140, 0, 0, 2097141, 0, 0, 2097142, 0, 0, 2097143, 0, 0, 2097144, 0, 0, 2097145, 0, 0, 2097146, 0, 0, 2097147, 0, 0, 2097148, 0, 0, 2097149, 0, 0, 2097150, 0, 0, 2097151, 0, 0, 2031616, 0, 0, 2031617, 0, 0, 2031618, 0, 0, 2031619, 0, 0, 2031620, 0, 0, 2031621, 0, 0, 2031622, 0, 0, 2031623, 0, 0, 2031624, 0, 0, 2031625, 0, 0, 2031626, 0, 0, 2031627, 0, 0, 2031628, 0, 0, 2031629, 0, 0, 2031630, 0, 0, 2031631, 0, 0, 2031632, 0, 0, 2031633, 0, 0, 2031634, 0, 0, 2031635, 0, 0, 2031636, 0, 0, 2031637, 0, 0, 2031638, 0, 0, 2031639, 0, 0, 2031640, 0, 0, 2031641, 0, 0, 2031642, 0, 0, 2031643, 0, 0, 2031644, 0, 0, 2031645, 0, 0, 2031646, 0, 0, 2031647, 0, 0, 2031648, 0, 0, 2031649, 0, 0, 2031650, 0, 0, 2031651, 0, 0, 2031652, 0, 0, 2031653, 0, 0, 2031654, 0, 0, 2031655, 0, 0, 2031656, 0, 0, 2031657, 0, 0, 2031658, 0, 0, 2031659, 0, 0, 2031660, 0, 0, 2031661, 0, 0, 2031662, 0, 0, 2031663, 0, 0, 2162655, 0, 0, 2162656, 0, 0, 2162657, 0, 0, 2162658, 0, 0, 2162659, 0, 0, 2162660, 0, 0, 2162661, 0, 0, 2162662, 0, 0, 2162663, 0, 0, 2162664, 0, 0, 2162665, 0, 0, 2162666, 0, 0, 2162667, 0, 0, 2162668, 0, 0, 2162669, 0, 0, 2162670, 0, 0, 2162671, 0, 0, 2162672, 0, 0, 2162673, 0, 0, 2162674, 0, 0, 2162675, 0, 0, 2162676, 0, 0, 2162677, 0, 0, 2162678, 0, 0, 2162679, 0, 0, 2162680, 0, 0, 2162681, 0, 0, 2162682, 0, 0, 2162683, 0, 0, 2162684, 0, 0, 2162685, 0, 0, 2162686, 0, 0, 2162687, 0, 0, 2097152, 0, 0, 2097153, 0, 0, 2097154, 0, 0, 2097155, 0, 0, 2097156, 0, 0, 2097157, 0, 0, 2097158, 0, 0, 2097159, 0, 0, 2097160, 0, 0, 2097161, 0, 0, 2097162, 0, 0, 2097163, 0, 0, 2097164, 0, 0, 2097165, 0, 0, 2097166, 0, 0, 2097167, 0, 0, 2097168, 0, 0, 2097169, 0, 0, 2097170, 0, 0, 2097171, 0, 0, 2097172, 0, 0, 2097173, 0, 0, 2097174, 0, 0, 2097175, 0, 0, 2097176, 0, 0, 2097177, 0, 0, 2097178, 0, 0, 2097179, 0, 0, 2097180, 0, 0, 2097181, 0, 0, 2097182, 0, 0, 2097183, 0, 0, 2097184, 0, 0, 2097185, 0, 0, 2097186, 0, 0, 2097187, 0, 0, 2097188, 0, 0, 2097189, 0, 0, 2097190, 0, 0, 2097191, 0, 0, 2097192, 0, 0, 2097193, 0, 0, 2097194, 0, 0, 2097195, 0, 0, 2097196, 0, 0, 2097197, 0, 0, 2097198, 0, 0, 2097199, 0, 0, 2097200, 0, 0, 2228191, 0, 0, 2228192, 0, 0, 2228193, 0, 0, 2228194, 0, 0, 2228195, 0, 0, 2228196, 0, 0, 2228197, 0, 0, 2228198, 0, 0, 2228199, 0, 0, 2228200, 0, 0, 2228201, 0, 0, 2228202, 0, 0, 2228203, 0, 0, 2228204, 0, 0, 2228205, 0, 0, 2228206, 0, 0, 2228207, 0, 0, 2228208, 0, 0, 2228209, 0, 0, 2228210, 0, 0, 2228219, 0, 0, 2228220, 0, 0, 2228221, 0, 0, 2228222, 0, 0, 2228223, 0, 0, 2162688, 0, 0, 2162689, 0, 0, 2162690, 0, 0, 2162691, 0, 0, 2162692, 0, 0, 2162693, 0, 0, 2162694, 0, 0, 2162695, 0, 0, 2162696, 0, 0, 2162697, 0, 0, 2162698, 0, 0, 2162699, 0, 0, 2162700, 0, 0, 2162701, 0, 0, 2162702, 0, 0, 2162703, 0, 0, 2162704, 0, 0, 2162705, 0, 0, 2162706, 0, 0, 2162707, 0, 0, 2162708, 0, 0, 2162709, 0, 0, 2162710, 0, 0, 2162711, 0, 0, 2162712, 0, 0, 2162713, 0, 0, 2162714, 0, 0, 2162715, 0, 0, 2162716, 0, 0, 2162717, 0, 0, 2162718, 0, 0, 2162719, 0, 0, 2162720, 0, 0, 2162721, 0, 0, 2162722, 0, 0, 2162723, 0, 0, 2162724, 0, 0, 2162725, 0, 0, 2162726, 0, 0, 2162727, 0, 0, 2162728, 0, 0, 2162729, 0, 0, 2162730, 0, 0, 2162731, 0, 0, 2162732, 0, 0, 2162733, 0, 0, 2162734, 0, 0, 2162735, 0, 0, 2162736, 0, 0, 2293727, 0, 0, 2293728, 0, 0, 2293729, 0, 0, 2293730, 0, 0, 2293731, 0, 0, 2293732, 0, 0, 2293733, 0, 0, 2293734, 0, 0, 2293735, 0, 0, 2293736, 0, 0, 2293737, 0, 0, 2293738, 0, 0, 2293739, 0, 0, 2293740, 0, 0, 2293741, 0, 0, 2293742, 0, 0, 2228225, 0, 0, 2228226, 0, 0, 2228227, 0, 0, 2228228, 0, 0, 2228229, 0, 0, 2228230, 0, 0, 2228231, 0, 0, 2228232, 0, 0, 2228233, 0, 0, 2228234, 0, 0, 2228235, 0, 0, 2228236, 0, 0, 2228237, 0, 0, 2228238, 0, 0, 2228239, 0, 0, 2228240, 0, 0, 2228241, 0, 0, 2228242, 0, 0, 2228243, 0, 0, 2228244, 0, 0, 2228245, 0, 0, 2228246, 0, 0, 2228247, 0, 0, 2228248, 0, 0, 2228249, 0, 0, 2228250, 0, 0, 2228251, 0, 0, 2228252, 0, 0, 2228253, 0, 0, 2228254, 0, 0, 2228255, 0, 0, 2228256, 0, 0, 2228257, 0, 0, 2228258, 0, 0, 2228259, 0, 0, 2228260, 0, 0, 2228261, 0, 0, 2228262, 0, 0, 2228263, 0, 0, 2228264, 0, 0, 2228265, 0, 0, 2228266, 0, 0, 2228267, 0, 0, 2228268, 0, 0, 2228269, 0, 0, 2228270, 0, 0, 2228271, 0, 0, 2228272, 0, 0, 2359263, 0, 0, 2359264, 0, 0, 2359265, 0, 0, 2359266, 0, 0, 2359267, 0, 0, 2359268, 0, 0, 2359269, 0, 0, 2359270, 0, 0, 2359271, 0, 0, 2359272, 0, 0, 2293773, 0, 0, 2293774, 0, 0, 2293775, 0, 0, 2293776, 0, 0, 2293777, 0, 0, 2293778, 0, 0, 2293779, 0, 0, 2293780, 0, 0, 2293781, 0, 0, 2293782, 0, 0, 2293783, 0, 0, 2293784, 0, 0, 2293785, 0, 0, 2293786, 0, 0, 2293787, 0, 0, 2293788, 0, 0, 2293789, 0, 0, 2293790, 0, 0, 2293791, 0, 0, 2293792, 0, 0, 2293793, 0, 0, 2293794, 0, 0, 2293795, 0, 0, 2293796, 0, 0, 2293797, 0, 0, 2293798, 0, 0, 2293799, 0, 0, 2293800, 0, 0, 2293801, 0, 0, 2293802, 0, 0, 2293803, 0, 0, 2293804, 0, 0, 2293805, 0, 0, 2293806, 0, 0, 2293807, 0, 0, 2293808, 0, 0, 2424799, 0, 0, 2424800, 0, 0, 2424801, 0, 0, 2424802, 0, 0, 2424803, 0, 0, 2359323, 0, 0, 2359324, 0, 0, 2359325, 0, 0, 2359326, 0, 0, 2359327, 0, 0, 2359328, 0, 0, 2359329, 0, 0, 2359330, 0, 0, 2359331, 0, 0, 2359332, 0, 0, 2359333, 0, 0, 2359334, 0, 0, 2359335, 0, 0, 2359336, 0, 0, 2359337, 0, 0, 2359338, 0, 0, 2359339, 0, 0, 2359340, 0, 0, 2359341, 0, 0, 2359342, 0, 0, 2359343, 0, 0, 2359344, 0, 0, 2424866, 0, 0, 2424867, 0, 0, 2424868, 0, 0, 2424869, 0, 0, 2424870, 0, 0, 2424871, 0, 0, 2424872, 0, 0, 2424873, 0, 0, 2424874, 0, 0, 2424875, 0, 0, 2424876, 0, 0 ) diff --git a/game/tilesets/tiles.png b/game/tilesets/tiles.png new file mode 100644 index 0000000000000000000000000000000000000000..fed0305299be539f3c5ccdae143f9a8aeea1762f GIT binary patch literal 2561 zcmeH}{Yz6(7{|Zoy4u}r`I4rX#llJ=rI{2GR^Dak5NBCG1XG(7MPPbO$%WOfF9g1n zy`ifulZwh;#7Zg{;Q=ivYLW?R4INpjsi|2BTh8w05B(ACr{_8FaGvx1obP$5+N(`b z$Rp$c6q?lJOn?zn2JBKX{514B#XyQOQ`Bg&MUDY7t0tK{V6aTux%^&LxUetmA(t8{ z+~MPF^hJVPnxxLI4-LL{e5_J4`MI=US9OW|PuF#8+{+IAjk!aE>1W+_-E;eI1<=TX zqniQ4Sw=b9(O37l0rZHNy6zV&rustdI3_s6e4RNz)wZ0jkx-2(1iXR(9HZxS8M7Jl zwqgifgSH$PKR9he*#s@Q46oA8!d?ytO49m3ck}12GxMXr0AmoMkIhOQ!K797)Jghl zkg)MGXpw~8K6l~!{8kl81L5y-k9~ZhSTIJ>Vo`UiDc1bh${;HZmd>r_=Y1?#p@P35 zb<|6!Y@#p&LXmaV;lwvN$pfydaD>F53VEt^<^#lM_qA%lzngJn`t^ z8C|~9wH;0Au+aJi`Sb#V6O4%Jn-`T$vs&1}3V!jcq2EM!{XIYAt;fnoT~&kEAf!pC z`gg)Rb1?WS9JH)R^a!qT^~v0YN^!Sy)QGeXC#il&9qT24MCMgM+K2r46bNw=dh&OF zld(O_aS=Go3Sau0h(WsDU_hK~K-&CVZ TUuTFC|8&so(I&U3_2qv7`t7>g literal 0 HcmV?d00001 diff --git a/game/tilesets/tiles.png.import b/game/tilesets/tiles.png.import new file mode 100644 index 0000000..58948ca --- /dev/null +++ b/game/tilesets/tiles.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/tiles.png-5d675a2fb09e0df27dbb24e34fa9fb00.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://tilesets/tiles.png" +dest_files=[ "res://.import/tiles.png-5d675a2fb09e0df27dbb24e34fa9fb00.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/tilesets/tileset.tres b/game/tilesets/tileset.tres new file mode 100644 index 0000000..6af0aba --- /dev/null +++ b/game/tilesets/tileset.tres @@ -0,0 +1,62 @@ +[gd_resource type="TileSet" load_steps=5 format=2] + +[ext_resource path="res://tilesets/tiles.png" type="Texture" id=1] + +[sub_resource type="NavigationPolygon" id=1] +vertices = PoolVector2Array( 0, 0, 32, 0, 32, 32, 0, 32 ) +polygons = [ PoolIntArray( 0, 1, 2, 3 ) ] + +[sub_resource type="NavigationPolygon" id=2] +vertices = PoolVector2Array( 0, 0, 32, 0, 32, 32, 0, 32 ) +polygons = [ PoolIntArray( 0, 1, 2, 3 ) ] + +[sub_resource type="NavigationPolygon" id=3] +vertices = PoolVector2Array( 0, 0, 32, 0, 32, 32, 0, 32 ) +polygons = [ PoolIntArray( 0, 1, 2, 3 ) ] + +[resource] +0/name = "Grass" +0/texture = ExtResource( 1 ) +0/tex_offset = Vector2( 0, 0 ) +0/modulate = Color( 1, 1, 1, 1 ) +0/region = Rect2( 32, 32, 32, 32 ) +0/tile_mode = 0 +0/occluder_offset = Vector2( 0, 0 ) +0/navigation_offset = Vector2( 0, 0 ) +0/navigation = SubResource( 1 ) +0/shape_offset = Vector2( 0, 0 ) +0/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) +0/shape_one_way = false +0/shape_one_way_margin = 0.0 +0/shapes = [ ] +0/z_index = 0 +1/name = "Grass Variant" +1/texture = ExtResource( 1 ) +1/tex_offset = Vector2( 0, 0 ) +1/modulate = Color( 1, 1, 1, 1 ) +1/region = Rect2( 96, 0, 32, 32 ) +1/tile_mode = 0 +1/occluder_offset = Vector2( 0, 0 ) +1/navigation_offset = Vector2( 0, 0 ) +1/navigation = SubResource( 2 ) +1/shape_offset = Vector2( 0, 0 ) +1/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) +1/shape_one_way = false +1/shape_one_way_margin = 0.0 +1/shapes = [ ] +1/z_index = 0 +2/name = "Grass Variant 2" +2/texture = ExtResource( 1 ) +2/tex_offset = Vector2( 0, 0 ) +2/modulate = Color( 1, 1, 1, 1 ) +2/region = Rect2( 96, 32, 32, 32 ) +2/tile_mode = 0 +2/occluder_offset = Vector2( 0, 0 ) +2/navigation_offset = Vector2( 0, 0 ) +2/navigation = SubResource( 3 ) +2/shape_offset = Vector2( 0, 0 ) +2/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) +2/shape_one_way = false +2/shape_one_way_margin = 0.0 +2/shapes = [ ] +2/z_index = 0 diff --git a/game/ui/about/About.tscn b/game/ui/about/About.tscn new file mode 100644 index 0000000..35ac75e --- /dev/null +++ b/game/ui/about/About.tscn @@ -0,0 +1,263 @@ +[gd_scene load_steps=8 format=2] + +[ext_resource path="res://ui/about/GodotAuthors.gd" type="Script" id=1] +[ext_resource path="res://ui/about/GodotDonors.gd" type="Script" id=2] +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=3] +[ext_resource path="res://ui/about/GodotLicense.gd" type="Script" id=4] +[ext_resource path="res://ui/about/GodotThirdPartyLicenses.gd" type="Script" id=5] +[ext_resource path="res://ui/about/Authors.gd" type="Script" id=6] +[ext_resource path="res://ui/about/Third-Party Licenses.gd" type="Script" id=7] + +[node name="About" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +theme = ExtResource( 3 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="PanelContainer" type="PanelContainer" parent="."] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -368.0 +margin_top = -236.5 +margin_right = 368.0 +margin_bottom = 236.5 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 732.0 +margin_bottom = 469.0 + +[node name="TabContainer" type="TabContainer" parent="PanelContainer/VBoxContainer"] +margin_right = 728.0 +margin_bottom = 431.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +tab_align = 0 + +[node name="Authors" type="ScrollContainer" parent="PanelContainer/VBoxContainer/TabContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 31.0 +margin_right = -4.0 +margin_bottom = -4.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer/TabContainer/Authors"] +margin_right = 720.0 +size_flags_horizontal = 3 +script = ExtResource( 6 ) + +[node name="License" type="ScrollContainer" parent="PanelContainer/VBoxContainer/TabContainer"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 31.0 +margin_right = -4.0 +margin_bottom = -4.0 + +[node name="RichTextLabel" type="RichTextLabel" parent="PanelContainer/VBoxContainer/TabContainer/License"] +margin_right = 720.0 +margin_bottom = 396.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Copyright (c) 2019-2020 Péter Magyar + +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." + +[node name="Third-Party Licenses" type="VBoxContainer" parent="PanelContainer/VBoxContainer/TabContainer"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 31.0 +margin_right = -4.0 +margin_bottom = -4.0 +size_flags_horizontal = 3 +script = ExtResource( 7 ) +tree_path = NodePath("HBoxContainer/Tree") +rtl_path = NodePath("HBoxContainer/PanelContainer/RichTextLabel") + +[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/TabContainer/Third-Party Licenses"] +margin_right = 720.0 +margin_bottom = 51.0 +text = "This project relies on a number of third-party free and open source assets/components, all compatible with the terms of its MIT license. The following is an exhaustive list of all such third-party components with their respective copyright statements and license terms." +autowrap = true + +[node name="HBoxContainer" type="HSplitContainer" parent="PanelContainer/VBoxContainer/TabContainer/Third-Party Licenses"] +margin_top = 59.0 +margin_right = 720.0 +margin_bottom = 396.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +split_offset = -88 + +[node name="Tree" type="Tree" parent="PanelContainer/VBoxContainer/TabContainer/Third-Party Licenses/HBoxContainer"] +margin_right = 266.0 +margin_bottom = 337.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +hide_folding = true +hide_root = true + +[node name="PanelContainer" type="PanelContainer" parent="PanelContainer/VBoxContainer/TabContainer/Third-Party Licenses/HBoxContainer"] +margin_left = 278.0 +margin_right = 720.0 +margin_bottom = 337.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="RichTextLabel" type="RichTextLabel" parent="PanelContainer/VBoxContainer/TabContainer/Third-Party Licenses/HBoxContainer/PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 438.0 +margin_bottom = 333.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Godot" type="TabContainer" parent="PanelContainer/VBoxContainer/TabContainer"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 31.0 +margin_right = -4.0 +margin_bottom = -4.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Authors" type="ScrollContainer" parent="PanelContainer/VBoxContainer/TabContainer/Godot"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 31.0 +margin_right = -4.0 +margin_bottom = -4.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer/TabContainer/Godot/Authors"] +margin_right = 712.0 +size_flags_horizontal = 3 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Donors" type="ScrollContainer" parent="PanelContainer/VBoxContainer/TabContainer/Godot"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 31.0 +margin_right = -4.0 +margin_bottom = -4.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer/TabContainer/Godot/Donors"] +margin_right = 712.0 +size_flags_horizontal = 3 +script = ExtResource( 2 ) + +[node name="License" type="ScrollContainer" parent="PanelContainer/VBoxContainer/TabContainer/Godot"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 31.0 +margin_right = -4.0 +margin_bottom = -4.0 + +[node name="RichTextLabel" type="RichTextLabel" parent="PanelContainer/VBoxContainer/TabContainer/Godot/License"] +margin_right = 712.0 +margin_bottom = 361.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = " +" +script = ExtResource( 4 ) + +[node name="Third-Party Licenses" type="VBoxContainer" parent="PanelContainer/VBoxContainer/TabContainer/Godot"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 31.0 +margin_right = -4.0 +margin_bottom = -4.0 +size_flags_horizontal = 3 +script = ExtResource( 5 ) +tree_path = NodePath("HBoxContainer/Tree") +rtl_path = NodePath("HBoxContainer/PanelContainer/RichTextLabel") + +[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/TabContainer/Godot/Third-Party Licenses"] +margin_right = 712.0 +margin_bottom = 51.0 +text = "Godot Engine relies on a number of third-party free and open source libraries, all compatible with the terms of its MIT license. The following is an exhaustive list of all such third-party components with their respective copyright statements and license terms." +autowrap = true + +[node name="HBoxContainer" type="HSplitContainer" parent="PanelContainer/VBoxContainer/TabContainer/Godot/Third-Party Licenses"] +margin_top = 59.0 +margin_right = 712.0 +margin_bottom = 361.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +split_offset = -88 + +[node name="Tree" type="Tree" parent="PanelContainer/VBoxContainer/TabContainer/Godot/Third-Party Licenses/HBoxContainer"] +margin_right = 262.0 +margin_bottom = 302.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +hide_folding = true +hide_root = true + +[node name="PanelContainer" type="PanelContainer" parent="PanelContainer/VBoxContainer/TabContainer/Godot/Third-Party Licenses/HBoxContainer"] +margin_left = 274.0 +margin_right = 712.0 +margin_bottom = 302.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="RichTextLabel" type="RichTextLabel" parent="PanelContainer/VBoxContainer/TabContainer/Godot/Third-Party Licenses/HBoxContainer/PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 434.0 +margin_bottom = 298.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Close" type="Button" parent="PanelContainer/VBoxContainer"] +margin_top = 439.0 +margin_right = 728.0 +margin_bottom = 465.57 +text = "Close" +[connection signal="pressed" from="PanelContainer/VBoxContainer/Close" to="." method="hide"] diff --git a/game/ui/about/Authors.gd b/game/ui/about/Authors.gd new file mode 100644 index 0000000..e7dadf4 --- /dev/null +++ b/game/ui/about/Authors.gd @@ -0,0 +1,38 @@ +extends VBoxContainer + +#this will be parsed from a central file eventually, when it's worth doing it +var data = { + "Lead Developer / Project Owner": [ + "Magyar Péter (Relintai)" + ] +} + +var populated : bool = false + +func _enter_tree(): + connect("visibility_changed", self, "on_visibility_changed") + +func on_visibility_changed(): + if visible: + populate() + +func populate(): + if populated: + return + + populated = true + + for key in data: + var l : Label = Label.new() + l.text = key + add_child(l) + + var il : ItemList = ItemList.new() + il.size_flags_horizontal = Control.SIZE_EXPAND_FILL + il.mouse_filter = MOUSE_FILTER_IGNORE + il.auto_height = true + + for e in data[key]: + il.add_item(e) + + add_child(il) diff --git a/game/ui/about/GodotAuthors.gd b/game/ui/about/GodotAuthors.gd new file mode 100644 index 0000000..e09af15 --- /dev/null +++ b/game/ui/about/GodotAuthors.gd @@ -0,0 +1,31 @@ +extends VBoxContainer + +var populated : bool = false + +func _enter_tree(): + connect("visibility_changed", self, "on_visibility_changed") + +func on_visibility_changed(): + if visible: + populate() + +func populate(): + if populated: + return + + populated = true + + for key in Engine.get_author_info(): + var l : Label = Label.new() + l.text = key + add_child(l) + + var il : ItemList = ItemList.new() + il.size_flags_horizontal = Control.SIZE_EXPAND_FILL + il.mouse_filter = MOUSE_FILTER_IGNORE + il.auto_height = true + + for e in Engine.get_author_info()[key]: + il.add_item(e) + + add_child(il) diff --git a/game/ui/about/GodotDonors.gd b/game/ui/about/GodotDonors.gd new file mode 100644 index 0000000..3c74f43 --- /dev/null +++ b/game/ui/about/GodotDonors.gd @@ -0,0 +1,31 @@ +extends VBoxContainer + +var populated : bool = false + +func _enter_tree(): + connect("visibility_changed", self, "on_visibility_changed") + +func on_visibility_changed(): + if visible: + populate() + +func populate(): + if populated: + return + + populated = true + + for key in Engine.get_donor_info(): + var l : Label = Label.new() + l.text = key + add_child(l) + + var il : ItemList = ItemList.new() + il.size_flags_horizontal = Control.SIZE_EXPAND_FILL + il.mouse_filter = MOUSE_FILTER_IGNORE + il.auto_height = true + + for e in Engine.get_donor_info()[key]: + il.add_item(e) + + add_child(il) diff --git a/game/ui/about/GodotLicense.gd b/game/ui/about/GodotLicense.gd new file mode 100644 index 0000000..9daa4e3 --- /dev/null +++ b/game/ui/about/GodotLicense.gd @@ -0,0 +1,18 @@ +extends RichTextLabel + +var populated : bool = false + +func _enter_tree(): + connect("visibility_changed", self, "on_visibility_changed") + +func on_visibility_changed(): + if visible: + populate() + +func populate(): + if populated: + return + + populated = true + + text = Engine.get_license_text() diff --git a/game/ui/about/GodotThirdPartyLicenses.gd b/game/ui/about/GodotThirdPartyLicenses.gd new file mode 100644 index 0000000..37ef73d --- /dev/null +++ b/game/ui/about/GodotThirdPartyLicenses.gd @@ -0,0 +1,51 @@ +extends VBoxContainer + +export(NodePath) var tree_path : NodePath +var tree : Tree + +export(NodePath) var rtl_path : NodePath +var rtl : RichTextLabel + +var populated : bool = false + +func _enter_tree(): + tree = get_node(tree_path) as Tree + rtl = get_node(rtl_path) as RichTextLabel + + connect("visibility_changed", self, "on_visibility_changed") + tree.connect("item_selected", self, "on_item_selected") + +func on_visibility_changed(): + if visible: + populate() + +func on_item_selected(): + rtl.text = tree.get_selected().get_metadata(0) + +func populate(): + if populated: + return + + populated = true + + tree.create_item() + + for info in Engine.get_copyright_info(): + var ti : TreeItem = tree.create_item() + + var st : String = info["name"] + "\n\n" + + for p in info["parts"]: + for k in p: + st += k + ":\n\n" + + if p[k] is Array: + for it in p[k]: + st += String(it) + "\n" + else: + st += String(p[k]) + "\n" + + st += "\n\n" + + ti.set_metadata(0, st) + ti.set_text(0, info["name"]) diff --git a/game/ui/about/Third-Party Licenses.gd b/game/ui/about/Third-Party Licenses.gd new file mode 100644 index 0000000..e22312c --- /dev/null +++ b/game/ui/about/Third-Party Licenses.gd @@ -0,0 +1,147 @@ +extends VBoxContainer + +export(NodePath) var tree_path : NodePath +var tree : Tree + +export(NodePath) var rtl_path : NodePath +var rtl : RichTextLabel + +var populated : bool = false + +var _data : Array = Array() + +enum AttibutionIndex { + ATTRIBUTION_INDEX_NAME = 0, + ATTRIBUTION_INDEX_URL = 1, + ATTRIBUTION_INDEX_DESCRIPTION = 2, + ATTRIBUTION_INDEX_LICENSES = 3, + ATTRIBUTION_INDEX_FILES = 4, + ATTRIBUTION_INDEX_MAX = 5, +} + +func _enter_tree(): + tree = get_node(tree_path) as Tree + rtl = get_node(rtl_path) as RichTextLabel + + connect("visibility_changed", self, "on_visibility_changed") + tree.connect("item_selected", self, "on_item_selected") + +func on_visibility_changed(): + if visible: + populate() + +func on_item_selected(): + rtl.text = tree.get_selected().get_metadata(0) + +func populate(): + if populated: + return + + populated = true + + #root + tree.create_item() + + _data.clear() + load_all_xmls("res://") + + for entry in _data: + var main : TreeItem = tree.create_item() + + main.set_text(0, entry[0][0]) + main.set_metadata(0, data_arr_to_string(entry[0])) + + for i in range(1, entry.size()): + var curr : TreeItem = tree.create_item(main) + + curr.set_text(0, entry[i][0]) + curr.set_metadata(0, data_arr_to_string(entry[i])) + +func load_all_xmls(path : String) -> void: + var dir = Directory.new() + if dir.open(path) == OK: + dir.list_dir_begin() + var file_name = dir.get_next() + while file_name != "": + if file_name == "." or file_name == "..": + file_name = dir.get_next() + continue + + if dir.current_is_dir(): + if path == "res://": + load_all_xmls(path + file_name) + else: + load_all_xmls(path + "/" + file_name) + else: + if file_name == "Attributions.xml": + if path == "res://": + load_xml(path + file_name) + else: + load_xml(path + "/" + file_name) + + file_name = dir.get_next() + else: + print("An error occurred when trying to access the path: " + path) + +func load_xml(path : String) -> void: + var parser : XMLParser = XMLParser.new() + var err = parser.open(path) + + if err != OK: + print("Couldn't open file: " + path + " Err: " + err) + return + + var attributions : Array = Array() + attributions.resize(1) + var attrib : PoolStringArray = PoolStringArray() + attrib.resize(AttibutionIndex.ATTRIBUTION_INDEX_MAX) + var curr_element : String = "" + while parser.read() == OK: + if parser.get_node_type() == XMLParser.NODE_ELEMENT: + curr_element = parser.get_node_name() + + elif parser.get_node_type() == XMLParser.NODE_TEXT: + if curr_element == "Name": + attrib[AttibutionIndex.ATTRIBUTION_INDEX_NAME] = parser.get_node_data() + elif curr_element == "Description": + attrib[AttibutionIndex.ATTRIBUTION_INDEX_DESCRIPTION] = parser.get_node_data() + elif curr_element == "Licenses": + attrib[AttibutionIndex.ATTRIBUTION_INDEX_LICENSES] = parser.get_node_data() + elif curr_element == "URL": + attrib[AttibutionIndex.ATTRIBUTION_INDEX_URL] = parser.get_node_data() + elif curr_element == "Files": + attrib[AttibutionIndex.ATTRIBUTION_INDEX_FILES] = parser.get_node_data() + + elif parser.get_node_type() == XMLParser.NODE_ELEMENT_END: + if parser.get_node_name() == "Attribution": + attributions.push_back(attrib) + attrib = PoolStringArray() + attrib.resize(AttibutionIndex.ATTRIBUTION_INDEX_MAX) + elif parser.get_node_name() == "Module": + attributions[0] = attrib + attrib = PoolStringArray() + attrib.resize(AttibutionIndex.ATTRIBUTION_INDEX_MAX) + + if attributions[0] == null: + print("Attributions file does not have a Module tag! Path: " + path) + + _data.push_back(attributions) + +func data_arr_to_string(arr : Array) -> String: + var s : String = "" + + s += arr[AttibutionIndex.ATTRIBUTION_INDEX_NAME] + "\n\n" + + if arr[AttibutionIndex.ATTRIBUTION_INDEX_URL] != "": + s += "url: " + arr[AttibutionIndex.ATTRIBUTION_INDEX_URL] + "\n\n" + + s += arr[AttibutionIndex.ATTRIBUTION_INDEX_DESCRIPTION] + "\n\n" + + s += "License(s):\n" + s += arr[AttibutionIndex.ATTRIBUTION_INDEX_LICENSES] + "\n\n" + + if arr[AttibutionIndex.ATTRIBUTION_INDEX_FILES] != "": + s += "File(s):\n\n" + s += arr[AttibutionIndex.ATTRIBUTION_INDEX_FILES] + + return s diff --git a/game/ui/actionbars/ActionBar.gd b/game/ui/actionbars/ActionBar.gd new file mode 100644 index 0000000..e69ed0d --- /dev/null +++ b/game/ui/actionbars/ActionBar.gd @@ -0,0 +1,46 @@ +extends Control + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export (PackedScene) var action_bar_entry_scene +export (NodePath) var child_container_path +var child_container + +func _ready() -> void: + child_container = get_node(child_container_path) + +func set_actionbar_entry(action_bar_entry : ActionBarEntry, player: Entity) -> void: + + for i in range(action_bar_entry.slot_num): + var b : ActionBarButtonEntry = action_bar_entry.get_button_for_slotid(i) + + #for i in range(action_bar_entry.get_action_bar_entry_count()): + #var b = action_bar_entry.get_button(i) + + var s : Node = action_bar_entry_scene.instance() + + child_container.add_child(s) + + s.set_player(player) + s.set_button_entry(b, player) + + s.owner = child_container + diff --git a/game/ui/actionbars/ActionBar.tscn b/game/ui/actionbars/ActionBar.tscn new file mode 100644 index 0000000..3a2b8da --- /dev/null +++ b/game/ui/actionbars/ActionBar.tscn @@ -0,0 +1,33 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/actionbars/ActionBarEntry.tscn" type="PackedScene" id=1] +[ext_resource path="res://ui/actionbars/ActionBar.gd" type="Script" id=2] + +[node name="ActionBar" type="VBoxContainer"] +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = -40.0 +margin_top = -553.0 +mouse_filter = 2 +custom_constants/separation = 0 +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} +action_bar_entry_scene = ExtResource( 1 ) +child_container_path = NodePath("GridContainer") + +[node name="Control" type="Control" parent="."] +margin_right = 40.0 +margin_bottom = 553.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="GridContainer" type="GridContainer" parent="."] +margin_top = 553.0 +margin_right = 40.0 +margin_bottom = 553.0 +custom_constants/vseparation = 0 +custom_constants/hseparation = 0 diff --git a/game/ui/actionbars/ActionBarEntry.gd b/game/ui/actionbars/ActionBarEntry.gd new file mode 100644 index 0000000..e3b10c2 --- /dev/null +++ b/game/ui/actionbars/ActionBarEntry.gd @@ -0,0 +1,388 @@ +extends Button + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export (NodePath) var button_path : NodePath +export (NodePath) var icon_path : NodePath +export (NodePath) var cooldown_indicator_path : NodePath +export (NodePath) var cooldown_text_path : NodePath +export (NodePath) var keybind_text_path : NodePath + +var button : Button +var icon_rect : TextureRect +var cooldown_indicator : TextureProgress +var cooldown_text : Label +var keybind_text : Label + +var button_entry : ActionBarButtonEntry +var player : Entity + +var spell_id : int = 0 +var spell_type : int = 0 + +var cd : float = 0 +var categ_cd : float = 0 + +var has_gcd : bool = false +var gcd : float = 0.0 + +func _ready() -> void: + button = get_node(button_path) as Button + icon_rect = get_node(icon_path) as TextureRect + + cooldown_indicator = get_node(cooldown_indicator_path) as TextureProgress + cooldown_text = get_node(cooldown_text_path) as Label + keybind_text = get_node(keybind_text_path) as Label + + button.connect("pressed", self, "_on_button_pressed") + + ProfileManager.connect("keybinds_changed", self, "on_keybinds_changed") + +func _exit_tree(): + if icon_rect.texture != null: + ThemeAtlas.unref_texture(icon_rect.texture) + +func _process(delta : float) -> void: + if cd > 0: + cd -= delta + + if categ_cd > 0: + categ_cd -= delta + + if cd < 0.02 and categ_cd < 0.02 and gcd < 0.001: + set_process(false) + hide_cooldown_timer() + return + + if gcd > 0.001: + gcd -= delta + + if gcd < 0: + gcd = 0 + + var value : float = gcd + + if cd > value: + value = cd + + if categ_cd > value: + value = categ_cd + + set_cooldown_time(value) + +func set_cooldown_time(time : float) -> void: + cooldown_indicator.value = time + cooldown_text.text = str(int(time)) + +func show_cooldown_timer(max_time : float) -> void: + if cooldown_indicator.visible and cooldown_indicator.max_value < max_time: + cooldown_indicator.max_value = max_time + + if not cooldown_indicator.visible: + cooldown_indicator.max_value = max_time + + cooldown_indicator.show() + cooldown_text.show() + +func hide_cooldown_timer() -> void: + cooldown_indicator.hide() + cooldown_text.hide() + +func set_button_entry(action_bar_button_entry: ActionBarButtonEntry, p_player: Entity) -> void: + player = p_player + + button_entry = action_bar_button_entry + + var iea : InputEventAction = InputEventAction.new() + + var action_name : String = "actionbar_" + str(action_bar_button_entry.action_bar_id) + "_" + str(action_bar_button_entry.slot_id) + + if not InputMap.has_action(action_name): + InputMap.add_action(action_name) + + on_keybinds_changed() + + iea.action = action_name + iea.pressed = true + var sc : ShortCut = ShortCut.new() + sc.shortcut = iea + shortcut = sc + + setup_icon() + refresh_known() + +func on_keybinds_changed(): + var action_name : String = "actionbar_" + str(button_entry.action_bar_id) + "_" + str(button_entry.slot_id) + + keybind_text.text = "" + + if not InputMap.has_action(action_name): + return + + var action_list : Array = InputMap.get_action_list(action_name) + + keybind_text.text = "" + + for action in action_list: + if action is InputEventKey: + var s : String = "" + + if action.shift: + s += "S-" + + if action.alt: + s += "A-" + + if action.control: + s += "C-" + + if action.command: + s += "Co-" + + if action.meta: + s += "M-" + + s += char(action.scancode) + + keybind_text.text = s + +func setup_icon() -> void: + if (button_entry.type == ActionBarButtonEntry.ACTION_BAR_BUTTON_ENTRY_TYPE_NONE): + if icon_rect.texture != null: + ThemeAtlas.unref_texture(icon_rect.texture) + + icon_rect.texture = null + elif (button_entry.type == ActionBarButtonEntry.ACTION_BAR_BUTTON_ENTRY_TYPE_SPELL): + if (button_entry.item_path == ""): + if icon_rect.texture != null: + ThemeAtlas.unref_texture(icon_rect.texture) + + icon_rect.texture = null + return + + if icon_rect.texture != null: + ThemeAtlas.unref_texture(icon_rect.texture) + icon_rect.texture = null + + var spell = ESS.resource_db.get_spell_path(button_entry.item_path) + + if spell == null: + return + + if spell.icon != null: + icon_rect.texture = ThemeAtlas.add_texture(spell.icon) +# icon_rect.texture = spell.icon + + spell_id = spell.id + spell_type = spell.spell_type + has_gcd = spell.cooldown_global_cooldown_enabled + elif (button_entry.type == ActionBarButtonEntry.ACTION_BAR_BUTTON_ENTRY_TYPE_ITEM): + if (button_entry.item_path == ""): + if icon_rect.texture != null: + ThemeAtlas.unref_texture(icon_rect.texture) + + icon_rect.texture = null + return + + if icon_rect.texture != null: + ThemeAtlas.unref_texture(icon_rect.texture) + icon_rect.texture = null + + var item : ItemTemplate = ESS.get_resource_db().get_item_template_path(button_entry.item_path) + + if item.icon != null: + icon_rect.texture = ThemeAtlas.add_texture(item.icon) +# icon_rect.texture = item.icon + + spell_id = item.use_spell.id + spell_type = item.use_spell.spell_type + has_gcd = item.use_spell.cooldown_global_cooldown_enabled + +func _on_button_pressed() -> void: + if button_entry.type == ActionBarButtonEntry.ACTION_BAR_BUTTON_ENTRY_TYPE_SPELL: + if (button_entry.item_path == ""): + return + + player.spell_crequest_cast(ESS.resource_db.spell_path_to_id(button_entry.item_path)) + + elif button_entry.type == ActionBarButtonEntry.ACTION_BAR_BUTTON_ENTRY_TYPE_ITEM: + if (button_entry.item_path == ""): + return + + player.item_crequest_use(ESS.resource_db.item_template_path_to_id(button_entry.item_path)) + +func set_button_entry_data(type: int, item_path: String) -> void: + button_entry.type = type + button_entry.item_path = item_path + + setup_icon() + +func get_drag_data(pos: Vector2) -> Object: + if (button_entry.type == ActionBarButtonEntry.ACTION_BAR_BUTTON_ENTRY_TYPE_NONE): + return null + + if player.actionbar_locked: + return null + + var tr = TextureRect.new() + tr.texture = icon_rect.texture + tr.expand = true + + tr.rect_size = icon_rect.rect_size + set_drag_preview(tr) + + var esd = ESDragAndDrop.new() + + if (button_entry.type == ActionBarButtonEntry.ACTION_BAR_BUTTON_ENTRY_TYPE_SPELL): + esd.type = ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_SPELL + elif (button_entry.type == ActionBarButtonEntry.ACTION_BAR_BUTTON_ENTRY_TYPE_ITEM): + esd.type = ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_ITEM + + esd.item_path = button_entry.item_path + + button_entry.type = ActionBarButtonEntry.ACTION_BAR_BUTTON_ENTRY_TYPE_NONE + button_entry.item_path = "" + +# Profiles.save() + + setup_icon() + + return esd + +func can_drop_data(pos, data) -> bool: + return data.is_class("ESDragAndDrop") + + +func drop_data(pos, esd) -> void: + if esd.type == ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_SPELL and button_entry.item_path == esd.item_path: + return + + if esd.type == ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_SPELL: + button_entry.type = ActionBarButtonEntry.ACTION_BAR_BUTTON_ENTRY_TYPE_SPELL + button_entry.item_path = esd.item_path + elif esd.type == ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_ITEM or esd.type == ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_INVENTORY_ITEM or esd.type == ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_EQUIPPED_ITEM: + button_entry.type = ActionBarButtonEntry.ACTION_BAR_BUTTON_ENTRY_TYPE_ITEM + + if button_entry.item_path != esd.item_path: + var it : ItemTemplate = ESS.get_resource_db().get_item_template_path(esd.item_path) + + if it == null or it.use_spell == null: + button_entry.item_path = "" + else: + button_entry.item_path = esd.item_path + + + setup_icon() + refresh_known() + +func refresh_known(): + if !player: + set_known(true) + return + + if (button_entry.type == ActionBarButtonEntry.ACTION_BAR_BUTTON_ENTRY_TYPE_NONE): + set_known(true) + elif (button_entry.type == ActionBarButtonEntry.ACTION_BAR_BUTTON_ENTRY_TYPE_SPELL): + var spell = ESS.resource_db.get_spell_path(button_entry.item_path) + + set_known(player.spell_hasc(spell)) + elif (button_entry.type == ActionBarButtonEntry.ACTION_BAR_BUTTON_ENTRY_TYPE_ITEM): + set_known(true) + +func set_known(val : bool): + if val: + icon_rect.modulate = Color(1, 1, 1, 1) + else: + icon_rect.modulate = Color(0.5, 0.5, 0.5, 1) + +func set_player(p_player: Entity) -> void: + if not player == null: + player.disconnect("ccooldown_added", self, "_ccooldown_added") + player.disconnect("ccooldown_removed", self, "_ccooldown_removed") + player.disconnect("ccategory_cooldown_added", self, "_ccategory_cooldown_added") + player.disconnect("ccategory_cooldown_removed", self, "_ccategory_cooldown_removed") + + player.disconnect("cgcd_started", self, "_cgcd_started") + player.disconnect("cgcd_finished", self, "_cgcd_finished") + + player.disconnect("cspell_added", self, "_cspell_added") + player.disconnect("cspell_removed", self, "_cspell_removed") + + player = null + + player = p_player + + if player == null: + return + +# for i in range(player.cooldown_getc_count()): +# var cooldown : Cooldown = player.cooldown_getc(i) + + player.connect("ccooldown_added", self, "_ccooldown_added") + player.connect("ccooldown_removed", self, "_ccooldown_removed") + player.connect("ccategory_cooldown_added", self, "_ccategory_cooldown_added") + player.connect("ccategory_cooldown_removed", self, "_ccategory_cooldown_removed") + + player.connect("cgcd_started", self, "_cgcd_started") + player.connect("cgcd_finished", self, "_cgcd_finished") + + player.connect("cspell_added", self, "_cspell_added") + player.connect("cspell_removed", self, "_cspell_removed") + +func _cspell_added(entity: Entity, spell: Spell): + if button_entry.type == ActionBarButtonEntry.ACTION_BAR_BUTTON_ENTRY_TYPE_SPELL && button_entry.item_path == spell.resource_path: + set_known(true) + +func _cspell_removed(entity: Entity, spell: Spell): + if button_entry.type == ActionBarButtonEntry.ACTION_BAR_BUTTON_ENTRY_TYPE_SPELL && button_entry.item_path == spell.resource_path: + set_known(false) + +func _ccooldown_added(id : int, value : float) -> void: + if id == spell_id: + cd = value + set_process(true) + show_cooldown_timer(value) + +func _ccooldown_removed(id : int, value : float) -> void: + if id == spell_id: + cd = 0 + +func _ccategory_cooldown_added(id : int, value : float) -> void: + if id == spell_type: + categ_cd = value + set_process(true) + show_cooldown_timer(value) + +func _ccategory_cooldown_removed(id : int, value : float) -> void: + if id == spell_type: + categ_cd = 0 + + +func _cgcd_started(e : Entity, value :float) -> void: + if not has_gcd: + return + + gcd = value + show_cooldown_timer(value) + set_process(true) + +func _cgcd_finished(val) -> void: + gcd = 0 diff --git a/game/ui/actionbars/ActionBarEntry.tscn b/game/ui/actionbars/ActionBarEntry.tscn new file mode 100644 index 0000000..06aa5e9 --- /dev/null +++ b/game/ui/actionbars/ActionBarEntry.tscn @@ -0,0 +1,91 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://ui/actionbars/ActionBarEntry.gd" type="Script" id=1] +[ext_resource path="res://ui/theme/cooldown_progress.png" type="Texture" id=2] +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=3] +[ext_resource path="res://ui/theme/actionbar_dynamicfont.tres" type="DynamicFont" id=5] + +[node name="ActionBarEntry" type="TouchButton"] +margin_right = 46.0 +margin_bottom = 46.0 +rect_min_size = Vector2( 46, 46 ) +focus_mode = 0 +theme = ExtResource( 3 ) +shortcut_in_tooltip = false +action_mode = 0 +button_mask = 3 +enabled_focus_mode = 0 +keep_pressed_outside = true +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +button_path = NodePath(".") +icon_path = NodePath("MarginContainer/TextureRect") +cooldown_indicator_path = NodePath("CooldownIndicator") +cooldown_text_path = NodePath("CooldownText") +keybind_text_path = NodePath("KeybindText") + +[node name="MarginContainer" type="MarginContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +custom_constants/margin_right = 2 +custom_constants/margin_top = 2 +custom_constants/margin_left = 2 +custom_constants/margin_bottom = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TextureRect" type="TextureRect" parent="MarginContainer"] +margin_left = 2.0 +margin_top = 2.0 +margin_right = 44.0 +margin_bottom = 44.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +expand = true + +[node name="CooldownIndicator" type="TextureProgress" parent="."] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +step = 0.0 +texture_progress = ExtResource( 2 ) +fill_mode = 5 +nine_patch_stretch = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="CooldownText" type="Label" parent="."] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_fonts/font = ExtResource( 5 ) +align = 1 +valign = 1 +clip_text = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="KeybindText" type="Label" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 2.0 +margin_top = 2.0 +margin_right = -2.0 +margin_bottom = -2.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/game/ui/actionbars/Actionbars.gd b/game/ui/actionbars/Actionbars.gd new file mode 100644 index 0000000..2e0c96d --- /dev/null +++ b/game/ui/actionbars/Actionbars.gd @@ -0,0 +1,70 @@ +extends Node + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(PackedScene) var actionbar_scene + +var _player : Entity +var _abp : ActionBarProfile + +func set_player(p_player: Entity) -> void: + if not _player == null: + clear_actionbars() + _player.disconnect("centity_data_changed", self, "_centity_data_changed") + _player = null + + _player = p_player + + if _player == null: + return + + _centity_data_changed(_player.centity_data) + _player.connect("centity_data_changed", self, "_centity_data_changed") + +func _centity_data_changed(cls: EntityData) -> void: + if _abp != null: + _abp.disconnect("changed", self, "on_changed") + + clear_actionbars() + + if cls == null: + return + + _abp = _player.get_action_bar_profile() + + for i in range(_abp.get_action_bar_count()): + var abe = _abp.get_action_bar(i) + var s = actionbar_scene.instance() + + add_child(s) + + s.set_actionbar_entry(abe, _player) + + s.owner = self + + +func clear_actionbars() -> void: + var children = get_children() + + for c in children: + c.queue_free() + + diff --git a/game/ui/actionbars/Actionbars.tscn b/game/ui/actionbars/Actionbars.tscn new file mode 100644 index 0000000..af3f2b7 --- /dev/null +++ b/game/ui/actionbars/Actionbars.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/actionbars/Actionbars.gd" type="Script" id=1] +[ext_resource path="res://ui/actionbars/ActionBar.tscn" type="PackedScene" id=2] + +[node name="Actionbars" type="HBoxContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_constants/separation = 0 +alignment = 2 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +actionbar_scene = ExtResource( 2 ) diff --git a/game/ui/actionbars/EditorKeybindSetup.gd b/game/ui/actionbars/EditorKeybindSetup.gd new file mode 100644 index 0000000..df71843 --- /dev/null +++ b/game/ui/actionbars/EditorKeybindSetup.gd @@ -0,0 +1,53 @@ +tool +extends Node + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(bool) var create = false setget createf +export(bool) var delete = false setget deletef + + +func createf(value : bool) -> void: + if not value: + return + + for i in range(6): + for j in range(12): + var actionstr : String = "input/actionbar_" + str(i) + "_" + str(j) + + var action : Dictionary = Dictionary() + action["events"] = Array() + action["deadzone"] = 0.5 + + ProjectSettings.set(name, actionstr) + ProjectSettings.save() + + +func deletef(value : bool) -> void: + if not value: + return + + for i in range(6): + for j in range(12): + var action : String = "input/actionbar_" + str(i) + "_" + str(j) + + ProjectSettings.clear(action) + ProjectSettings.save() diff --git a/game/ui/actionbars/game_module.tres b/game/ui/actionbars/game_module.tres new file mode 100644 index 0000000..a301a86 --- /dev/null +++ b/game/ui/actionbars/game_module.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" load_steps=3 format=2] + +[ext_resource path="res://scripts/game_modules/ui_gui_child_module.gd" type="Script" id=1] +[ext_resource path="res://ui/actionbars/Actionbars.tscn" type="PackedScene" id=2] + +[resource] +script = ExtResource( 1 ) +enabled = true +scene = ExtResource( 2 ) +hide = false diff --git a/game/ui/auraframe/AuraEntry.gd b/game/ui/auraframe/AuraEntry.gd new file mode 100644 index 0000000..c7acc8e --- /dev/null +++ b/game/ui/auraframe/AuraEntry.gd @@ -0,0 +1,95 @@ +extends VBoxContainer + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export (NodePath) var texture_rect_path : NodePath +export (NodePath) var tooltip_node_path : NodePath +export (NodePath) var time_label_path : NodePath + +export (NodePath) var magic_bg_path : NodePath +export (NodePath) var bleed_bg_path : NodePath +export (NodePath) var poison_bg_path : NodePath +export (NodePath) var physical_bg_path : NodePath +export (NodePath) var curse_bg_path : NodePath + +var texture_rect : TextureRect +var tooltip_node : Control +var time_label : Label + +var magic_bg : Node +var bleed_bg : Node +var poison_bg : Node +var physical_bg : Node +var curse_bg : Node + +var aura_data : AuraData + +func _ready(): + set_process(false) + + texture_rect = get_node(texture_rect_path) as TextureRect + tooltip_node = get_node(tooltip_node_path) as Control + time_label = get_node(time_label_path) as Label + + magic_bg = get_node(magic_bg_path) as Node + bleed_bg = get_node(bleed_bg_path) as Node + poison_bg = get_node(poison_bg_path) as Node + physical_bg = get_node(physical_bg_path) as Node + curse_bg = get_node(curse_bg_path) as Node + +func _process(delta): +# if not aura_data.is_timed: +# return + + time_label.text = str(int(aura_data.remaining_time)) + "s" + + if (aura_data.remaining_time <= 0): + queue_free() + +func set_aura_data(paura_data : AuraData): + aura_data = paura_data + + if aura_data.is_timed: + set_process(true) + time_label.text = str(aura_data.remaining_time) + else: + set_process(false) + time_label.text = "" + + tooltip_node.hint_tooltip = aura_data.aura.text_description + texture_rect.texture = aura_data.aura.icon + + if aura_data.aura.debuff: + var aura_type : int = aura_data.aura.aura_type + + if aura_type == SpellEnums.AURA_TYPE_MAGIC: + magic_bg.visible = true + elif aura_type == SpellEnums.AURA_TYPE_BLEED: + bleed_bg.visible = true + elif aura_type == SpellEnums.AURA_TYPE_CURSE: + curse_bg.visible = true + elif aura_type == SpellEnums.AURA_TYPE_PHYSICAL: + physical_bg.visible = true + elif aura_type == SpellEnums.AURA_TYPE_POISON: + poison_bg.visible = true + +func get_aura_data() -> AuraData: + return aura_data diff --git a/game/ui/auraframe/AuraEntry.tscn b/game/ui/auraframe/AuraEntry.tscn new file mode 100644 index 0000000..7154325 --- /dev/null +++ b/game/ui/auraframe/AuraEntry.tscn @@ -0,0 +1,94 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/auraframe/AuraEntry.gd" type="Script" id=1] +[ext_resource path="res://ui/theme/ui_dynamicfont_small.tres" type="DynamicFont" id=2] + +[node name="AuraEntry" type="VBoxContainer"] +margin_right = 30.0 +margin_bottom = 51.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +texture_rect_path = NodePath("MarginContainer/MarginContainer/TextureRect") +tooltip_node_path = NodePath("MarginContainer/MarginContainer") +time_label_path = NodePath("MarginContainer2/Label") +magic_bg_path = NodePath("MarginContainer/MagicBG") +bleed_bg_path = NodePath("MarginContainer/BleedBG") +poison_bg_path = NodePath("MarginContainer/PoisonBG") +physical_bg_path = NodePath("MarginContainer/PhysicalBG") +curse_bg_path = NodePath("MarginContainer/CurseBG") + +[node name="MarginContainer" type="MarginContainer" parent="."] +margin_right = 30.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 30, 30 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="MagicBG" type="ColorRect" parent="MarginContainer"] +visible = false +margin_right = 30.0 +margin_bottom = 30.0 +color = Color( 0.215686, 0.0666667, 0.772549, 1 ) + +[node name="BleedBG" type="ColorRect" parent="MarginContainer"] +visible = false +margin_right = 30.0 +margin_bottom = 30.0 +color = Color( 0.541176, 0, 0, 1 ) + +[node name="PoisonBG" type="ColorRect" parent="MarginContainer"] +visible = false +margin_right = 30.0 +margin_bottom = 30.0 +color = Color( 0, 0.301961, 0.027451, 1 ) + +[node name="PhysicalBG" type="ColorRect" parent="MarginContainer"] +visible = false +margin_right = 30.0 +margin_bottom = 30.0 +color = Color( 0.27451, 0.0627451, 0.0627451, 1 ) + +[node name="CurseBG" type="ColorRect" parent="MarginContainer"] +visible = false +margin_right = 30.0 +margin_bottom = 30.0 +color = Color( 0.172549, 0.0588235, 0.262745, 1 ) + +[node name="MarginContainer" type="MarginContainer" parent="MarginContainer"] +margin_right = 30.0 +margin_bottom = 30.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_constants/margin_right = 1 +custom_constants/margin_top = 1 +custom_constants/margin_left = 1 +custom_constants/margin_bottom = 1 + +[node name="TextureRect" type="TextureRect" parent="MarginContainer/MarginContainer"] +margin_left = 1.0 +margin_top = 1.0 +margin_right = 29.0 +margin_bottom = 29.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +expand = true + +[node name="MarginContainer2" type="MarginContainer" parent="."] +margin_top = 38.0 +margin_right = 30.0 +margin_bottom = 51.0 +rect_min_size = Vector2( 30, 10 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Label" type="Label" parent="MarginContainer2"] +margin_right = 30.0 +margin_bottom = 13.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_fonts/font = ExtResource( 2 ) +align = 1 +valign = 1 +max_lines_visible = 1 diff --git a/game/ui/auraframe/AuraFrame.gd b/game/ui/auraframe/AuraFrame.gd new file mode 100644 index 0000000..a0391f7 --- /dev/null +++ b/game/ui/auraframe/AuraFrame.gd @@ -0,0 +1,74 @@ +extends Control + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export (PackedScene) var aura_entry_scene : PackedScene + +export (NodePath) var buff_container_path : NodePath +export (NodePath) var debuff_container_path : NodePath + +var buff_container_node : Node +var debuff_container_node : Node + +var buff_nodes : Array +var debuff_nodes : Array + +var entity : Entity + +func _ready(): + buff_container_node = get_node(buff_container_path) + debuff_container_node = get_node(debuff_container_path) + +func set_target(pentity : Entity) -> void: + if entity != null: + pass + + entity = pentity + entity.connect("notification_caura", self, "on_notification_caura") + +func on_notification_caura(what :int, aura_data : AuraData) -> void: + if what == SpellEnums.NOTIFICATION_AURA_ADDED: + var created_node : Node = aura_entry_scene.instance() + + if (not aura_data.aura.debuff): + buff_container_node.add_child(created_node) + created_node.owner = buff_container_node + else: + debuff_container_node.add_child(created_node) + created_node.owner = debuff_container_node + + created_node.set_aura_data(aura_data) + elif what == SpellEnums.NOTIFICATION_AURA_REMOVED: + if (not aura_data.aura.debuff): + for bn in buff_container_node.get_children(): + if bn.get_aura_data() == aura_data: + buff_container_node.remove_child(bn) + bn.queue_free() + return + else: + for bn in debuff_container_node.get_children(): + if bn.get_aura_data() == aura_data: + debuff_container_node.remove_child(bn) + bn.queue_free() + return + +func set_player(player : Entity) -> void: + set_target(player) diff --git a/game/ui/auraframe/AuraFrame.tscn b/game/ui/auraframe/AuraFrame.tscn new file mode 100644 index 0000000..3290e0a --- /dev/null +++ b/game/ui/auraframe/AuraFrame.tscn @@ -0,0 +1,44 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/auraframe/AuraFrame.gd" type="Script" id=1] +[ext_resource path="res://ui/auraframe/AuraEntry.tscn" type="PackedScene" id=2] + +[node name="AuraFrame" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +aura_entry_scene = ExtResource( 2 ) +buff_container_path = NodePath("MarginContainer/VBoxContainer/Buffs") +debuff_container_path = NodePath("MarginContainer/VBoxContainer/Debuffs") + +[node name="MarginContainer" type="MarginContainer" parent="."] +anchor_left = 1.0 +anchor_right = 1.0 +margin_left = -335.0 +margin_bottom = 157.0 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"] +margin_right = 335.0 +margin_bottom = 157.0 +mouse_filter = 2 + +[node name="Buffs" type="GridContainer" parent="MarginContainer/VBoxContainer"] +margin_right = 335.0 +margin_bottom = 76.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +columns = 9 + +[node name="Debuffs" type="GridContainer" parent="MarginContainer/VBoxContainer"] +margin_top = 80.0 +margin_right = 335.0 +margin_bottom = 157.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +columns = 9 diff --git a/game/ui/auraframe/game_module.tres b/game/ui/auraframe/game_module.tres new file mode 100644 index 0000000..bf19038 --- /dev/null +++ b/game/ui/auraframe/game_module.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" load_steps=3 format=2] + +[ext_resource path="res://scripts/game_modules/ui_gui_child_module.gd" type="Script" id=1] +[ext_resource path="res://ui/auraframe/AuraFrame.tscn" type="PackedScene" id=2] + +[resource] +script = ExtResource( 1 ) +enabled = true +scene = ExtResource( 2 ) +hide = false diff --git a/game/ui/autoload/SettingsManager.gd b/game/ui/autoload/SettingsManager.gd new file mode 100644 index 0000000..665f517 --- /dev/null +++ b/game/ui/autoload/SettingsManager.gd @@ -0,0 +1,227 @@ +extends Node + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +signal setting_changed(section, key, value) +signal settings_loaded() + +const SAVE_PATH : String = "user://settings.cfg" + +var loaded : bool = false + +var _config_file : ConfigFile = ConfigFile.new() +var _settings : Dictionary = { + "rendering" : { + "window_size" : OS.window_size, + "window_position" : OS.window_position, + + "viewport_scale" : ProjectSettings.get("display/window/size/viewport_scale"), + "thread_model" : ProjectSettings.get("rendering/threads/thread_model"), + "borderless" : ProjectSettings.get("display/window/size/borderless"), + "fullscreen" : ProjectSettings.get("display/window/size/fullscreen"), + "always_on_top" : ProjectSettings.get("display/window/size/always_on_top"), + "shadows_enabled" : ProjectSettings.get("rendering/quality/shadows/enabled"), + "use_vsync" : ProjectSettings.get("display/window/vsync/use_vsync"), + "vsync_via_compositor" : ProjectSettings.get("display/window/vsync/vsync_via_compositor"), + }, + "ui" : { + "touchscreen_mode" : OS.has_touchscreen_ui_hint(), + "ui_scale" : ProjectSettings.get("display/window/size/ui_scale"), + "ui_scale_touch" : ProjectSettings.get("display/window/size/ui_scale_touch"), + }, + "debug" : { + "debug_info" : false + } +} + +func _ready(): + load_settings() + + var actions : Array = InputMap.get_actions() + + for action in actions: + var acts : Array = InputMap.get_action_list(action) + + for i in range(len(acts)): + var a = acts[i] + if a is InputEventKey: + var nie : BSInputEventKey = BSInputEventKey.new() + nie.from_input_event_key(a as InputEventKey) + acts[i] = nie + + InputMap.action_erase_event(action, a) + InputMap.action_add_event(action, nie) + + set_stretch() + setup_window() + +func _exit_tree(): + if OS.window_fullscreen: + return + + var wp : Vector2 = OS.window_position + var ws : Vector2 = OS.window_size + + var wpr = get_value("rendering", "window_position") + var wsr = get_value("rendering", "window_size") + + if int(wp.x) != int(wpr.x) || \ + int(wp.y) != int(wpr.y) || \ + int(ws.x) != int(wsr.x) || \ + int(ws.y) != int(wsr.y): + + #don't use set_value() here, as the app is quitting + _settings["rendering"]["window_size"] = ws + _settings["rendering"]["window_position"] = wp + + save_settings() + +func set_value(section, key, value) -> void: + _settings[section][key] = value + + if has_method("set_" + section + "_" + key): + call("set_" + section + "_" + key, value) + + save_settings() + + emit_signal("setting_changed", section, key, value) + +func get_value(section, key): + return _settings[section][key] + +func _set_value(section, key, value) -> void: + _settings[section][key] = value + + if has_method("set_" + section + "_" + key): + call("set_" + section + "_" + key, value) + +func save_settings() -> void: + for section in _settings.keys(): + for key in _settings[section]: + _config_file.set_value(section, key, _settings[section][key]) + + _config_file.save(SAVE_PATH) + +func load_settings() -> void: + var error : int = _config_file.load(SAVE_PATH) + + if error != OK: +# print("Failed to load the settings file! Error code %s" % error) + return + + for section in _settings.keys(): + for key in _settings[section]: + _set_value(section, key, _config_file.get_value(section, key, _settings[section][key])) + + loaded = true + emit_signal("settings_loaded") + +func set_rendering_thread_model(value : int) -> void: + ProjectSettings.set("rendering/threads/thread_model", value) + +func set_rendering_borderless(value : bool) -> void: + ProjectSettings.set("display/window/size/borderless", value) + OS.window_borderless = value + +func set_rendering_fullscreen(value : bool) -> void: + ProjectSettings.set("display/window/size/fullscreen", value) + OS.window_fullscreen = value + + if !value: + setup_window() + +func set_rendering_always_on_top(value : bool) -> void: + ProjectSettings.set("display/window/size/always_on_top", value) + OS.set_window_always_on_top(value) + +func set_rendering_viewport_scale(value : int) -> void: + ProjectSettings.set("rendering/window/size/viewport_scale", value) + var v: Vector2 = OS.get_window_size() + v *= value * 0.01 + + get_tree().get_root().size = v + +func set_rendering_shadows_enabled(value : bool) -> void: + ProjectSettings.set("rendering/quality/shadows/enabled", value) + +func set_rendering_use_vsync(value : bool) -> void: + ProjectSettings.set("display/window/vsync/use_vsync", value) + + OS.vsync_enabled = value + +func set_rendering_vsync_via_compositor(value : bool) -> void: + ProjectSettings.set("display/window/vsync/vsync_via_compositor", value) + + OS.vsync_via_compositor = value + +func set_ui_touchscreen_mode(value : bool) -> void: + set_stretch() + +func set_ui_ui_scale(value : float) -> void: + ProjectSettings.set("rendering/window/size/ui_scale", value) + set_stretch() + +func set_ui_ui_scale_touch(value : float) -> void: + ProjectSettings.set("rendering/window/size/ui_scale_touch", value) + set_stretch() + +func set_stretch(): + if !loaded: + return + + var stretch_mode : String = ProjectSettings.get("display/window/stretch/mode") + var stretch_aspect : String = ProjectSettings.get("display/window/stretch/aspect") + var stretch_size : Vector2 = Vector2(ProjectSettings.get("display/window/size/width"), ProjectSettings.get("display/window/size/height")) + var stretch_shrink : float = ProjectSettings.get("display/window/stretch/shrink") + + var uiscale : float = 1 + + if !get_value("ui", "touchscreen_mode"): + uiscale = get_value("ui", "ui_scale") + else: + uiscale = get_value("ui", "ui_scale_touch") + + stretch_size *= uiscale + + var sml_sm = SceneTree.STRETCH_MODE_DISABLED; + if (stretch_mode == "2d"): + sml_sm = SceneTree.STRETCH_MODE_2D; + elif (stretch_mode == "viewport"): + sml_sm = SceneTree.STRETCH_MODE_VIEWPORT; + + var sml_aspect = SceneTree.STRETCH_ASPECT_IGNORE; + if (stretch_aspect == "keep"): + sml_aspect = SceneTree.STRETCH_ASPECT_KEEP; + elif (stretch_aspect == "keep_width"): + sml_aspect = SceneTree.STRETCH_ASPECT_KEEP_WIDTH; + elif (stretch_aspect == "keep_height"): + sml_aspect = SceneTree.STRETCH_ASPECT_KEEP_HEIGHT; + elif (stretch_aspect == "expand"): + sml_aspect = SceneTree.STRETCH_ASPECT_EXPAND; + + get_tree().set_screen_stretch(sml_sm, sml_aspect, stretch_size, stretch_shrink) + +func setup_window(): + if OS.window_fullscreen: + return + + OS.window_position = get_value("rendering", "window_position") + OS.window_size = get_value("rendering", "window_size") diff --git a/game/ui/autoload/SettingsManager.tscn b/game/ui/autoload/SettingsManager.tscn new file mode 100644 index 0000000..3fd9984 --- /dev/null +++ b/game/ui/autoload/SettingsManager.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/autoload/SettingsManager.gd" type="Script" id=1] + +[node name="SettingsManager" type="Node"] +script = ExtResource( 1 ) diff --git a/game/ui/autoload/ThemeAtlas.gd b/game/ui/autoload/ThemeAtlas.gd new file mode 100644 index 0000000..a343294 --- /dev/null +++ b/game/ui/autoload/ThemeAtlas.gd @@ -0,0 +1,30 @@ +extends TextureMerger + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +#func _texture_added(texture): +# print("added") +# +#func _texture_removed(): +# print("removed") + +func _texture_merged(): + $Sprite.texture = get_generated_texture(0) diff --git a/game/ui/autoload/ThemeAtlas.tscn b/game/ui/autoload/ThemeAtlas.tscn new file mode 100644 index 0000000..1f171c9 --- /dev/null +++ b/game/ui/autoload/ThemeAtlas.tscn @@ -0,0 +1,25 @@ +[gd_scene load_steps=18 format=2] + +[ext_resource path="res://ui/theme/scrollbar_grabber_atlas.tres" type="Texture" id=2] +[ext_resource path="res://ui/theme/h_scroll_bar_texture.tres" type="Texture" id=3] +[ext_resource path="res://ui/theme/panel_bg_atlas.tres" type="Texture" id=4] +[ext_resource path="res://ui/theme/scrollbar_bg_atlas.tres" type="Texture" id=5] +[ext_resource path="res://ui/theme/separator_texture.tres" type="Texture" id=6] +[ext_resource path="res://ui/theme/button_bg_atlas.tres" type="Texture" id=7] +[ext_resource path="res://ui/theme/bag_icon.tres" type="Texture" id=8] +[ext_resource path="res://ui/theme/locked_icon.tres" type="Texture" id=9] +[ext_resource path="res://ui/theme/unlocked_icon.tres" type="Texture" id=10] +[ext_resource path="res://ui/theme/spellbook_icon.tres" type="Texture" id=11] +[ext_resource path="res://ui/theme/radio_texture.tres" type="Texture" id=12] +[ext_resource path="res://ui/theme/radio_checked_texture.tres" type="Texture" id=13] +[ext_resource path="res://ui/theme/checkbox_texture.tres" type="Texture" id=14] +[ext_resource path="res://ui/theme/dropdown_icon.tres" type="Texture" id=15] +[ext_resource path="res://ui/theme/checkbox_checked_texture.tres" type="Texture" id=16] +[ext_resource path="res://ui/theme/window_bg_atlas.tres" type="Texture" id=17] +[ext_resource path="res://ui/theme/window_bg_bg.tres" type="Texture" id=18] + +[node name="ThemeAtlas" type="TextureMerger"] +texture_flags = 0 +keep_original_atlases = true +automatic_merge = true +textures = [ ExtResource( 8 ), ExtResource( 7 ), ExtResource( 16 ), ExtResource( 14 ), ExtResource( 15 ), ExtResource( 3 ), ExtResource( 9 ), ExtResource( 4 ), ExtResource( 13 ), ExtResource( 12 ), ExtResource( 5 ), ExtResource( 2 ), ExtResource( 6 ), ExtResource( 11 ), ExtResource( 10 ), ExtResource( 17 ), ExtResource( 18 ) ] diff --git a/game/ui/autoload/WorldNumbers.gd b/game/ui/autoload/WorldNumbers.gd new file mode 100644 index 0000000..c27b707 --- /dev/null +++ b/game/ui/autoload/WorldNumbers.gd @@ -0,0 +1,54 @@ +extends Node + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(PackedScene) var number_scene + +func damage(entity_position : Vector3, entity_height : float, value : int, crit : bool) -> void: + var scene : Node = number_scene.instance() + + add_child(scene) + scene.owner = self + + entity_position.y += entity_height + (0.2 * randf()) + entity_position.x += entity_height * 0.4 - entity_height * 0.8 * randf() + entity_position.z += entity_height * 0.4 - entity_height * 0.8 * randf() + + scene.damage(entity_position, value, crit) + +func heal(entity_position : Vector3, entity_height : float, value : int, crit : bool) -> void: + var scene : Node = number_scene.instance() + + add_child(scene) + scene.owner = self + + randomize() + + entity_position.y += entity_height + (0.3 * randf()) + entity_position.x += entity_height * 0.4 - entity_height * 0.8 * randf() + entity_position.z += entity_height * 0.4 - entity_height * 0.8 * randf() + + + scene.heal(entity_position, value, crit) + +func clear() -> void: + for child in get_children(): + child.queue_free() diff --git a/game/ui/autoload/WorldNumbers.tscn b/game/ui/autoload/WorldNumbers.tscn new file mode 100644 index 0000000..2281e4d --- /dev/null +++ b/game/ui/autoload/WorldNumbers.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/numbers/Number.tscn" type="PackedScene" id=1] +[ext_resource path="res://ui/autoload/WorldNumbers.gd" type="Script" id=2] + +[node name="WorldNumbers" type="Node"] +script = ExtResource( 2 ) +number_scene = ExtResource( 1 ) diff --git a/game/ui/bags/Bag.tscn b/game/ui/bags/Bag.tscn new file mode 100644 index 0000000..08de2b7 --- /dev/null +++ b/game/ui/bags/Bag.tscn @@ -0,0 +1,265 @@ +[gd_scene load_steps=6 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] +[ext_resource path="res://ui/bags/InventoryGUI.gd" type="Script" id=2] +[ext_resource path="res://ui/bags/BagEntry.tscn" type="PackedScene" id=3] +[ext_resource path="res://ui/bags/EquipmentSlot.tscn" type="PackedScene" id=4] +[ext_resource path="res://ui/bags/ItemTooltip.tscn" type="PackedScene" id=5] + +[node name="Inventory" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +theme = ExtResource( 1 ) +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} +inventory_item_scene = ExtResource( 3 ) +inventory_item_container_path = NodePath("PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer2/VBoxContainer/ScrollContainer/GridContainer") +item_tooltip_path = NodePath("ItemTooltip") +inventory_slots = [ NodePath("PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer/Head"), NodePath("PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer2/Neck"), NodePath("PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer2/Shoulder"), NodePath("PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer3/Chest"), NodePath("PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer2/Hands"), NodePath("PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer4/Belt"), NodePath("PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer5/Legs"), NodePath("PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer5/Feet"), NodePath("PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer3/Ring1"), NodePath("PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer3/Ring2"), NodePath("PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer4/Trinket1"), NodePath("PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer4/Trinket2"), NodePath("PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer6/PanelContainer/HBoxContainer/MainHand"), NodePath("PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer6/PanelContainer/HBoxContainer/OffHand") ] + +[node name="PanelContainer" type="PanelContainer" parent="."] +margin_left = 103.0 +margin_top = 37.0 +margin_right = 692.0 +margin_bottom = 527.0 + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 585.0 +margin_bottom = 486.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/VBoxContainer"] +margin_right = 581.0 +margin_bottom = 26.0 + +[node name="BagName" type="Label" parent="PanelContainer/VBoxContainer/HBoxContainer"] +margin_top = 5.0 +margin_right = 547.0 +margin_bottom = 20.0 +size_flags_horizontal = 3 +size_flags_vertical = 6 +text = "Inventory" +align = 1 + +[node name="CloseButton" type="Button" parent="PanelContainer/VBoxContainer/HBoxContainer"] +margin_left = 551.0 +margin_right = 581.0 +margin_bottom = 26.5702 +rect_min_size = Vector2( 30, 20 ) +text = "X" + +[node name="HBoxContainer3" type="HBoxContainer" parent="PanelContainer/VBoxContainer"] +margin_top = 34.0 +margin_right = 581.0 +margin_bottom = 482.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +alignment = 1 + +[node name="PanelContainer" type="PanelContainer" parent="PanelContainer/VBoxContainer/HBoxContainer3"] +margin_right = 227.96 +margin_bottom = 448.0 +rect_min_size = Vector2( 227.96, 0 ) + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 223.96 +margin_bottom = 444.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_constants/separation = 10 +alignment = 1 + +[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer"] +margin_top = 41.0 +margin_right = 219.0 +margin_bottom = 91.0 +size_flags_horizontal = 3 +alignment = 1 + +[node name="Head" parent="PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer" instance=ExtResource( 4 )] + +[node name="HBoxContainer2" type="HBoxContainer" parent="PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer"] +margin_top = 101.0 +margin_right = 219.0 +margin_bottom = 151.0 +size_flags_horizontal = 3 +alignment = 1 + +[node name="Shoulder" parent="PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer2" instance=ExtResource( 4 )] +margin_left = 30.0 +margin_right = 80.0 +text = "sh" +equip_slot = 2 + +[node name="Neck" parent="PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer2" instance=ExtResource( 4 )] +text = "Neck" +equip_slot = 1 + +[node name="Hands" parent="PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer2" instance=ExtResource( 4 )] +margin_left = 138.0 +margin_right = 188.0 +text = "Hands" +equip_slot = 4 + +[node name="HBoxContainer3" type="HBoxContainer" parent="PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer"] +margin_top = 161.0 +margin_right = 219.0 +margin_bottom = 211.0 +size_flags_horizontal = 3 +alignment = 1 + +[node name="Ring1" parent="PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer3" instance=ExtResource( 4 )] +margin_left = 30.0 +margin_right = 80.0 +text = "Ring" +equip_slot = 8 +texture_path = NodePath("../Ring1/MarginContainer/TextureRect") + +[node name="Chest" parent="PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer3" instance=ExtResource( 4 )] +text = "Chest" +equip_slot = 3 + +[node name="Ring2" parent="PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer3" instance=ExtResource( 4 )] +margin_left = 138.0 +margin_right = 188.0 +text = "Ring" +equip_slot = 9 + +[node name="HBoxContainer4" type="HBoxContainer" parent="PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer"] +margin_top = 221.0 +margin_right = 219.0 +margin_bottom = 271.0 +size_flags_horizontal = 3 +alignment = 1 + +[node name="Trinket1" parent="PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer4" instance=ExtResource( 4 )] +margin_left = 30.0 +margin_right = 80.0 +text = "Tr" +equip_slot = 10 + +[node name="Belt" parent="PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer4" instance=ExtResource( 4 )] +text = "Belt" +equip_slot = 5 + +[node name="Trinket2" parent="PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer4" instance=ExtResource( 4 )] +margin_left = 138.0 +margin_right = 188.0 +text = "Tr" +equip_slot = 11 + +[node name="HBoxContainer5" type="HBoxContainer" parent="PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer"] +margin_top = 281.0 +margin_right = 219.0 +margin_bottom = 331.0 +size_flags_horizontal = 3 +alignment = 1 + +[node name="Legs" parent="PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer5" instance=ExtResource( 4 )] +margin_left = 57.0 +margin_right = 107.0 +text = "Legs" +equip_slot = 6 + +[node name="Feet" parent="PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer5" instance=ExtResource( 4 )] +margin_left = 111.0 +margin_right = 161.0 +text = "Feet" +equip_slot = 7 + +[node name="HBoxContainer6" type="HBoxContainer" parent="PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer"] +margin_top = 341.0 +margin_right = 219.0 +margin_bottom = 399.0 +size_flags_horizontal = 3 +alignment = 1 + +[node name="PanelContainer" type="PanelContainer" parent="PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer6"] +margin_left = 53.0 +margin_right = 165.0 +margin_bottom = 58.0 +size_flags_horizontal = 0 +size_flags_vertical = 0 + +[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer6/PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 108.0 +margin_bottom = 54.0 + +[node name="MainHand" parent="PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer6/PanelContainer/HBoxContainer" instance=ExtResource( 4 )] +margin_left = 0.0 +margin_right = 50.0 +text = "MH" +equip_slot = 12 + +[node name="OffHand" parent="PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer6/PanelContainer/HBoxContainer" instance=ExtResource( 4 )] +margin_left = 54.0 +margin_right = 104.0 +text = "OH" +equip_slot = 13 + +[node name="PanelContainer2" type="PanelContainer" parent="PanelContainer/VBoxContainer/HBoxContainer3"] +margin_left = 231.0 +margin_right = 581.0 +margin_bottom = 448.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer2"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 346.0 +margin_bottom = 444.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="ScrollContainer" type="ScrollContainer" parent="PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer2/VBoxContainer"] +margin_right = 342.0 +margin_bottom = 406.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +scroll_horizontal_enabled = false + +[node name="GridContainer" type="GridContainer" parent="PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer2/VBoxContainer/ScrollContainer"] +size_flags_horizontal = 2 +size_flags_vertical = 2 +custom_constants/vseparation = 5 +custom_constants/hseparation = 5 +columns = 6 + +[node name="HBoxContainer2" type="HBoxContainer" parent="PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer2/VBoxContainer"] +margin_top = 414.0 +margin_right = 342.0 +margin_bottom = 440.0 + +[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer2/VBoxContainer/HBoxContainer2"] +margin_top = 5.0 +margin_right = 308.0 +margin_bottom = 20.0 +size_flags_horizontal = 3 +text = "190 " +align = 2 + +[node name="ResizeButton" type="Button" parent="PanelContainer/VBoxContainer/HBoxContainer3/PanelContainer2/VBoxContainer/HBoxContainer2"] +margin_left = 312.0 +margin_right = 342.0 +margin_bottom = 26.5702 +rect_min_size = Vector2( 30, 20 ) + +[node name="ItemTooltip" parent="." instance=ExtResource( 5 )] +toplevel = false +margin_left = 4.0 +margin_top = 4.0 +margin_right = 299.0 +margin_bottom = 227.0 + +[connection signal="pressed" from="PanelContainer/VBoxContainer/HBoxContainer/CloseButton" to="." method="hide"] diff --git a/game/ui/bags/BagEntry.gd b/game/ui/bags/BagEntry.gd new file mode 100644 index 0000000..e502bbe --- /dev/null +++ b/game/ui/bags/BagEntry.gd @@ -0,0 +1,256 @@ +extends Button + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export (NodePath) var button_path : NodePath +export (NodePath) var icon_path : NodePath + +export (NodePath) var cooldown_indicator_path : NodePath +export (NodePath) var cooldown_text_path : NodePath + +export (NodePath) var stack_counter : NodePath +var _stack_counter : Label + +var _tooltip : Popup + +var button : Button +var icon_rect : TextureRect +var cooldown_indicator : TextureProgress +var cooldown_text : Label + +var slot_id : int = 0 +var item : ItemInstance +var player : Entity + +var spell_id : int = 0 +#var spell_type : int = 0 + +var cd : float = 0 + +var has_gcd : bool = false +var gcd : float = 0.0 + +func _ready() -> void: + button = get_node(button_path) as Button + icon_rect = get_node(icon_path) as TextureRect + + cooldown_indicator = get_node(cooldown_indicator_path) as TextureProgress + cooldown_text = get_node(cooldown_text_path) as Label + + _stack_counter = get_node(stack_counter) as Label + + button.connect("button_up", self, "_on_button_pressed") + +#func _exit_tree(): +# if item != null: +# item.disconnect("stack_size_changed", self, "stack_size_changed") + +func _process(delta : float) -> void: + if cd > 0: + cd -= delta + + if cd < 0: + cd = 0 + + if cd < 0.02 and gcd < 0.001: + set_process(false) + hide_cooldown_timer() + return + + if gcd > 0.001: + gcd -= delta + + if gcd < 0: + gcd = 0 + + var value : float = gcd + + if cd > value: + value = cd + + set_cooldown_time(value) + +func set_cooldown_time(time : float) -> void: + cooldown_indicator.value = time + cooldown_text.text = str(int(time)) + +func show_cooldown_timer(max_time : float) -> void: + if cooldown_indicator.visible and cooldown_indicator.max_value < max_time: + cooldown_indicator.max_value = max_time + + if not cooldown_indicator.visible: + cooldown_indicator.max_value = max_time + + cooldown_indicator.show() + cooldown_text.show() + +func hide_cooldown_timer() -> void: + cooldown_indicator.hide() + cooldown_text.hide() + +func set_item_instance(pitem : ItemInstance) -> void: + if item != null and item.item_template.stack_size > 1: + item.disconnect("stack_size_changed", self, "stack_size_changed") + _stack_counter.hide() + + item = pitem + + setup_icon() + + if item != null and item.item_template.stack_size > 1: + item.connect("stack_size_changed", self, "stack_size_changed") + _stack_counter.show() + stack_size_changed(item) + +func setup_icon() -> void: + if (item == null): + icon_rect.texture = null + else: + if (item.get_item_template() == null): + icon_rect.texture = null + return + + if item.item_template.use_spell != null: + var spell : Spell = item.item_template.use_spell + spell_id = spell.id + has_gcd = spell.cooldown_global_cooldown_enabled + else: + spell_id = 0 + has_gcd = false + + icon_rect.texture = item.item_template.icon + + + + +func set_button_entry_data(ii : ItemInstance) -> void: + if item != null and item.item_template.stack_size > 1: + item.disconnect("stack_size_changed", self, "stack_size_changed") + _stack_counter.hide() + + item = ii + + setup_icon() + + if item != null and item.item_template.stack_size > 1: + item.connect("stack_size_changed", self, "stack_size_changed") + _stack_counter.show() + stack_size_changed(item) + +func stack_size_changed(ii : ItemInstance) -> void: + _stack_counter.text = str(ii.stack_size) + +func get_drag_data(pos: Vector2) -> Object: + if item == null: + return null + + var tr = TextureRect.new() + tr.texture = icon_rect.texture + tr.expand = true + + tr.rect_size = icon_rect.rect_size + set_drag_preview(tr) + + var esd = ESDragAndDrop.new() + + esd.origin = self + esd.type = ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_INVENTORY_ITEM + esd.item_path = item.item_template.resource_path + esd.set_meta("slot_id", slot_id) + + setup_icon() + + return esd + +func can_drop_data(pos, data) -> bool: + return (data.is_class("ESDragAndDrop") and (data.type == ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_INVENTORY_ITEM or + data.type == ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_EQUIPPED_ITEM)) + + +func drop_data(pos, esd) -> void: + if esd.type == ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_INVENTORY_ITEM: + player.item_crequest_swap(slot_id, esd.get_meta("slot_id")) + setup_icon() + elif esd.type == ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_EQUIPPED_ITEM: + player.equip_crequest(ESS.resource_db.get_item_template_path(esd.item_path).equip_slot, slot_id) + setup_icon() + +func set_slot_id(pslot_id : int) -> void: + slot_id = pslot_id + +func set_player(p_player: Entity) -> void: + if not player == null: + player.disconnect("ccooldown_added", self, "_ccooldown_added") + player.disconnect("ccooldown_removed", self, "_ccooldown_removed") + + player.disconnect("cgcd_started", self, "_cgcd_started") + player.disconnect("cgcd_finished", self, "_cgcd_finished") + + player = null + + player = p_player + + if player == null: + return + +# for i in range(player.cooldown_getc_count()): +# var cooldown : Cooldown = player.cooldown_getc(i) + + player.connect("ccooldown_added", self, "_ccooldown_added") + player.connect("ccooldown_removed", self, "_ccooldown_removed") + + player.connect("cgcd_started", self, "_cgcd_started") + player.connect("cgcd_finished", self, "_cgcd_finished") + + +func _ccooldown_added(id : int, value : float) -> void: + if id == spell_id: + cd = value + set_process(true) + show_cooldown_timer(value) + +func _ccooldown_removed(id : int, value : float) -> void: + if id == spell_id: + cd = 0 + +func _cgcd_started(entity: Entity, value :float) -> void: + if not has_gcd: + return + + gcd = value + show_cooldown_timer(value) + set_process(true) + +func _cgcd_finished(entity) -> void: + gcd = 0 + +func _on_button_pressed() -> void: +#func _pressed(): + if _tooltip != null and item != null: + var pos : Vector2 = rect_global_position + pos.x += rect_size.x + + _tooltip.set_item(player, item) + _tooltip.popup(Rect2(pos, _tooltip.rect_size)) +# _tooltip.pac + +func set_tooltip_node(tooltip : Popup) -> void: + _tooltip = tooltip diff --git a/game/ui/bags/BagEntry.tscn b/game/ui/bags/BagEntry.tscn new file mode 100644 index 0000000..bd0587b --- /dev/null +++ b/game/ui/bags/BagEntry.tscn @@ -0,0 +1,104 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://ui/bags/BagEntry.gd" type="Script" id=1] +[ext_resource path="res://ui/theme/cooldown_progress.png" type="Texture" id=2] +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=3] +[ext_resource path="res://ui/theme/actionbar_dynamicfont.tres" type="DynamicFont" id=5] + +[node name="BagEntry" type="Button"] +margin_top = 1.0 +margin_right = 45.0 +margin_bottom = 46.0 +rect_min_size = Vector2( 45, 45 ) +focus_mode = 0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme = ExtResource( 3 ) +shortcut_in_tooltip = false +action_mode = 0 +button_mask = 3 +enabled_focus_mode = 0 +keep_pressed_outside = true +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +button_path = NodePath(".") +icon_path = NodePath("MarginContainer/TextureRect") +cooldown_indicator_path = NodePath("CooldownIndicator") +cooldown_text_path = NodePath("CooldownText") +stack_counter = NodePath("MarginContainer2/StackCounter") + +[node name="MarginContainer" type="MarginContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +custom_constants/margin_right = 2 +custom_constants/margin_top = 2 +custom_constants/margin_left = 2 +custom_constants/margin_bottom = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TextureRect" type="TextureRect" parent="MarginContainer"] +margin_left = 2.0 +margin_top = 2.0 +margin_right = 43.0 +margin_bottom = 43.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +expand = true + +[node name="CooldownIndicator" type="TextureProgress" parent="."] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +step = 0.0 +texture_progress = ExtResource( 2 ) +fill_mode = 5 +nine_patch_stretch = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="CooldownText" type="Label" parent="."] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_fonts/font = ExtResource( 5 ) +align = 1 +valign = 1 +clip_text = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="MarginContainer2" type="MarginContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +custom_constants/margin_right = 4 +custom_constants/margin_top = 4 +custom_constants/margin_left = 4 +custom_constants/margin_bottom = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="StackCounter" type="Label" parent="MarginContainer2"] +visible = false +margin_left = 4.0 +margin_top = 4.0 +margin_right = 41.0 +margin_bottom = 42.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +align = 2 +valign = 2 diff --git a/game/ui/bags/BagFrame.gd b/game/ui/bags/BagFrame.gd new file mode 100644 index 0000000..f276638 --- /dev/null +++ b/game/ui/bags/BagFrame.gd @@ -0,0 +1,29 @@ +extends Control + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(PackedScene) var bag_scene : PackedScene +export(NodePath) var container_path : NodePath = "BagContainerFrame" + +var container : Control + +func _ready() -> void: + container = get_node(container_path) as Control diff --git a/game/ui/bags/BagFrame.tscn b/game/ui/bags/BagFrame.tscn new file mode 100644 index 0000000..69607ab --- /dev/null +++ b/game/ui/bags/BagFrame.tscn @@ -0,0 +1,51 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/bags/Bag.tscn" type="PackedScene" id=1] +[ext_resource path="res://ui/bags/BagFrame.gd" type="Script" id=2] + +[node name="BagFrame" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +script = ExtResource( 2 ) +__meta__ = { +"_edit_lock_": true, +"_edit_use_anchors_": false +} +bag_scene = ExtResource( 1 ) +container_path = NodePath("") + +[node name="BagOpenerFrame" type="HBoxContainer" parent="."] +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = -39.0 +margin_top = -37.0 +grow_horizontal = 0 +grow_vertical = 0 +size_flags_horizontal = 0 +size_flags_vertical = 0 +alignment = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Button" type="Button" parent="BagOpenerFrame"] +margin_right = 40.0 +margin_bottom = 40.0 +rect_min_size = Vector2( 40, 40 ) +text = "B" + +[node name="Bag" parent="." instance=ExtResource( 1 )] +visible = false +margin_left = 68.0 +margin_top = 115.0 +margin_right = 551.0 +margin_bottom = 432.0 +grow_horizontal = 0 +grow_vertical = 0 +rect_min_size = Vector2( 100, 0 ) +size_flags_horizontal = 10 +size_flags_vertical = 10 +[connection signal="pressed" from="BagOpenerFrame/Button" to="Bag" method="show"] diff --git a/game/ui/bags/BaseWindow.tscn b/game/ui/bags/BaseWindow.tscn new file mode 100644 index 0000000..a5a7286 --- /dev/null +++ b/game/ui/bags/BaseWindow.tscn @@ -0,0 +1,79 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] + +[node name="BaseWindow" type="Panel"] +margin_right = 523.0 +margin_bottom = 427.0 +theme = ExtResource( 1 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="MarginContainer" type="MarginContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +__meta__ = { +"_edit_lock_": true +} + +[node name="VSplitContainer" type="VSplitContainer" parent="MarginContainer"] +margin_right = 523.0 +margin_bottom = 427.0 +dragger_visibility = 2 + +[node name="Header" type="MarginContainer" parent="MarginContainer/VSplitContainer"] +margin_right = 523.0 +margin_bottom = 32.0 + +[node name="VSplitContainer" type="VSplitContainer" parent="MarginContainer/VSplitContainer/Header"] +margin_right = 523.0 +margin_bottom = 32.0 +size_flags_horizontal = 3 +collapsed = true +dragger_visibility = 2 + +[node name="MarginContainer" type="MarginContainer" parent="MarginContainer/VSplitContainer/Header/VSplitContainer"] +margin_right = 523.0 +margin_bottom = 24.0 +custom_constants/margin_right = 2 +custom_constants/margin_top = 2 +custom_constants/margin_left = 2 +custom_constants/margin_bottom = 1 + +[node name="HSplitContainer" type="HSplitContainer" parent="MarginContainer/VSplitContainer/Header/VSplitContainer/MarginContainer"] +margin_left = 2.0 +margin_top = 2.0 +margin_right = 521.0 +margin_bottom = 23.0 +dragger_visibility = 2 + +[node name="Label" type="Label" parent="MarginContainer/VSplitContainer/Header/VSplitContainer/MarginContainer/HSplitContainer"] +margin_right = 485.0 +margin_bottom = 21.0 +size_flags_horizontal = 3 +size_flags_vertical = 5 +text = "Header" +valign = 1 + +[node name="Button" type="Button" parent="MarginContainer/VSplitContainer/Header/VSplitContainer/MarginContainer/HSplitContainer"] +margin_left = 485.0 +margin_right = 519.0 +margin_bottom = 21.0 +hint_tooltip = "Close" +size_flags_horizontal = 3 +size_flags_vertical = 3 +size_flags_stretch_ratio = 0.07 +text = "X" + +[node name="HSeparator" type="HSeparator" parent="MarginContainer/VSplitContainer/Header/VSplitContainer"] +margin_top = 24.0 +margin_right = 523.0 +margin_bottom = 32.0 +size_flags_horizontal = 3 +size_flags_vertical = 0 + +[node name="Content" type="MarginContainer" parent="MarginContainer/VSplitContainer"] +margin_top = 32.0 +margin_right = 523.0 +margin_bottom = 427.0 diff --git a/game/ui/bags/EquipmentSlot.gd b/game/ui/bags/EquipmentSlot.gd new file mode 100644 index 0000000..3112fa0 --- /dev/null +++ b/game/ui/bags/EquipmentSlot.gd @@ -0,0 +1,118 @@ +extends Button + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(int) var equip_slot : int + +export(NodePath) var texture_path : NodePath + +var _texture : TextureRect +var _tooltip : Popup + +var _player : Entity + +var _item_instance : ItemInstance + +func _ready(): + _texture = get_node(texture_path) as TextureRect + + connect("button_up", self, "_on_button_pressed") + +func set_tooltip_node(tooltip : Popup) -> void: + _tooltip = tooltip + +func set_player(player: Entity) -> void: + if _player != null: + _player.disconnect("equip_con_success", self, "equip_con_success") + + _player = player + + if _player == null: + return + + _player.connect("equip_con_success", self, "equip_con_success") + + equip_con_success(player, equip_slot, player.equip_getc_slot(equip_slot), null, 0) + +func drop_data(position, data): + if _player == null: + return + + var dd : ESDragAndDrop = data as ESDragAndDrop + + if dd.type == ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_EQUIPPED_ITEM: + #todo + return + + if dd.type == ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_INVENTORY_ITEM: + _player.equip_crequest(equip_slot, dd.get_meta("slot_id")) + +func can_drop_data(position, data): + if _player == null: + return false + + if data is ESDragAndDrop and (data.type == ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_EQUIPPED_ITEM or + data.type == ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_INVENTORY_ITEM): + return true + + return false + +func get_drag_data(position): + if _item_instance == null: + return null + + var tr = TextureRect.new() + tr.texture = _texture.texture + tr.expand = true + + tr.rect_size = _texture.rect_size + set_drag_preview(tr) + + var esd = ESDragAndDrop.new() + + esd.origin = self + esd.type = ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_EQUIPPED_ITEM + esd.item_path = _item_instance.item_template.resource_path + esd.set_meta("equip_slot_id", equip_slot) + + return esd + +func equip_con_success(entity: Entity, pequip_slot: int, item: ItemInstance, old_item: ItemInstance, bag_slot: int): + if equip_slot != pequip_slot: + return + + _item_instance = item + + if item == null: + _texture.texture = null + return + + _texture.texture = item.item_template.icon + +func _on_button_pressed() -> void: +#func _pressed(): + if _tooltip != null and _item_instance != null: + var pos : Vector2 = rect_global_position + pos.x += rect_size.x + + _tooltip.set_item(_player, _item_instance) + _tooltip.popup(Rect2(pos, _tooltip.rect_size)) +# _tooltip.pac diff --git a/game/ui/bags/EquipmentSlot.tscn b/game/ui/bags/EquipmentSlot.tscn new file mode 100644 index 0000000..971fc46 --- /dev/null +++ b/game/ui/bags/EquipmentSlot.tscn @@ -0,0 +1,37 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/bags/EquipmentSlot.gd" type="Script" id=1] + +[node name="EquipmentSlot" type="Button"] +margin_left = 84.0 +margin_right = 134.0 +margin_bottom = 50.0 +rect_min_size = Vector2( 50, 50 ) +text = "Head" +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +texture_path = NodePath("MarginContainer/TextureRect") + +[node name="MarginContainer" type="MarginContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +custom_constants/margin_right = 5 +custom_constants/margin_top = 5 +custom_constants/margin_left = 5 +custom_constants/margin_bottom = 5 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TextureRect" type="TextureRect" parent="MarginContainer"] +margin_left = 5.0 +margin_top = 5.0 +margin_right = 45.0 +margin_bottom = 45.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +expand = true diff --git a/game/ui/bags/InventoryGUI.gd b/game/ui/bags/InventoryGUI.gd new file mode 100644 index 0000000..9d2df43 --- /dev/null +++ b/game/ui/bags/InventoryGUI.gd @@ -0,0 +1,149 @@ +extends Control + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +var opener_button : BaseButton + +export(PackedScene) var inventory_item_scene : PackedScene +export(NodePath) var inventory_item_container_path : NodePath +export(NodePath) var item_tooltip_path : NodePath +export(Array, NodePath) var inventory_slots : Array + +var _inventory_slots : Array +var _inventory_item_container : Node +var _tooltip : Popup + +var _player : Entity = null +var _bag : Bag = null + +func _ready() -> void: + _inventory_item_container = get_node(inventory_item_container_path) + _tooltip = get_node(item_tooltip_path) + + for np in inventory_slots: + var es : Control = get_node(np) as Control + es.set_tooltip_node(_tooltip) + _inventory_slots.append(es) + + connect("visibility_changed", self, "on_visibility_changed") + +func set_player(p_player: Entity) -> void: + if _player != null: + _player.disconnect("cbag_changed", self, "cbag_changed") + _player.disconnect("equip_con_success", self, "equip_con_success") + + for ie in _inventory_item_container.get_children(): + ie.queue_free() + + _player = p_player + + _player.connect("cbag_changed", self, "cbag_changed") + _player.connect("equip_con_success", self, "equip_con_success") + + cbag_changed(_player, _player.cbag) + + for np in _inventory_slots: + np.set_player(_player) + + refresh_bags() + +func refresh_bags() -> void: + if _bag == null: + return + + if not visible: + return + +# if _bag.size == _inventory_item_container.get_child_count(): +# return + + for ie in _inventory_item_container.get_children(): + ie.queue_free() + + for i in range(_bag.get_size()): + var n : Node = inventory_item_scene.instance() + + _inventory_item_container.add_child(n) + n.owner = _inventory_item_container + + n.set_slot_id(i) + n.set_tooltip_node(_tooltip) + n.set_player(_player) + n.set_item_instance(_bag.get_item(i)) + +func cbag_changed(entity: Entity, bag: Bag) -> void: + if _bag != null: + _bag.disconnect("size_changed", self, "bag_size_changed") + _bag.disconnect("item_added", self, "bag_item_added") + _bag.disconnect("item_count_changed", self, "item_count_changed") + _bag.disconnect("item_removed", self, "item_removed") + _bag.disconnect("item_swapped", self, "item_swapped") + + _bag = entity.cbag + + if _bag == null: + return + + _bag.connect("size_changed", self, "bag_size_changed") + _bag.connect("item_added", self, "bag_item_added") + _bag.connect("item_count_changed", self, "item_count_changed") + _bag.connect("item_removed", self, "item_removed") + _bag.connect("item_swapped", self, "item_swapped") + +# overburden_removed(bag: Bag) +# overburdened(bag: Bag) + +func bag_size_changed(bag: Bag) -> void: + refresh_bags() + +func bag_item_added(bag: Bag, item: ItemInstance, slot_id: int) -> void: + refresh_bags() + +func item_count_changed(bag: Bag, item: ItemInstance, slot_id: int) -> void: + refresh_bags() + +func item_removed(bag: Bag, item: ItemInstance, slot_id: int) -> void: + refresh_bags() + +func item_swapped(bag: Bag, item1_slot : int, item2_slot: int) -> void: + refresh_bags() + +func equip_con_success(entity, equip_slot, item, old_item, bag_slot) -> void: + refresh_bags() + +func on_visibility_changed(): + refresh_bags() + + if opener_button: + if visible && !opener_button.pressed: + opener_button.pressed = true + return + + if !visible && opener_button.pressed: + opener_button.pressed = false + +func _on_button_toggled(button_pressed): + if button_pressed: + if !visible: + show() + else: + if visible: + hide() diff --git a/game/ui/bags/InventoryWindow.tscn b/game/ui/bags/InventoryWindow.tscn new file mode 100644 index 0000000..7b090e4 --- /dev/null +++ b/game/ui/bags/InventoryWindow.tscn @@ -0,0 +1,127 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/bags/ItemEntry.tscn" type="PackedScene" id=1] +[ext_resource path="res://ui/bags/BaseWindow.tscn" type="PackedScene" id=2] + + + +[node name="InventoryWindow" type="Control"] +margin_right = 888.0 +margin_bottom = 463.0 + +[node name="BaseWindow" parent="." instance=ExtResource( 2 )] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_right = 0.0 +margin_bottom = 0.0 + +[node name="VSplitContainer" parent="BaseWindow/MarginContainer" index="0"] +margin_right = 888.0 +margin_bottom = 463.0 + +[node name="Header" parent="BaseWindow/MarginContainer/VSplitContainer" index="0"] +margin_right = 888.0 + +[node name="VSplitContainer" parent="BaseWindow/MarginContainer/VSplitContainer/Header" index="0"] +margin_right = 888.0 + +[node name="MarginContainer" parent="BaseWindow/MarginContainer/VSplitContainer/Header/VSplitContainer" index="0"] +margin_right = 888.0 + +[node name="HSplitContainer" parent="BaseWindow/MarginContainer/VSplitContainer/Header/VSplitContainer/MarginContainer" index="0"] +margin_right = 886.0 + +[node name="Label" parent="BaseWindow/MarginContainer/VSplitContainer/Header/VSplitContainer/MarginContainer/HSplitContainer" index="0"] +margin_right = 826.0 + +[node name="Button" parent="BaseWindow/MarginContainer/VSplitContainer/Header/VSplitContainer/MarginContainer/HSplitContainer" index="1"] +margin_left = 826.0 +margin_right = 884.0 + +[node name="HSeparator" parent="BaseWindow/MarginContainer/VSplitContainer/Header/VSplitContainer" index="1"] +margin_right = 888.0 + +[node name="Content" parent="BaseWindow/MarginContainer/VSplitContainer" index="1"] +margin_right = 888.0 +margin_bottom = 463.0 + +[node name="PanelContainer" type="MarginContainer" parent="BaseWindow/MarginContainer/VSplitContainer/Content" index="0"] +margin_right = 888.0 +margin_bottom = 431.0 + +[node name="HBoxContainer" type="HBoxContainer" parent="BaseWindow/MarginContainer/VSplitContainer/Content/PanelContainer"] +margin_right = 888.0 +margin_bottom = 431.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="PanelContainer" type="PanelContainer" parent="BaseWindow/MarginContainer/VSplitContainer/Content/PanelContainer/HBoxContainer"] +margin_right = 432.0 +margin_bottom = 431.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="ScrollContainer" type="ScrollContainer" parent="BaseWindow/MarginContainer/VSplitContainer/Content/PanelContainer/HBoxContainer/PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 428.0 +margin_bottom = 427.0 + +[node name="ItemContainer" type="VBoxContainer" parent="BaseWindow/MarginContainer/VSplitContainer/Content/PanelContainer/HBoxContainer/PanelContainer/ScrollContainer"] +margin_right = 424.0 +margin_bottom = 47.0 +size_flags_horizontal = 3 + +[node name="ItemEntry" parent="BaseWindow/MarginContainer/VSplitContainer/Content/PanelContainer/HBoxContainer/PanelContainer/ScrollContainer/ItemContainer" instance=ExtResource( 1 )] +margin_right = 424.0 +margin_bottom = 47.0 + +[node name="Filter" type="PanelContainer" parent="BaseWindow/MarginContainer/VSplitContainer/Content/PanelContainer/HBoxContainer"] +margin_left = 440.0 +margin_right = 448.0 +margin_bottom = 431.0 +size_flags_vertical = 3 + +[node name="PanelContainer2" type="PanelContainer" parent="BaseWindow/MarginContainer/VSplitContainer/Content/PanelContainer/HBoxContainer"] +margin_left = 456.0 +margin_right = 888.0 +margin_bottom = 431.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="BaseWindow/MarginContainer/VSplitContainer/Content/PanelContainer/HBoxContainer/PanelContainer2"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 428.0 +margin_bottom = 427.0 + +[node name="HeadSlot" type="PanelContainer" parent="BaseWindow/MarginContainer/VSplitContainer/Content/PanelContainer/HBoxContainer/PanelContainer2/VBoxContainer"] +margin_right = 424.0 +margin_bottom = 8.0 + +[node name="MarginContainer" type="MarginContainer" parent="BaseWindow/MarginContainer/VSplitContainer/Content/PanelContainer/HBoxContainer/PanelContainer2/VBoxContainer"] +margin_top = 16.0 +margin_right = 424.0 +margin_bottom = 24.0 + +[node name="HBoxContainer" type="HBoxContainer" parent="BaseWindow/MarginContainer/VSplitContainer/Content/PanelContainer/HBoxContainer/PanelContainer2/VBoxContainer/MarginContainer"] +margin_right = 424.0 +margin_bottom = 8.0 + +[node name="PanelContainer" type="PanelContainer" parent="BaseWindow/MarginContainer/VSplitContainer/Content/PanelContainer/HBoxContainer/PanelContainer2/VBoxContainer/MarginContainer/HBoxContainer"] +margin_right = 8.0 +margin_bottom = 8.0 + +[node name="Control" type="Control" parent="BaseWindow/MarginContainer/VSplitContainer/Content/PanelContainer/HBoxContainer/PanelContainer2/VBoxContainer/MarginContainer/HBoxContainer"] +margin_left = 16.0 +margin_right = 408.0 +margin_bottom = 8.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="PanelContainer2" type="PanelContainer" parent="BaseWindow/MarginContainer/VSplitContainer/Content/PanelContainer/HBoxContainer/PanelContainer2/VBoxContainer/MarginContainer/HBoxContainer"] +margin_left = 416.0 +margin_right = 424.0 +margin_bottom = 8.0 + +[editable path="BaseWindow"] diff --git a/game/ui/bags/ItemEntry.tscn b/game/ui/bags/ItemEntry.tscn new file mode 100644 index 0000000..ba1094a --- /dev/null +++ b/game/ui/bags/ItemEntry.tscn @@ -0,0 +1,54 @@ +[gd_scene format=2] + +[node name="ItemEntry" type="PanelContainer"] +margin_right = 398.0 +margin_bottom = 97.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +margin_left = 14.0 +margin_top = 14.0 +margin_right = 384.0 +margin_bottom = 83.0 + +[node name="PanelContainer" type="PanelContainer" parent="HBoxContainer"] +margin_right = 28.0 +margin_bottom = 69.0 + +[node name="TextureRect" type="TextureRect" parent="HBoxContainer/PanelContainer"] +margin_left = 14.0 +margin_top = 14.0 +margin_right = 14.0 +margin_bottom = 55.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="HBoxContainer"] +margin_left = 36.0 +margin_right = 370.0 +margin_bottom = 69.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="PanelContainer" type="PanelContainer" parent="HBoxContainer/VBoxContainer"] +margin_right = 334.0 +margin_bottom = 53.0 + +[node name="Name" type="Label" parent="HBoxContainer/VBoxContainer/PanelContainer"] +margin_left = 14.0 +margin_top = 14.0 +margin_right = 320.0 +margin_bottom = 39.0 +text = "Sword of Big Damage" + +[node name="StatsGrid" type="GridContainer" parent="HBoxContainer/VBoxContainer"] +margin_top = 61.0 +margin_right = 334.0 +margin_bottom = 61.0 + +[node name="SpellsContainer" type="VBoxContainer" parent="HBoxContainer/VBoxContainer"] +margin_top = 69.0 +margin_right = 334.0 +margin_bottom = 69.0 diff --git a/game/ui/bags/ItemPupop.gd b/game/ui/bags/ItemPupop.gd new file mode 100644 index 0000000..203d15d --- /dev/null +++ b/game/ui/bags/ItemPupop.gd @@ -0,0 +1,52 @@ +extends PopupPanel + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(NodePath) var name_path : NodePath +export(NodePath) var description_path : NodePath +export(NodePath) var use_button_path : NodePath + +var _name : RichTextLabel +var _description : RichTextLabel +var _use_button : Button + +var _entity : Entity +var _item : ItemInstance + +func _ready(): + _name = get_node(name_path) as RichTextLabel + _description = get_node(description_path) as RichTextLabel + _use_button = get_node(use_button_path) as Button + +func set_item(entity : Entity, item : ItemInstance) -> void: + _entity = entity + _item = item + + _name.bbcode_text = item.item_template.text_name +# _description.text = item.item_template. + + if item.item_template.use_spell != null: + _use_button.show() + else: + _use_button.hide() + +func use_button_pressed(): + _entity.item_crequest_use(_item.item_template.id) diff --git a/game/ui/bags/ItemTooltip.tscn b/game/ui/bags/ItemTooltip.tscn new file mode 100644 index 0000000..ac37109 --- /dev/null +++ b/game/ui/bags/ItemTooltip.tscn @@ -0,0 +1,76 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/bags/ItemPupop.gd" type="Script" id=1] + +[node name="ItemTooltip" type="PopupPanel"] +margin_right = 295.0 +margin_bottom = 223.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +name_path = NodePath("../ItemTooltip/VBoxContainer/HBoxContainer/VBoxContainer/NameLabel") +description_path = NodePath("../ItemTooltip/VBoxContainer/DescriptionLabel") +use_button_path = NodePath("VBoxContainer/UseButton") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 291.0 +margin_bottom = 219.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +margin_right = 287.0 +margin_bottom = 26.0 + +[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/HBoxContainer"] +margin_right = 253.0 +margin_bottom = 26.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +alignment = 1 + +[node name="NameLabel" type="RichTextLabel" parent="VBoxContainer/HBoxContainer/VBoxContainer"] +margin_top = 4.0 +margin_right = 253.0 +margin_bottom = 22.0 +rect_min_size = Vector2( 0, 18 ) +size_flags_horizontal = 3 +bbcode_enabled = true + +[node name="Button" type="Button" parent="VBoxContainer/HBoxContainer"] +margin_left = 257.0 +margin_right = 287.0 +margin_bottom = 26.269 +rect_min_size = Vector2( 30, 20 ) +text = "X" + +[node name="HSeparator" type="HSeparator" parent="VBoxContainer"] +margin_top = 34.0 +margin_right = 287.0 +margin_bottom = 38.0 +size_flags_horizontal = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="UseButton" type="Button" parent="VBoxContainer"] +margin_top = 46.0 +margin_right = 287.0 +margin_bottom = 72.269 +text = "Use" + +[node name="DescriptionLabel" type="RichTextLabel" parent="VBoxContainer"] +margin_top = 80.0 +margin_right = 287.0 +margin_bottom = 215.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +bbcode_enabled = true +[connection signal="pressed" from="VBoxContainer/HBoxContainer/Button" to="." method="hide"] +[connection signal="pressed" from="VBoxContainer/UseButton" to="." method="use_button_pressed"] diff --git a/game/ui/bags/game_module.tres b/game/ui/bags/game_module.tres new file mode 100644 index 0000000..3c5777c --- /dev/null +++ b/game/ui/bags/game_module.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" load_steps=4 format=2] + +[ext_resource path="res://ui/theme/bag_icon.tres" type="Texture" id=1] +[ext_resource path="res://scripts/game_modules/ui_window_module.gd" type="Script" id=2] +[ext_resource path="res://ui/bags/Bag.tscn" type="PackedScene" id=3] + +[resource] +script = ExtResource( 2 ) +enabled = true +scene = ExtResource( 3 ) +opener_button_texture = ExtResource( 1 ) +index = 3 +add_button = true diff --git a/game/ui/bags/weapon_set_button_group.tres b/game/ui/bags/weapon_set_button_group.tres new file mode 100644 index 0000000..0e55d74 --- /dev/null +++ b/game/ui/bags/weapon_set_button_group.tres @@ -0,0 +1,3 @@ +[gd_resource type="ButtonGroup" format=2] + +[resource] diff --git a/game/ui/buttons/Buttons.gd b/game/ui/buttons/Buttons.gd new file mode 100644 index 0000000..f69ae56 --- /dev/null +++ b/game/ui/buttons/Buttons.gd @@ -0,0 +1,75 @@ +extends Control + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export (PackedScene) var image_button : PackedScene + +export (NodePath) var spell_book_path +export (NodePath) var spell_book_button_path +var spell_book +var spell_book_button + +export (NodePath) var lock_button_path +var lock_button + +var player : Entity + +func _ready(): + lock_button = get_node(lock_button_path) + lock_button.connect("pressed", self, "_lock_button_click") + +func add_image_button(texture : Texture, index : int = -1) -> Button: + var button : Button = image_button.instance() as Button + + button.set_meta("button_index", index) + + button.get_child(0).texture = texture + + add_child(button) + + for ch in get_children(): + var button_index : int = get_child_count() + + if ch.has_meta("button_index"): + button_index = ch.get_meta("button_index") + + if button_index != -1: + move_child(ch, button_index) + + return button + +func set_player(p_player): + player = p_player + + +func _lock_button_click(): + if player == null: + return + + var cls = player.centity_data + + if cls == null: + return + + var profile = ProfileManager.getc_player_profile().get_class_profile(cls.resource_path) + + profile.actionbar_locked = not profile.actionbar_locked + diff --git a/game/ui/buttons/ImageButton.tscn b/game/ui/buttons/ImageButton.tscn new file mode 100644 index 0000000..30a2305 --- /dev/null +++ b/game/ui/buttons/ImageButton.tscn @@ -0,0 +1,26 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/theme/character_icon.tres" type="Texture" id=1] + +[node name="ImageButton" type="Button"] +margin_right = 25.0 +margin_bottom = 40.0 +rect_min_size = Vector2( 25, 30 ) +hint_tooltip = "Inventory" +focus_mode = 0 +toggle_mode = true +enabled_focus_mode = 0 +keep_pressed_outside = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TextureRect" type="TextureRect" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +texture = ExtResource( 1 ) +expand = true +stretch_mode = 6 +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/game/ui/castbar/Castbar.gd b/game/ui/castbar/Castbar.gd new file mode 100644 index 0000000..1e464bd --- /dev/null +++ b/game/ui/castbar/Castbar.gd @@ -0,0 +1,80 @@ +extends VBoxContainer + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export (NodePath) var progress_bar_path +export (NodePath) var label_path + +var progress_bar : ProgressBar +var label : Label + +var player : Entity = null +var spell_cast_info : SpellCastInfo = null + +func _ready() -> void: + progress_bar = get_node(progress_bar_path) + progress_bar.min_value = 0 + label = get_node(label_path) + hide() + set_process(false) + +func _process(delta: float) -> void: + if not spell_cast_info.is_casting: + hide() + set_process(false) + + progress_bar.value = spell_cast_info.current_cast_time + + +func set_player(p_player: Entity) -> void: + if not player == null: + player.disconnect("notification_ccast", self, "on_notification_ccast") + + player = p_player + + player.connect("notification_ccast", self, "on_notification_ccast") + + +func on_notification_ccast(what : int, pspell_cast_info: SpellCastInfo) -> void: + if what == SpellEnums.NOTIFICATION_CAST_STARTED: + set_process(true) + + spell_cast_info = pspell_cast_info + + label.text = spell_cast_info.spell.get_name() + + progress_bar.value = spell_cast_info.current_cast_time + progress_bar.max_value = spell_cast_info.cast_time + + show() + elif what == SpellEnums.NOTIFICATION_CAST_FAILED: + set_process(false) + hide() + elif what == SpellEnums.NOTIFICATION_CAST_FINISHED: + set_process(false) + hide() + elif what == SpellEnums.NOTIFICATION_CAST_INTERRUPTED: + set_process(false) + hide() + + + + diff --git a/game/ui/castbar/Castbar.tscn b/game/ui/castbar/Castbar.tscn new file mode 100644 index 0000000..d5bf1f4 --- /dev/null +++ b/game/ui/castbar/Castbar.tscn @@ -0,0 +1,52 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/castbar/Castbar.gd" type="Script" id=1] +[ext_resource path="res://ui/theme/scrollbar_grabber_blue.tres" type="StyleBox" id=2] + +[node name="Castbar" type="VBoxContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +progress_bar_path = NodePath("HBoxContainer/ProgressBar") +label_path = NodePath("HBoxContainer/ProgressBar/Label") + +[node name="Spacer" type="Control" parent="."] +margin_right = 1024.0 +margin_bottom = 447.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +size_flags_stretch_ratio = 3.0 + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +margin_top = 451.0 +margin_right = 1024.0 +margin_bottom = 600.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +alignment = 1 + +[node name="ProgressBar" type="ProgressBar" parent="HBoxContainer"] +margin_left = 402.0 +margin_right = 622.0 +margin_bottom = 20.0 +rect_min_size = Vector2( 220, 20 ) +mouse_filter = 2 +custom_styles/fg = ExtResource( 2 ) +percent_visible = false + +[node name="Label" type="Label" parent="HBoxContainer/ProgressBar"] +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +align = 1 +valign = 1 +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/game/ui/castbar/game_module.tres b/game/ui/castbar/game_module.tres new file mode 100644 index 0000000..2d4c9e7 --- /dev/null +++ b/game/ui/castbar/game_module.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" load_steps=3 format=2] + +[ext_resource path="res://scripts/game_modules/ui_gui_child_module.gd" type="Script" id=1] +[ext_resource path="res://ui/castbar/Castbar.tscn" type="PackedScene" id=2] + +[resource] +script = ExtResource( 1 ) +enabled = true +scene = ExtResource( 2 ) +hide = true diff --git a/game/ui/character/CharacterWindow.gd b/game/ui/character/CharacterWindow.gd new file mode 100644 index 0000000..b6f6d9d --- /dev/null +++ b/game/ui/character/CharacterWindow.gd @@ -0,0 +1,33 @@ +extends Control + +#export(NodePath) var opener_button_path : NodePath +var opener_button : BaseButton + +export(NodePath) var container_path : NodePath +var container : Node + +var _player : Entity + +func _ready(): +# opener_button = get_node_or_null(opener_button_path) as BaseButton + container = get_node(container_path) + +func set_player(p_player: Entity) -> void: + _player = p_player + + for c in container.get_children(): + if c.has_method("set_player"): + c.set_player(_player) + +func _on_button_toggled(button_pressed): + if button_pressed: + show() + else: + hide() + + +func _on_Button_pressed(): + if opener_button: + opener_button.pressed = false + + hide() diff --git a/game/ui/character/CharacterWindow.tscn b/game/ui/character/CharacterWindow.tscn new file mode 100644 index 0000000..25abd6d --- /dev/null +++ b/game/ui/character/CharacterWindow.tscn @@ -0,0 +1,385 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] +[ext_resource path="res://ui/character/CharacterWindow.gd" type="Script" id=2] +[ext_resource path="res://ui/character/SingleStatRow.tscn" type="PackedScene" id=3] + +[node name="CharacterWindow" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +theme = ExtResource( 1 ) +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} +container_path = NodePath("Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer") + +[node name="Panel" type="PanelContainer" parent="."] +margin_left = 52.0 +margin_top = 54.0 +margin_right = 288.0 +margin_bottom = 421.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="Panel"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 232.0 +margin_bottom = 363.0 + +[node name="HBoxContainer" type="HBoxContainer" parent="Panel/VBoxContainer"] +margin_right = 228.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 0, 30 ) + +[node name="Label" type="Label" parent="Panel/VBoxContainer/HBoxContainer"] +margin_top = 7.0 +margin_right = 194.0 +margin_bottom = 22.0 +size_flags_horizontal = 3 +text = "Character" + +[node name="Button" type="Button" parent="Panel/VBoxContainer/HBoxContainer"] +margin_left = 198.0 +margin_right = 228.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 30, 30 ) +text = "X" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBoxContainer2" type="HBoxContainer" parent="Panel/VBoxContainer"] +margin_top = 38.0 +margin_right = 228.0 +margin_bottom = 359.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="ScrollContainer" type="ScrollContainer" parent="Panel/VBoxContainer/HBoxContainer2"] +margin_right = 228.0 +margin_bottom = 321.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="MarginContainer" type="MarginContainer" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer"] +margin_right = 218.0 +margin_bottom = 1066.0 +size_flags_horizontal = 3 +custom_constants/margin_right = 8 +custom_constants/margin_left = 6 + +[node name="VBoxContainer" type="VBoxContainer" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer"] +margin_left = 6.0 +margin_right = 210.0 +margin_bottom = 1066.0 +size_flags_horizontal = 3 + +[node name="Agility" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_right = 204.0 +stat_name = "Agility" + +[node name="Strength" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 23.0 +margin_right = 204.0 +margin_bottom = 38.0 +stat_name = "Strength" + +[node name="Stamina" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 46.0 +margin_right = 204.0 +margin_bottom = 61.0 +stat_name = "Stamina" + +[node name="Intellect" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 69.0 +margin_right = 204.0 +margin_bottom = 84.0 +stat_name = "Intellect" + +[node name="Spirit" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 92.0 +margin_right = 204.0 +margin_bottom = 107.0 +stat_name = "Spirit" + +[node name="Separator" type="Control" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer"] +margin_top = 115.0 +margin_right = 204.0 +margin_bottom = 119.0 +rect_min_size = Vector2( 0, 4 ) + +[node name="Health" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 127.0 +margin_right = 204.0 +margin_bottom = 142.0 +stat_name = "Health" + +[node name="Mana" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 150.0 +margin_right = 204.0 +margin_bottom = 165.0 +stat_name = "Mana" + +[node name="Speed" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 173.0 +margin_right = 204.0 +margin_bottom = 188.0 +stat_name = "Speed" + +[node name="Haste" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 196.0 +margin_right = 204.0 +margin_bottom = 211.0 +stat_name = "Haste" + +[node name="HasteRating" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 219.0 +margin_right = 204.0 +margin_bottom = 234.0 +stat_name = "Haste Rating" + +[node name="Separator2" type="Control" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer"] +margin_top = 242.0 +margin_right = 204.0 +margin_bottom = 246.0 +rect_min_size = Vector2( 0, 4 ) + +[node name="Resilience" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 254.0 +margin_right = 204.0 +margin_bottom = 269.0 +stat_name = "Resilience" + +[node name="Armor" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 277.0 +margin_right = 204.0 +margin_bottom = 292.0 +stat_name = "Armor" + +[node name="Separator4" type="Control" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer"] +margin_top = 300.0 +margin_right = 204.0 +margin_bottom = 304.0 +rect_min_size = Vector2( 0, 4 ) + +[node name="AttackPower" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 312.0 +margin_right = 204.0 +margin_bottom = 327.0 +stat_name = "Attack Power" + +[node name="SpellPower" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 335.0 +margin_right = 204.0 +margin_bottom = 350.0 +stat_name = "Spell Power" + +[node name="MeleeCrit" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 358.0 +margin_right = 204.0 +margin_bottom = 373.0 +stat_name = "Melee Crit" + +[node name="MeleeCritBonus" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 381.0 +margin_right = 204.0 +margin_bottom = 396.0 +stat_name = "Melee Crit Bonus" + +[node name="SpellCrit" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 404.0 +margin_right = 204.0 +margin_bottom = 419.0 +stat_name = "Spell Crit" + +[node name="SpellCritBonus" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 427.0 +margin_right = 204.0 +margin_bottom = 442.0 +stat_name = "Spell Crit Bonus" + +[node name="Separator3" type="Control" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer"] +margin_top = 450.0 +margin_right = 204.0 +margin_bottom = 454.0 +rect_min_size = Vector2( 0, 4 ) + +[node name="Block" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 462.0 +margin_right = 204.0 +margin_bottom = 477.0 +stat_name = "Block" + +[node name="Parry" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 485.0 +margin_right = 204.0 +margin_bottom = 500.0 +stat_name = "Parry" + +[node name="DamageReduction" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 508.0 +margin_right = 204.0 +margin_bottom = 523.0 +stat_name = "Damage Reduction" + +[node name="MeleeDamageReduction" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 531.0 +margin_right = 204.0 +margin_bottom = 546.0 +stat_name = "Melee Damage Reduction" + +[node name="SpellDamageReduction" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 554.0 +margin_right = 204.0 +margin_bottom = 569.0 +stat_name = "Spell Damage Reduction" + +[node name="Separator5" type="Control" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer"] +margin_top = 577.0 +margin_right = 204.0 +margin_bottom = 581.0 +rect_min_size = Vector2( 0, 4 ) + +[node name="DamageTaken" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 589.0 +margin_right = 204.0 +margin_bottom = 604.0 +stat_name = "Damage Taken" + +[node name="HealTaken" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 612.0 +margin_right = 204.0 +margin_bottom = 627.0 +stat_name = "Heal Taken" + +[node name="Separator6" type="Control" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer"] +margin_top = 635.0 +margin_right = 204.0 +margin_bottom = 639.0 +rect_min_size = Vector2( 0, 4 ) + +[node name="MeleeDamage" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 647.0 +margin_right = 204.0 +margin_bottom = 662.0 +stat_name = "Melee Damage" + +[node name="SpellDamage" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 670.0 +margin_right = 204.0 +margin_bottom = 685.0 +stat_name = "Spell Damage" + +[node name="Separator7" type="Control" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer"] +margin_top = 693.0 +margin_right = 204.0 +margin_bottom = 697.0 +rect_min_size = Vector2( 0, 4 ) + +[node name="HolyResist" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 705.0 +margin_right = 204.0 +margin_bottom = 720.0 +stat_name = "Holy Resist" + +[node name="ShadowResist" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 728.0 +margin_right = 204.0 +margin_bottom = 743.0 +stat_name = "Shadow Resist" + +[node name="NatureResist" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 751.0 +margin_right = 204.0 +margin_bottom = 766.0 +stat_name = "Nature Resist" + +[node name="FireResist" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 774.0 +margin_right = 204.0 +margin_bottom = 789.0 +stat_name = "Fire Resist" + +[node name="FrostResist" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 797.0 +margin_right = 204.0 +margin_bottom = 812.0 +stat_name = "Frost Resist" + +[node name="LightningResist" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 820.0 +margin_right = 204.0 +margin_bottom = 835.0 +stat_name = "Lightning Resist" + +[node name="ChaosResist" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 843.0 +margin_right = 204.0 +margin_bottom = 858.0 +stat_name = "Chaos Resist" + +[node name="SilenceResist" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 866.0 +margin_right = 204.0 +margin_bottom = 881.0 +stat_name = "Silence Resist" + +[node name="FearResist" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 889.0 +margin_right = 204.0 +margin_bottom = 904.0 +stat_name = "Fear Resist" + +[node name="StunResist" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 912.0 +margin_right = 204.0 +margin_bottom = 927.0 +stat_name = "Stun Resist" + +[node name="Separator8" type="Control" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer"] +margin_top = 935.0 +margin_right = 204.0 +margin_bottom = 939.0 +rect_min_size = Vector2( 0, 4 ) + +[node name="Energy" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 947.0 +margin_right = 204.0 +margin_bottom = 962.0 +stat_name = "Energy" + +[node name="Rage" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 970.0 +margin_right = 204.0 +margin_bottom = 985.0 +stat_name = "Rage" + +[node name="XPRate" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 993.0 +margin_right = 204.0 +margin_bottom = 1008.0 +stat_name = "XP Rate" + +[node name="Separator9" type="Control" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer"] +margin_top = 1016.0 +margin_right = 204.0 +margin_bottom = 1020.0 +rect_min_size = Vector2( 0, 4 ) + +[node name="WeaponDamageMin" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 1028.0 +margin_right = 204.0 +margin_bottom = 1043.0 +stat_name = "Weapon Damage Min" + +[node name="WeaponDamageMax" parent="Panel/VBoxContainer/HBoxContainer2/ScrollContainer/MarginContainer/VBoxContainer" instance=ExtResource( 3 )] +margin_top = 1051.0 +margin_right = 204.0 +margin_bottom = 1066.0 +stat_name = "Weapon Damage Max" + +[connection signal="pressed" from="Panel/VBoxContainer/HBoxContainer/Button" to="." method="_on_Button_pressed"] diff --git a/game/ui/character/SingleStatRow.gd b/game/ui/character/SingleStatRow.gd new file mode 100644 index 0000000..053938d --- /dev/null +++ b/game/ui/character/SingleStatRow.gd @@ -0,0 +1,38 @@ +extends HBoxContainer + +export(String) var stat_name : String +var stat_id : int + +onready var stat_name_label : Label = $StatName as Label +onready var stat_value_label : Label = $Stat as Label + +var _player : Entity + +func _ready(): + stat_id = ESS.stat_get_id(stat_name) + + stat_name_label.text = stat_name + + connect("visibility_changed", self, "on_visibility_changed") + +func on_visibility_changed(): + if _player: + stat_value_label.text = str(_player.stat_getc_current(stat_id)) + " " + else: + stat_value_label.text = str(0) + " " + +func set_player(p_player: Entity) -> void: + _player = p_player + + on_visibility_changed() + +""" +Agility,Strength,Stamina,Intellect,Spirit, +Health,Mana,Speed,Global Cooldown,Haste,Haste Rating, +Resilience,Armor,Attack Power,Spell Power,Melee Crit, +Melee Crit Bonus,Spell Crit,Spell Crit Bonus,Block,Parry,Damage Reduction, +Melee Damage Reduction,Spell Damage Reduction,Damage Taken,Heal Taken, +Melee Damage,Spell Damage,Holy Resist,Shadow Resist,Nature Resist, +Fire Resist,Frost Resist,Lightning Resist,Chaos Resist,Silence Resist,Fear Resist, +Stun Resist,Energy,Rage,XP Rate,Weapon Damage Min,Weapon Damage Max +""" diff --git a/game/ui/character/SingleStatRow.tscn b/game/ui/character/SingleStatRow.tscn new file mode 100644 index 0000000..af3ffed --- /dev/null +++ b/game/ui/character/SingleStatRow.tscn @@ -0,0 +1,27 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/character/SingleStatRow.gd" type="Script" id=1] + +[node name="SingleStatRow" type="HBoxContainer"] +margin_right = 1016.0 +margin_bottom = 15.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="StatName" type="Label" parent="."] +margin_right = 506.0 +margin_bottom = 14.0 +size_flags_horizontal = 3 +size_flags_vertical = 6 +valign = 1 + +[node name="Stat" type="Label" parent="."] +margin_left = 510.0 +margin_right = 1016.0 +margin_bottom = 14.0 +size_flags_horizontal = 3 +size_flags_vertical = 6 +align = 2 +valign = 1 diff --git a/game/ui/character/game_module.tres b/game/ui/character/game_module.tres new file mode 100644 index 0000000..3efffa8 --- /dev/null +++ b/game/ui/character/game_module.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" load_steps=4 format=2] + +[ext_resource path="res://scripts/game_modules/ui_window_module.gd" type="Script" id=1] +[ext_resource path="res://ui/character/CharacterWindow.tscn" type="PackedScene" id=2] +[ext_resource path="res://ui/theme/character_icon.tres" type="Texture" id=3] + +[resource] +script = ExtResource( 1 ) +enabled = true +scene = ExtResource( 2 ) +opener_button_texture = ExtResource( 3 ) +index = 0 +add_button = true diff --git a/game/ui/crafting/CraftItemDescription.gd b/game/ui/crafting/CraftItemDescription.gd new file mode 100644 index 0000000..3f5e0e7 --- /dev/null +++ b/game/ui/crafting/CraftItemDescription.gd @@ -0,0 +1,42 @@ +extends HBoxContainer + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(NodePath) var icon_path : NodePath +export(NodePath) var name_label_path : NodePath +export(NodePath) var description_label_path : NodePath + +var _icon : TextureRect +var _name_label : Label +var _description_label : RichTextLabel + +func _ready(): + _icon = get_node(icon_path) as TextureRect + _name_label = get_node(name_label_path) as Label + _description_label = get_node(description_label_path) as RichTextLabel + +func set_item(item: CraftRecipeHelper) -> void: + if item == null: + return + + _icon.texture = item.item.icon + _name_label.text = item.item.text_name + _description_label.text = item.item.text_name diff --git a/game/ui/crafting/CraftingWindow.gd b/game/ui/crafting/CraftingWindow.gd new file mode 100644 index 0000000..0080c41 --- /dev/null +++ b/game/ui/crafting/CraftingWindow.gd @@ -0,0 +1,162 @@ +extends Control + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +var opener_button : BaseButton + +export(PackedScene) var item_entry_scene : PackedScene +export(PackedScene) var recipe_selector_scene : PackedScene + +export(NodePath) var item_container_path : NodePath +export(NodePath) var tools_container_path : NodePath +export(NodePath) var materials_container_path : NodePath +export(NodePath) var recipe_selector_container_path : NodePath + +export(NodePath) var recipe_selector_main_on : NodePath +export(NodePath) var recipe_selector_main_off : NodePath +export(NodePath) var materials_container_main_on : NodePath +export(NodePath) var materials_container_main_off : NodePath + +var _item_container : Node +var _tools_container : Node +var _materials_container : Node +var _recipe_selector_container : Node + +var _selected_craft_recipe : CraftRecipe + +var _player : Entity + +var _recipe_selector_main_on : Node +var _recipe_selector_main_off : Node +var _materials_container_main_on : Node +var _materials_container_main_off : Node + +func _ready(): + connect("visibility_changed", self, "on_visibility_changed") + + _item_container = get_node(item_container_path) + _tools_container = get_node(tools_container_path) + _materials_container = get_node(materials_container_path) + _recipe_selector_container = get_node(recipe_selector_container_path) + + _recipe_selector_main_on = get_node(recipe_selector_main_on) + _recipe_selector_main_off = get_node(recipe_selector_main_off) + _materials_container_main_on = get_node(materials_container_main_on) + _materials_container_main_off = get_node(materials_container_main_off) + +func set_player(entity: Entity) -> void: + _player = entity + + set_category(CraftRecipe.CRAFT_CATEGORY_ALCHEMY) + +func set_category(category: int) -> void: + for ch in _recipe_selector_container.get_children(): + ch.queue_free() + + var count : int = 0 + for i in range(_player.craft_gets_recipe_count()): + var cr : CraftRecipe = _player.craft_gets_recipe(i) + + if cr.category == category: + var rss : Node = recipe_selector_scene.instance() + _recipe_selector_container.add_child(rss) + rss.owner = _recipe_selector_container + + rss.set_recipe(cr, self) + + count += 1 + + if count == 0: + _recipe_selector_main_on.visible = false + _recipe_selector_main_off.visible = true + else: + _recipe_selector_main_on.visible = true + _recipe_selector_main_off.visible = false + + +func request_craft() -> void: + _player.craft_crequest(_selected_craft_recipe.id) + + for ch in _tools_container.get_children(): + ch.refresh() + + for ch in _materials_container.get_children(): + ch.refresh() + +func select_recipe(recipe : CraftRecipe) -> void: + _selected_craft_recipe = recipe + + if _selected_craft_recipe == null: + _materials_container_main_on.visible = false + _materials_container_main_off.visible = true + + return + else: + _materials_container_main_on.visible = true + _materials_container_main_off.visible = false + + _item_container.set_item(recipe.item) + + for ch in _tools_container.get_children(): + ch.queue_free() + + for ch in _materials_container.get_children(): + ch.queue_free() + + for i in range(recipe.get_required_tools_count()): + var ih : CraftRecipeHelper = recipe.get_required_tool(i) + + if ih == null: + continue + + var ie : Node = item_entry_scene.instance() + _tools_container.add_child(ie) + ie.owner = _tools_container + ie.set_item(_player, ih) + + for i in range(recipe.get_required_materials_count()): + var ih : CraftRecipeHelper = recipe.get_required_material(i) + + if ih == null: + continue + + var ie : Node = item_entry_scene.instance() + _materials_container.add_child(ie) + ie.owner = _materials_container + ie.set_item(_player, ih) + + +func on_visibility_changed(): + if opener_button: + if visible && !opener_button.pressed: + opener_button.pressed = true + return + + if !visible && opener_button.pressed: + opener_button.pressed = false + +func _on_button_toggled(button_pressed): + if button_pressed: + if !visible: + show() + else: + if visible: + hide() diff --git a/game/ui/crafting/CraftingWindow.tscn b/game/ui/crafting/CraftingWindow.tscn new file mode 100644 index 0000000..e8d411b --- /dev/null +++ b/game/ui/crafting/CraftingWindow.tscn @@ -0,0 +1,319 @@ +[gd_scene load_steps=7 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] +[ext_resource path="res://ui/crafting/CraftingWindow.gd" type="Script" id=2] +[ext_resource path="res://ui/crafting/RecipeSelector.tscn" type="PackedScene" id=3] +[ext_resource path="res://ui/crafting/ItemEntry.tscn" type="PackedScene" id=4] +[ext_resource path="res://ui/crafting/CraftItemDescription.gd" type="Script" id=5] + +[sub_resource type="ButtonGroup" id=1] + +[node name="CraftingWindow" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +theme = ExtResource( 1 ) +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} +item_entry_scene = ExtResource( 4 ) +recipe_selector_scene = ExtResource( 3 ) +item_container_path = NodePath("PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2/CraftItemDescription") +tools_container_path = NodePath("PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2/ToolsContainer") +materials_container_path = NodePath("PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2/MaterialContainer") +recipe_selector_container_path = NodePath("PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer2/Recipes/VBoxContainer") +recipe_selector_main_on = NodePath("PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer2/Recipes") +recipe_selector_main_off = NodePath("PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer2/CenterContainer2") +materials_container_main_on = NodePath("PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry") +materials_container_main_off = NodePath("PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CenterContainer") + +[node name="PanelContainer" type="PanelContainer" parent="."] +margin_left = 43.0 +margin_top = 36.0 +margin_right = 995.0 +margin_bottom = 577.0 + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 948.0 +margin_bottom = 537.0 + +[node name="Header" type="HBoxContainer" parent="PanelContainer/VBoxContainer"] +margin_right = 944.0 +margin_bottom = 30.0 + +[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/Header"] +margin_top = 7.0 +margin_right = 900.0 +margin_bottom = 22.0 +size_flags_horizontal = 3 +text = "Crafting" + +[node name="Button" type="Button" parent="PanelContainer/VBoxContainer/Header"] +margin_left = 904.0 +margin_right = 944.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 40, 30 ) +text = "X" + +[node name="Categories" type="HBoxContainer" parent="PanelContainer/VBoxContainer"] +margin_top = 38.0 +margin_right = 944.0 +margin_bottom = 64.0 + +[node name="HBoxContainer2" type="HBoxContainer" parent="PanelContainer/VBoxContainer/Categories"] +margin_right = 944.0 +margin_bottom = 26.0 +rect_min_size = Vector2( 0, 20 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +alignment = 1 + +[node name="Alchemy" type="Button" parent="PanelContainer/VBoxContainer/Categories/HBoxContainer2"] +margin_left = 162.0 +margin_right = 262.0 +margin_bottom = 26.5702 +rect_min_size = Vector2( 100, 0 ) +toggle_mode = true +pressed = true +group = SubResource( 1 ) +text = "Alchemy" + +[node name="Smithing" type="Button" parent="PanelContainer/VBoxContainer/Categories/HBoxContainer2"] +margin_left = 266.0 +margin_right = 366.0 +margin_bottom = 26.5702 +rect_min_size = Vector2( 100, 0 ) +toggle_mode = true +group = SubResource( 1 ) +text = "Smithing" + +[node name="Enchanting" type="Button" parent="PanelContainer/VBoxContainer/Categories/HBoxContainer2"] +margin_left = 370.0 +margin_right = 470.0 +margin_bottom = 26.5702 +rect_min_size = Vector2( 100, 0 ) +toggle_mode = true +group = SubResource( 1 ) +text = "Enchantig" + +[node name="Engineering" type="Button" parent="PanelContainer/VBoxContainer/Categories/HBoxContainer2"] +margin_left = 474.0 +margin_right = 574.0 +margin_bottom = 26.5702 +rect_min_size = Vector2( 100, 0 ) +toggle_mode = true +group = SubResource( 1 ) +text = "Engineering" + +[node name="Tailoring" type="Button" parent="PanelContainer/VBoxContainer/Categories/HBoxContainer2"] +margin_left = 578.0 +margin_right = 678.0 +margin_bottom = 26.5702 +rect_min_size = Vector2( 100, 0 ) +toggle_mode = true +group = SubResource( 1 ) +text = "Tailoring" + +[node name="Other" type="Button" parent="PanelContainer/VBoxContainer/Categories/HBoxContainer2"] +margin_left = 682.0 +margin_right = 782.0 +margin_bottom = 26.5702 +rect_min_size = Vector2( 100, 0 ) +toggle_mode = true +group = SubResource( 1 ) +text = "Other" + +[node name="VBoxContainer" type="MarginContainer" parent="PanelContainer/VBoxContainer"] +margin_top = 72.0 +margin_right = 944.0 +margin_bottom = 533.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/VBoxContainer/VBoxContainer"] +margin_right = 944.0 +margin_bottom = 461.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="PanelContainer" type="PanelContainer" parent="PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer"] +margin_right = 626.0 +margin_bottom = 461.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="CraftEntry" type="VBoxContainer" parent="PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer"] +visible = false +margin_left = 4.0 +margin_top = 4.0 +margin_right = 718.0 +margin_bottom = 516.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +size_flags_stretch_ratio = 0.6 +custom_constants/separation = 10 + +[node name="ScrollContainer" type="ScrollContainer" parent="PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry"] +margin_right = 714.0 +margin_bottom = 472.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +scroll_horizontal_enabled = false + +[node name="VBoxContainer2" type="VBoxContainer" parent="PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer"] +margin_right = 714.0 +margin_bottom = 122.0 +size_flags_horizontal = 3 + +[node name="CraftItemDescription" type="HBoxContainer" parent="PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2"] +margin_right = 714.0 +margin_bottom = 60.0 +alignment = 1 +script = ExtResource( 5 ) +icon_path = NodePath("VBoxContainer/PanelContainer/TextureRect") +name_label_path = NodePath("PanelContainer2/VBoxContainer/Label") +description_label_path = NodePath("PanelContainer2/VBoxContainer/RichTextLabel") + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2/CraftItemDescription"] +margin_left = 175.0 +margin_right = 235.0 +margin_bottom = 60.0 + +[node name="PanelContainer" type="PanelContainer" parent="PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2/CraftItemDescription/VBoxContainer"] +margin_right = 60.0 +margin_bottom = 60.0 +rect_min_size = Vector2( 60, 60 ) + +[node name="TextureRect" type="TextureRect" parent="PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2/CraftItemDescription/VBoxContainer/PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 56.0 +margin_bottom = 56.0 +expand = true + +[node name="PanelContainer2" type="PanelContainer" parent="PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2/CraftItemDescription"] +margin_left = 239.0 +margin_right = 539.0 +margin_bottom = 60.0 +rect_min_size = Vector2( 300, 0 ) + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2/CraftItemDescription/PanelContainer2"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 296.0 +margin_bottom = 56.0 + +[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2/CraftItemDescription/PanelContainer2/VBoxContainer"] +margin_right = 292.0 +margin_bottom = 15.0 + +[node name="RichTextLabel" type="RichTextLabel" parent="PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2/CraftItemDescription/PanelContainer2/VBoxContainer"] +margin_top = 23.0 +margin_right = 292.0 +margin_bottom = 52.0 +size_flags_vertical = 3 +text = " +" +scroll_active = false + +[node name="Label2" type="Label" parent="PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2"] +margin_top = 68.0 +margin_right = 714.0 +margin_bottom = 83.0 +text = "Tools" + +[node name="ToolsContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2"] +margin_top = 91.0 +margin_right = 714.0 +margin_bottom = 91.0 + +[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2"] +margin_top = 99.0 +margin_right = 714.0 +margin_bottom = 114.0 +text = "Materials" + +[node name="MaterialContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2"] +margin_top = 122.0 +margin_right = 714.0 +margin_bottom = 122.0 + +[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry"] +margin_top = 482.0 +margin_right = 714.0 +margin_bottom = 512.0 +alignment = 1 + +[node name="CraftButton" type="Button" parent="PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/HBoxContainer"] +margin_left = 307.0 +margin_right = 407.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 100, 30 ) +text = "Craft" + +[node name="CenterContainer" type="CenterContainer" parent="PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 622.0 +margin_bottom = 457.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CenterContainer"] +margin_left = 264.0 +margin_top = 219.0 +margin_right = 354.0 +margin_bottom = 234.0 +text = "Select a recipe" +align = 1 +valign = 1 + +[node name="PanelContainer2" type="PanelContainer" parent="PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer"] +margin_left = 630.0 +margin_right = 944.0 +margin_bottom = 461.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +size_flags_stretch_ratio = 0.5 + +[node name="Recipes" type="ScrollContainer" parent="PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer2"] +visible = false +margin_left = 4.0 +margin_top = 4.0 +margin_right = 286.0 +margin_bottom = 516.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer2/Recipes"] +margin_right = 282.0 +size_flags_horizontal = 3 + +[node name="CenterContainer2" type="CenterContainer" parent="PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer2"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 310.0 +margin_bottom = 457.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer2/CenterContainer2"] +margin_left = 123.0 +margin_top = 219.0 +margin_right = 183.0 +margin_bottom = 234.0 +text = "No recipes" +align = 1 +valign = 1 + +[connection signal="pressed" from="PanelContainer/VBoxContainer/Header/Button" to="." method="hide"] +[connection signal="pressed" from="PanelContainer/VBoxContainer/Categories/HBoxContainer2/Alchemy" to="." method="set_category" binds= [ 1 ]] +[connection signal="pressed" from="PanelContainer/VBoxContainer/Categories/HBoxContainer2/Smithing" to="." method="set_category" binds= [ 2 ]] +[connection signal="pressed" from="PanelContainer/VBoxContainer/Categories/HBoxContainer2/Enchanting" to="." method="set_category" binds= [ 4 ]] +[connection signal="pressed" from="PanelContainer/VBoxContainer/Categories/HBoxContainer2/Engineering" to="." method="set_category" binds= [ 5 ]] +[connection signal="pressed" from="PanelContainer/VBoxContainer/Categories/HBoxContainer2/Tailoring" to="." method="set_category" binds= [ 3 ]] +[connection signal="pressed" from="PanelContainer/VBoxContainer/Categories/HBoxContainer2/Other" to="." method="set_category" binds= [ 0 ]] +[connection signal="pressed" from="PanelContainer/VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/HBoxContainer/CraftButton" to="." method="request_craft"] diff --git a/game/ui/crafting/ItemEntry.gd b/game/ui/crafting/ItemEntry.gd new file mode 100644 index 0000000..d8c5152 --- /dev/null +++ b/game/ui/crafting/ItemEntry.gd @@ -0,0 +1,47 @@ +extends PanelContainer + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(NodePath) var icon_path : NodePath +export(NodePath) var label_path : NodePath + +var _icon : TextureRect +var _label : Label + +var _entity : Entity +var _crh : CraftRecipeHelper + +func _ready(): + _icon = get_node(icon_path) as TextureRect + _label = get_node(label_path) as Label + +func set_item(entity: Entity, crh: CraftRecipeHelper) -> void: + _entity = entity + _crh = crh + + refresh() + +func refresh() -> void: + if _crh.item == null: + return + + _icon.texture = _crh.item.icon + _label.text = _crh.item.text_name + " (" + str(_crh.count) + ")" diff --git a/game/ui/crafting/ItemEntry.tscn b/game/ui/crafting/ItemEntry.tscn new file mode 100644 index 0000000..3b9026d --- /dev/null +++ b/game/ui/crafting/ItemEntry.tscn @@ -0,0 +1,45 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/crafting/ItemEntry.gd" type="Script" id=1] + +[node name="ItemEntry" type="PanelContainer"] +margin_right = 695.0 +margin_bottom = 60.0 +rect_min_size = Vector2( 100, 60 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +icon_path = NodePath("HBoxContainer/PanelContainer/TextureRect") +label_path = NodePath("HBoxContainer/Label") + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +margin_left = 14.0 +margin_top = 14.0 +margin_right = 681.0 +margin_bottom = 64.0 + +[node name="PanelContainer" type="PanelContainer" parent="HBoxContainer"] +margin_right = 50.0 +margin_bottom = 50.0 +rect_min_size = Vector2( 50, 50 ) + +[node name="TextureRect" type="TextureRect" parent="HBoxContainer/PanelContainer"] +margin_left = 14.0 +margin_top = 14.0 +margin_right = 36.0 +margin_bottom = 36.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +expand = true + +[node name="Label" type="Label" parent="HBoxContainer"] +margin_left = 58.0 +margin_top = 12.0 +margin_right = 667.0 +margin_bottom = 37.0 +size_flags_horizontal = 3 +text = "Spanner" +align = 1 diff --git a/game/ui/crafting/RecipeSelector.gd b/game/ui/crafting/RecipeSelector.gd new file mode 100644 index 0000000..c1c2b96 --- /dev/null +++ b/game/ui/crafting/RecipeSelector.gd @@ -0,0 +1,33 @@ +extends Button + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +var _recipe : CraftRecipe +var _crafting_window : Node + +func set_recipe(recipe : CraftRecipe, crafting_window : Node) -> void: + _recipe = recipe + _crafting_window = crafting_window + + text = recipe.item.item.text_name + +func _pressed(): + _crafting_window.select_recipe(_recipe) diff --git a/game/ui/crafting/RecipeSelector.tscn b/game/ui/crafting/RecipeSelector.tscn new file mode 100644 index 0000000..575485a --- /dev/null +++ b/game/ui/crafting/RecipeSelector.tscn @@ -0,0 +1,12 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/crafting/RecipeSelector.gd" type="Script" id=1] + +[node name="RecipeSelector" type="Button"] +margin_right = 303.0 +margin_bottom = 40.0 +rect_min_size = Vector2( 0, 40 ) +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/game/ui/crafting/game_module.tres b/game/ui/crafting/game_module.tres new file mode 100644 index 0000000..71af8a5 --- /dev/null +++ b/game/ui/crafting/game_module.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" load_steps=4 format=2] + +[ext_resource path="res://ui/theme/crafting_icon.tres" type="Texture" id=1] +[ext_resource path="res://scripts/game_modules/ui_window_module.gd" type="Script" id=2] +[ext_resource path="res://ui/crafting/CraftingWindow.tscn" type="PackedScene" id=3] + +[resource] +script = ExtResource( 2 ) +enabled = true +scene = ExtResource( 3 ) +opener_button_texture = ExtResource( 1 ) +index = 4 +add_button = true diff --git a/game/ui/debug/DebugInfo.gd b/game/ui/debug/DebugInfo.gd new file mode 100644 index 0000000..0a9b01a --- /dev/null +++ b/game/ui/debug/DebugInfo.gd @@ -0,0 +1,77 @@ +extends Label + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +func _ready(): + Settings.connect("setting_changed", self, "setting_changed") + + if visible: + set_process(true) + else: + set_process(false) + +func _exit_tree(): + if Settings != null: + Settings.disconnect("setting_changed", self, "setting_changed") + +func setting_changed(section, key, value): + if section == "debug" and key == "debug_info": + if value: + show() + set_process(true) + else: + hide() + set_process(false) + +func _process(delta): + var a : String = "Fps: " + str(Performance.get_monitor(Performance.TIME_FPS)) + "\n" +# a += "time_process: " + str(Performance.get_monitor(Performance.TIME_PROCESS)) + "\n" +# a += "time_physics_process: " + str(Performance.get_monitor(Performance.TIME_PHYSICS_PROCESS)) + "\n" + a += "mem_static: " + str(Performance.get_monitor(Performance.MEMORY_STATIC)) + "\n" + a += "mem_dynamic: " + str(Performance.get_monitor(Performance.MEMORY_DYNAMIC)) + "\n" +# a += "mem_static_max: " + str(Performance.get_monitor(Performance.MEMORY_STATIC_MAX)) + "\n" +# a += "mem_dyn_max: " + str(Performance.get_monitor(Performance.MEMORY_DYNAMIC_MAX)) + "\n" +# a += "mem_msg_buf_max: " + str(Performance.get_monitor(Performance.MEMORY_MESSAGE_BUFFER_MAX)) + "\n" + a += "obj_count: " + str(Performance.get_monitor(Performance.OBJECT_COUNT)) + "\n" + a += "obj_res_count: " + str(Performance.get_monitor(Performance.OBJECT_RESOURCE_COUNT)) + "\n" + a += "obj_mode_count: " + str(Performance.get_monitor(Performance.OBJECT_NODE_COUNT)) + "\n" + a += "obj_orphan_mode_count: " + str(Performance.get_monitor(Performance.OBJECT_ORPHAN_NODE_COUNT)) + "\n" + a += "obj_in_frame: " + str(Performance.get_monitor(Performance.RENDER_OBJECTS_IN_FRAME)) + "\n" + a += "vert_in_frame: " + str(Performance.get_monitor(Performance.RENDER_VERTICES_IN_FRAME)) + "\n" + a += "mat_changes: " + str(Performance.get_monitor(Performance.RENDER_MATERIAL_CHANGES_IN_FRAME)) + "\n" + a += "shader_changes: " + str(Performance.get_monitor(Performance.RENDER_SHADER_CHANGES_IN_FRAME)) + "\n" + a += "surface_changes: " + str(Performance.get_monitor(Performance.RENDER_SURFACE_CHANGES_IN_FRAME)) + "\n" + a += "draw_calls: " + str(Performance.get_monitor(Performance.RENDER_DRAW_CALLS_IN_FRAME)) + "\n" + a += "vid_mem_used: " + str(Performance.get_monitor(Performance.RENDER_VIDEO_MEM_USED)) + "\n" +# a += "texture_mem_used: " + str(Performance.get_monitor(Performance.RENDER_TEXTURE_MEM_USED)) + "\n" +# a += "vertex_mem_used: " + str(Performance.get_monitor(Performance.RENDER_VERTEX_MEM_USED)) + "\n" +# a += "vid_mem_total: " + str(Performance.get_monitor(Performance.RENDER_USAGE_VIDEO_MEM_TOTAL)) + "\n" + +# a += "phys_2d_active_obj: " + str(Performance.get_monitor(Performance.PHYSICS_2D_ACTIVE_OBJECTS)) + "\n" +# a += "phys_2d_coll_pairs: " + str(Performance.get_monitor(Performance.PHYSICS_2D_COLLISION_PAIRS)) + "\n" +# a += "phys_2d_island_count: " + str(Performance.get_monitor(Performance.PHYSICS_2D_ISLAND_COUNT)) + "\n" +# a += "phys_3d_active_obj: " + str(Performance.get_monitor(Performance.PHYSICS_3D_ACTIVE_OBJECTS)) + "\n" +# a += "phys_3d_coll_pairs: " + str(Performance.get_monitor(Performance.PHYSICS_3D_COLLISION_PAIRS)) + "\n" +# a += "phys_3d_island_count: " + str(Performance.get_monitor(Performance.PHYSICS_3D_ISLAND_COUNT)) + "\n" +# a += "audio_output_latency: " + str(Performance.get_monitor(Performance.AUDIO_OUTPUT_LATENCY)) + "\n" + + text = a + diff --git a/game/ui/debug/DebugInfo.tscn b/game/ui/debug/DebugInfo.tscn new file mode 100644 index 0000000..dd8d0f1 --- /dev/null +++ b/game/ui/debug/DebugInfo.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/debug/DebugInfo.gd" type="Script" id=1] +[ext_resource path="res://ui/debug/debuginfo_font.tres" type="DynamicFont" id=2] + +[node name="DebugInfo" type="CanvasLayer"] +layer = 3 + +[node name="DebugInfo" type="Label" parent="."] +visible = false +anchor_bottom = 1.0 +margin_right = 301.0 +custom_fonts/font = ExtResource( 2 ) +valign = 1 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/game/ui/debug/SpawnPointSimpleUI.tscn b/game/ui/debug/SpawnPointSimpleUI.tscn new file mode 100644 index 0000000..96e3eba --- /dev/null +++ b/game/ui/debug/SpawnPointSimpleUI.tscn @@ -0,0 +1,102 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] +[ext_resource path="res://scripts/networking/SpawnPoint.gd" type="Script" id=2] + + + +[node name="SpawnPoint" type="Spatial"] +script = ExtResource( 2 ) +multi_player = true +gui_path = NodePath("PanelContainer") +host_button_path = NodePath("PanelContainer/VBoxContainer/host") +address_line_edit_path = NodePath("PanelContainer/VBoxContainer/VBoxContainer/address") +port_line_edit_path = NodePath("PanelContainer/VBoxContainer/VBoxContainer/port") +connect_button_path = NodePath("PanelContainer/VBoxContainer/VBoxContainer/connect") +naturalist_button_path = NodePath("PanelContainer/VBoxContainer/select naturalist") +terrarin_path = NodePath("..") + +[node name="PanelContainer" type="PanelContainer" parent="."] +visible = false +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -126.0 +margin_top = -169.5 +margin_right = 126.0 +margin_bottom = 169.5 +theme = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 248.0 +margin_bottom = 335.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_constants/separation = 35 + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer"] +margin_right = 244.0 +margin_bottom = 140.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +size_flags_stretch_ratio = 4.0 + +[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/VBoxContainer"] +margin_right = 244.0 +margin_bottom = 15.0 +text = "Ip:" + +[node name="address" type="LineEdit" parent="PanelContainer/VBoxContainer/VBoxContainer"] +margin_top = 23.0 +margin_right = 244.0 +margin_bottom = 47.3413 +placeholder_text = "127.0.0.1" + +[node name="Label2" type="Label" parent="PanelContainer/VBoxContainer/VBoxContainer"] +margin_top = 55.0 +margin_right = 244.0 +margin_bottom = 70.0 +text = "Port:" + +[node name="port" type="LineEdit" parent="PanelContainer/VBoxContainer/VBoxContainer"] +margin_top = 78.0 +margin_right = 244.0 +margin_bottom = 102.341 +placeholder_text = "23223" + +[node name="connect" type="Button" parent="PanelContainer/VBoxContainer/VBoxContainer"] +margin_top = 110.0 +margin_right = 244.0 +margin_bottom = 140.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Connect" + +[node name="host" type="Button" parent="PanelContainer/VBoxContainer"] +margin_top = 175.0 +margin_right = 244.0 +margin_bottom = 210.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Host" + +[node name="Label" type="Label" parent="PanelContainer/VBoxContainer"] +margin_top = 245.0 +margin_right = 244.0 +margin_bottom = 260.0 +size_flags_vertical = 1 +text = "Class: (Just select for offline play):" + +[node name="select naturalist" type="Button" parent="PanelContainer/VBoxContainer"] +margin_top = 295.0 +margin_right = 244.0 +margin_bottom = 331.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Naturalist" diff --git a/game/ui/debug/debuginfo_font.tres b/game/ui/debug/debuginfo_font.tres new file mode 100644 index 0000000..e07ee08 --- /dev/null +++ b/game/ui/debug/debuginfo_font.tres @@ -0,0 +1,7 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://fonts/VT323-Regular.ttf" type="DynamicFontData" id=1] + +[resource] +size = 11 +font_data = ExtResource( 1 ) diff --git a/game/ui/errorframe/ErrorFrame.tscn b/game/ui/errorframe/ErrorFrame.tscn new file mode 100644 index 0000000..8d3da0f --- /dev/null +++ b/game/ui/errorframe/ErrorFrame.tscn @@ -0,0 +1,5 @@ +[gd_scene format=2] + +[node name="ErrorFrame" type="MarginContainer"] +margin_right = 40.0 +margin_bottom = 40.0 diff --git a/game/ui/icons/icon_add.png b/game/ui/icons/icon_add.png new file mode 100644 index 0000000000000000000000000000000000000000..fafc1543c500fd6c0749f4373f1cec2d2999bf20 GIT binary patch literal 564 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 VPaw!=umS)8002ovPDHLkV1mntK{x;a literal 0 HcmV?d00001 diff --git a/game/ui/icons/icon_keyboard.png.import b/game/ui/icons/icon_keyboard.png.import new file mode 100644 index 0000000..4419622 --- /dev/null +++ b/game/ui/icons/icon_keyboard.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/icon_keyboard.png-58b4ebdc3868706f0d2ebc63fcba3a74.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://ui/icons/icon_keyboard.png" +dest_files=[ "res://.import/icon_keyboard.png-58b4ebdc3868706f0d2ebc63fcba3a74.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=1 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/ui/icons/icon_mouse.png b/game/ui/icons/icon_mouse.png new file mode 100644 index 0000000000000000000000000000000000000000..eebefdcdd1840f2f52f0d7f096c0e4e655c72c68 GIT binary patch literal 689 zcmV;i0#5yjP)EX>4Tx04R}tkv&MmKpe$iTcsiu2MdabWT;LSM5T1pDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|}?mh0_0scmXsb<$CplX(p zP9}tGZdC}rB8X88B8IrcOnpuiQ}7&L_we!cF3PjK&;2?2l)T9RpFljzbi*RvAdYQX zI_G`jFe^z4@j3B?K^G)`x1ki;UEAVPqQ8p^1^LX=jG6ccIMPk8u;9luB}nOtQs zax9<<6_Voz|AXJ%nuX~pHz||=x?gPjV+;uH0?oQ@e;?a+^8^Sy16NwxUu^*KPtxmc zEpi0(Zvz+CZB5<-E_Z;TCtWfmM+(sN7Ye}p8GTa@7`O#`*WBJ(`#607GSpS-1~@nb z#*37_?(y!P&ffk#)9UXB66A8{+{!BA00006VoOIv03!g600MZy2UGw6010qNS#tmY z4c7nw4c7reD4Tcy000McNliru$+md)YhW?G?m+tb`?OVgvjaNf$}; zp|hhnA!%)92LQ8Px&m+tA*`|hNfm${01jM6l644SnyX;@?s+6PIl#D}MHBp$7&XyK zOx}AY$M~sYz@xx(&jH#3K$`@RYzhEP65yOW0;n_Qz4!i{oI?LInc1?pST_JoZ2pR# X40SZZIS6T+00000NkvXXu0mjf#8V}L literal 0 HcmV?d00001 diff --git a/game/ui/icons/icon_mouse.png.import b/game/ui/icons/icon_mouse.png.import new file mode 100644 index 0000000..4d1b8c0 --- /dev/null +++ b/game/ui/icons/icon_mouse.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/icon_mouse.png-5bef59a63732b271e4a97478075d6992.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://ui/icons/icon_mouse.png" +dest_files=[ "res://.import/icon_mouse.png-5bef59a63732b271e4a97478075d6992.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=1 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/ui/icons/icon_remove.png b/game/ui/icons/icon_remove.png new file mode 100644 index 0000000000000000000000000000000000000000..5df461d0c26d1433fc5e33270033f40f7d060833 GIT binary patch literal 615 zcmV-t0+{`YP)EX>4Tx04R}tkv&MmKpe$iTcsiu2MdabWT;LSM5T1pDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|}?mh0_0scmXsb<$CplX(p zP9}tGZdC}rB8X88B8IrcOnpuiQ}7&L_we!cF3PjK&;2?2l)T9RpFljzbi*RvAdYQX zI_G`jFe^z4@j3B?K^G)`x1ki;UEAVPqQ8p^1^LX=jG6ccIMPk8u;9luB}nOtQs zax9<<6_Voz|AXJ%nuX~pHz||=x?gPjV+;uH0?oQ@e;?a+^8^Sy16NwxUu^*KPtxmc zEpi0(Zvz+CZB5<-E_Z;TCtWfmM+(sN7Ye}p8GTa@7`O#`*WBJ(`#607GSpS-1~@nb z#*37_?(y!P&ffk#)9UXB66A8{+{!BA00006VoOIv03!g600MZy2UGw6010qNS#tmY z4c7nw4c7reD4Tcy000McNliruFt0+Hz}<7} zzwY4#zd^Bsl+q??>D28c*INQf(aeq>v7|U{KPQtgGFuwrZcqRK002ovPDHLkV1lG) B2%rD} literal 0 HcmV?d00001 diff --git a/game/ui/icons/icon_remove.png.import b/game/ui/icons/icon_remove.png.import new file mode 100644 index 0000000..cd70e3f --- /dev/null +++ b/game/ui/icons/icon_remove.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/icon_remove.png-05b3a725226167bddcdc3b55463863b5.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://ui/icons/icon_remove.png" +dest_files=[ "res://.import/icon_remove.png-05b3a725226167bddcdc3b55463863b5.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=1 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=false +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/ui/ingame_menu/ExitButton.gd b/game/ui/ingame_menu/ExitButton.gd new file mode 100644 index 0000000..51d0a9c --- /dev/null +++ b/game/ui/ingame_menu/ExitButton.gd @@ -0,0 +1,28 @@ +extends Button + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + + +func _ready(): + connect("pressed", self, "on_click") + +func on_click() -> void: + get_node("/root/Main").switch_scene(Main.StartSceneTypes.MENU) diff --git a/game/ui/ingame_menu/IngameMenu.tscn b/game/ui/ingame_menu/IngameMenu.tscn new file mode 100644 index 0000000..6795fe6 --- /dev/null +++ b/game/ui/ingame_menu/IngameMenu.tscn @@ -0,0 +1,106 @@ +[gd_scene load_steps=6 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] +[ext_resource path="res://ui/options/Options.tscn" type="PackedScene" id=2] +[ext_resource path="res://ui/ingame_menu/ExitButton.gd" type="Script" id=3] +[ext_resource path="res://ui/keybinds/Keybinds.tscn" type="PackedScene" id=4] +[ext_resource path="res://ui/interface/InterfaceOptions.tscn" type="PackedScene" id=5] + +[node name="IngameMenu" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +theme = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Menu" type="PanelContainer" parent="."] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -77.0 +margin_top = -51.0 +margin_right = 78.0 +margin_bottom = 51.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="Menu"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 151.0 +margin_bottom = 166.0 + +[node name="Resume" type="Button" parent="Menu/VBoxContainer"] +margin_right = 147.0 +margin_bottom = 26.5702 +text = "Resume" + +[node name="Keybinds" type="Button" parent="Menu/VBoxContainer"] +margin_top = 34.0 +margin_right = 147.0 +margin_bottom = 60.5702 +text = "Keybinds" + +[node name="Interface" type="Button" parent="Menu/VBoxContainer"] +margin_top = 68.0 +margin_right = 147.0 +margin_bottom = 94.5702 +text = "Interface" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Options" type="Button" parent="Menu/VBoxContainer"] +margin_top = 102.0 +margin_right = 147.0 +margin_bottom = 128.57 +text = "Options" + +[node name="Exit" type="Button" parent="Menu/VBoxContainer"] +margin_top = 136.0 +margin_right = 147.0 +margin_bottom = 162.57 +text = "Exit" +script = ExtResource( 3 ) + +[node name="Options" parent="." instance=ExtResource( 2 )] +visible = false +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -307.0 +margin_top = -220.0 +margin_right = 307.0 +margin_bottom = 220.0 + +[node name="KeybindWindow" parent="." instance=ExtResource( 4 )] +visible = false +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -426.0 +margin_top = -270.0 +margin_right = 426.0 +margin_bottom = 270.0 + +[node name="InterfaceOptions" parent="." instance=ExtResource( 5 )] +visible = false +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -331.0 +margin_top = -224.5 +margin_right = 331.0 +margin_bottom = 224.5 + +[connection signal="pressed" from="Menu/VBoxContainer/Resume" to="." method="hide"] +[connection signal="pressed" from="Menu/VBoxContainer/Keybinds" to="KeybindWindow" method="show"] +[connection signal="pressed" from="Menu/VBoxContainer/Interface" to="InterfaceOptions" method="show"] +[connection signal="pressed" from="Menu/VBoxContainer/Options" to="Options" method="show"] diff --git a/game/ui/interface/InterfaceOptions.gd b/game/ui/interface/InterfaceOptions.gd new file mode 100644 index 0000000..1ecf6d1 --- /dev/null +++ b/game/ui/interface/InterfaceOptions.gd @@ -0,0 +1,6 @@ +extends PanelContainer + +export(NodePath) var actionbar_set_default_button_path : NodePath + +func set_player(p_player: Entity) -> void: + get_node(actionbar_set_default_button_path).set_player(p_player) diff --git a/game/ui/interface/InterfaceOptions.tscn b/game/ui/interface/InterfaceOptions.tscn new file mode 100644 index 0000000..e4a20f3 --- /dev/null +++ b/game/ui/interface/InterfaceOptions.tscn @@ -0,0 +1,52 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/interface/SetActionbarAsDefault.gd" type="Script" id=1] +[ext_resource path="res://ui/interface/InterfaceOptions.gd" type="Script" id=2] + +[node name="InterfaceOptions" type="PanelContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} +actionbar_set_default_button_path = NodePath("VBoxContainer2/VBoxContainer/SetActionbarAsDefault") + +[node name="VBoxContainer2" type="VBoxContainer" parent="."] +margin_left = 7.0 +margin_top = 7.0 +margin_right = 1017.0 +margin_bottom = 593.0 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer2"] +margin_right = 1010.0 +margin_bottom = 30.0 +size_flags_horizontal = 3 + +[node name="Label" type="Label" parent="VBoxContainer2/HBoxContainer"] +margin_top = 8.0 +margin_right = 966.0 +margin_bottom = 22.0 +size_flags_horizontal = 3 +text = "Interface options" + +[node name="Button" type="Button" parent="VBoxContainer2/HBoxContainer"] +margin_left = 970.0 +margin_right = 1010.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 40, 30 ) +text = "X" + +[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer2"] +margin_top = 34.0 +margin_right = 1010.0 +margin_bottom = 586.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="SetActionbarAsDefault" type="Button" parent="VBoxContainer2/VBoxContainer"] +margin_right = 1010.0 +margin_bottom = 20.0 +text = "Set current actionbar setup as default" +script = ExtResource( 1 ) +[connection signal="pressed" from="VBoxContainer2/HBoxContainer/Button" to="." method="hide"] diff --git a/game/ui/interface/SetActionbarAsDefault.gd b/game/ui/interface/SetActionbarAsDefault.gd new file mode 100644 index 0000000..c2cdd07 --- /dev/null +++ b/game/ui/interface/SetActionbarAsDefault.gd @@ -0,0 +1,16 @@ +extends Button + +var _player : Entity + +func set_player(p_player: Entity) -> void: + _player = p_player + +func _pressed(): + if _player && is_instance_valid(_player): + var abp : ActionBarProfile = _player.get_action_bar_profile() + + var cp : ClassProfile = ProfileManager.getc_player_profile().get_class_profile(_player.gets_entity_data().get_path()) + + cp.get_default_action_bar_profile().from_actionbar_profile(abp) + + ProfileManager.save() diff --git a/game/ui/keybinds/KeybindCategory.gd b/game/ui/keybinds/KeybindCategory.gd new file mode 100644 index 0000000..ed3d0f9 --- /dev/null +++ b/game/ui/keybinds/KeybindCategory.gd @@ -0,0 +1,25 @@ +extends VBoxContainer + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(PackedScene) var keybind_entry_scene : PackedScene + +export(NodePath) var content_container_path : NodePath diff --git a/game/ui/keybinds/KeybindCategory.tscn b/game/ui/keybinds/KeybindCategory.tscn new file mode 100644 index 0000000..f66ca13 --- /dev/null +++ b/game/ui/keybinds/KeybindCategory.tscn @@ -0,0 +1,29 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/keybinds/KeybindCategory.gd" type="Script" id=1] +[ext_resource path="res://ui/keybinds/KeybindEntry.tscn" type="PackedScene" id=2] + +[node name="KeybindCategory" type="VBoxContainer"] +margin_right = 1016.0 +margin_bottom = 23.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +keybind_entry_scene = ExtResource( 2 ) +content_container_path = NodePath("VBoxContainer/content") + +[node name="Label" type="Label" parent="."] +margin_right = 1016.0 +margin_bottom = 25.0 +text = "Category" + +[node name="VBoxContainer" type="MarginContainer" parent="."] +margin_top = 33.0 +margin_right = 1016.0 +margin_bottom = 33.0 +custom_constants/margin_left = 20 + +[node name="content" type="VBoxContainer" parent="VBoxContainer"] +margin_left = 20.0 +margin_right = 1016.0 diff --git a/game/ui/keybinds/KeybindEntry.gd b/game/ui/keybinds/KeybindEntry.gd new file mode 100644 index 0000000..848faf3 --- /dev/null +++ b/game/ui/keybinds/KeybindEntry.gd @@ -0,0 +1,39 @@ +extends HBoxContainer + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" + +# Called when the node enters the scene tree for the first time. +func _ready(): + pass # Replace with function body. + +# Called every frame. 'delta' is the elapsed time since the previous frame. +#func _process(delta): +# pass + +func query_keybind_1() -> void: + pass + +func query_keybind_2() -> void: + pass diff --git a/game/ui/keybinds/KeybindEntry.tscn b/game/ui/keybinds/KeybindEntry.tscn new file mode 100644 index 0000000..9da6f5d --- /dev/null +++ b/game/ui/keybinds/KeybindEntry.tscn @@ -0,0 +1,34 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/keybinds/KeybindEntry.gd" type="Script" id=1] + +[node name="KeybindEntry" type="HBoxContainer"] +margin_right = 996.0 +margin_bottom = 37.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label" type="Label" parent="."] +margin_top = 6.0 +margin_right = 580.0 +margin_bottom = 31.0 +size_flags_horizontal = 3 +text = "Keybind" + +[node name="Button" type="Button" parent="."] +margin_left = 588.0 +margin_right = 788.0 +margin_bottom = 37.0 +rect_min_size = Vector2( 200, 30 ) +text = "empty" + +[node name="Button2" type="Button" parent="."] +margin_left = 796.0 +margin_right = 996.0 +margin_bottom = 37.0 +rect_min_size = Vector2( 200, 30 ) +text = "empty" +[connection signal="pressed" from="Button" to="." method="query_keybind_1"] +[connection signal="pressed" from="Button2" to="." method="query_keybind_2"] diff --git a/game/ui/keybinds/Keybinds.gd b/game/ui/keybinds/Keybinds.gd new file mode 100644 index 0000000..bcc3db4 --- /dev/null +++ b/game/ui/keybinds/Keybinds.gd @@ -0,0 +1,156 @@ +extends Control + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(PackedScene) var keybind_category_scene : PackedScene + +export(NodePath) var content_container_path : NodePath + +var _player : Entity + +func set_player(player : Entity): + if _player: + _player.disconnect("centity_data_changed", self, "on_data_changed") + + _player = player + + on_data_changed(_player.getc_entity_data()) + + _player.connect("centity_data_changed", self, "on_data_changed") + + +func on_data_changed(data): + if data: + ProfileManager.on_keybinds_changed(data.get_path()) + InputMap.load_from_globals() + + +# Note for the reader: +# +# This demo conveniently uses the same names for actions and for the container nodes +# that hold each remapping button. This allow to get back to the button based simply +# on the name of the corresponding action, but it might not be so simple in your project. +# +# A better approach for large-scale input remapping might be to do the connections between +# buttons and wait_for_input through the code, passing as arguments both the name of the +# action and the node, e.g.: +# button.connect("pressed", self, "wait_for_input", [ button, action ]) + +# Constants +const INPUT_ACTIONS = [ "move_up", "move_down", "move_left", "move_right", "jump" ] +const CONFIG_FILE = "user://input.cfg" + +# Member variables +var action # To register the action the UI is currently handling +var button # Button node corresponding to the above action + + +# Load/save input mapping to a config file +# Changes done while testing the demo will be persistent, saved to CONFIG_FILE + +func load_config(): + var config = ConfigFile.new() + var err = config.load(CONFIG_FILE) + if err: # Assuming that file is missing, generate default config + for action_name in INPUT_ACTIONS: + var action_list = InputMap.get_action_list(action_name) + # There could be multiple actions in the list, but we save the first one by default + var scancode = OS.get_scancode_string(action_list[0].scancode) + config.set_value("input", action_name, scancode) + config.save(CONFIG_FILE) + else: # ConfigFile was properly loaded, initialize InputMap + for action_name in config.get_section_keys("input"): + # Get the key scancode corresponding to the saved human-readable string + var scancode = OS.find_scancode_from_string(config.get_value("input", action_name)) + # Create a new event object based on the saved scancode + var event = InputEventKey.new() + event.scancode = scancode + # Replace old action (key) events by the new one + for old_event in InputMap.get_action_list(action_name): + if old_event is InputEventKey: + InputMap.action_erase_event(action_name, old_event) + InputMap.action_add_event(action_name, event) + + +func save_to_config(section, key, value): + """Helper function to redefine a parameter in the settings file""" + var config = ConfigFile.new() + var err = config.load(CONFIG_FILE) + if err: + print("Error code when loading config file: ", err) + else: + config.set_value(section, key, value) + config.save(CONFIG_FILE) + + +# Input management + +func wait_for_input(action_bind): + action = action_bind + # See note at the beginning of the script + button = get_node("bindings").get_node(action).get_node("Button") + get_node("contextual_help").text = "Press a key to assign to the '" + action + "' action." + set_process_input(true) + + +func a_input(event): + # Handle the first pressed key + if event is InputEventKey: + # Register the event as handled and stop polling + get_tree().set_input_as_handled() + set_process_input(false) + # Reinitialise the contextual help label + get_node("contextual_help").text = "Click a key binding to reassign it, or press the Cancel action." + if not event.is_action("ui_cancel"): + # Display the string corresponding to the pressed key + var scancode = OS.get_scancode_string(event.scancode) + button.text = scancode + # Start by removing previously key binding(s) + for old_event in InputMap.get_action_list(action): + InputMap.action_erase_event(action, old_event) + # Add the new key binding + InputMap.action_add_event(action, event) + save_to_config("input", action, scancode) + + +func a_ready(): + # Load config if existing, if not it will be generated with default values + load_config() + # Initialise each button with the default key binding from InputMap + for action in INPUT_ACTIONS: + # We assume that the key binding that we want is the first one (0), if there are several + var input_event = InputMap.get_action_list(action)[0] + # See note at the beginning of the script + var button = get_node("bindings").get_node(action).get_node("Button") + button.text = OS.get_scancode_string(input_event.scancode) + button.connect("pressed", self, "wait_for_input", [action]) + + # Do not start processing input until a button is pressed + set_process_input(false) + +func close(): + InputMap.load_from_globals() + + if _player: + ProfileManager.on_keybinds_changed(_player.getc_entity_data().get_path()) + + hide() + diff --git a/game/ui/keybinds/Keybinds.tscn b/game/ui/keybinds/Keybinds.tscn new file mode 100644 index 0000000..c5046e3 --- /dev/null +++ b/game/ui/keybinds/Keybinds.tscn @@ -0,0 +1,84 @@ +[gd_scene load_steps=11 format=2] + +[ext_resource path="res://ui/keybinds/Keybinds.gd" type="Script" id=1] +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=2] +[ext_resource path="res://ui/keybinds/KeybindCategory.tscn" type="PackedScene" id=3] +[ext_resource path="res://ui/icons/icon_mouse.png" type="Texture" id=4] +[ext_resource path="res://ui/icons/icon_keyboard.png" type="Texture" id=5] +[ext_resource path="res://ui/icons/icon_joy_button.png" type="Texture" id=6] +[ext_resource path="res://ui/icons/icon_remove.png" type="Texture" id=7] +[ext_resource path="res://ui/icons/icon_add.png" type="Texture" id=8] +[ext_resource path="res://ui/icons/icon_edit.png" type="Texture" id=9] +[ext_resource path="res://ui/icons/icon_joy_axis.png" type="Texture" id=10] + +[node name="KeybindWindow" type="PanelContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +theme = ExtResource( 2 ) +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +keybind_category_scene = ExtResource( 3 ) + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 1020.0 +margin_bottom = 596.0 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +margin_right = 1016.0 +margin_bottom = 30.0 + +[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer"] +margin_top = 7.0 +margin_right = 972.0 +margin_bottom = 22.0 +size_flags_horizontal = 3 +text = "Keybinds" + +[node name="Button" type="Button" parent="VBoxContainer/HBoxContainer"] +margin_left = 976.0 +margin_right = 1016.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 40, 30 ) +text = "X" + +[node name="InputMapEditor" type="InputMapEditor" parent="VBoxContainer"] +margin_top = 38.0 +margin_right = 1016.0 +margin_bottom = 554.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +add_texture = ExtResource( 8 ) +remove_texture = ExtResource( 7 ) +edit_texture = ExtResource( 9 ) +keyboard_texture = ExtResource( 5 ) +joybutton_texture = ExtResource( 6 ) +joyaxis_texture = ExtResource( 10 ) +mouse_texture = ExtResource( 4 ) + +[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer"] +margin_top = 562.0 +margin_right = 1016.0 +margin_bottom = 592.0 +alignment = 2 + +[node name="Button" type="Button" parent="VBoxContainer/HBoxContainer2"] +margin_left = 852.0 +margin_right = 932.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 80, 30 ) +text = "Cancel" + +[node name="Button2" type="Button" parent="VBoxContainer/HBoxContainer2"] +margin_left = 936.0 +margin_right = 1016.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 80, 30 ) +text = "OK" +[connection signal="pressed" from="VBoxContainer/HBoxContainer/Button" to="." method="hide"] +[connection signal="pressed" from="VBoxContainer/HBoxContainer2/Button" to="." method="hide"] +[connection signal="pressed" from="VBoxContainer/HBoxContainer2/Button2" to="." method="close"] +[connection signal="pressed" from="VBoxContainer/HBoxContainer2/Button2" to="VBoxContainer/InputMapEditor" method="queue_save"] diff --git a/game/ui/login/Login.tscn b/game/ui/login/Login.tscn new file mode 100644 index 0000000..5e0270f --- /dev/null +++ b/game/ui/login/Login.tscn @@ -0,0 +1,88 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] + +[node name="Login" type="PanelContainer"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -145.0 +margin_top = -157.0 +margin_right = 110.0 +margin_bottom = 86.0 +theme = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 251.0 +margin_bottom = 242.0 +custom_constants/separation = 10 +alignment = 1 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +margin_right = 247.0 +margin_bottom = 30.0 +size_flags_horizontal = 3 + +[node name="Label3" type="Label" parent="VBoxContainer/HBoxContainer"] +margin_top = 7.0 +margin_right = 199.0 +margin_bottom = 22.0 +size_flags_horizontal = 3 +text = "Login" + +[node name="Button" type="Button" parent="VBoxContainer/HBoxContainer"] +margin_left = 207.0 +margin_right = 247.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 40, 30 ) +text = "X" + +[node name="HSeparator" type="HSeparator" parent="VBoxContainer"] +margin_top = 40.0 +margin_right = 247.0 +margin_bottom = 48.0 + +[node name="Label" type="Label" parent="VBoxContainer"] +margin_top = 58.0 +margin_right = 247.0 +margin_bottom = 73.0 +text = "Username" + +[node name="LineEdit" type="LineEdit" parent="VBoxContainer"] +margin_top = 83.0 +margin_right = 247.0 +margin_bottom = 107.341 + +[node name="Label2" type="Label" parent="VBoxContainer"] +margin_top = 117.0 +margin_right = 247.0 +margin_bottom = 132.0 +text = "Password" + +[node name="LineEdit2" type="LineEdit" parent="VBoxContainer"] +margin_top = 142.0 +margin_right = 247.0 +margin_bottom = 166.341 +secret = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="CheckBox" type="CheckBox" parent="VBoxContainer"] +margin_top = 176.0 +margin_right = 247.0 +margin_bottom = 202.269 +text = "Remember me" + +[node name="Button" type="Button" parent="VBoxContainer"] +margin_top = 212.0 +margin_right = 247.0 +margin_bottom = 238.269 +text = "Login" +[connection signal="pressed" from="VBoxContainer/HBoxContainer/Button" to="." method="hide"] diff --git a/game/ui/loot_window/LootEntry.gd b/game/ui/loot_window/LootEntry.gd new file mode 100644 index 0000000..28df181 --- /dev/null +++ b/game/ui/loot_window/LootEntry.gd @@ -0,0 +1,49 @@ +extends Control + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(NodePath) var icon_path : NodePath +export(NodePath) var label_path : NodePath + +var icon : TextureRect +var label : RichTextLabel + +var index : int +var player : Entity +var item : ItemInstance + +func _ready(): + icon = get_node(icon_path) as TextureRect + label = get_node(label_path) as RichTextLabel + + if icon == null or label == null: + Logger.error("LootEntry is not setup correctly!") + +func on_click(): + player.loot_crequest(index) + +func set_item(pindex : int, item_instance : ItemInstance, pplayer : Entity) -> void: + index = index + player = pplayer + item = item_instance + + icon.texture = item.item_template.icon + label.bbcode_text = item.item_template.text_name diff --git a/game/ui/loot_window/LootEntry.tscn b/game/ui/loot_window/LootEntry.tscn new file mode 100644 index 0000000..cd3a857 --- /dev/null +++ b/game/ui/loot_window/LootEntry.tscn @@ -0,0 +1,61 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/loot_window/LootEntry.gd" type="Script" id=1] +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=2] + +[node name="lootEntry" type="PanelContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_right = -3.0 +margin_bottom = -3.0 +rect_min_size = Vector2( 0, 40 ) +size_flags_horizontal = 3 +theme = ExtResource( 2 ) +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +icon_path = NodePath("HBoxContainer/Button/TextureRect") +label_path = NodePath("HBoxContainer/Label") + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 1017.0 +margin_bottom = 593.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Button" type="Button" parent="HBoxContainer"] +margin_right = 46.0 +margin_bottom = 589.0 +rect_min_size = Vector2( 46, 46 ) + +[node name="TextureRect" type="TextureRect" parent="HBoxContainer/Button"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -20.0 +margin_top = -20.0 +margin_right = 20.0 +margin_bottom = 20.0 +rect_min_size = Vector2( 40, 40 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +expand = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label" type="RichTextLabel" parent="HBoxContainer"] +margin_left = 50.0 +margin_right = 1013.0 +margin_bottom = 589.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +bbcode_enabled = true +text = "sdfsdfsdf" +scroll_active = false +[connection signal="pressed" from="HBoxContainer/Button" to="." method="on_click"] diff --git a/game/ui/loot_window/LootWindow.gd b/game/ui/loot_window/LootWindow.gd new file mode 100644 index 0000000..7f525c2 --- /dev/null +++ b/game/ui/loot_window/LootWindow.gd @@ -0,0 +1,98 @@ +extends Control + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(PackedScene) var entry_scene : PackedScene +export(NodePath) var container_path : NodePath + +var container : Node + +var player : Entity +var target_bag : Bag + +func _ready(): + get_node("../../../").loot_window = self + + container = get_node(container_path) + + connect("visibility_changed", self, "on_visibility_changed") + + if entry_scene == null: + Logger.error("LootWindow: entry_scene is null") + +func refresh(): + for child in container.get_children(): + child.queue_free() + + if target_bag == null: + return + + for i in range(target_bag.get_size()): + var ii : ItemInstance = target_bag.get_item(i) + + if ii: + var e : Node = entry_scene.instance() + + container.add_child(e) + e.owner = container + + e.set_item(i, ii, player) + +func set_player(p_player : Entity) -> void: + player = p_player + player.connect("ctarget_bag_changed", self, "ctarget_bag_changed") + player.connect("onc_open_winow_request", self, "onc_open_loot_winow_request") + +func on_player_moved(): + if visible: + hide() + +func on_visibility_changed(): + if visible: + refresh() + else: + if target_bag != null: + target_bag.disconnect("item_removed", self, "on_item_removed") + target_bag = null + +func on_item_removed(bag: Bag, item: ItemInstance, slot_id: int) -> void: + refresh() + +func ctarget_bag_changed(entity: Entity, bag: Bag) -> void: + if target_bag != null: + target_bag.disconnect("item_removed", self, "on_item_removed") + target_bag = null + + target_bag = bag + + if target_bag == null: + return + + target_bag.connect("item_removed", self, "on_item_removed") + +func onc_open_loot_winow_request(window_id) -> void: + if window_id != EntityEnums.ENTITY_WINDOW_LOOT: + return + + show() + + if player.has_signal("player_moved") && !player.is_connected("player_moved", self, "on_player_moved"): + player.connect("player_moved", self, "on_player_moved", [], CONNECT_ONESHOT) diff --git a/game/ui/loot_window/LootWindow.tscn b/game/ui/loot_window/LootWindow.tscn new file mode 100644 index 0000000..18807e4 --- /dev/null +++ b/game/ui/loot_window/LootWindow.tscn @@ -0,0 +1,56 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://ui/loot_window/LootWindow.gd" type="Script" id=1] +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=2] +[ext_resource path="res://ui/loot_window/LootEntry.tscn" type="PackedScene" id=3] + +[node name="LootWindow" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +theme = ExtResource( 2 ) +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +entry_scene = ExtResource( 3 ) +container_path = NodePath("PanelContainer/VBoxContainer/ScrollContainer/container") + +[node name="PanelContainer" type="PanelContainer" parent="."] +margin_left = 82.0 +margin_top = 83.0 +margin_right = 299.0 +margin_bottom = 359.0 + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 213.0 +margin_bottom = 272.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Label" type="Label" parent="PanelContainer/VBoxContainer"] +margin_right = 209.0 +margin_bottom = 15.0 +text = "Loot" +align = 1 +valign = 1 + +[node name="ScrollContainer" type="ScrollContainer" parent="PanelContainer/VBoxContainer"] +margin_top = 23.0 +margin_right = 209.0 +margin_bottom = 234.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="container" type="VBoxContainer" parent="PanelContainer/VBoxContainer/ScrollContainer"] +margin_right = 209.0 +size_flags_horizontal = 3 + +[node name="Button" type="Button" parent="PanelContainer/VBoxContainer"] +margin_top = 242.0 +margin_right = 209.0 +margin_bottom = 268.57 +text = "close" +[connection signal="pressed" from="PanelContainer/VBoxContainer/Button" to="." method="hide"] diff --git a/game/ui/loot_window/game_module.tres b/game/ui/loot_window/game_module.tres new file mode 100644 index 0000000..8a640a3 --- /dev/null +++ b/game/ui/loot_window/game_module.tres @@ -0,0 +1,11 @@ +[gd_resource type="Resource" load_steps=3 format=2] + +[ext_resource path="res://scripts/game_modules/ui_window_module.gd" type="Script" id=2] +[ext_resource path="res://ui/loot_window/LootWindow.tscn" type="PackedScene" id=3] + +[resource] +script = ExtResource( 2 ) +enabled = true +scene = ExtResource( 3 ) +index = -1 +add_button = false diff --git a/game/ui/map/Map.tscn b/game/ui/map/Map.tscn new file mode 100644 index 0000000..4067832 --- /dev/null +++ b/game/ui/map/Map.tscn @@ -0,0 +1,47 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] + +[node name="Map" type="PanelContainer"] +margin_left = 55.5336 +margin_top = 55.5336 +margin_right = 821.534 +margin_bottom = 545.534 +theme = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 762.0 +margin_bottom = 486.0 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +margin_right = 758.0 +margin_bottom = 40.0 + +[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer"] +margin_top = 12.0 +margin_right = 710.0 +margin_bottom = 27.0 +size_flags_horizontal = 3 +text = "Map" + +[node name="Button" type="Button" parent="VBoxContainer/HBoxContainer"] +margin_left = 718.0 +margin_right = 758.0 +margin_bottom = 40.0 +rect_min_size = Vector2( 40, 40 ) +text = "X" + +[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer"] +margin_top = 48.0 +margin_right = 758.0 +margin_bottom = 482.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="TextureRect" type="TextureRect" parent="VBoxContainer/ScrollContainer"] +[connection signal="pressed" from="VBoxContainer/HBoxContainer/Button" to="." method="hide"] diff --git a/game/ui/menu/CharacterEntry.gd b/game/ui/menu/CharacterEntry.gd new file mode 100644 index 0000000..0f35016 --- /dev/null +++ b/game/ui/menu/CharacterEntry.gd @@ -0,0 +1,59 @@ +extends Button + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(NodePath) var name_label_path : NodePath +export(NodePath) var class_label_path : NodePath +export(NodePath) var level_label_path : NodePath + +var id : int +var file_name : String + +var name_label : Label +var class_label : Label +var level_label : Label + +var entity : Entity +var class_profile : ClassProfile + +func _ready(): + name_label = get_node(name_label_path) as Label + class_label = get_node(class_label_path) as Label + level_label = get_node(level_label_path) as Label + + connect("visibility_changed", self, "on_visibility_changed") + +func setup(pfile_name : String, name : String, cls_name : String, level : int, class_level : int, pentity : Entity) -> void: + file_name = pfile_name + name_label.text = name + class_label.text = cls_name + " (lvl " + str(class_level) + ')' + level_label.text = str(level) + entity = pentity + +func set_class_name(name : String, level : int, pclass_profile : ClassProfile) -> void: + name_label.text = name + level_label.text = str(level) + class_profile = pclass_profile + +func on_visibility_changed(): + if visible and class_profile != null: + level_label.text = str(class_profile.level) + diff --git a/game/ui/menu/CharacterEntry.tscn b/game/ui/menu/CharacterEntry.tscn new file mode 100644 index 0000000..bcaeaa7 --- /dev/null +++ b/game/ui/menu/CharacterEntry.tscn @@ -0,0 +1,91 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] +[ext_resource path="res://ui/menu/CharacterEntry.gd" type="Script" id=2] + +[node name="CharacterEntry" type="Button"] +margin_right = 224.0 +margin_bottom = 88.0 +rect_min_size = Vector2( 80, 80 ) +size_flags_horizontal = 3 +theme = ExtResource( 1 ) +toggle_mode = true +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} +name_label_path = NodePath("MarginContainer/HBoxContainer/VBoxContainer/name") +class_label_path = NodePath("MarginContainer/HBoxContainer/VBoxContainer/class") +level_label_path = NodePath("MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer/level") + +[node name="MarginContainer" type="MarginContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_constants/margin_right = 5 +custom_constants/margin_top = 5 +custom_constants/margin_left = 5 +custom_constants/margin_bottom = 5 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer"] +margin_left = 5.0 +margin_top = 5.0 +margin_right = 219.0 +margin_bottom = 83.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="PanelContainer" type="PanelContainer" parent="MarginContainer/HBoxContainer"] +margin_right = 68.0 +margin_bottom = 78.0 +mouse_filter = 2 +size_flags_vertical = 3 + +[node name="MarginContainer" type="MarginContainer" parent="MarginContainer/HBoxContainer/PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 64.0 +margin_bottom = 74.0 +rect_min_size = Vector2( 60, 60 ) +mouse_filter = 2 +custom_constants/margin_right = 5 +custom_constants/margin_top = 5 +custom_constants/margin_left = 5 +custom_constants/margin_bottom = 5 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/HBoxContainer"] +margin_left = 72.0 +margin_right = 214.0 +margin_bottom = 78.0 +mouse_filter = 2 +size_flags_horizontal = 3 + +[node name="name" type="Label" parent="MarginContainer/HBoxContainer/VBoxContainer"] +margin_right = 142.0 +margin_bottom = 15.0 + +[node name="class" type="Label" parent="MarginContainer/HBoxContainer/VBoxContainer"] +margin_top = 23.0 +margin_right = 142.0 +margin_bottom = 38.0 + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/HBoxContainer/VBoxContainer"] +margin_top = 46.0 +margin_right = 142.0 +margin_bottom = 61.0 + +[node name="Label" type="Label" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer"] +margin_right = 36.0 +margin_bottom = 15.0 +text = "Level " + +[node name="level" type="Label" parent="MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer"] +margin_left = 40.0 +margin_right = 40.0 +margin_bottom = 15.0 diff --git a/game/ui/menu/character_creation_button_group.tres b/game/ui/menu/character_creation_button_group.tres new file mode 100644 index 0000000..0e55d74 --- /dev/null +++ b/game/ui/menu/character_creation_button_group.tres @@ -0,0 +1,3 @@ +[gd_resource type="ButtonGroup" format=2] + +[resource] diff --git a/game/ui/menu/menu_character_button_group.tres b/game/ui/menu/menu_character_button_group.tres new file mode 100644 index 0000000..0e55d74 --- /dev/null +++ b/game/ui/menu/menu_character_button_group.tres @@ -0,0 +1,3 @@ +[gd_resource type="ButtonGroup" format=2] + +[resource] diff --git a/game/ui/minimap/MiniMap.tscn b/game/ui/minimap/MiniMap.tscn new file mode 100644 index 0000000..b9cf302 --- /dev/null +++ b/game/ui/minimap/MiniMap.tscn @@ -0,0 +1,11 @@ +[gd_scene format=2] + +[node name="MiniMap" type="MarginContainer"] +anchor_left = 1.0 +anchor_right = 1.0 +margin_left = -196.0 +margin_bottom = 189.0 +mouse_filter = 2 +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/game/ui/nameplates/NamePlate.tscn b/game/ui/nameplates/NamePlate.tscn new file mode 100644 index 0000000..43518ef --- /dev/null +++ b/game/ui/nameplates/NamePlate.tscn @@ -0,0 +1,68 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://ui/nameplates/name_plate_theme.tres" type="Theme" id=1] +[ext_resource path="res://ui/nameplates/texture_progress_fg.tres" type="Texture" id=2] +[ext_resource path="res://player/NamePlate.gd" type="Script" id=3] + +[node name="NamePlate" type="VBoxContainer"] +margin_right = 62.0 +margin_bottom = 17.0 +rect_scale = Vector2( 0.75, 0.75 ) +mouse_filter = 2 +theme = ExtResource( 1 ) +custom_constants/separation = 0 +script = ExtResource( 3 ) +__meta__ = { +"_edit_use_anchors_": false +} +health_bar_path = NodePath("MarginContainer/TextureProgress") +health_bar_label_path = NodePath("MarginContainer/CenterContainer/Label") +normal_color = Color( 0.74902, 0.74902, 0.74902, 1 ) +mouseover_scale = Vector2( 0.75, 0.75 ) + +[node name="Name" type="Label" parent="."] +margin_right = 62.0 +margin_bottom = 15.0 +custom_constants/line_spacing = 0 +text = "Asda" +align = 1 +valign = 1 + +[node name="MarginContainer" type="MarginContainer" parent="."] +margin_top = 15.0 +margin_right = 62.0 +margin_bottom = 17.0 +size_flags_horizontal = 15 +size_flags_vertical = 15 +size_flags_stretch_ratio = 2.3 + +[node name="TextureProgress" type="TextureProgress" parent="MarginContainer"] +margin_right = 62.0 +margin_bottom = 2.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +value = 100.0 +texture_under = ExtResource( 2 ) +texture_progress = ExtResource( 2 ) +tint_under = Color( 0.219608, 0.215686, 0.215686, 0.756863 ) +tint_progress = Color( 0.917647, 0.0117647, 0.0117647, 1 ) +nine_patch_stretch = true +stretch_margin_left = 1 +stretch_margin_top = 1 +stretch_margin_right = 1 +stretch_margin_bottom = 1 + +[node name="CenterContainer" type="CenterContainer" parent="MarginContainer"] +visible = false +margin_right = 62.0 +margin_bottom = 2.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Label" type="Label" parent="MarginContainer/CenterContainer"] +visible = false +margin_left = 22.0 +margin_top = -7.0 +margin_right = 40.0 +margin_bottom = 8.0 +text = "50%" diff --git a/game/ui/nameplates/name_plate_dynamicfont.tres b/game/ui/nameplates/name_plate_dynamicfont.tres new file mode 100644 index 0000000..b9a53e2 --- /dev/null +++ b/game/ui/nameplates/name_plate_dynamicfont.tres @@ -0,0 +1,8 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://fonts/VT323-Regular.ttf" type="DynamicFontData" id=1] + + +[resource] +size = 14 +font_data = ExtResource( 1 ) diff --git a/game/ui/nameplates/name_plate_theme.tres b/game/ui/nameplates/name_plate_theme.tres new file mode 100644 index 0000000..83e5895 --- /dev/null +++ b/game/ui/nameplates/name_plate_theme.tres @@ -0,0 +1,36 @@ +[gd_resource type="Theme" load_steps=4 format=2] + +[ext_resource path="res://ui/nameplates/name_plate_dynamicfont.tres" type="DynamicFont" id=1] + +[sub_resource type="StyleBoxFlat" id=1] +bg_color = Color( 0.0627451, 0.0627451, 0.0627451, 0.823529 ) +corner_radius_top_left = 5 +corner_radius_top_right = 5 +corner_radius_bottom_right = 5 +corner_radius_bottom_left = 5 +anti_aliasing = false + +[sub_resource type="StyleBoxFlat" id=2] +bg_color = Color( 0.647059, 0, 0, 1 ) +corner_radius_top_left = 5 +corner_radius_top_right = 5 +corner_radius_bottom_right = 5 +corner_radius_bottom_left = 5 +anti_aliasing = false + +[resource] +default_font = ExtResource( 1 ) +Label/colors/font_color = Color( 1, 1, 1, 1 ) +Label/colors/font_color_shadow = Color( 0, 0, 0, 0 ) +Label/colors/font_outline_modulate = Color( 1, 1, 1, 1 ) +Label/constants/line_spacing = 6 +Label/constants/shadow_as_outline = 0 +Label/constants/shadow_offset_x = 0 +Label/constants/shadow_offset_y = 0 +Label/fonts/font = null +Label/styles/normal = null +ProgressBar/colors/font_color = Color( 0.94, 0.94, 0.94, 1 ) +ProgressBar/colors/font_color_shadow = Color( 0, 0, 0, 1 ) +ProgressBar/fonts/font = null +ProgressBar/styles/bg = SubResource( 1 ) +ProgressBar/styles/fg = SubResource( 2 ) diff --git a/game/ui/nameplates/texture_progress_bg.tres b/game/ui/nameplates/texture_progress_bg.tres new file mode 100644 index 0000000..9b0e3ef --- /dev/null +++ b/game/ui/nameplates/texture_progress_bg.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 31, 49, 10, 11 ) diff --git a/game/ui/nameplates/texture_progress_fg.tres b/game/ui/nameplates/texture_progress_fg.tres new file mode 100644 index 0000000..9b0e3ef --- /dev/null +++ b/game/ui/nameplates/texture_progress_fg.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 31, 49, 10, 11 ) diff --git a/game/ui/numbers/Number.gd b/game/ui/numbers/Number.gd new file mode 100644 index 0000000..6bd67d2 --- /dev/null +++ b/game/ui/numbers/Number.gd @@ -0,0 +1,87 @@ +extends Label + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(NodePath) var animation_player_path : NodePath = "AnimationPlayer" + +export(Color) var damage_color : Color = Color.yellow +export(Color) var heal_color : Color = Color.green + +var world_position : Vector3 = Vector3() +var animation_player : AnimationPlayer = null +var camera : Camera = null + +func _ready() -> void: + animation_player = get_node(animation_player_path) as AnimationPlayer + + animation_player.connect("animation_finished", self, "animation_finished") + + set_process(false) + +func _process(delta): + if camera == null: + return + + var cam_pos : Vector3 = camera.global_transform.xform(Vector3()) + var dstv : Vector3 = cam_pos - world_position + dstv.y = 0 +# var dst : float = dstv.length_squared() + + var cam_facing : Vector3 = -camera.global_transform.basis.z + var d : float = cam_facing.dot(dstv) + + if d > 0: + if visible: + hide() + return + else: + if not visible: + show() + + var screen_position : Vector2 = camera.unproject_position(world_position) + var new_pos : Vector2 = Vector2(screen_position.x + rect_position.x, screen_position.y + rect_position.y - 60) + + set_position(new_pos) + + +func damage(pos : Vector3, value : int, crit : bool) -> void: + setup(pos, damage_color, value, crit) + +func heal(pos : Vector3, value : int, crit : bool) -> void: + setup(pos, heal_color, value, crit) + +func setup(pos : Vector3, color : Color, value : int, crit : bool) -> void: + world_position = pos + + camera = get_tree().get_root().get_camera() as Camera + + text = str(value) + add_color_override("font_color", color) + + if crit: + animation_player.play("crit") + else: + animation_player.play("normal") + + set_process(true) + +func animation_finished(anim_name : String) -> void: + queue_free() diff --git a/game/ui/numbers/Number.tscn b/game/ui/numbers/Number.tscn new file mode 100644 index 0000000..c9dc9dd --- /dev/null +++ b/game/ui/numbers/Number.tscn @@ -0,0 +1,92 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://ui/numbers/Number.gd" type="Script" id=1] +[ext_resource path="res://ui/numbers/number_font.tres" type="DynamicFont" id=2] + +[sub_resource type="Animation" id=1] +resource_name = "crit" +length = 1.5 +tracks/0/type = "value" +tracks/0/path = NodePath(".:rect_scale") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.05, 0.3, 1.5 ), +"transitions": PoolRealArray( 1, 0.307786, 1, 1.36604 ), +"update": 0, +"values": [ Vector2( 0.1, 0.1 ), Vector2( 1.5, 1.5 ), Vector2( 1.3, 1.3 ), Vector2( 1.3, 1.3 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath(".:rect_position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0, 0.6, 1.5 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -50, 20 ), Vector2( -50, 20 ), Vector2( -50, 10 ) ] +} +tracks/2/type = "value" +tracks/2/path = NodePath(".:modulate") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/keys = { +"times": PoolRealArray( 0, 1.2, 1.5 ), +"transitions": PoolRealArray( 1, 1, 4 ), +"update": 0, +"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ] +} + +[sub_resource type="Animation" id=2] +resource_name = "normal" +length = 2.0 +tracks/0/type = "value" +tracks/0/path = NodePath(".:rect_position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 2 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Vector2( -50, 20 ), Vector2( -50, 0 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath(".:modulate") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 4 ), +"update": 0, +"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ] +} + +[node name="Number" type="Label"] +modulate = Color( 1, 1, 1, 0 ) +margin_left = -50.0 +margin_right = 50.0 +margin_bottom = 40.0006 +rect_scale = Vector2( 1.3, 1.3 ) +rect_pivot_offset = Vector2( 50, 20 ) +custom_fonts/font = ExtResource( 2 ) +custom_colors/font_color = Color( 0.870588, 0.898039, 0.0117647, 1 ) +align = 1 +valign = 1 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +anims/crit = SubResource( 1 ) +anims/normal = SubResource( 2 ) diff --git a/game/ui/numbers/number_font.tres b/game/ui/numbers/number_font.tres new file mode 100644 index 0000000..6f185f3 --- /dev/null +++ b/game/ui/numbers/number_font.tres @@ -0,0 +1,8 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://fonts/VT323-Regular.ttf" type="DynamicFontData" id=1] + + +[resource] +size = 12 +font_data = ExtResource( 1 ) diff --git a/game/ui/options/OptionButtonRow.gd b/game/ui/options/OptionButtonRow.gd new file mode 100644 index 0000000..c9c5bee --- /dev/null +++ b/game/ui/options/OptionButtonRow.gd @@ -0,0 +1,35 @@ +extends HBoxContainer + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(String) var property_category : String +export(String) var property_name : String + +export(String) var property_label : String + +func _ready(): + var ob : Button = $Button as Button + $Label.text = property_label + +# ob.connect("pressed", self, "pressed") +# +#func pressed() -> void: +# Settings.set_value(property_category, property_name, val) diff --git a/game/ui/options/OptionButtonRow.tscn b/game/ui/options/OptionButtonRow.tscn new file mode 100644 index 0000000..c86e532 --- /dev/null +++ b/game/ui/options/OptionButtonRow.tscn @@ -0,0 +1,25 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/options/OptionButtonRow.gd" type="Script" id=1] + +[node name="OptionButtonRow" type="HBoxContainer"] +margin_right = 527.0 +margin_bottom = 15.0 +size_flags_horizontal = 3 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label" type="Label" parent="."] +margin_top = 3.0 +margin_right = 261.0 +margin_bottom = 17.0 +size_flags_horizontal = 3 + +[node name="Button" type="Button" parent="."] +margin_left = 265.0 +margin_right = 527.0 +margin_bottom = 20.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 diff --git a/game/ui/options/OptionCheckBox.gd b/game/ui/options/OptionCheckBox.gd new file mode 100644 index 0000000..9a53aa2 --- /dev/null +++ b/game/ui/options/OptionCheckBox.gd @@ -0,0 +1,33 @@ +extends CheckBox + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(String) var property_category : String +export(String) var property_name : String + +func _ready() -> void: + var p : bool = Settings.get_value(property_category, property_name) as bool + + if p != pressed: + pressed = p + +func _toggled(button_pressed : bool) -> void: + Settings.set_value(property_category, property_name, button_pressed) diff --git a/game/ui/options/OptionCheckboxRow.tscn b/game/ui/options/OptionCheckboxRow.tscn new file mode 100644 index 0000000..92ab19a --- /dev/null +++ b/game/ui/options/OptionCheckboxRow.tscn @@ -0,0 +1,27 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/options/OptionToggleRow.gd" type="Script" id=1] + +[node name="OptionToggleRow" type="HBoxContainer"] +margin_top = 34.0 +margin_right = 527.0 +margin_bottom = 60.0 +size_flags_horizontal = 3 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label" type="Label" parent="."] +margin_top = 6.0 +margin_right = 261.0 +margin_bottom = 20.0 +size_flags_horizontal = 3 + +[node name="CheckBox" type="CheckBox" parent="."] +margin_left = 265.0 +margin_right = 527.0 +margin_bottom = 26.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "On" diff --git a/game/ui/options/OptionEnumRow.gd b/game/ui/options/OptionEnumRow.gd new file mode 100644 index 0000000..29b3f31 --- /dev/null +++ b/game/ui/options/OptionEnumRow.gd @@ -0,0 +1,47 @@ +tool +extends HBoxContainer + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(String) var property_category : String +export(String) var property_name : String + +export(String) var property_label : String + +export(Array, String) var options : Array + +func _ready(): + $Label.text = property_label + + if Engine.editor_hint: + return + + var ob : OptionButton = $OptionButton as OptionButton + + for i in range(options.size()): + ob.add_item(options[i], i) + + ob.selected = Settings.get_value(property_category, property_name) + + ob.connect("item_selected", self, "item_selected") + +func item_selected(id : int) -> void: + Settings.set_value(property_category, property_name, id) diff --git a/game/ui/options/OptionEnumRow.tscn b/game/ui/options/OptionEnumRow.tscn new file mode 100644 index 0000000..6f900d9 --- /dev/null +++ b/game/ui/options/OptionEnumRow.tscn @@ -0,0 +1,27 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/options/OptionEnumRow.gd" type="Script" id=1] + +[node name="OptionEnumRow" type="HBoxContainer"] +margin_top = 34.0 +margin_right = 527.0 +margin_bottom = 60.0 +size_flags_horizontal = 3 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label" type="Label" parent="."] +margin_top = 6.0 +margin_right = 261.0 +margin_bottom = 20.0 +size_flags_horizontal = 3 + +[node name="OptionButton" type="OptionButton" parent="."] +margin_left = 265.0 +margin_right = 527.0 +margin_bottom = 26.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +align = 1 diff --git a/game/ui/options/OptionToggleRow.gd b/game/ui/options/OptionToggleRow.gd new file mode 100644 index 0000000..6ab985c --- /dev/null +++ b/game/ui/options/OptionToggleRow.gd @@ -0,0 +1,44 @@ +tool +extends HBoxContainer + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(String) var property_category : String +export(String) var property_name : String + +export(String) var property_label : String + +var _cb : CheckBox = null + +func _ready(): + $Label.text = property_label + + if Engine.editor_hint: + return + + _cb = $CheckBox as CheckBox + + _cb.pressed = Settings.get_value(property_category, property_name) + + _cb.connect("pressed", self, "pressed") + +func pressed() -> void: + Settings.set_value(property_category, property_name, _cb.pressed) diff --git a/game/ui/options/Options.tscn b/game/ui/options/Options.tscn new file mode 100644 index 0000000..2316be6 --- /dev/null +++ b/game/ui/options/Options.tscn @@ -0,0 +1,196 @@ +[gd_scene load_steps=8 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] +[ext_resource path="res://ui/player_ui/RemoveProfile.gd" type="Script" id=2] +[ext_resource path="res://ui/options/OptionsViewportLabel.tscn" type="PackedScene" id=3] +[ext_resource path="res://ui/options/OptionCheckboxRow.tscn" type="PackedScene" id=4] +[ext_resource path="res://ui/options/OptionCheckBox.gd" type="Script" id=5] +[ext_resource path="res://ui/options/OptionEnumRow.tscn" type="PackedScene" id=6] +[ext_resource path="res://ui/options/OptionsSpinboxRow.tscn" type="PackedScene" id=8] + +[node name="Options" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +theme = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="PanelContainer" type="PanelContainer" parent="."] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -271.5 +margin_top = -236.5 +margin_right = 271.5 +margin_bottom = 236.5 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 539.0 +margin_bottom = 469.0 + +[node name="TabContainer" type="TabContainer" parent="PanelContainer/VBoxContainer"] +margin_right = 535.0 +margin_bottom = 431.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +tab_align = 0 + +[node name="Video" type="VBoxContainer" parent="PanelContainer/VBoxContainer/TabContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 31.0 +margin_right = -4.0 +margin_bottom = -4.0 +size_flags_horizontal = 3 + +[node name="ViewportWidth" parent="PanelContainer/VBoxContainer/TabContainer/Video" instance=ExtResource( 3 )] +margin_bottom = 15.0 +property_label = "Viewport Width" + +[node name="ViewportHeight" parent="PanelContainer/VBoxContainer/TabContainer/Video" instance=ExtResource( 3 )] +margin_top = 23.0 +margin_bottom = 38.0 +property_label = "Viewport Height" +width = false + +[node name="ViewportScale" parent="PanelContainer/VBoxContainer/TabContainer/Video" instance=ExtResource( 8 )] +margin_top = 46.0 +margin_bottom = 70.0 +property_category = "rendering" +property_name = "viewport_scale" +property_label = "Viewport Scale" +min_value = 20.0 +step = 5.0 +suffix = "%" + +[node name="Borderless" parent="PanelContainer/VBoxContainer/TabContainer/Video" instance=ExtResource( 4 )] +margin_top = 78.0 +margin_bottom = 104.0 +property_category = "rendering" +property_name = "borderless" +property_label = "Borderless Window" + +[node name="FullScreen" parent="PanelContainer/VBoxContainer/TabContainer/Video" instance=ExtResource( 4 )] +margin_top = 112.0 +margin_bottom = 138.0 +property_category = "rendering" +property_name = "fullscreen" +property_label = "Fullscreen" + +[node name="AlwaysOnTop" parent="PanelContainer/VBoxContainer/TabContainer/Video" instance=ExtResource( 4 )] +margin_top = 146.0 +margin_bottom = 172.0 +property_category = "rendering" +property_name = "always_on_top" +property_label = "Always On Top" + +[node name="ThreadModel" parent="PanelContainer/VBoxContainer/TabContainer/Video" instance=ExtResource( 6 )] +margin_top = 180.0 +margin_bottom = 206.0 +property_category = "rendering" +property_name = "thread_model" +property_label = "Thread Model" +options = [ "Single-Unsafe", "Single-Safe", "Multi Threaded" ] + +[node name="Shadows" parent="PanelContainer/VBoxContainer/TabContainer/Video" instance=ExtResource( 4 )] +margin_top = 214.0 +margin_bottom = 240.0 +property_category = "rendering" +property_name = "shadows_enabled" +property_label = "Shadows Enabled" + +[node name="VSync" parent="PanelContainer/VBoxContainer/TabContainer/Video" instance=ExtResource( 4 )] +margin_top = 248.0 +margin_bottom = 274.0 +property_category = "rendering" +property_name = "use_vsync" +property_label = "VSync" + +[node name="VSyncViaCompositor" parent="PanelContainer/VBoxContainer/TabContainer/Video" instance=ExtResource( 4 )] +margin_top = 282.0 +margin_bottom = 308.0 +property_category = "rendering" +property_name = "vsync_via_compositor" +property_label = "VSync Via Compositor" + +[node name="Interface" type="VBoxContainer" parent="PanelContainer/VBoxContainer/TabContainer"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 31.0 +margin_right = -4.0 +margin_bottom = -4.0 +size_flags_horizontal = 3 + +[node name="OptionToggleRow" parent="PanelContainer/VBoxContainer/TabContainer/Interface" instance=ExtResource( 4 )] +margin_top = 0.0 +margin_bottom = 26.0 +property_category = "ui" +property_name = "touchscreen_mode" +property_label = "Touchscreen Mode" + +[node name="OptionsSpinboxRow" parent="PanelContainer/VBoxContainer/TabContainer/Interface" instance=ExtResource( 8 )] +margin_top = 58.0 +margin_bottom = 82.0 +property_category = "ui" +property_name = "ui_scale" +property_label = "UI Scale" +min_value = 0.2 +max_value = 2.4 +step = 0.01 +rounded = false + +[node name="OptionsSpinboxRow2" parent="PanelContainer/VBoxContainer/TabContainer/Interface" instance=ExtResource( 8 )] +margin_top = 90.0 +margin_bottom = 114.0 +property_category = "ui" +property_name = "ui_scale_touch" +property_label = "UI Scale Touch" +min_value = 0.2 +max_value = 2.4 +step = 0.01 +rounded = false + +[node name="Debug" type="VBoxContainer" parent="PanelContainer/VBoxContainer/TabContainer"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 31.0 +margin_right = -4.0 +margin_bottom = -4.0 +size_flags_horizontal = 3 + +[node name="DebugInfo" type="CheckBox" parent="PanelContainer/VBoxContainer/TabContainer/Debug"] +margin_right = 527.0 +margin_bottom = 26.269 +text = "Show Debug info" +script = ExtResource( 5 ) +property_category = "debug" +property_name = "debug_info" + +[node name="RemoveProfile" type="Button" parent="PanelContainer/VBoxContainer/TabContainer/Debug"] +margin_top = 34.0 +margin_right = 527.0 +margin_bottom = 60.269 +size_flags_horizontal = 3 +text = "Remove Profile" +script = ExtResource( 2 ) + +[node name="Close" type="Button" parent="PanelContainer/VBoxContainer"] +margin_top = 439.0 +margin_right = 535.0 +margin_bottom = 465.57 +text = "Close" + +[connection signal="pressed" from="PanelContainer/VBoxContainer/Close" to="." method="hide"] diff --git a/game/ui/options/OptionsSliderRow.gd b/game/ui/options/OptionsSliderRow.gd new file mode 100644 index 0000000..1468a35 --- /dev/null +++ b/game/ui/options/OptionsSliderRow.gd @@ -0,0 +1,44 @@ +tool +extends HBoxContainer + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(String) var property_category : String +export(String) var property_name : String + +export(String) var property_label : String + +var _slider : HSlider = null + +func _ready(): + $Label.text = property_label + + if Engine.editor_hint: + return + + _slider = $HSlider as Slider + + _slider.value = Settings.get_value(property_category, property_name) + + _slider.connect("value_changed", self, "value_changed") + +func value_changed(val: float) -> void: + Settings.set_value(property_category, property_name, val) diff --git a/game/ui/options/OptionsSliderRow.tscn b/game/ui/options/OptionsSliderRow.tscn new file mode 100644 index 0000000..7017178 --- /dev/null +++ b/game/ui/options/OptionsSliderRow.tscn @@ -0,0 +1,29 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/options/OptionsSliderRow.gd" type="Script" id=1] + +[node name="OptionsSliderRow" type="HBoxContainer"] +margin_top = 46.0 +margin_right = 527.0 +margin_bottom = 72.0 +size_flags_horizontal = 3 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label" type="Label" parent="."] +margin_top = 6.0 +margin_right = 261.0 +margin_bottom = 20.0 +size_flags_horizontal = 3 + +[node name="HSlider" type="HSlider" parent="."] +margin_left = 265.0 +margin_right = 527.0 +margin_bottom = 26.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +min_value = 5.0 +step = 5.0 +value = 100.0 diff --git a/game/ui/options/OptionsSpinboxRow.gd b/game/ui/options/OptionsSpinboxRow.gd new file mode 100644 index 0000000..ac26d37 --- /dev/null +++ b/game/ui/options/OptionsSpinboxRow.gd @@ -0,0 +1,66 @@ +tool +extends HBoxContainer + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(String) var property_category : String +export(String) var property_name : String + +export(String) var property_label : String + +export(float) var min_value : float = 0 +export(float) var max_value : float = 100 +export(float) var step : float = 1 +export(bool) var rounded : bool = true + +export(String) var prefix : String = "" +export(String) var suffix : String = "" + +var _sb : SpinBox = null + +func _ready(): + $Label.text = property_label + + _sb = $SpinBox as SpinBox + + _sb.min_value = min_value + _sb.max_value = max_value + _sb.step = step + + _sb.prefix = prefix + _sb.suffix = suffix + + _sb.rounded = rounded + + if Engine.editor_hint: + return + + _sb = $SpinBox as SpinBox + + _sb.min_value = min_value + _sb.max_value = max_value + _sb.step = step + _sb.value = Settings.get_value(property_category, property_name) + + _sb.connect("value_changed", self, "value_changed") + +func value_changed(val: float) -> void: + Settings.set_value(property_category, property_name, val) diff --git a/game/ui/options/OptionsSpinboxRow.tscn b/game/ui/options/OptionsSpinboxRow.tscn new file mode 100644 index 0000000..dbe44e5 --- /dev/null +++ b/game/ui/options/OptionsSpinboxRow.tscn @@ -0,0 +1,38 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/options/OptionsSpinboxRow.gd" type="Script" id=1] + +[node name="OptionsSpinboxRow" type="HBoxContainer"] +margin_top = 70.0 +margin_right = 527.0 +margin_bottom = 86.0 +size_flags_horizontal = 3 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +property_category = "" +property_name = "" +property_label = "" +min_value = 0.0 +max_value = 100.0 +step = 0.0 +rounded = true +prefix = "" +suffix = "" + +[node name="Label" type="Label" parent="."] +margin_top = 5.0 +margin_right = 261.0 +margin_bottom = 19.0 +size_flags_horizontal = 3 + +[node name="SpinBox" type="SpinBox" parent="."] +margin_left = 265.0 +margin_right = 527.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +step = 0.0 +rounded = true +align = 1 diff --git a/game/ui/options/OptionsViewportLabel.gd b/game/ui/options/OptionsViewportLabel.gd new file mode 100644 index 0000000..aff9ede --- /dev/null +++ b/game/ui/options/OptionsViewportLabel.gd @@ -0,0 +1,37 @@ +extends HBoxContainer + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(String) var property_label : String +export(bool) var width : bool = true + +var _label : Label = null + +func _ready(): + $Label.text = property_label + _label = $Label2 as Label + + +func _process(delta: float) -> void: + if width: + _label.text = str(int(get_tree().root.size.x)) + else: + _label.text = str(int(get_tree().root.size.y)) diff --git a/game/ui/options/OptionsViewportLabel.tscn b/game/ui/options/OptionsViewportLabel.tscn new file mode 100644 index 0000000..f4cd861 --- /dev/null +++ b/game/ui/options/OptionsViewportLabel.tscn @@ -0,0 +1,27 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/options/OptionsViewportLabel.gd" type="Script" id=1] + +[node name="OptionsViewportLabel" type="HBoxContainer"] +margin_right = 527.0 +margin_bottom = 26.0 +size_flags_horizontal = 3 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label" type="Label" parent="."] +margin_top = 6.0 +margin_right = 261.0 +margin_bottom = 20.0 +size_flags_horizontal = 3 + +[node name="Label2" type="Label" parent="."] +margin_left = 265.0 +margin_right = 527.0 +margin_bottom = 26.0 +size_flags_horizontal = 3 +size_flags_vertical = 7 +align = 1 +valign = 1 diff --git a/game/ui/options/Threads.gd b/game/ui/options/Threads.gd new file mode 100644 index 0000000..7e7596b --- /dev/null +++ b/game/ui/options/Threads.gd @@ -0,0 +1,35 @@ +extends HBoxContainer + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +func _ready(): + var ob : OptionButton = $OptionButton as OptionButton + + ob.add_item("Single-Unsafe", 0) + ob.add_item("Single-Safe", 1) + ob.add_item("Multi Threaded", 2) + + ob.selected = Settings.get_value("rendering", "thread_model") + + ob.connect("item_selected", self, "item_selected") + +func item_selected(id : int) -> void: + Settings.set_value("rendering", "thread_model", id) diff --git a/game/ui/player_ui/RemoveProfile.gd b/game/ui/player_ui/RemoveProfile.gd new file mode 100644 index 0000000..dff74d2 --- /dev/null +++ b/game/ui/player_ui/RemoveProfile.gd @@ -0,0 +1,37 @@ +extends Button + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" + +# Called when the node enters the scene tree for the first time. +func _ready(): + connect("pressed", self, "_on_pressed") + +# Called every frame. 'delta' is the elapsed time since the previous frame. +#func _process(delta): +# pass + +func _on_pressed(): + var d : Directory = Directory.new() + d.remove("user://profile.save") diff --git a/game/ui/player_ui/player_ui.gd b/game/ui/player_ui/player_ui.gd new file mode 100644 index 0000000..2752891 --- /dev/null +++ b/game/ui/player_ui/player_ui.gd @@ -0,0 +1,58 @@ +extends CanvasLayer + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export (String) var player_path : String = "../.." + + +export(NodePath) var gui_base_path : NodePath +export(NodePath) var buttons_path : NodePath +export(NodePath) var windows_path : NodePath + +var gui_base : Node +var buttons : Node +var windows : Node + +var loot_window : Control + +func _ready(): + initialize() + + if player_path != null: + var player = get_node(player_path) + + for c in windows.get_children(): + if c.has_method("set_player"): + c.set_player(player) + + for c in gui_base.get_children(): + if c.has_method("set_player"): + c.set_player(player) + +func initialize(): + gui_base = get_node(gui_base_path) + buttons = get_node(buttons_path) + windows = get_node(windows_path) + + +func _on_Player_onc_open_loot_winow_request() -> void: + if loot_window != null: + loot_window.show() diff --git a/game/ui/player_ui/player_ui.tscn b/game/ui/player_ui/player_ui.tscn new file mode 100644 index 0000000..a3ca5d6 --- /dev/null +++ b/game/ui/player_ui/player_ui.tscn @@ -0,0 +1,102 @@ +[gd_scene load_steps=10 format=2] + +[ext_resource path="res://player/GUI.gd" type="Script" id=1] +[ext_resource path="res://ui/ingame_menu/IngameMenu.tscn" type="PackedScene" id=2] +[ext_resource path="res://ui/theme/menu_icon.tres" type="Texture" id=6] +[ext_resource path="res://ui/buttons/Buttons.gd" type="Script" id=9] +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=10] +[ext_resource path="res://ui/theme/locked_icon.tres" type="Texture" id=25] +[ext_resource path="res://ui/theme/unlocked_icon.tres" type="Texture" id=26] +[ext_resource path="res://ui/player_ui/player_ui.gd" type="Script" id=28] +[ext_resource path="res://ui/buttons/ImageButton.tscn" type="PackedScene" id=30] + +[node name="GUILayer" type="CanvasLayer"] +script = ExtResource( 28 ) +gui_base_path = NodePath("GUI") +buttons_path = NodePath("GUI/Buttons") +windows_path = NodePath("GUI/Windows") + +[node name="GUI" type="Control" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +theme = ExtResource( 10 ) +script = ExtResource( 1 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="Buttons" type="HBoxContainer" parent="GUI"] +anchor_top = 1.0 +anchor_bottom = 1.0 +margin_top = -40.0 +margin_right = 342.0 +rect_min_size = Vector2( 0, 40 ) +mouse_filter = 2 +custom_constants/separation = 0 +script = ExtResource( 9 ) +__meta__ = { +"_edit_group_": true, +"_edit_use_anchors_": false +} +image_button = ExtResource( 30 ) +lock_button_path = NodePath("LockButton") + +[node name="LockButton" type="Button" parent="GUI/Buttons"] +margin_right = 25.0 +margin_bottom = 40.0 +rect_min_size = Vector2( 25, 30 ) +focus_mode = 0 +toggle_mode = true +enabled_focus_mode = 0 +keep_pressed_outside = true + +[node name="locked" type="TextureRect" parent="GUI/Buttons/LockButton"] +anchor_right = 1.0 +anchor_bottom = 1.0 +texture = ExtResource( 25 ) +expand = true +stretch_mode = 6 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="unlocked" type="TextureRect" parent="GUI/Buttons/LockButton"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +texture = ExtResource( 26 ) +expand = true +stretch_mode = 6 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Menu" type="Button" parent="GUI/Buttons"] +margin_left = 25.0 +margin_right = 50.0 +margin_bottom = 40.0 +rect_min_size = Vector2( 25, 30 ) +focus_mode = 0 +enabled_focus_mode = 0 +keep_pressed_outside = true + +[node name="TextureRect3" type="TextureRect" parent="GUI/Buttons/Menu"] +anchor_right = 1.0 +anchor_bottom = 1.0 +texture = ExtResource( 6 ) +expand = true +stretch_mode = 6 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Windows" type="CanvasLayer" parent="GUI"] +layer = 2 + +[node name="IngameMenu" parent="GUI" instance=ExtResource( 2 )] +visible = false + +[connection signal="pressed" from="GUI/Buttons/Menu" to="GUI/IngameMenu" method="show"] + +[editable path="GUI/IngameMenu"] diff --git a/game/ui/register/Register.tscn b/game/ui/register/Register.tscn new file mode 100644 index 0000000..2f36a84 --- /dev/null +++ b/game/ui/register/Register.tscn @@ -0,0 +1,114 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] + +[node name="Register" type="PanelContainer"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -107.5 +margin_top = -182.0 +margin_right = 107.5 +margin_bottom = 182.0 +theme = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 211.0 +margin_bottom = 360.0 +custom_constants/separation = 10 +alignment = 1 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +margin_right = 207.0 +margin_bottom = 30.0 +size_flags_horizontal = 3 + +[node name="Label3" type="Label" parent="VBoxContainer/HBoxContainer"] +margin_top = 7.0 +margin_right = 159.0 +margin_bottom = 22.0 +size_flags_horizontal = 3 +text = "Register" + +[node name="Button" type="Button" parent="VBoxContainer/HBoxContainer"] +margin_left = 167.0 +margin_right = 207.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 40, 30 ) +text = "X" + +[node name="HSeparator" type="HSeparator" parent="VBoxContainer"] +margin_top = 40.0 +margin_right = 207.0 +margin_bottom = 48.0 + +[node name="Label" type="Label" parent="VBoxContainer"] +margin_top = 58.0 +margin_right = 207.0 +margin_bottom = 73.0 +text = "Username" + +[node name="LineEdit" type="LineEdit" parent="VBoxContainer"] +margin_top = 83.0 +margin_right = 207.0 +margin_bottom = 107.341 + +[node name="Label4" type="Label" parent="VBoxContainer"] +margin_top = 117.0 +margin_right = 207.0 +margin_bottom = 132.0 +text = "Email" + +[node name="LineEdit4" type="LineEdit" parent="VBoxContainer"] +margin_top = 142.0 +margin_right = 207.0 +margin_bottom = 166.341 + +[node name="Label2" type="Label" parent="VBoxContainer"] +margin_top = 176.0 +margin_right = 207.0 +margin_bottom = 191.0 +text = "Password" + +[node name="LineEdit2" type="LineEdit" parent="VBoxContainer"] +margin_top = 201.0 +margin_right = 207.0 +margin_bottom = 225.341 +secret = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label3" type="Label" parent="VBoxContainer"] +margin_top = 235.0 +margin_right = 207.0 +margin_bottom = 250.0 +text = "Password Again" + +[node name="LineEdit3" type="LineEdit" parent="VBoxContainer"] +margin_top = 260.0 +margin_right = 207.0 +margin_bottom = 284.341 +secret = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="CheckBox" type="CheckBox" parent="VBoxContainer"] +margin_top = 294.0 +margin_right = 207.0 +margin_bottom = 320.269 +text = "I Accept the EULA" + +[node name="Button" type="Button" parent="VBoxContainer"] +margin_top = 330.0 +margin_right = 207.0 +margin_bottom = 356.269 +text = "Register" +[connection signal="pressed" from="VBoxContainer/HBoxContainer/Button" to="." method="hide"] diff --git a/game/ui/spellbook/SpellBookWindow.gd b/game/ui/spellbook/SpellBookWindow.gd new file mode 100644 index 0000000..4988b5e --- /dev/null +++ b/game/ui/spellbook/SpellBookWindow.gd @@ -0,0 +1,217 @@ +extends Control + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +var opener_button : BaseButton + +export(NodePath) var spell_entry_container_path : NodePath +export(NodePath) var prev_button_path : NodePath +export(NodePath) var next_button_path : NodePath +export(NodePath) var spell_points_label_path : NodePath + +export(bool) var show_not_learned : bool = true +export(bool) var show_not_learnable : bool = false + +var _spell_entry_container : Node +var _spell_entries : Array + +var _prev_button : Button +var _next_button : Button +var _spell_points_label : Label + +var _player : Entity + +var _page : int = 0 +var _max_pages : int = 0 +var _entity_data : EntityData +var _character_class : EntityClassData + +var _spells : Array + +func _ready() -> void: + connect("visibility_changed", self, "on_visibility_changed") + + _spell_entries.clear() + + _spell_entry_container = get_node(spell_entry_container_path) + + for i in range(_spell_entry_container.get_child_count()): + _spell_entries.append(_spell_entry_container.get_child(i)) + + _prev_button = get_node(prev_button_path) + _next_button = get_node(next_button_path) + _spell_points_label = get_node(spell_points_label_path) + + _prev_button.connect("pressed", self, "dec_page") + _next_button.connect("pressed", self, "inc_page") + + if ESS.use_spell_points: + _spell_points_label.text = "" + + connect("visibility_changed", self, "_visibility_changed") + +func inc_page() -> void: + if _character_class == null: + return + + _page += 1 + + if _page > _max_pages: + _page = _max_pages + + refresh_entries() + +func dec_page() -> void: + if _character_class == null: + return + + _page -= 1 + + if _page < 0: + _page = 0 + + refresh_entries() + +func refresh_entries() -> void: + if _character_class == null or _player == null: + return + + var i : int = 0 + var n : int = 0 +# for n in range(len(_spell_entries)): + while n < len(_spell_entries): + var spindex : int = i + (_page * len(_spell_entries)) + + if spindex >= _spells.size(): + _spell_entries[n].set_spell(_player, null) + i += 1 + n += 1 + continue + + var spell : Spell = _spells[spindex] + + if not _player.spell_hasc(spell): + if not show_not_learned: + i += 1 + continue + + if not show_not_learnable: + if spell.training_required_spell and not _player.spell_hasc(spell.training_required_spell): + i += 1 + continue + + + _spell_entries[n].set_spell(_player, spell) + i += 1 + n += 1 + + +func refresh_all() -> void: + if _player == null: + return + + if _character_class == null: + return + + _max_pages = int(_character_class.get_num_spells() / len(_spell_entries)) + + if _page > _max_pages: + _page = _max_pages + + if ESS.use_spell_points: + _spell_points_label.text = "Free spell points: " + str(_player.getc_free_spell_points()) + + refresh_entries() + + +func _visibility_changed() -> void: + if visible: + refresh_all() + +func set_player(p_player: Entity) -> void: + if _player != null: + _player.disconnect("cfree_spell_points_changed", self, "cfree_spell_points_changed") + _player.disconnect("centity_data_changed", self, "centity_data_changed") + + _player = p_player + + _player.connect("cfree_spell_points_changed", self, "cfree_spell_points_changed") + _player.connect("centity_data_changed", self, "centity_data_changed") + + if _player != null: + centity_data_changed(_player.centity_data) + else: + centity_data_changed(null) + +func cfree_spell_points_changed(entity: Entity, value: int) -> void: + _spell_points_label.text = "Free spell points: " + str(_player.getc_free_spell_points()) + +func centity_data_changed(data: EntityData): + _spells.clear() + + _entity_data = null + _character_class = null + + if data == null: + return + + _entity_data = _player.centity_data + _character_class = _entity_data.entity_class_data + + if _character_class == null: + return + + for i in range(_character_class.get_num_spells()): + _spells.append(_character_class.get_spell(i)) + + _spells.sort_custom(CustomSpellSorter, "sort") + + +class CustomSpellSorter: + static func sort(a, b): + var res = a.text_name.casecmp_to(b.text_name) + + if res == 0: + if a.rank < b.rank: + return true + return false + elif res == 1: + return false + + return true + + +func on_visibility_changed(): + if opener_button: + if visible && !opener_button.pressed: + opener_button.pressed = true + return + + if !visible && opener_button.pressed: + opener_button.pressed = false + +func _on_button_toggled(button_pressed): + if button_pressed: + if !visible: + show() + else: + if visible: + hide() diff --git a/game/ui/spellbook/SpellBookWindow.tscn b/game/ui/spellbook/SpellBookWindow.tscn new file mode 100644 index 0000000..2f081fb --- /dev/null +++ b/game/ui/spellbook/SpellBookWindow.tscn @@ -0,0 +1,178 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] +[ext_resource path="res://ui/spellbook/SpellBookWindow.gd" type="Script" id=2] +[ext_resource path="res://ui/spellbook/SpellContainer.tscn" type="PackedScene" id=3] + +[node name="SpellBookWindow" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +theme = ExtResource( 1 ) +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} +spell_entry_container_path = NodePath("PanelContainer/PagedContent/GridContainer") +prev_button_path = NodePath("PanelContainer/PagedContent/Controls/HBoxContainer/Button2") +next_button_path = NodePath("PanelContainer/PagedContent/Controls/HBoxContainer/Button") +spell_points_label_path = NodePath("PanelContainer/PagedContent/Controls/HBoxContainer/SpellPoints") +show_not_learned = false + +[node name="PanelContainer" type="PanelContainer" parent="."] +margin_left = 79.0 +margin_top = 65.0 +margin_right = 535.0 +margin_bottom = 483.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="PagedContent" type="VBoxContainer" parent="PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 452.0 +margin_bottom = 414.0 + +[node name="Header" type="HBoxContainer" parent="PanelContainer/PagedContent"] +margin_right = 448.0 +margin_bottom = 30.0 + +[node name="Label" type="Label" parent="PanelContainer/PagedContent/Header"] +margin_top = 7.0 +margin_right = 54.0 +margin_bottom = 22.0 +text = "Spellbook" + +[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/PagedContent/Header"] +margin_left = 58.0 +margin_right = 404.0 +margin_bottom = 30.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +alignment = 1 + +[node name="Button" type="Button" parent="PanelContainer/PagedContent/Header/HBoxContainer"] +margin_left = 123.0 +margin_right = 223.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 100, 0 ) +text = "Nature" + +[node name="Button" type="Button" parent="PanelContainer/PagedContent/Header"] +margin_left = 408.0 +margin_right = 448.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 40, 30 ) +text = "X" + +[node name="GridContainer" type="GridContainer" parent="PanelContainer/PagedContent"] +margin_top = 38.0 +margin_right = 448.0 +margin_bottom = 372.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +columns = 2 + +[node name="SpellContainer" parent="PanelContainer/PagedContent/GridContainer" instance=ExtResource( 3 )] +margin_left = 0.0 +margin_top = 0.0 +margin_right = 222.0 +margin_bottom = 63.0 + +[node name="SpellContainer2" parent="PanelContainer/PagedContent/GridContainer" instance=ExtResource( 3 )] +margin_left = 226.0 +margin_top = 0.0 +margin_right = 448.0 +margin_bottom = 63.0 + +[node name="SpellContainer3" parent="PanelContainer/PagedContent/GridContainer" instance=ExtResource( 3 )] +margin_left = 0.0 +margin_top = 67.0 +margin_right = 222.0 +margin_bottom = 130.0 + +[node name="SpellContainer4" parent="PanelContainer/PagedContent/GridContainer" instance=ExtResource( 3 )] +margin_left = 226.0 +margin_top = 67.0 +margin_right = 448.0 +margin_bottom = 130.0 + +[node name="SpellContainer5" parent="PanelContainer/PagedContent/GridContainer" instance=ExtResource( 3 )] +margin_left = 0.0 +margin_top = 134.0 +margin_right = 222.0 +margin_bottom = 197.0 + +[node name="SpellContainer6" parent="PanelContainer/PagedContent/GridContainer" instance=ExtResource( 3 )] +margin_left = 226.0 +margin_top = 134.0 +margin_right = 448.0 +margin_bottom = 197.0 + +[node name="SpellContainer7" parent="PanelContainer/PagedContent/GridContainer" instance=ExtResource( 3 )] +margin_left = 0.0 +margin_top = 201.0 +margin_right = 222.0 +margin_bottom = 264.0 + +[node name="SpellContainer8" parent="PanelContainer/PagedContent/GridContainer" instance=ExtResource( 3 )] +margin_left = 226.0 +margin_top = 201.0 +margin_right = 448.0 +margin_bottom = 264.0 + +[node name="SpellContainer9" parent="PanelContainer/PagedContent/GridContainer" instance=ExtResource( 3 )] +margin_left = 0.0 +margin_top = 268.0 +margin_right = 222.0 +margin_bottom = 331.0 + +[node name="SpellContainer10" parent="PanelContainer/PagedContent/GridContainer" instance=ExtResource( 3 )] +margin_left = 226.0 +margin_top = 268.0 +margin_right = 448.0 +margin_bottom = 331.0 + +[node name="Controls" type="MarginContainer" parent="PanelContainer/PagedContent"] +margin_top = 380.0 +margin_right = 448.0 +margin_bottom = 410.0 +custom_constants/margin_right = 2 +custom_constants/margin_top = 2 +custom_constants/margin_left = 2 +custom_constants/margin_bottom = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/PagedContent/Controls"] +margin_left = 2.0 +margin_top = 2.0 +margin_right = 446.0 +margin_bottom = 28.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Button2" type="Button" parent="PanelContainer/PagedContent/Controls/HBoxContainer"] +margin_right = 145.0 +margin_bottom = 26.5702 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "< Previous page" + +[node name="SpellPoints" type="Label" parent="PanelContainer/PagedContent/Controls/HBoxContainer"] +margin_left = 149.0 +margin_top = 5.0 +margin_right = 294.0 +margin_bottom = 20.0 +size_flags_horizontal = 3 +align = 1 +valign = 1 + +[node name="Button" type="Button" parent="PanelContainer/PagedContent/Controls/HBoxContainer"] +margin_left = 298.0 +margin_right = 444.0 +margin_bottom = 26.5702 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Next page >" + +[connection signal="pressed" from="PanelContainer/PagedContent/Header/Button" to="." method="hide"] diff --git a/game/ui/spellbook/SpellContainer.gd b/game/ui/spellbook/SpellContainer.gd new file mode 100644 index 0000000..5f6dfec --- /dev/null +++ b/game/ui/spellbook/SpellContainer.gd @@ -0,0 +1,150 @@ +extends Control + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(NodePath) var icon_path : NodePath +export(NodePath) var name_label_path : NodePath +#export(NodePath) var description_label_path : NodePath +export(NodePath) var known_label_path : NodePath +export(NodePath) var learn_button_path : NodePath +export(NodePath) var spell_button_path : NodePath +export(NodePath) var popup_path : NodePath + +export(Color) var known_color : Color = Color.white +export(Color) var not_known_color : Color = Color.gray +export(Color) var unlearnable_color : Color = Color.gray + +var _icon : TextureRect +var _name_label : Label +#var _description_label : RichTextLabel +var _spell_button : Button +var _popup : Popup + +var _spell : Spell +var _player : Entity + +var _spell_known : bool + +func _ready() -> void: + _icon = get_node(icon_path) as TextureRect + _name_label = get_node(name_label_path) as Label +# _description_label = get_node(description_label_path) as RichTextLabel + _spell_button = get_node(spell_button_path) as Button + _popup = get_node(popup_path) as Popup + +func set_spell(p_player : Entity, p_spell: Spell) -> void: + + if _player != null: + _player.disconnect("cspell_added", self, "cspell_added") + _player.disconnect("cspell_removed", self, "cspell_removed") + + _spell = p_spell + _player = p_player + + _player.connect("cspell_added", self, "cspell_added") + _player.connect("cspell_removed", self, "cspell_removed") + +# _icon.set_spell(_spell) + _spell_button.set_spell(_spell) + _popup.set_spell(_spell) + + if not _spell == null: + _spell_known = _player.spell_hasc(p_spell) + + _icon.texture = _spell.icon + _name_label.text = _spell.text_name + " (Rank " + str(_spell.rank) + ")" + else: + _icon.texture = null + + _name_label.text = "....." + + update_spell_indicators() + +func learn_spell() -> void: + if _player == null or _spell == null: + return + + if _player.cfree_spell_points <= 0: + return + + _player.spell_learn_requestc(_spell.id) + +func cspell_added(entity: Entity, spell: Spell) -> void: + if spell == _spell: + _spell_known = true + + update_spell_indicators() + +func cspell_removed(entity: Entity, spell: Spell) -> void: + if spell == _spell: + _spell_known = false + + update_spell_indicators() + +func spell_button_pressed() -> void: + var pos : Vector2 = _spell_button.rect_global_position + pos.x += _spell_button.rect_size.x + + _popup.popup(Rect2(pos, _popup.rect_size)) + +func update_spell_indicators(): + if ESS.use_spell_points: + if _spell_known: + get_node(known_label_path).show() + get_node(learn_button_path).hide() + + modulate = known_color + else: + if _spell != null: + if _spell.training_required_spell: + if not _player.spell_hasc(_spell.training_required_spell): + + if ESS.use_spell_points: + get_node(known_label_path).hide() + get_node(learn_button_path).show() + + modulate = unlearnable_color + + return + + if ESS.use_spell_points: + get_node(known_label_path).hide() + get_node(learn_button_path).show() + + modulate = not_known_color + else: + get_node(known_label_path).hide() + get_node(learn_button_path).hide() + + if _spell_known: + modulate = known_color + else: + if _spell != null: + if _spell.training_required_spell: + if not _player.spell_hasc(_spell.training_required_spell): + + modulate = unlearnable_color + + return + + modulate = not_known_color + + diff --git a/game/ui/spellbook/SpellContainer.tscn b/game/ui/spellbook/SpellContainer.tscn new file mode 100644 index 0000000..3dda6b0 --- /dev/null +++ b/game/ui/spellbook/SpellContainer.tscn @@ -0,0 +1,150 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] +[ext_resource path="res://ui/spellbook/SpellDragAndDropSpellBook.gd" type="Script" id=2] +[ext_resource path="res://ui/spellbook/SpellContainer.gd" type="Script" id=3] +[ext_resource path="res://ui/spellbook/SpellEntryPopup.gd" type="Script" id=4] + +[node name="SpellContainer" type="Control"] +margin_left = 290.0 +margin_top = 306.0 +margin_right = 576.0 +margin_bottom = 370.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme = ExtResource( 1 ) +script = ExtResource( 3 ) +__meta__ = { +"_edit_use_anchors_": false +} +icon_path = NodePath("PanelContainer/HBoxContainer/Button/CenterContainer/SpellIcon") +name_label_path = NodePath("PanelContainer/HBoxContainer/SpellName") +known_label_path = NodePath("SpellEntryPopup/VBoxContainer/PanelContainer") +learn_button_path = NodePath("SpellEntryPopup/VBoxContainer/LearnButton") +spell_button_path = NodePath("PanelContainer/HBoxContainer/Button") +popup_path = NodePath("SpellEntryPopup") +not_known_color = Color( 0.596078, 0.596078, 0.596078, 1 ) +unlearnable_color = Color( 0.772549, 0.192157, 0.192157, 1 ) + +[node name="PanelContainer" type="PanelContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 282.0 +margin_bottom = 60.0 + +[node name="Button" type="Button" parent="PanelContainer/HBoxContainer"] +margin_right = 55.0 +margin_bottom = 56.0 +rect_min_size = Vector2( 55, 55 ) +script = ExtResource( 2 ) + +[node name="CenterContainer" type="MarginContainer" parent="PanelContainer/HBoxContainer/Button"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 51.0 +margin_bottom = 51.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="SpellIcon" type="TextureRect" parent="PanelContainer/HBoxContainer/Button/CenterContainer"] +margin_right = 47.0 +margin_bottom = 47.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +expand = true + +[node name="SpellName" type="Label" parent="PanelContainer/HBoxContainer"] +margin_left = 59.0 +margin_top = 20.0 +margin_right = 278.0 +margin_bottom = 35.0 +size_flags_horizontal = 3 +text = "......" + +[node name="SpellEntryPopup" type="PopupPanel" parent="."] +margin_left = 64.0 +margin_top = 4.0 +margin_right = 360.0 +margin_bottom = 207.0 +script = ExtResource( 4 ) +__meta__ = { +"_edit_use_anchors_": false +} +label_path = NodePath("VBoxContainer/HBoxContainer/Label") +desc_label_path = NodePath("VBoxContainer/RichTextLabel") + +[node name="VBoxContainer" type="VBoxContainer" parent="SpellEntryPopup"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 4.0 +margin_right = -4.0 +margin_bottom = -4.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBoxContainer" type="HBoxContainer" parent="SpellEntryPopup/VBoxContainer"] +margin_right = 288.0 +margin_bottom = 26.0 + +[node name="Label" type="Label" parent="SpellEntryPopup/VBoxContainer/HBoxContainer"] +margin_top = 5.0 +margin_right = 254.0 +margin_bottom = 20.0 +size_flags_horizontal = 3 + +[node name="Button" type="Button" parent="SpellEntryPopup/VBoxContainer/HBoxContainer"] +margin_left = 258.0 +margin_right = 288.0 +margin_bottom = 26.5702 +rect_min_size = Vector2( 30, 0 ) +text = "X" + +[node name="HSeparator2" type="HSeparator" parent="SpellEntryPopup/VBoxContainer"] +margin_top = 34.0 +margin_right = 288.0 +margin_bottom = 38.0 + +[node name="PanelContainer" type="PanelContainer" parent="SpellEntryPopup/VBoxContainer"] +margin_top = 46.0 +margin_right = 288.0 +margin_bottom = 69.0 +rect_min_size = Vector2( 0, 20 ) + +[node name="KnownLabel" type="Label" parent="SpellEntryPopup/VBoxContainer/PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 284.0 +margin_bottom = 19.0 +text = "Known" +align = 1 +valign = 1 + +[node name="LearnButton" type="Button" parent="SpellEntryPopup/VBoxContainer"] +visible = false +margin_top = 77.0 +margin_right = 288.0 +margin_bottom = 103.57 +text = "Learn" + +[node name="RichTextLabel" type="RichTextLabel" parent="SpellEntryPopup/VBoxContainer"] +margin_top = 77.0 +margin_right = 288.0 +margin_bottom = 195.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +[connection signal="pressed" from="PanelContainer/HBoxContainer/Button" to="." method="spell_button_pressed"] +[connection signal="pressed" from="SpellEntryPopup/VBoxContainer/HBoxContainer/Button" to="SpellEntryPopup" method="hide"] +[connection signal="pressed" from="SpellEntryPopup/VBoxContainer/LearnButton" to="." method="learn_spell"] diff --git a/game/ui/spellbook/SpellDragAndDropSpellBook.gd b/game/ui/spellbook/SpellDragAndDropSpellBook.gd new file mode 100644 index 0000000..87e30be --- /dev/null +++ b/game/ui/spellbook/SpellDragAndDropSpellBook.gd @@ -0,0 +1,45 @@ +extends Button + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +var spell + +func set_spell(p_spell): + spell = p_spell + +func get_drag_data(pos): + if spell == null: + return null + + var tr = TextureRect.new() + tr.texture = spell.icon + tr.expand = true + +# tr.rect_size = rect_size + tr.rect_size = Vector2(45, 45) + set_drag_preview(tr) + + var esd = ESDragAndDrop.new() + + esd.type = ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_SPELL + esd.item_path = spell.resource_path + + return esd diff --git a/game/ui/spellbook/SpellEntryPopup.gd b/game/ui/spellbook/SpellEntryPopup.gd new file mode 100644 index 0000000..1db6ad6 --- /dev/null +++ b/game/ui/spellbook/SpellEntryPopup.gd @@ -0,0 +1,43 @@ +extends PopupPanel + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(NodePath) var label_path : NodePath +export(NodePath) var desc_label_path : NodePath + +var _label : Label +var _desc_label : RichTextLabel + +var _spell : Spell + +func _ready(): + _label = get_node(label_path) as Label + _desc_label = get_node(desc_label_path) as RichTextLabel + +func set_spell(spell : Spell) -> void: + _spell = spell + + if _spell == null: + return + + _label.text = _spell.text_name + _desc_label.text = _spell.get_description(1, 1) + diff --git a/game/ui/spellbook/game_module.tres b/game/ui/spellbook/game_module.tres new file mode 100644 index 0000000..9080b7e --- /dev/null +++ b/game/ui/spellbook/game_module.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" load_steps=4 format=2] + +[ext_resource path="res://ui/theme/spellbook_icon.tres" type="Texture" id=1] +[ext_resource path="res://ui/spellbook/SpellBookWindow.tscn" type="PackedScene" id=2] +[ext_resource path="res://scripts/game_modules/ui_window_module.gd" type="Script" id=3] + +[resource] +script = ExtResource( 3 ) +enabled = true +scene = ExtResource( 2 ) +opener_button_texture = ExtResource( 1 ) +index = 1 +add_button = true diff --git a/game/ui/starmap/StarMap.tscn b/game/ui/starmap/StarMap.tscn new file mode 100644 index 0000000..b2a6bfb --- /dev/null +++ b/game/ui/starmap/StarMap.tscn @@ -0,0 +1,72 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] + +[node name="StarMap" type="PanelContainer"] +margin_right = 531.0 +margin_bottom = 442.0 +theme = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 527.0 +margin_bottom = 438.0 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +margin_right = 523.0 +margin_bottom = 40.0 + +[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer"] +margin_top = 12.0 +margin_right = 475.0 +margin_bottom = 27.0 +size_flags_horizontal = 3 +text = "Starmap" + +[node name="Button" type="Button" parent="VBoxContainer/HBoxContainer"] +margin_left = 483.0 +margin_right = 523.0 +margin_bottom = 40.0 +rect_min_size = Vector2( 40, 40 ) +text = "X" + +[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer"] +margin_top = 48.0 +margin_right = 523.0 +margin_bottom = 396.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="TextureRect" type="TextureRect" parent="VBoxContainer/ScrollContainer"] + +[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer"] +margin_top = 404.0 +margin_right = 523.0 +margin_bottom = 434.0 +alignment = 1 + +[node name="Button" type="Button" parent="VBoxContainer/HBoxContainer2"] +margin_left = 133.0 +margin_right = 213.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 80, 30 ) +text = "Search" + +[node name="Button2" type="Button" parent="VBoxContainer/HBoxContainer2"] +margin_left = 221.0 +margin_right = 301.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 80, 30 ) +text = "Custom" + +[node name="Button3" type="Button" parent="VBoxContainer/HBoxContainer2"] +margin_left = 309.0 +margin_right = 389.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 80, 30 ) +text = "Go" +[connection signal="pressed" from="VBoxContainer/HBoxContainer/Button" to="." method="hide"] diff --git a/game/ui/talents/Spec.gd b/game/ui/talents/Spec.gd new file mode 100644 index 0000000..b0a5446 --- /dev/null +++ b/game/ui/talents/Spec.gd @@ -0,0 +1,51 @@ +extends ScrollContainer + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(PackedScene) var talent_row_scene : PackedScene +export(NodePath) var container_path : NodePath + +var _container : Node + +var _player : Entity +var _spec : CharacterSpec +var _spec_index : int + +func _ready() -> void: + _container = get_node(container_path) + +func set_spec(player : Entity, spec : CharacterSpec, spec_index: int) -> void: + for ch in _container.get_children(): + ch.queue_free() + + _player = player + _spec = spec + _spec_index = spec_index + + if _player == null or _spec == null: + return + + for i in range(spec.num_rows): + var r : Node = talent_row_scene.instance() + _container.add_child(r) + r.owner = self + r.set_player(player, spec, spec_index, i) + diff --git a/game/ui/talents/Spec.tscn b/game/ui/talents/Spec.tscn new file mode 100644 index 0000000..18b157a --- /dev/null +++ b/game/ui/talents/Spec.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/talents/Spec.gd" type="Script" id=1] +[ext_resource path="res://ui/talents/TalentRow.tscn" type="PackedScene" id=2] + +[node name="Spec" type="ScrollContainer"] +margin_right = 882.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +talent_row_scene = ExtResource( 2 ) +container_path = NodePath("Container") + +[node name="Container" type="VBoxContainer" parent="."] +margin_right = 858.0 +size_flags_horizontal = 3 +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/game/ui/talents/TalentEntry.gd b/game/ui/talents/TalentEntry.gd new file mode 100644 index 0000000..5d2cab0 --- /dev/null +++ b/game/ui/talents/TalentEntry.gd @@ -0,0 +1,128 @@ +extends CenterContainer + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(NodePath) var main_container_path : NodePath +export(NodePath) var popup_path : NodePath + +export(NodePath) var aura_name_label_path : NodePath +export(NodePath) var aura_description_label_path : NodePath +export(NodePath) var icon_rect_path : NodePath +export(NodePath) var rank_label_path : NodePath +export(NodePath) var upgrade_button_path : NodePath + +export(int) var culomn : int + +var _main_container : Control +var _popup : PopupPanel + +var _aura_name_label : Label +var _aura_description_label : Label +var _icon_rect : TextureRect +var _rank_label : Label +var _upgrade_button : Button + +var _row : int +var _spec_index : int + +var _player : Entity +var _spec : CharacterSpec + +func _ready() -> void: + _main_container = get_node(main_container_path) as Control + _popup = get_node(popup_path) as PopupPanel + + _aura_name_label = get_node(aura_name_label_path) as Label + _aura_description_label = get_node(aura_description_label_path) as Label + _icon_rect = get_node(icon_rect_path) as TextureRect + _rank_label = get_node(rank_label_path) as Label + _upgrade_button = get_node(upgrade_button_path) as Button + +func set_player(player : Entity, spec : CharacterSpec, spec_index : int, row : int, pculomn : int) -> void: + if _player != null: + _player.disconnect("cclass_talent_learned", self, "ctalent_learned") + _player.disconnect("ccharacter_talent_learned", self, "ctalent_learned") + _player.disconnect("cclass_talent_reset", self, "ctalent_reset") + _player.disconnect("ccharacter_talent_reset", self, "ctalent_reset") + + _row = row + _spec = spec + _player = player + _spec_index = spec_index + culomn = pculomn + + _player.connect("cclass_talent_learned", self, "ctalent_learned") + _player.connect("ccharacter_talent_learned", self, "ctalent_learned") + _player.connect("cclass_talent_reset", self, "ctalent_reset") + _player.connect("ccharacter_talent_reset", self, "ctalent_reset") + + refresh() + + +func refresh() -> void: + if _spec.get_talent(_row, culomn, 0) == null: + _main_container.hide() + return + + var rank_count : int = 0 + var known_rank_count : int = 0 + + for i in range(_spec.get_num_ranks(_row, culomn)): + var a : Aura = _spec.get_talent(_row, culomn, i) + + if a == null: + break + + if _player.class_talent_hasc(a.id): + known_rank_count += 1 + + rank_count += 1 + + var ridx : int = known_rank_count - 1 + + if rank_count == known_rank_count: + _upgrade_button.hide() + else: + ridx += 1 + + _upgrade_button.show() + + var aura : Aura = _spec.get_talent(_row, culomn, ridx) + + _aura_name_label.text = aura.text_name + _aura_description_label.text = aura.text_description + _icon_rect.texture = aura.icon + _rank_label.text = str(known_rank_count) + "/" + str(rank_count) + +func open_popup() -> void: + var p : Vector2 = rect_global_position + p.x += rect_size.x + + _popup.popup(Rect2(p, _popup.rect_size)) + +func upgrade(): + _player.class_talent_crequest_learn(_spec_index, _row, culomn) + +func ctalent_learned(entity: Entity, talent_id: int) -> void: + refresh() + +func ctalent_reset(entity: Entity) -> void: + refresh() diff --git a/game/ui/talents/TalentEntry.tscn b/game/ui/talents/TalentEntry.tscn new file mode 100644 index 0000000..7878372 --- /dev/null +++ b/game/ui/talents/TalentEntry.tscn @@ -0,0 +1,110 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/talents/TalentEntry.gd" type="Script" id=1] +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=2] + +[node name="TalentEntry" type="CenterContainer"] +margin_right = 40.0 +margin_bottom = 40.0 +rect_min_size = Vector2( 45, 45 ) +size_flags_horizontal = 3 +theme = ExtResource( 2 ) +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +main_container_path = NodePath("Button") +popup_path = NodePath("Button/PopupPanel") +aura_name_label_path = NodePath("Button/PopupPanel/VBoxContainer/HBoxContainer/Label") +aura_description_label_path = NodePath("Button/PopupPanel/VBoxContainer/Label") +icon_rect_path = NodePath("Button/MarginContainer/TextureRect") +rank_label_path = NodePath("Button/MarginContainer/TextureRect/Label") +upgrade_button_path = NodePath("Button/PopupPanel/VBoxContainer/HBoxContainer/Button") + +[node name="Button" type="Button" parent="."] +margin_right = 45.0 +margin_bottom = 45.0 +rect_min_size = Vector2( 45, 45 ) + +[node name="MarginContainer" type="MarginContainer" parent="Button"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +custom_constants/margin_right = 3 +custom_constants/margin_top = 3 +custom_constants/margin_left = 3 +custom_constants/margin_bottom = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TextureRect" type="TextureRect" parent="Button/MarginContainer"] +margin_left = 3.0 +margin_top = 3.0 +margin_right = 42.0 +margin_bottom = 42.0 +expand = true + +[node name="Label" type="Label" parent="Button/MarginContainer/TextureRect"] +anchor_right = 1.0 +anchor_bottom = 1.0 +text = "2/2" +align = 2 +valign = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="PopupPanel" type="PopupPanel" parent="Button"] +margin_left = 41.592 +margin_top = 1.58763 +margin_right = 211.592 +margin_bottom = 127.588 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="Button/PopupPanel"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 166.0 +margin_bottom = 122.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="HBoxContainer" type="HBoxContainer" parent="Button/PopupPanel/VBoxContainer"] +margin_right = 162.0 +margin_bottom = 30.0 + +[node name="Label" type="Label" parent="Button/PopupPanel/VBoxContainer/HBoxContainer"] +margin_top = 7.0 +margin_right = 124.0 +margin_bottom = 22.0 +size_flags_horizontal = 3 +text = "asdasdasdasdasda" +valign = 1 + +[node name="Button" type="Button" parent="Button/PopupPanel/VBoxContainer/HBoxContainer"] +margin_left = 132.0 +margin_right = 162.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 30, 30 ) +text = "X" + +[node name="Button" type="Button" parent="Button/PopupPanel/VBoxContainer"] +margin_top = 38.0 +margin_right = 162.0 +margin_bottom = 64.269 +text = "Upgrade" + +[node name="Label" type="Label" parent="Button/PopupPanel/VBoxContainer"] +margin_top = 72.0 +margin_right = 162.0 +margin_bottom = 118.0 +size_flags_horizontal = 3 +size_flags_vertical = 7 +text = "increases your Dodge by 5%. +Also Adds 10% lols." +[connection signal="pressed" from="Button" to="." method="open_popup"] +[connection signal="pressed" from="Button/PopupPanel/VBoxContainer/HBoxContainer/Button" to="Button/PopupPanel" method="hide"] +[connection signal="pressed" from="Button/PopupPanel/VBoxContainer/Button" to="." method="upgrade"] diff --git a/game/ui/talents/TalentRow.gd b/game/ui/talents/TalentRow.gd new file mode 100644 index 0000000..27741c2 --- /dev/null +++ b/game/ui/talents/TalentRow.gd @@ -0,0 +1,29 @@ +extends HBoxContainer + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(PackedScene) var entry_scene : PackedScene + +func set_player(player : Entity, spec : CharacterSpec, spec_index: int, row : int) -> void: + for i in range(spec.get_num_columns(row)): + var ch : Node = entry_scene.instance() + add_child(ch) + ch.set_player(player, spec, spec_index, row, i) diff --git a/game/ui/talents/TalentRow.tscn b/game/ui/talents/TalentRow.tscn new file mode 100644 index 0000000..4376857 --- /dev/null +++ b/game/ui/talents/TalentRow.tscn @@ -0,0 +1,17 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://ui/talents/TalentEntry.tscn" type="PackedScene" id=1] +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=2] +[ext_resource path="res://ui/talents/TalentRow.gd" type="Script" id=3] + +[node name="TalentRow" type="HBoxContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +theme = ExtResource( 2 ) +alignment = 1 +script = ExtResource( 3 ) +__meta__ = { +"_edit_use_anchors_": false +} +entry_scene = ExtResource( 1 ) diff --git a/game/ui/talents/TalentWindow.gd b/game/ui/talents/TalentWindow.gd new file mode 100644 index 0000000..f6963ee --- /dev/null +++ b/game/ui/talents/TalentWindow.gd @@ -0,0 +1,118 @@ +extends Control + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +var opener_button : BaseButton + +export(PackedScene) var spec_scene : PackedScene +export(PackedScene) var spec_switcher_scene : PackedScene +export(NodePath) var spec_container_path : NodePath +export(NodePath) var spec_switcher_path : NodePath + +var _spec_container : Node +var _spec_switcher_container : Node + +var _data : EntityData +var _player : Entity + +func _ready(): + connect("visibility_changed", self, "on_visibility_changed") + + _spec_container = get_node(spec_container_path) + _spec_switcher_container = get_node(spec_switcher_path) + +func set_player(player : Entity) -> void: + if _player != null: + _player.disconnect("centity_data_changed", self, "centity_data_changed") + + _player = player + + if _player == null: + return + + _player.connect("centity_data_changed", self, "centity_data_changed") + + centity_data_changed(_player.centity_data) + + +func select_spec(index : int) -> void: + for ch in _spec_container.get_children(): + ch.hide() + + if _spec_container.get_child_count() <= index: + return + + _spec_container.get_child(index).show() + +func centity_data_changed(data: EntityData) -> void: + if _data == data: + return + + _data = data + + for ch in _spec_container.get_children(): + ch.queue_free() + _spec_container.remove_child(ch) + + for ch in _spec_switcher_container.get_children(): + ch.queue_free() + + if data == null or data.entity_class_data == null: + return + + var cd : EntityClassData = data.entity_class_data + + for i in range(cd.get_num_specs()): + var spec : CharacterSpec = cd.get_spec(i) + + if spec == null: + continue + +# var b : Node = spec_switcher_scene.instance() +# _spec_switcher_container.add_child(b) +# b.owner = _spec_switcher_container +# b.set_spec_index(self, i) + + var s : Node = spec_scene.instance() + _spec_container.add_child(s) + s.owner = _spec_container + + if spec.text_name != "": + s.name = spec.text_name + + s.set_spec(_player, spec, i) + +func on_visibility_changed(): + if opener_button: + if visible && !opener_button.pressed: + opener_button.pressed = true + return + + if !visible && opener_button.pressed: + opener_button.pressed = false + +func _on_button_toggled(button_pressed): + if button_pressed: + if !visible: + show() + else: + if visible: + hide() diff --git a/game/ui/talents/TalentWindow.tscn b/game/ui/talents/TalentWindow.tscn new file mode 100644 index 0000000..44b83f6 --- /dev/null +++ b/game/ui/talents/TalentWindow.tscn @@ -0,0 +1,117 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] +[ext_resource path="res://ui/talents/Spec.tscn" type="PackedScene" id=2] +[ext_resource path="res://ui/talents/TalentWindow.gd" type="Script" id=3] +[ext_resource path="res://ui/talents/talent_switcher_button.tscn" type="PackedScene" id=4] + +[node name="TalentWindow" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +theme = ExtResource( 1 ) +script = ExtResource( 3 ) +spec_scene = ExtResource( 2 ) +spec_switcher_scene = ExtResource( 4 ) +spec_container_path = NodePath("PanelContainer/VBoxContainer/HBoxContainer/PanelContainer2/VBoxContainer/TabContainer2") +spec_switcher_path = NodePath("PanelContainer/VBoxContainer/Header/SpecSwitcher") + +[node name="PanelContainer" type="PanelContainer" parent="."] +margin_left = 68.0 +margin_top = 87.0 +margin_right = 643.0 +margin_bottom = 525.0 + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 571.0 +margin_bottom = 434.0 + +[node name="Header" type="HBoxContainer" parent="PanelContainer/VBoxContainer"] +margin_right = 567.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 0, 30 ) +alignment = 1 + +[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/Header"] +margin_top = 7.0 +margin_right = 42.0 +margin_bottom = 22.0 +text = "Talents" + +[node name="SpecSwitcher" type="HBoxContainer" parent="PanelContainer/VBoxContainer/Header"] +margin_left = 46.0 +margin_right = 523.0 +margin_bottom = 30.0 +size_flags_horizontal = 3 +alignment = 1 + +[node name="Button" type="Button" parent="PanelContainer/VBoxContainer/Header"] +margin_left = 527.0 +margin_right = 567.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 40, 30 ) +text = "X" + +[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/VBoxContainer"] +margin_top = 38.0 +margin_right = 567.0 +margin_bottom = 430.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="PanelContainer" type="PanelContainer" parent="PanelContainer/VBoxContainer/HBoxContainer"] +margin_right = 185.0 +margin_bottom = 392.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +size_flags_stretch_ratio = 0.49 + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer/HBoxContainer/PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 181.0 +margin_bottom = 388.0 + +[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/HBoxContainer/PanelContainer/VBoxContainer"] +margin_right = 177.0 +margin_bottom = 15.0 +text = "Body" + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer/HBoxContainer/PanelContainer/VBoxContainer"] +margin_top = 23.0 +margin_right = 177.0 +margin_bottom = 384.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="PanelContainer2" type="PanelContainer" parent="PanelContainer/VBoxContainer/HBoxContainer"] +margin_left = 189.0 +margin_right = 567.0 +margin_bottom = 392.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer/HBoxContainer/PanelContainer2"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 374.0 +margin_bottom = 388.0 + +[node name="Label2" type="Label" parent="PanelContainer/VBoxContainer/HBoxContainer/PanelContainer2/VBoxContainer"] +visible = false +margin_right = 672.0 +margin_bottom = 15.0 +text = "Class" + +[node name="TabContainer2" type="TabContainer" parent="PanelContainer/VBoxContainer/HBoxContainer/PanelContainer2/VBoxContainer"] +margin_right = 370.0 +margin_bottom = 384.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[connection signal="pressed" from="PanelContainer/VBoxContainer/Header/Button" to="." method="hide"] diff --git a/game/ui/talents/game_module.tres b/game/ui/talents/game_module.tres new file mode 100644 index 0000000..c343d87 --- /dev/null +++ b/game/ui/talents/game_module.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" load_steps=4 format=2] + +[ext_resource path="res://ui/theme/talent_icon.tres" type="Texture" id=1] +[ext_resource path="res://scripts/game_modules/ui_window_module.gd" type="Script" id=2] +[ext_resource path="res://ui/talents/TalentWindow.tscn" type="PackedScene" id=3] + +[resource] +script = ExtResource( 2 ) +enabled = true +scene = ExtResource( 3 ) +opener_button_texture = ExtResource( 1 ) +index = 2 +add_button = true diff --git a/game/ui/talents/talent_switcher_button.gd b/game/ui/talents/talent_switcher_button.gd new file mode 100644 index 0000000..d34d0a1 --- /dev/null +++ b/game/ui/talents/talent_switcher_button.gd @@ -0,0 +1,32 @@ +extends Button + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +var _index : int +var _spec_window : Node + +func set_spec_index(spec_window : Node, index : int) -> void: + _index = index + _spec_window = spec_window + +func _toggled(button_pressed): + if button_pressed: + _spec_window.select_spec(_index) diff --git a/game/ui/talents/talent_switcher_button.tscn b/game/ui/talents/talent_switcher_button.tscn new file mode 100644 index 0000000..637bbe7 --- /dev/null +++ b/game/ui/talents/talent_switcher_button.tscn @@ -0,0 +1,14 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/talents/talent_switcher_button.gd" type="Script" id=1] + +[node name="TalentSwitcher" type="Button"] +margin_left = 301.0 +margin_right = 401.0 +margin_bottom = 40.0 +rect_min_size = Vector2( 70, 30 ) +text = "Melee" +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/game/ui/theme/GameUI.png b/game/ui/theme/GameUI.png new file mode 100644 index 0000000000000000000000000000000000000000..abb3e2cff2a74cd6818e5f060f1c06f77e26bd32 GIT binary patch literal 3405 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 literal 0 HcmV?d00001 diff --git a/game/ui/theme/cooldown_progress.png.import b/game/ui/theme/cooldown_progress.png.import new file mode 100644 index 0000000..aad26d8 --- /dev/null +++ b/game/ui/theme/cooldown_progress.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/cooldown_progress.png-021a0cda14b9a15b9ac04b9c9084d412.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://ui/theme/cooldown_progress.png" +dest_files=[ "res://.import/cooldown_progress.png-021a0cda14b9a15b9ac04b9c9084d412.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/game/ui/theme/crafting_icon.tres b/game/ui/theme/crafting_icon.tres new file mode 100644 index 0000000..a9ee07e --- /dev/null +++ b/game/ui/theme/crafting_icon.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 105, 108, 20, 20 ) diff --git a/game/ui/theme/dropdown_icon.tres b/game/ui/theme/dropdown_icon.tres new file mode 100644 index 0000000..04e6b89 --- /dev/null +++ b/game/ui/theme/dropdown_icon.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 1, 1, 10, 10 ) diff --git a/game/ui/theme/h_scroll_bar_texture.tres b/game/ui/theme/h_scroll_bar_texture.tres new file mode 100644 index 0000000..9b0e3ef --- /dev/null +++ b/game/ui/theme/h_scroll_bar_texture.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 31, 49, 10, 11 ) diff --git a/game/ui/theme/indicator.png b/game/ui/theme/indicator.png new file mode 100644 index 0000000000000000000000000000000000000000..54d16eb870f63f14e1b8bec3d30918c5b75a403f GIT binary patch literal 417 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}c0*}aI1_r*vAk26?e?qM z&(L5k7uNxxse+y^jv*HQYo{pk9Wsz;o#>&$)al^kqhP_rbkb44gN2i+(V?J4mZkBD zg0Qd*L*TvePm=?81>A`Hr26)C_1TQzs&hO2I%nl}Adr%ExSO6@=}5A(6w0#&ex8})j6L#v@b{V z&?EB~3g1o`aM_o>Q#n+iRT6mcNM51Rp#&i7>ZAlo#M5D`bQOjvV^iIT@E*4(_Qyvr`xvAMib wbfwbmAJbm@u-doRPy0390O(ww3&nfcJ#%;yW^J3H1q?w3Pgg&ebxsLQ0Ee`n0RR91 literal 0 HcmV?d00001 diff --git a/game/ui/theme/indicator.png.import b/game/ui/theme/indicator.png.import new file mode 100644 index 0000000..de0ce35 --- /dev/null +++ b/game/ui/theme/indicator.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/indicator.png-c41d04cbba622d9e2a8ddce8ec7447b5.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://ui/theme/indicator.png" +dest_files=[ "res://.import/indicator.png-c41d04cbba622d9e2a8ddce8ec7447b5.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/game/ui/theme/lineedit_normal_style.tres b/game/ui/theme/lineedit_normal_style.tres new file mode 100644 index 0000000..836cca1 --- /dev/null +++ b/game/ui/theme/lineedit_normal_style.tres @@ -0,0 +1,15 @@ +[gd_resource type="StyleBoxTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/button_bg_atlas.tres" type="Texture" id=1] + +[resource] +texture = ExtResource( 1 ) +region_rect = Rect2( 0, 0, 13, 14 ) +margin_left = 4.54215 +margin_right = 4.92768 +margin_top = 4.54215 +margin_bottom = 4.79917 +expand_margin_top = 4.0 +expand_margin_bottom = 4.0 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 diff --git a/game/ui/theme/locked_icon.tres b/game/ui/theme/locked_icon.tres new file mode 100644 index 0000000..1d04f23 --- /dev/null +++ b/game/ui/theme/locked_icon.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 34, 108, 20, 20 ) diff --git a/game/ui/theme/menu_icon.tres b/game/ui/theme/menu_icon.tres new file mode 100644 index 0000000..1f439c8 --- /dev/null +++ b/game/ui/theme/menu_icon.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 68, 108, 20, 20 ) diff --git a/game/ui/theme/panel_bg.tres b/game/ui/theme/panel_bg.tres new file mode 100644 index 0000000..1350fef --- /dev/null +++ b/game/ui/theme/panel_bg.tres @@ -0,0 +1,13 @@ +[gd_resource type="StyleBoxTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/panel_bg_atlas.tres" type="Texture" id=1] + +[resource] +texture = ExtResource( 1 ) +region_rect = Rect2( 0, 0, 10, 11 ) +margin_left = 4.0 +margin_right = 4.0 +margin_top = 4.0 +margin_bottom = 4.0 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 diff --git a/game/ui/theme/panel_bg_atlas.tres b/game/ui/theme/panel_bg_atlas.tres new file mode 100644 index 0000000..9b0e3ef --- /dev/null +++ b/game/ui/theme/panel_bg_atlas.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 31, 49, 10, 11 ) diff --git a/game/ui/theme/radio_checked_texture.tres b/game/ui/theme/radio_checked_texture.tres new file mode 100644 index 0000000..25bfe52 --- /dev/null +++ b/game/ui/theme/radio_checked_texture.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 1, 37, 7, 7 ) diff --git a/game/ui/theme/radio_texture.tres b/game/ui/theme/radio_texture.tres new file mode 100644 index 0000000..f3bda6d --- /dev/null +++ b/game/ui/theme/radio_texture.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 9, 37, 7, 7 ) diff --git a/game/ui/theme/scrollbar_bg.tres b/game/ui/theme/scrollbar_bg.tres new file mode 100644 index 0000000..fa085e5 --- /dev/null +++ b/game/ui/theme/scrollbar_bg.tres @@ -0,0 +1,14 @@ +[gd_resource type="StyleBoxTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/scrollbar_bg_atlas.tres" type="Texture" id=1] + +[resource] +texture = ExtResource( 1 ) +region_rect = Rect2( 0, 0, 10, 11 ) +margin_left = 2.0 +margin_right = 2.0 +margin_top = 2.0 +margin_bottom = 2.0 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 +modulate_color = Color( 0.976471, 0.976471, 0.976471, 1 ) diff --git a/game/ui/theme/scrollbar_bg_atlas.tres b/game/ui/theme/scrollbar_bg_atlas.tres new file mode 100644 index 0000000..9b0e3ef --- /dev/null +++ b/game/ui/theme/scrollbar_bg_atlas.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 31, 49, 10, 11 ) diff --git a/game/ui/theme/scrollbar_bg_focus.tres b/game/ui/theme/scrollbar_bg_focus.tres new file mode 100644 index 0000000..8a932b2 --- /dev/null +++ b/game/ui/theme/scrollbar_bg_focus.tres @@ -0,0 +1,13 @@ +[gd_resource type="StyleBoxTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/panel_bg_atlas.tres" type="Texture" id=1] + +[resource] +texture = ExtResource( 1 ) +region_rect = Rect2( 0, 0, 10, 11 ) +margin_left = 2.0 +margin_right = 2.0 +margin_top = 2.0 +margin_bottom = 2.0 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 diff --git a/game/ui/theme/scrollbar_grabber.tres b/game/ui/theme/scrollbar_grabber.tres new file mode 100644 index 0000000..ad31839 --- /dev/null +++ b/game/ui/theme/scrollbar_grabber.tres @@ -0,0 +1,13 @@ +[gd_resource type="StyleBoxTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/scrollbar_grabber_atlas.tres" type="Texture" id=1] + +[resource] +texture = ExtResource( 1 ) +region_rect = Rect2( 0, 0, 10, 11 ) +margin_left = 2.35121 +margin_right = 2.35121 +margin_top = 2.95077 +margin_bottom = 2.65099 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 diff --git a/game/ui/theme/scrollbar_grabber_atlas.tres b/game/ui/theme/scrollbar_grabber_atlas.tres new file mode 100644 index 0000000..9b0e3ef --- /dev/null +++ b/game/ui/theme/scrollbar_grabber_atlas.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 31, 49, 10, 11 ) diff --git a/game/ui/theme/scrollbar_grabber_blue.tres b/game/ui/theme/scrollbar_grabber_blue.tres new file mode 100644 index 0000000..441935e --- /dev/null +++ b/game/ui/theme/scrollbar_grabber_blue.tres @@ -0,0 +1,14 @@ +[gd_resource type="StyleBoxTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/scrollbar_grabber_atlas.tres" type="Texture" id=1] + +[resource] +texture = ExtResource( 1 ) +region_rect = Rect2( 0, 0, 10, 11 ) +margin_left = 2.35121 +margin_right = 2.35121 +margin_top = 2.95077 +margin_bottom = 2.65099 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 +modulate_color = Color( 0.0588235, 0.403922, 1, 1 ) diff --git a/game/ui/theme/scrollbar_grabber_blue_xp.tres b/game/ui/theme/scrollbar_grabber_blue_xp.tres new file mode 100644 index 0000000..1fed589 --- /dev/null +++ b/game/ui/theme/scrollbar_grabber_blue_xp.tres @@ -0,0 +1,14 @@ +[gd_resource type="StyleBoxTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/scrollbar_grabber_atlas.tres" type="Texture" id=1] + +[resource] +texture = ExtResource( 1 ) +region_rect = Rect2( 0, 0, 10, 11 ) +margin_left = 2.35121 +margin_right = 2.35121 +margin_top = 2.95077 +margin_bottom = 2.65099 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 +modulate_color = Color( 0.054902, 1, 0.976471, 1 ) diff --git a/game/ui/theme/scrollbar_grabber_highlight.tres b/game/ui/theme/scrollbar_grabber_highlight.tres new file mode 100644 index 0000000..ad31839 --- /dev/null +++ b/game/ui/theme/scrollbar_grabber_highlight.tres @@ -0,0 +1,13 @@ +[gd_resource type="StyleBoxTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/scrollbar_grabber_atlas.tres" type="Texture" id=1] + +[resource] +texture = ExtResource( 1 ) +region_rect = Rect2( 0, 0, 10, 11 ) +margin_left = 2.35121 +margin_right = 2.35121 +margin_top = 2.95077 +margin_bottom = 2.65099 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 diff --git a/game/ui/theme/scrollbar_grabber_pressed.tres b/game/ui/theme/scrollbar_grabber_pressed.tres new file mode 100644 index 0000000..ffc1382 --- /dev/null +++ b/game/ui/theme/scrollbar_grabber_pressed.tres @@ -0,0 +1,14 @@ +[gd_resource type="StyleBoxTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/scrollbar_grabber_atlas.tres" type="Texture" id=1] + +[resource] +texture = ExtResource( 1 ) +region_rect = Rect2( 0, 0, 10, 11 ) +margin_left = 2.35121 +margin_right = 2.35121 +margin_top = 2.95077 +margin_bottom = 2.65099 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 +modulate_color = Color( 0.976471, 0.976471, 0.976471, 1 ) diff --git a/game/ui/theme/scrollbar_grabber_red.tres b/game/ui/theme/scrollbar_grabber_red.tres new file mode 100644 index 0000000..2ea4477 --- /dev/null +++ b/game/ui/theme/scrollbar_grabber_red.tres @@ -0,0 +1,14 @@ +[gd_resource type="StyleBoxTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/scrollbar_grabber_atlas.tres" type="Texture" id=1] + +[resource] +texture = ExtResource( 1 ) +region_rect = Rect2( 0, 0, 10, 11 ) +margin_left = 2.35121 +margin_right = 2.35121 +margin_top = 2.95077 +margin_bottom = 2.65099 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 +modulate_color = Color( 0.878431, 0.0784314, 0.0784314, 1 ) diff --git a/game/ui/theme/separator_stylebox.tres b/game/ui/theme/separator_stylebox.tres new file mode 100644 index 0000000..7bf5dd6 --- /dev/null +++ b/game/ui/theme/separator_stylebox.tres @@ -0,0 +1,7 @@ +[gd_resource type="StyleBoxTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/separator_texture.tres" type="Texture" id=1] + +[resource] +texture = ExtResource( 1 ) +region_rect = Rect2( 0, 0, 1, 1 ) diff --git a/game/ui/theme/separator_texture.tres b/game/ui/theme/separator_texture.tres new file mode 100644 index 0000000..654816f --- /dev/null +++ b/game/ui/theme/separator_texture.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 20, 68, 1, 1 ) diff --git a/game/ui/theme/spellbook_icon.tres b/game/ui/theme/spellbook_icon.tres new file mode 100644 index 0000000..cfacdf0 --- /dev/null +++ b/game/ui/theme/spellbook_icon.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 17, 108, 20, 20 ) diff --git a/game/ui/theme/tab_button_bg_stylebox.tres b/game/ui/theme/tab_button_bg_stylebox.tres new file mode 100644 index 0000000..5843cc0 --- /dev/null +++ b/game/ui/theme/tab_button_bg_stylebox.tres @@ -0,0 +1,14 @@ +[gd_resource type="StyleBoxTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/button_bg_atlas.tres" type="Texture" id=1] + +[resource] +texture = ExtResource( 1 ) +region_rect = Rect2( 0, 0, 13, 14 ) +margin_left = 8.65868 +margin_right = 8.7872 +margin_top = 6.0 +margin_bottom = 6.0 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 +modulate_color = Color( 0.772549, 0.772549, 0.772549, 1 ) diff --git a/game/ui/theme/tab_button_bg_stylebox_focus.tres b/game/ui/theme/tab_button_bg_stylebox_focus.tres new file mode 100644 index 0000000..2e73253 --- /dev/null +++ b/game/ui/theme/tab_button_bg_stylebox_focus.tres @@ -0,0 +1,14 @@ +[gd_resource type="StyleBoxTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/button_bg_atlas.tres" type="Texture" id=1] + +[resource] +texture = ExtResource( 1 ) +region_rect = Rect2( 0, 0, 13, 14 ) +margin_left = 8.40166 +margin_right = 8.01612 +margin_top = 6.0 +margin_bottom = 6.0 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 +modulate_color = Color( 0.807843, 0.807843, 0.807843, 1 ) diff --git a/game/ui/theme/tab_button_bg_stylebox_hover.tres b/game/ui/theme/tab_button_bg_stylebox_hover.tres new file mode 100644 index 0000000..8f2d668 --- /dev/null +++ b/game/ui/theme/tab_button_bg_stylebox_hover.tres @@ -0,0 +1,13 @@ +[gd_resource type="StyleBoxTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/button_bg_atlas.tres" type="Texture" id=1] + +[resource] +texture = ExtResource( 1 ) +region_rect = Rect2( 0, 0, 13, 14 ) +margin_left = 8.27315 +margin_right = 8.14463 +margin_top = 6.0 +margin_bottom = 6.0 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 diff --git a/game/ui/theme/talent_icon.tres b/game/ui/theme/talent_icon.tres new file mode 100644 index 0000000..2d7f204 --- /dev/null +++ b/game/ui/theme/talent_icon.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 86, 108, 20, 20 ) diff --git a/game/ui/theme/ui_dynamicfont.tres b/game/ui/theme/ui_dynamicfont.tres new file mode 100644 index 0000000..306f2ca --- /dev/null +++ b/game/ui/theme/ui_dynamicfont.tres @@ -0,0 +1,7 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://fonts/VT323-Regular.ttf" type="DynamicFontData" id=1] + +[resource] +size = 14 +font_data = ExtResource( 1 ) diff --git a/game/ui/theme/ui_dynamicfont_small.tres b/game/ui/theme/ui_dynamicfont_small.tres new file mode 100644 index 0000000..de5e337 --- /dev/null +++ b/game/ui/theme/ui_dynamicfont_small.tres @@ -0,0 +1,7 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://fonts/VT323-Regular.ttf" type="DynamicFontData" id=1] + +[resource] +size = 12 +font_data = ExtResource( 1 ) diff --git a/game/ui/theme/ui_theme.tres b/game/ui/theme/ui_theme.tres new file mode 100644 index 0000000..9f435b9 --- /dev/null +++ b/game/ui/theme/ui_theme.tres @@ -0,0 +1,380 @@ +[gd_resource type="Theme" load_steps=34 format=2] + +[ext_resource path="res://ui/theme/h_scroll_bar_texture.tres" type="Texture" id=1] +[ext_resource path="res://ui/theme/button_bg_stylebox_disabled.tres" type="StyleBox" id=2] +[ext_resource path="res://ui/theme/button_bg_stylebox_focus.tres" type="StyleBox" id=3] +[ext_resource path="res://ui/theme/button_bg_stylebox.tres" type="StyleBox" id=4] +[ext_resource path="res://ui/theme/button_bg_stylebox_hover.tres" type="StyleBox" id=5] +[ext_resource path="res://ui/theme/ui_dynamicfont.tres" type="DynamicFont" id=6] +[ext_resource path="res://ui/theme/button_bg_stylebox_pressed.tres" type="StyleBox" id=7] +[ext_resource path="res://ui/theme/panel_bg.tres" type="StyleBox" id=8] +[ext_resource path="res://ui/theme/lineedit_normal_style.tres" type="StyleBox" id=9] +[ext_resource path="res://ui/theme/scrollbar_grabber_highlight.tres" type="StyleBox" id=10] +[ext_resource path="res://ui/theme/scrollbar_bg.tres" type="StyleBox" id=11] +[ext_resource path="res://ui/theme/scrollbar_grabber.tres" type="StyleBox" id=12] +[ext_resource path="res://ui/theme/scrollbar_grabber_pressed.tres" type="StyleBox" id=13] +[ext_resource path="res://ui/theme/scrollbar_bg_focus.tres" type="StyleBox" id=14] +[ext_resource path="res://ui/theme/separator_stylebox.tres" type="StyleBox" id=15] +[ext_resource path="res://ui/theme/radio_texture.tres" type="Texture" id=16] +[ext_resource path="res://ui/theme/radio_checked_texture.tres" type="Texture" id=17] +[ext_resource path="res://ui/theme/checkbox_texture.tres" type="Texture" id=18] +[ext_resource path="res://ui/theme/checkbox_checked_texture.tres" type="Texture" id=19] +[ext_resource path="res://ui/theme/dropdown_icon.tres" type="Texture" id=20] +[ext_resource path="res://ui/theme/tab_button_bg_stylebox_focus.tres" type="StyleBox" id=21] +[ext_resource path="res://ui/theme/tab_button_bg_stylebox_hover.tres" type="StyleBox" id=22] +[ext_resource path="res://ui/theme/tab_button_bg_stylebox.tres" type="StyleBox" id=23] +[ext_resource path="res://scripts/ui/AdaptiveTheme.gd" type="Script" id=24] + +[sub_resource type="Image" id=1] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 16, 255, 255, 255, 97, 255, 255, 255, 135, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 114, 191, 191, 191, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 15, 255, 255, 255, 139, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 123, 191, 191, 191, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 96, 255, 255, 255, 150, 255, 255, 255, 105, 255, 255, 255, 15, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 191, 191, 191, 0, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 123, 191, 191, 191, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 134, 255, 255, 255, 150, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 123, 191, 191, 191, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 122, 191, 191, 191, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 122, 191, 191, 191, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 121, 191, 191, 191, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 121, 191, 191, 191, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 121, 191, 191, 191, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 120, 191, 191, 191, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 120, 191, 191, 191, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 120, 191, 191, 191, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 119, 191, 191, 191, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 119, 191, 191, 191, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 134, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 119, 191, 191, 191, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 97, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 118, 191, 191, 191, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 16, 255, 255, 255, 139, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 111, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 16, 255, 255, 255, 97, 255, 255, 255, 135, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 191, 191, 191, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 134, 255, 255, 255, 150, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 16, 255, 255, 255, 150, 255, 255, 255, 134, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 97, 255, 255, 255, 150, 255, 255, 255, 105, 255, 255, 255, 15, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 255, 255, 255, 15, 255, 255, 255, 105, 255, 255, 255, 150, 255, 255, 255, 97, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 16, 255, 255, 255, 139, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 139, 191, 191, 191, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 16, 255, 255, 255, 97, 255, 255, 255, 135, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 135, 255, 255, 255, 97, 191, 191, 191, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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": "RGBA8", +"height": 64, +"mipmaps": false, +"width": 64 +} + +[sub_resource type="ImageTexture" id=2] +flags = 0 +flags = 0 +image = SubResource( 1 ) +size = Vector2( 64, 64 ) + +[sub_resource type="Image" id=3] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 128, 46, 46, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 68, 68, 27, 255, 91, 91, 165, 255, 93, 93, 229, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 195, 191, 68, 68, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 69, 69, 26, 255, 93, 93, 236, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 210, 191, 68, 68, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 164, 255, 93, 93, 255, 255, 92, 92, 178, 255, 88, 88, 26, 128, 46, 46, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 191, 70, 70, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 209, 191, 68, 68, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 228, 255, 93, 93, 255, 255, 90, 90, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 209, 191, 69, 69, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 208, 191, 68, 68, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 208, 191, 68, 68, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 207, 191, 67, 67, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 206, 191, 68, 68, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 206, 191, 69, 69, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 205, 191, 68, 68, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 205, 191, 68, 68, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 204, 191, 68, 68, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 204, 191, 68, 68, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 203, 191, 68, 68, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 228, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 202, 191, 67, 67, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 165, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 202, 191, 67, 67, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 46, 46, 27, 255, 93, 93, 236, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 190, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 191, 68, 68, 27, 255, 91, 91, 165, 255, 93, 93, 229, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 128, 46, 46, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 191, 70, 70, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 128, 46, 46, 0, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 191, 68, 68, 7, 255, 92, 92, 151, 255, 92, 92, 151, 191, 68, 68, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 68, 68, 7, 255, 92, 92, 151, 255, 92, 92, 151, 191, 68, 68, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 255, 88, 88, 7, 255, 92, 92, 180, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 180, 191, 65, 65, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 65, 65, 7, 255, 92, 92, 180, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 180, 191, 65, 65, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 255, 91, 91, 180, 255, 93, 93, 255, 255, 93, 93, 233, 255, 93, 93, 233, 255, 93, 93, 255, 255, 91, 91, 180, 191, 66, 66, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 66, 66, 7, 255, 91, 91, 180, 255, 93, 93, 255, 255, 93, 93, 233, 255, 93, 93, 233, 255, 93, 93, 255, 255, 91, 91, 180, 191, 66, 66, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 69, 69, 7, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 87, 87, 43, 255, 78, 78, 44, 255, 93, 93, 233, 255, 93, 93, 255, 255, 91, 91, 179, 191, 66, 66, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 66, 66, 7, 255, 91, 91, 179, 255, 93, 93, 255, 255, 93, 93, 233, 255, 78, 78, 44, 255, 78, 78, 44, 255, 93, 93, 233, 255, 93, 93, 255, 255, 91, 91, 179, 191, 66, 66, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 68, 68, 7, 255, 92, 92, 181, 255, 93, 93, 255, 255, 92, 92, 217, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 234, 255, 70, 70, 44, 64, 19, 19, 0, 64, 16, 16, 0, 255, 70, 70, 44, 255, 93, 93, 234, 255, 93, 93, 255, 255, 92, 92, 178, 191, 65, 65, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 65, 65, 6, 255, 92, 92, 178, 255, 93, 93, 255, 255, 93, 93, 234, 255, 70, 70, 44, 64, 16, 16, 0, 64, 16, 16, 0, 255, 70, 70, 44, 255, 93, 93, 234, 255, 93, 93, 255, 255, 92, 92, 178, 191, 65, 65, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 66, 66, 7, 255, 91, 91, 180, 255, 93, 93, 255, 255, 93, 93, 233, 255, 87, 87, 43, 64, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 93, 93, 219, 255, 93, 93, 232, 255, 71, 71, 45, 128, 37, 37, 0, 191, 69, 69, 9, 191, 68, 68, 8, 128, 37, 37, 0, 255, 71, 71, 45, 255, 93, 93, 234, 255, 93, 93, 255, 255, 91, 91, 177, 191, 64, 64, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 64, 64, 6, 255, 91, 91, 178, 255, 93, 93, 255, 255, 93, 93, 234, 255, 71, 71, 45, 128, 37, 37, 0, 191, 69, 69, 8, 191, 69, 69, 8, 128, 37, 37, 0, 255, 71, 71, 45, 255, 93, 93, 234, 255, 93, 93, 255, 255, 91, 91, 177, 191, 64, 64, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 66, 66, 7, 255, 91, 91, 179, 255, 93, 93, 255, 255, 93, 93, 234, 255, 70, 70, 44, 64, 19, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 69, 69, 11, 191, 68, 68, 11, 128, 26, 26, 0, 255, 87, 87, 43, 255, 93, 93, 230, 255, 93, 93, 230, 255, 87, 87, 42, 128, 25, 25, 0, 255, 61, 61, 45, 255, 93, 93, 234, 255, 93, 93, 255, 255, 91, 91, 176, 191, 66, 66, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 66, 66, 6, 255, 91, 91, 176, 255, 93, 93, 255, 255, 93, 93, 234, 255, 61, 61, 45, 128, 25, 25, 0, 255, 87, 87, 43, 255, 93, 93, 230, 255, 93, 93, 230, 255, 87, 87, 42, 128, 25, 25, 0, 255, 61, 61, 45, 255, 93, 93, 234, 255, 93, 93, 255, 255, 91, 91, 176, 191, 66, 66, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 64, 64, 6, 255, 91, 91, 178, 255, 93, 93, 255, 255, 93, 93, 234, 255, 71, 71, 45, 64, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 255, 23, 23, 42, 255, 93, 93, 232, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 232, 255, 23, 23, 42, 128, 13, 13, 0, 255, 61, 61, 46, 255, 93, 93, 235, 255, 93, 93, 255, 255, 92, 92, 176, 191, 69, 69, 6, 0, 0, 0, 0, 0, 0, 0, 0, 191, 69, 69, 6, 255, 92, 92, 176, 255, 93, 93, 255, 255, 93, 93, 235, 255, 61, 61, 46, 128, 13, 13, 0, 255, 23, 23, 42, 255, 93, 93, 232, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 232, 255, 23, 23, 42, 128, 13, 13, 0, 255, 61, 61, 46, 255, 93, 93, 235, 255, 93, 93, 255, 255, 92, 92, 176, 191, 69, 69, 6, 0, 0, 0, 0, 0, 0, 0, 0, 191, 64, 64, 6, 255, 91, 91, 178, 255, 93, 93, 255, 255, 93, 93, 234, 255, 66, 66, 45, 128, 37, 37, 0, 191, 68, 68, 10, 191, 69, 69, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 255, 23, 23, 41, 255, 93, 93, 232, 255, 93, 93, 255, 255, 92, 92, 182, 255, 92, 92, 182, 255, 93, 93, 255, 255, 93, 93, 232, 255, 23, 23, 41, 128, 13, 13, 0, 255, 74, 74, 47, 255, 93, 93, 235, 255, 93, 93, 255, 255, 92, 92, 175, 191, 68, 68, 6, 191, 68, 68, 6, 255, 92, 92, 175, 255, 93, 93, 255, 255, 93, 93, 235, 255, 74, 74, 47, 128, 13, 13, 0, 255, 23, 23, 41, 255, 93, 93, 232, 255, 93, 93, 255, 255, 92, 92, 182, 255, 92, 92, 182, 255, 93, 93, 255, 255, 93, 93, 232, 255, 23, 23, 41, 128, 13, 13, 0, 255, 74, 74, 47, 255, 93, 93, 235, 255, 93, 93, 255, 255, 92, 92, 175, 191, 68, 68, 6, 191, 65, 65, 6, 255, 91, 91, 177, 255, 93, 93, 255, 255, 93, 93, 235, 255, 61, 61, 46, 128, 23, 23, 0, 255, 87, 87, 43, 255, 93, 93, 231, 255, 92, 92, 219, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 255, 23, 23, 41, 255, 93, 93, 231, 255, 93, 93, 255, 255, 90, 90, 183, 191, 66, 66, 7, 191, 66, 66, 7, 255, 90, 90, 183, 255, 93, 93, 255, 255, 93, 93, 231, 255, 23, 23, 41, 128, 21, 21, 0, 255, 87, 87, 47, 255, 93, 93, 236, 255, 93, 93, 255, 255, 91, 91, 174, 255, 91, 91, 174, 255, 93, 93, 255, 255, 93, 93, 236, 255, 87, 87, 47, 128, 21, 21, 0, 255, 23, 23, 41, 255, 93, 93, 231, 255, 93, 93, 255, 255, 90, 90, 183, 191, 66, 66, 7, 191, 66, 66, 7, 255, 90, 90, 183, 255, 93, 93, 255, 255, 93, 93, 231, 255, 23, 23, 41, 128, 21, 21, 0, 255, 87, 87, 47, 255, 93, 93, 236, 255, 93, 93, 255, 255, 91, 91, 174, 255, 92, 92, 176, 255, 93, 93, 255, 255, 93, 93, 235, 255, 61, 61, 46, 128, 13, 13, 0, 255, 23, 23, 42, 255, 93, 93, 232, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 93, 93, 216, 255, 93, 93, 255, 255, 91, 91, 184, 191, 64, 64, 8, 0, 0, 0, 0, 0, 0, 0, 0, 191, 64, 64, 8, 255, 91, 91, 184, 255, 93, 93, 255, 255, 93, 93, 231, 255, 23, 23, 40, 128, 21, 21, 0, 255, 87, 87, 48, 255, 93, 93, 236, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 236, 255, 87, 87, 48, 128, 21, 21, 0, 255, 23, 23, 40, 255, 93, 93, 231, 255, 93, 93, 255, 255, 91, 91, 184, 191, 64, 64, 8, 0, 0, 0, 0, 0, 0, 0, 0, 191, 64, 64, 8, 255, 91, 91, 184, 255, 93, 93, 255, 255, 93, 93, 231, 255, 23, 23, 40, 128, 21, 21, 0, 255, 87, 87, 48, 255, 93, 93, 236, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 236, 255, 87, 87, 47, 128, 17, 17, 0, 255, 23, 23, 41, 255, 93, 93, 232, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 191, 65, 65, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 64, 64, 8, 255, 92, 92, 184, 255, 93, 93, 255, 255, 93, 93, 231, 255, 23, 23, 39, 128, 20, 20, 0, 255, 77, 77, 48, 255, 93, 93, 233, 255, 93, 93, 233, 255, 77, 77, 48, 128, 20, 20, 0, 255, 23, 23, 40, 255, 93, 93, 231, 255, 93, 93, 255, 255, 92, 92, 184, 191, 64, 64, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 64, 64, 8, 255, 92, 92, 184, 255, 93, 93, 255, 255, 93, 93, 231, 255, 23, 23, 39, 128, 20, 20, 0, 255, 77, 77, 48, 255, 93, 93, 233, 255, 93, 93, 233, 255, 87, 87, 48, 128, 21, 21, 0, 255, 23, 23, 41, 255, 93, 93, 231, 255, 93, 93, 255, 255, 92, 92, 182, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 66, 66, 8, 255, 92, 92, 185, 255, 93, 93, 255, 255, 93, 93, 230, 191, 69, 69, 39, 64, 18, 18, 0, 191, 66, 66, 9, 191, 66, 66, 9, 64, 18, 18, 0, 191, 69, 69, 39, 255, 93, 93, 230, 255, 93, 93, 255, 255, 92, 92, 185, 191, 66, 66, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 66, 66, 8, 255, 92, 92, 185, 255, 93, 93, 255, 255, 93, 93, 230, 191, 69, 69, 39, 64, 18, 18, 0, 191, 66, 66, 9, 191, 66, 66, 9, 128, 21, 21, 0, 255, 23, 23, 40, 255, 93, 93, 231, 255, 93, 93, 255, 255, 90, 90, 183, 255, 89, 89, 7, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 69, 69, 8, 255, 92, 92, 186, 255, 93, 93, 255, 255, 93, 93, 230, 191, 68, 68, 38, 0, 0, 0, 0, 0, 0, 0, 0, 191, 68, 68, 38, 255, 93, 93, 230, 255, 93, 93, 255, 255, 92, 92, 186, 191, 69, 69, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 69, 69, 8, 255, 92, 92, 186, 255, 93, 93, 255, 255, 93, 93, 230, 191, 68, 68, 38, 0, 0, 0, 0, 64, 0, 0, 0, 255, 23, 23, 40, 255, 93, 93, 231, 255, 93, 93, 255, 255, 91, 91, 184, 191, 64, 64, 8, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 67, 67, 9, 255, 91, 91, 186, 255, 93, 93, 255, 255, 93, 93, 229, 191, 68, 68, 38, 191, 69, 69, 38, 255, 93, 93, 229, 255, 93, 93, 255, 255, 91, 91, 186, 191, 67, 67, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 67, 67, 9, 255, 91, 91, 186, 255, 93, 93, 255, 255, 93, 93, 229, 191, 68, 68, 38, 191, 69, 69, 39, 255, 93, 93, 230, 255, 93, 93, 255, 255, 92, 92, 184, 191, 64, 64, 8, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 68, 68, 9, 255, 92, 92, 187, 255, 93, 93, 255, 255, 93, 93, 229, 255, 93, 93, 229, 255, 93, 93, 255, 255, 92, 92, 187, 191, 68, 68, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 68, 68, 9, 255, 92, 92, 187, 255, 93, 93, 255, 255, 93, 93, 229, 255, 93, 93, 230, 255, 93, 93, 255, 255, 92, 92, 185, 191, 66, 66, 8, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 69, 69, 9, 255, 92, 92, 188, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 188, 191, 69, 69, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 69, 69, 9, 255, 92, 92, 188, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 186, 191, 69, 69, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 66, 66, 10, 255, 92, 92, 154, 255, 92, 92, 154, 191, 66, 66, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 66, 66, 10, 255, 92, 92, 154, 255, 92, 92, 153, 191, 68, 68, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 228, 255, 93, 93, 255, 255, 90, 90, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 90, 90, 26, 255, 93, 93, 255, 255, 92, 92, 228, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 165, 255, 93, 93, 255, 255, 92, 92, 178, 255, 88, 88, 26, 128, 46, 46, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 46, 46, 0, 255, 88, 88, 26, 255, 92, 92, 178, 255, 93, 93, 255, 255, 92, 92, 165, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 46, 46, 27, 255, 93, 93, 236, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 236, 255, 46, 46, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 191, 68, 68, 27, 255, 91, 91, 165, 255, 93, 93, 229, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 229, 255, 91, 91, 165, 191, 68, 68, 27, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 128, 46, 46, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 46, 46, 0, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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": "RGBA8", +"height": 64, +"mipmaps": false, +"width": 64 +} + +[sub_resource type="ImageTexture" id=4] +flags = 0 +flags = 0 +image = SubResource( 3 ) +size = Vector2( 64, 64 ) + +[sub_resource type="Image" id=5] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 128, 46, 46, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 68, 68, 27, 255, 91, 91, 165, 255, 93, 93, 229, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 195, 191, 68, 68, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 69, 69, 26, 255, 93, 93, 236, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 210, 191, 69, 69, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 164, 255, 93, 93, 255, 255, 90, 90, 179, 255, 87, 87, 26, 128, 46, 46, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 191, 70, 70, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 209, 191, 68, 68, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 228, 255, 93, 93, 255, 255, 89, 89, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 209, 191, 69, 69, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 208, 191, 68, 68, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 208, 191, 68, 68, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 207, 191, 68, 68, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 206, 191, 68, 68, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 206, 191, 69, 69, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 205, 191, 68, 68, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 205, 191, 68, 68, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 204, 191, 68, 68, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 203, 191, 68, 68, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 203, 191, 68, 68, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 228, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 202, 191, 67, 67, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 165, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 202, 191, 67, 67, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 46, 46, 27, 255, 93, 93, 236, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 189, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 191, 68, 68, 27, 255, 91, 91, 165, 255, 93, 93, 229, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 128, 46, 46, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 191, 70, 70, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 255, 92, 92, 184, 255, 92, 92, 200, 191, 67, 67, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 68, 68, 15, 255, 92, 92, 191, 255, 91, 91, 183, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 255, 92, 92, 184, 255, 92, 92, 200, 191, 67, 67, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 68, 68, 15, 255, 92, 92, 191, 255, 91, 91, 183, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 197, 255, 93, 93, 255, 255, 92, 92, 188, 191, 66, 66, 6, 0, 0, 0, 0, 191, 66, 66, 6, 255, 92, 92, 188, 255, 93, 93, 255, 255, 92, 92, 197, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 197, 255, 93, 93, 255, 255, 92, 92, 188, 191, 66, 66, 6, 0, 0, 0, 0, 191, 66, 66, 6, 255, 92, 92, 188, 255, 93, 93, 255, 255, 92, 92, 197, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 69, 69, 30, 255, 93, 93, 229, 255, 93, 93, 255, 255, 91, 91, 161, 255, 85, 85, 2, 255, 91, 91, 161, 255, 93, 93, 255, 255, 93, 93, 229, 191, 69, 69, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 69, 69, 30, 255, 93, 93, 229, 255, 93, 93, 255, 255, 91, 91, 161, 255, 85, 85, 2, 255, 91, 91, 161, 255, 93, 93, 255, 255, 93, 93, 229, 191, 69, 69, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 21, 21, 0, 255, 89, 89, 48, 255, 93, 93, 242, 255, 93, 93, 255, 255, 92, 92, 201, 255, 93, 93, 255, 255, 93, 93, 242, 255, 89, 89, 48, 64, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 21, 21, 0, 255, 89, 89, 48, 255, 93, 93, 242, 255, 93, 93, 255, 255, 92, 92, 201, 255, 93, 93, 255, 255, 93, 93, 242, 255, 89, 89, 48, 64, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 23, 23, 0, 255, 90, 90, 72, 255, 93, 93, 251, 255, 93, 93, 255, 255, 93, 93, 251, 255, 90, 90, 72, 64, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 23, 23, 0, 255, 90, 90, 72, 255, 93, 93, 251, 255, 93, 93, 255, 255, 93, 93, 251, 255, 90, 90, 72, 64, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 22, 22, 0, 255, 90, 90, 71, 255, 93, 93, 250, 255, 93, 93, 255, 255, 93, 93, 250, 255, 90, 90, 71, 64, 22, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 22, 22, 0, 255, 90, 90, 71, 255, 93, 93, 250, 255, 93, 93, 255, 255, 93, 93, 250, 255, 90, 90, 71, 64, 22, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 21, 21, 0, 255, 87, 87, 47, 255, 93, 93, 242, 255, 93, 93, 255, 255, 92, 92, 203, 255, 93, 93, 255, 255, 93, 93, 242, 255, 87, 87, 47, 64, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 21, 21, 0, 255, 87, 87, 47, 255, 93, 93, 242, 255, 93, 93, 255, 255, 92, 92, 203, 255, 93, 93, 255, 255, 93, 93, 242, 255, 87, 87, 47, 64, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 68, 68, 29, 255, 93, 93, 228, 255, 93, 93, 255, 255, 92, 92, 162, 255, 87, 87, 2, 255, 92, 92, 162, 255, 93, 93, 255, 255, 93, 93, 228, 191, 68, 68, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 68, 68, 29, 255, 93, 93, 228, 255, 93, 93, 255, 255, 92, 92, 162, 255, 87, 87, 2, 255, 92, 92, 162, 255, 93, 93, 255, 255, 93, 93, 228, 191, 68, 68, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 196, 255, 93, 93, 255, 255, 91, 91, 189, 191, 67, 67, 6, 0, 0, 0, 0, 191, 66, 66, 6, 255, 91, 91, 189, 255, 93, 93, 255, 255, 92, 92, 196, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 196, 255, 93, 93, 255, 255, 91, 91, 189, 191, 67, 67, 6, 0, 0, 0, 0, 191, 66, 66, 6, 255, 91, 91, 189, 255, 93, 93, 255, 255, 92, 92, 196, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 255, 92, 92, 180, 255, 92, 92, 194, 191, 67, 67, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 67, 67, 16, 255, 92, 92, 194, 255, 92, 92, 180, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 255, 92, 92, 180, 255, 92, 92, 194, 191, 67, 67, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 67, 67, 16, 255, 92, 92, 194, 255, 92, 92, 180, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 255, 92, 92, 179, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 179, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 255, 91, 91, 179, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 91, 91, 179, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 128, 47, 47, 0, 128, 47, 47, 0, 191, 70, 70, 0, 255, 93, 93, 255, 255, 93, 93, 255, 191, 70, 70, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 191, 70, 70, 0, 255, 93, 93, 255, 255, 93, 93, 255, 191, 70, 70, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 93, 93, 241, 255, 93, 93, 255, 255, 90, 90, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 90, 90, 23, 255, 93, 93, 255, 255, 93, 93, 241, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 189, 255, 93, 93, 255, 255, 92, 92, 115, 64, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 23, 23, 0, 255, 92, 92, 115, 255, 93, 93, 255, 255, 92, 92, 189, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 21, 21, 0, 255, 89, 89, 60, 255, 93, 93, 253, 255, 93, 93, 248, 255, 91, 91, 115, 255, 91, 91, 25, 255, 91, 91, 25, 255, 91, 91, 115, 255, 93, 93, 248, 255, 93, 93, 253, 255, 89, 89, 60, 64, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 23, 23, 0, 255, 92, 92, 120, 255, 93, 93, 253, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 253, 255, 92, 92, 120, 64, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 23, 23, 0, 255, 57, 57, 60, 255, 92, 92, 190, 255, 93, 93, 242, 255, 93, 93, 242, 255, 92, 92, 190, 255, 57, 57, 60, 64, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 128, 46, 46, 0, 128, 46, 46, 0, 128, 46, 46, 0, 128, 46, 46, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 228, 255, 93, 93, 255, 255, 90, 90, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 91, 91, 27, 255, 93, 93, 255, 255, 92, 92, 228, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 165, 255, 93, 93, 255, 255, 92, 92, 178, 255, 88, 88, 26, 128, 46, 46, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 46, 46, 0, 255, 91, 91, 26, 255, 92, 92, 178, 255, 93, 93, 255, 255, 92, 92, 165, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 46, 46, 27, 255, 93, 93, 236, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 236, 255, 46, 46, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 191, 68, 68, 27, 255, 91, 91, 165, 255, 93, 93, 229, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 229, 255, 91, 91, 165, 191, 68, 68, 27, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 128, 46, 46, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 46, 46, 0, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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": "RGBA8", +"height": 64, +"mipmaps": false, +"width": 64 +} + +[sub_resource type="ImageTexture" id=6] +flags = 0 +flags = 0 +image = SubResource( 5 ) +size = Vector2( 64, 64 ) + +[sub_resource type="Image" id=7] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 98, 98, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 166, 166, 166, 28, 222, 222, 222, 166, 224, 224, 224, 229, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 238, 210, 210, 210, 137, 150, 150, 150, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 28, 224, 224, 224, 236, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 220, 220, 220, 145, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 110, 110, 0, 222, 222, 222, 165, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 251, 220, 220, 220, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 0, 223, 223, 223, 228, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 223, 223, 223, 181, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 222, 222, 222, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 223, 223, 223, 189, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 222, 222, 222, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 223, 223, 223, 189, 167, 167, 167, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 229, 222, 222, 222, 166, 166, 166, 166, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 236, 111, 111, 111, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 222, 222, 222, 165, 110, 110, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 223, 223, 223, 228, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 223, 223, 223, 228, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 0, 223, 223, 223, 164, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 222, 222, 222, 165, 110, 110, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 35, 224, 224, 224, 233, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 236, 111, 111, 111, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 0, 212, 212, 212, 35, 222, 222, 222, 167, 224, 224, 224, 234, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 229, 222, 222, 222, 166, 166, 166, 166, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 110, 110, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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": "RGBA8", +"height": 64, +"mipmaps": false, +"width": 64 +} + +[sub_resource type="ImageTexture" id=8] +flags = 0 +flags = 0 +image = SubResource( 7 ) +size = Vector2( 64, 64 ) + +[sub_resource type="StyleBoxTexture" id=9] +texture = ExtResource( 1 ) +region_rect = Rect2( 0, 0, 25, 3 ) +margin_right = 10.0 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 +modulate_color = Color( 0.890196, 0.976471, 0.992157, 1 ) + +[resource] +default_font = ExtResource( 6 ) +Button/colors/font_color = Color( 1, 1, 1, 1 ) +Button/colors/font_color_disabled = Color( 0.9, 0.9, 0.9, 0.2 ) +Button/colors/font_color_hover = Color( 0.941176, 0.941176, 0.941176, 1 ) +Button/colors/font_color_pressed = Color( 1, 1, 1, 1 ) +Button/constants/hseparation = 0 +Button/fonts/font = null +Button/styles/disabled = ExtResource( 2 ) +Button/styles/focus = ExtResource( 3 ) +Button/styles/hover = ExtResource( 5 ) +Button/styles/normal = ExtResource( 4 ) +Button/styles/pressed = ExtResource( 7 ) +CheckBox/colors/font_color = Color( 0.878431, 0.878431, 0.878431, 1 ) +CheckBox/colors/font_color_disabled = Color( 0.901961, 0.901961, 0.901961, 0.2 ) +CheckBox/colors/font_color_hover = Color( 0.941176, 0.941176, 0.941176, 1 ) +CheckBox/colors/font_color_hover_pressed = Color( 1, 1, 1, 1 ) +CheckBox/colors/font_color_pressed = Color( 1, 1, 1, 1 ) +CheckBox/constants/check_vadjust = 0 +CheckBox/constants/hseparation = 4 +CheckBox/fonts/font = null +CheckBox/icons/checked = ExtResource( 19 ) +CheckBox/icons/radio_checked = ExtResource( 17 ) +CheckBox/icons/radio_unchecked = ExtResource( 16 ) +CheckBox/icons/unchecked = ExtResource( 18 ) +CheckBox/styles/disabled = ExtResource( 4 ) +CheckBox/styles/focus = ExtResource( 3 ) +CheckBox/styles/hover = null +CheckBox/styles/hover_pressed = null +CheckBox/styles/normal = ExtResource( 4 ) +CheckBox/styles/pressed = ExtResource( 4 ) +CheckButton/colors/font_color = Color( 0.878431, 0.878431, 0.878431, 1 ) +CheckButton/colors/font_color_disabled = Color( 0.9, 0.9, 0.9, 0.2 ) +CheckButton/colors/font_color_hover = Color( 0.941176, 0.941176, 0.941176, 1 ) +CheckButton/colors/font_color_hover_pressed = Color( 1, 1, 1, 1 ) +CheckButton/colors/font_color_pressed = Color( 1, 1, 1, 1 ) +CheckButton/constants/check_vadjust = 0 +CheckButton/constants/hseparation = 4 +CheckButton/fonts/font = null +CheckButton/icons/off = ExtResource( 18 ) +CheckButton/icons/on = ExtResource( 19 ) +CheckButton/styles/disabled = ExtResource( 2 ) +CheckButton/styles/focus = ExtResource( 3 ) +CheckButton/styles/hover = ExtResource( 5 ) +CheckButton/styles/hover_pressed = ExtResource( 5 ) +CheckButton/styles/normal = ExtResource( 4 ) +CheckButton/styles/pressed = ExtResource( 7 ) +Dialogs/constants/button_margin = 64 +Dialogs/constants/margin = 16 +EditorIcons/icons/FileBigThumb = SubResource( 2 ) +EditorIcons/icons/FileBrokenBigThumb = SubResource( 4 ) +EditorIcons/icons/FileDeadBigThumb = SubResource( 6 ) +EditorIcons/icons/FolderBigThumb = SubResource( 8 ) +GridContainer/colors/PanelContainer = Color( 1, 1, 1, 1 ) +HScrollBar/icons/decrement = null +HScrollBar/icons/decrement_highlight = null +HScrollBar/icons/increment = null +HScrollBar/icons/increment_highlight = null +HScrollBar/styles/GridContainer = SubResource( 9 ) +HScrollBar/styles/grabber = ExtResource( 12 ) +HScrollBar/styles/grabber_highlight = ExtResource( 10 ) +HScrollBar/styles/grabber_pressed = ExtResource( 13 ) +HScrollBar/styles/scroll = ExtResource( 11 ) +HScrollBar/styles/scroll_focus = null +ItemList/colors/font_color = Color( 0.63, 0.63, 0.63, 1 ) +ItemList/colors/font_color_selected = Color( 1, 1, 1, 1 ) +ItemList/colors/guide_color = Color( 0, 0, 0, 0.1 ) +ItemList/constants/hseparation = 4 +ItemList/constants/icon_margin = 4 +ItemList/constants/line_separation = 4 +ItemList/constants/vseparation = 2 +ItemList/fonts/font = null +ItemList/styles/bg = ExtResource( 8 ) +ItemList/styles/bg_focus = ExtResource( 14 ) +ItemList/styles/cursor = null +ItemList/styles/cursor_unfocused = null +ItemList/styles/selected = null +ItemList/styles/selected_focus = null +LineEdit/colors/clear_button_color = Color( 0.878431, 0.878431, 0.878431, 1 ) +LineEdit/colors/clear_button_color_pressed = Color( 1, 1, 1, 1 ) +LineEdit/colors/cursor_color = Color( 0.941176, 0.941176, 0.941176, 1 ) +LineEdit/colors/font_color = Color( 0.878431, 0.878431, 0.878431, 1 ) +LineEdit/colors/font_color_selected = Color( 0, 0, 0, 1 ) +LineEdit/colors/selection_color = Color( 0.490196, 0.490196, 0.490196, 1 ) +LineEdit/constants/minimum_spaces = 24 +LineEdit/fonts/font = null +LineEdit/icons/clear = null +LineEdit/styles/focus = ExtResource( 3 ) +LineEdit/styles/normal = ExtResource( 9 ) +LineEdit/styles/read_only = ExtResource( 2 ) +OptionButton/colors/font_color = Color( 0.88, 0.88, 0.88, 1 ) +OptionButton/colors/font_color_disabled = Color( 0.9, 0.9, 0.9, 0.2 ) +OptionButton/colors/font_color_hover = Color( 0.94, 0.94, 0.94, 1 ) +OptionButton/colors/font_color_pressed = Color( 1, 1, 1, 1 ) +OptionButton/constants/arrow_margin = 4 +OptionButton/constants/hseparation = 4 +OptionButton/fonts/font = null +OptionButton/icons/arrow = ExtResource( 20 ) +OptionButton/styles/disabled = ExtResource( 2 ) +OptionButton/styles/focus = ExtResource( 3 ) +OptionButton/styles/hover = ExtResource( 5 ) +OptionButton/styles/normal = ExtResource( 4 ) +OptionButton/styles/pressed = ExtResource( 7 ) +Panel/styles/panel = ExtResource( 8 ) +PanelContainer/styles/panel = ExtResource( 8 ) +PopupMenu/colors/font_color = Color( 0.88, 0.88, 0.88, 1 ) +PopupMenu/colors/font_color_accel = Color( 0.7, 0.7, 0.7, 0.8 ) +PopupMenu/colors/font_color_disabled = Color( 0.4, 0.4, 0.4, 0.8 ) +PopupMenu/colors/font_color_hover = Color( 0.88, 0.88, 0.88, 1 ) +PopupMenu/constants/hseparation = 8 +PopupMenu/constants/vseparation = 8 +PopupMenu/fonts/font = null +PopupMenu/icons/checked = null +PopupMenu/icons/radio_checked = ExtResource( 17 ) +PopupMenu/icons/radio_unchecked = ExtResource( 16 ) +PopupMenu/icons/submenu = null +PopupMenu/icons/unchecked = null +PopupMenu/styles/hover = ExtResource( 5 ) +PopupMenu/styles/labeled_separator_left = null +PopupMenu/styles/labeled_separator_right = null +PopupMenu/styles/panel = ExtResource( 8 ) +PopupMenu/styles/panel_disabled = ExtResource( 2 ) +PopupMenu/styles/separator = ExtResource( 15 ) +PopupPanel/styles/panel = ExtResource( 8 ) +ProgressBar/colors/font_color = Color( 0.941176, 0.941176, 0.941176, 1 ) +ProgressBar/colors/font_color_shadow = Color( 0, 0, 0, 1 ) +ProgressBar/fonts/font = null +ProgressBar/styles/bg = ExtResource( 11 ) +ProgressBar/styles/fg = ExtResource( 12 ) +TabContainer/colors/font_color_bg = Color( 0.69, 0.69, 0.69, 1 ) +TabContainer/colors/font_color_disabled = Color( 0.9, 0.9, 0.9, 0.2 ) +TabContainer/colors/font_color_fg = Color( 0.94, 0.94, 0.94, 1 ) +TabContainer/constants/hseparation = 8 +TabContainer/constants/label_valign_bg = 4 +TabContainer/constants/label_valign_fg = 0 +TabContainer/constants/side_margin = 16 +TabContainer/constants/top_margin = 48 +TabContainer/fonts/font = null +TabContainer/icons/decrement = null +TabContainer/icons/decrement_highlight = null +TabContainer/icons/increment = null +TabContainer/icons/increment_highlight = null +TabContainer/icons/menu = null +TabContainer/icons/menu_highlight = null +TabContainer/styles/panel = ExtResource( 8 ) +TabContainer/styles/tab_bg = ExtResource( 23 ) +TabContainer/styles/tab_disabled = ExtResource( 22 ) +TabContainer/styles/tab_fg = ExtResource( 21 ) +Tabs/colors/font_color_bg = Color( 0.69, 0.69, 0.69, 1 ) +Tabs/colors/font_color_disabled = Color( 0.9, 0.9, 0.9, 0.2 ) +Tabs/colors/font_color_fg = Color( 0.94, 0.94, 0.94, 1 ) +Tabs/constants/hseparation = 8 +Tabs/constants/label_valign_bg = 4 +Tabs/constants/label_valign_fg = 0 +Tabs/constants/top_margin = 48 +Tabs/fonts/font = null +Tabs/icons/close = null +Tabs/icons/decrement = null +Tabs/icons/decrement_highlight = null +Tabs/icons/increment = null +Tabs/icons/increment_highlight = null +Tabs/styles/button = ExtResource( 4 ) +Tabs/styles/button_pressed = ExtResource( 7 ) +Tabs/styles/panel = ExtResource( 8 ) +Tabs/styles/tab_bg = ExtResource( 4 ) +Tabs/styles/tab_disabled = ExtResource( 2 ) +Tabs/styles/tab_fg = ExtResource( 8 ) +TextEdit/colors/background_color = Color( 0, 0, 0, 1 ) +TextEdit/colors/bookmark_color = Color( 0.08, 0.49, 0.98, 1 ) +TextEdit/colors/brace_mismatch_color = Color( 1, 0.2, 0.2, 1 ) +TextEdit/colors/breakpoint_color = Color( 0.8, 0.8, 0.4, 0.2 ) +TextEdit/colors/caret_background_color = Color( 0, 0, 0, 1 ) +TextEdit/colors/caret_color = Color( 0.88, 0.88, 0.88, 1 ) +TextEdit/colors/code_folding_color = Color( 0.8, 0.8, 0.8, 0.8 ) +TextEdit/colors/completion_background_color = Color( 0.17, 0.16, 0.2, 1 ) +TextEdit/colors/completion_existing_color = Color( 0.87, 0.87, 0.87, 0.13 ) +TextEdit/colors/completion_font_color = Color( 0.67, 0.67, 0.67, 1 ) +TextEdit/colors/completion_scroll_color = Color( 1, 1, 1, 1 ) +TextEdit/colors/completion_selected_color = Color( 0.26, 0.26, 0.27, 1 ) +TextEdit/colors/current_line_color = Color( 0.25, 0.25, 0.26, 0.8 ) +TextEdit/colors/executing_line_color = Color( 0.2, 0.8, 0.2, 0.4 ) +TextEdit/colors/font_color = Color( 0.88, 0.88, 0.88, 1 ) +TextEdit/colors/font_color_readonly = Color( 0.88, 0.88, 0.88, 0.5 ) +TextEdit/colors/font_color_selected = Color( 0, 0, 0, 1 ) +TextEdit/colors/function_color = Color( 0.4, 0.64, 0.81, 1 ) +TextEdit/colors/line_number_color = Color( 0.67, 0.67, 0.67, 0.4 ) +TextEdit/colors/mark_color = Color( 1, 0.4, 0.4, 0.4 ) +TextEdit/colors/member_variable_color = Color( 0.9, 0.31, 0.35, 1 ) +TextEdit/colors/number_color = Color( 0.92, 0.58, 0.2, 1 ) +TextEdit/colors/safe_line_number_color = Color( 0.67, 0.78, 0.67, 0.6 ) +TextEdit/colors/selection_color = Color( 0.49, 0.49, 0.49, 1 ) +TextEdit/colors/symbol_color = Color( 0.94, 0.94, 0.94, 1 ) +TextEdit/colors/word_highlighted_color = Color( 0.8, 0.9, 0.9, 0.15 ) +TextEdit/constants/completion_lines = 7 +TextEdit/constants/completion_max_width = 50 +TextEdit/constants/completion_scroll_width = 3 +TextEdit/constants/line_spacing = 8 +TextEdit/fonts/font = null +TextEdit/icons/fold = null +TextEdit/icons/folded = null +TextEdit/icons/space = null +TextEdit/icons/tab = null +TextEdit/styles/completion = ExtResource( 3 ) +TextEdit/styles/focus = ExtResource( 3 ) +TextEdit/styles/normal = ExtResource( 8 ) +TextEdit/styles/read_only = ExtResource( 2 ) +ToolButton/colors/font_color = Color( 0.88, 0.88, 0.88, 1 ) +ToolButton/colors/font_color_disabled = Color( 0.9, 0.95, 1, 0.3 ) +ToolButton/colors/font_color_hover = Color( 0.94, 0.94, 0.94, 1 ) +ToolButton/colors/font_color_pressed = Color( 1, 1, 1, 1 ) +ToolButton/constants/hseparation = 3 +ToolButton/fonts/font = null +ToolButton/styles/disabled = ExtResource( 2 ) +ToolButton/styles/focus = ExtResource( 3 ) +ToolButton/styles/hover = ExtResource( 5 ) +ToolButton/styles/normal = ExtResource( 4 ) +ToolButton/styles/pressed = ExtResource( 7 ) +TooltipLabel/colors/font_color = Color( 1, 1, 1, 1 ) +TooltipLabel/colors/font_color_shadow = Color( 0, 0, 0, 0.1 ) +TooltipLabel/constants/shadow_offset_x = 1 +TooltipLabel/constants/shadow_offset_y = 1 +TooltipLabel/fonts/font = null +TooltipPanel/styles/panel = ExtResource( 8 ) +Tree/colors/cursor_color = Color( 0, 0, 0, 1 ) +Tree/colors/custom_button_font_highlight = Color( 0.94, 0.94, 0.94, 1 ) +Tree/colors/drop_position_color = Color( 1, 0.3, 0.2, 1 ) +Tree/colors/font_color = Color( 0.69, 0.69, 0.69, 1 ) +Tree/colors/font_color_selected = Color( 1, 1, 1, 1 ) +Tree/colors/guide_color = Color( 0, 0, 0, 0.1 ) +Tree/colors/relationship_line_color = Color( 0.27, 0.27, 0.27, 1 ) +Tree/colors/selection_color = Color( 0.1, 0.1, 1, 0.8 ) +Tree/colors/title_button_color = Color( 0.88, 0.88, 0.88, 1 ) +Tree/constants/button_margin = 8 +Tree/constants/draw_guides = 1 +Tree/constants/draw_relationship_lines = 0 +Tree/constants/hseparation = 8 +Tree/constants/item_margin = 24 +Tree/constants/scroll_border = 4 +Tree/constants/scroll_speed = 12 +Tree/constants/vseparation = 8 +Tree/fonts/font = null +Tree/fonts/title_button_font = null +Tree/icons/arrow = null +Tree/icons/arrow_collapsed = null +Tree/icons/checked = null +Tree/icons/select_arrow = null +Tree/icons/unchecked = null +Tree/icons/updown = null +Tree/styles/bg = ExtResource( 8 ) +Tree/styles/bg_focus = null +Tree/styles/button_pressed = null +Tree/styles/cursor = null +Tree/styles/cursor_unfocused = null +Tree/styles/custom_button = null +Tree/styles/custom_button_hover = null +Tree/styles/custom_button_pressed = null +Tree/styles/selected = null +Tree/styles/selected_focus = null +Tree/styles/title_button_hover = null +Tree/styles/title_button_normal = null +Tree/styles/title_button_pressed = null +VBoxContainer/constants/separation = 8 +VScrollBar/icons/decrement = null +VScrollBar/icons/decrement_highlight = null +VScrollBar/icons/increment = null +VScrollBar/icons/increment_highlight = null +VScrollBar/styles/grabber = ExtResource( 12 ) +VScrollBar/styles/grabber_highlight = ExtResource( 10 ) +VScrollBar/styles/grabber_pressed = ExtResource( 13 ) +VScrollBar/styles/scroll = ExtResource( 11 ) +VScrollBar/styles/scroll_focus = ExtResource( 14 ) +WindowDialog/colors/title_color = Color( 0, 0, 0, 1 ) +WindowDialog/constants/close_h_ofs = 36 +WindowDialog/constants/close_v_ofs = 36 +WindowDialog/constants/scaleborder_size = 8 +WindowDialog/constants/title_height = 40 +WindowDialog/fonts/title_font = null +WindowDialog/icons/close = null +WindowDialog/icons/close_highlight = null +WindowDialog/styles/panel = ExtResource( 8 ) +script = ExtResource( 24 ) +content_margin_vertical_normal = 6.0 +content_margin_vertical_touch = 10.0 +content_margin_horizontal_normal = 5.0 +content_margin_horizontal_touch = 20.0 diff --git a/game/ui/theme/unlocked_icon.tres b/game/ui/theme/unlocked_icon.tres new file mode 100644 index 0000000..f89a110 --- /dev/null +++ b/game/ui/theme/unlocked_icon.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 50, 108, 20, 20 ) diff --git a/game/ui/theme/window_bg_atlas.tres b/game/ui/theme/window_bg_atlas.tres new file mode 100644 index 0000000..9b0e3ef --- /dev/null +++ b/game/ui/theme/window_bg_atlas.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 31, 49, 10, 11 ) diff --git a/game/ui/theme/window_bg_bg.tres b/game/ui/theme/window_bg_bg.tres new file mode 100644 index 0000000..9b0e3ef --- /dev/null +++ b/game/ui/theme/window_bg_bg.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 31, 49, 10, 11 ) diff --git a/game/ui/touch_movement_controls/TouchMovementControls.tscn b/game/ui/touch_movement_controls/TouchMovementControls.tscn new file mode 100644 index 0000000..6a59c42 --- /dev/null +++ b/game/ui/touch_movement_controls/TouchMovementControls.tscn @@ -0,0 +1,92 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://ui/touch_pad/analog.tscn" type="PackedScene" id=1] +[ext_resource path="res://ui/touch_pad/TurnPanel.gd" type="Script" id=2] +[ext_resource path="res://ui/touch_pad/analog.gd" type="Script" id=3] + +[node name="TouchMovementControls" type="MarginContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +custom_constants/margin_top = 200 +__meta__ = { +"_edit_group_": true, +"_edit_use_anchors_": false +} + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +margin_top = 200.0 +margin_right = 1024.0 +margin_bottom = 600.0 +mouse_filter = 2 +size_flags_horizontal = 7 +size_flags_vertical = 7 + +[node name="VBoxContainer" type="VBoxContainer" parent="HBoxContainer"] +margin_right = 323.0 +margin_bottom = 400.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +size_flags_stretch_ratio = 1.4 + +[node name="Control" type="Control" parent="HBoxContainer/VBoxContainer"] +margin_right = 323.0 +margin_bottom = 196.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="TouchPad" type="Control" parent="HBoxContainer/VBoxContainer"] +margin_top = 204.0 +margin_right = 323.0 +margin_bottom = 400.0 +mouse_filter = 2 +size_flags_horizontal = 15 +size_flags_vertical = 15 + +[node name="Analog" type="Node2D" parent="HBoxContainer/VBoxContainer/TouchPad" instance=ExtResource( 1 )] +position = Vector2( 107.368, 94.2101 ) +script = ExtResource( 3 ) +__meta__ = { +"__editor_plugin_screen__": "2D" +} +isDynamicallyShowing = true +padname = "TouchPad" + +[node name="Control" type="Control" parent="HBoxContainer"] +margin_left = 327.0 +margin_right = 558.0 +margin_bottom = 400.0 +mouse_filter = 2 +size_flags_horizontal = 15 +size_flags_vertical = 15 + +[node name="VBoxContainer2" type="VBoxContainer" parent="HBoxContainer"] +margin_left = 562.0 +margin_right = 1024.0 +margin_bottom = 400.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +size_flags_stretch_ratio = 2.0 + +[node name="Control" type="Control" parent="HBoxContainer/VBoxContainer2"] +margin_right = 462.0 +margin_bottom = 150.0 +mouse_filter = 2 +size_flags_vertical = 3 + +[node name="TurnPanel" type="Control" parent="HBoxContainer/VBoxContainer2"] +margin_top = 158.0 +margin_right = 462.0 +margin_bottom = 400.0 +mouse_filter = 2 +size_flags_horizontal = 15 +size_flags_vertical = 15 +size_flags_stretch_ratio = 1.6 + +[node name="Node2D" type="Node2D" parent="HBoxContainer/VBoxContainer2/TurnPanel"] +position = Vector2( -600, -200 ) +script = ExtResource( 2 ) +listenerNodePath = "../../../../../../.." diff --git a/game/ui/touch_movement_controls/game_module.tres b/game/ui/touch_movement_controls/game_module.tres new file mode 100644 index 0000000..d6fe9a7 --- /dev/null +++ b/game/ui/touch_movement_controls/game_module.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" load_steps=3 format=2] + +[ext_resource path="res://scripts/game_modules/ui_gui_child_module.gd" type="Script" id=1] +[ext_resource path="res://ui/touch_movement_controls/TouchMovementControls.tscn" type="PackedScene" id=2] + +[resource] +script = ExtResource( 1 ) +enabled = true +scene = ExtResource( 2 ) +hide = false diff --git a/game/ui/touch_pad/TurnPanel.gd b/game/ui/touch_pad/TurnPanel.gd new file mode 100644 index 0000000..fa85b65 --- /dev/null +++ b/game/ui/touch_pad/TurnPanel.gd @@ -0,0 +1,115 @@ +extends Node2D + +const INACTIVE_IDX = -1; + +export (String) var listenerNodePath : String = "../../../../../.." +export (String) var padname : String = "" + +var parent : Control + +var centerPoint = Vector2(0,0) +var currentForce = Vector2(0,0) +var last_pointer_position : Vector2 = Vector2() + +var currentPointerIDX = INACTIVE_IDX; + +var listener : Node = null + +func _ready(): + parent = get_node("..") + listener = get_node(listenerNodePath) + + if listener != null: + if not listener.has_method("queue_camera_rotation"): + listener = null + + set_process_input(true) + +func get_force(): + return currentForce + +func _input(event): + var incomingPointer = extractPointerIdx(event) + + if incomingPointer == INACTIVE_IDX: + return + + if need2ChangeActivePointer(event): + if (currentPointerIDX != incomingPointer) and event.is_pressed(): + currentPointerIDX = incomingPointer; + last_pointer_position = Vector2(event.position.x - parent.get_global_rect().position.x, event.position.y - parent.get_global_rect().position.y); + + get_tree().set_input_as_handled() + + var theSamePointer = currentPointerIDX == incomingPointer + if isActive() and theSamePointer: + process_input(event) + +func need2ChangeActivePointer(event): #touch down inside analog + if event is InputEventMouseButton or event is InputEventScreenTouch: + return parent.get_global_rect().has_point(Vector2(event.position.x, event.position.y)) + else: + return false + +func isActive(): + return currentPointerIDX != INACTIVE_IDX + +func extractPointerIdx(event): + var touch = event is InputEventScreenTouch + var drag = event is InputEventScreenDrag + var mouseButton = event is InputEventMouseButton + var mouseMove = event is InputEventMouseMotion + + #print(event) + if touch: + return event.index + + elif drag: + + + return event.index + elif mouseButton or mouseMove: + #plog("SOMETHING IS VERYWRONG??, I HAVE MOUSE ON TOUCH DEVICE") + return INACTIVE_IDX + else: + return INACTIVE_IDX + +func process_input(event): + calculateForce(event.position.x - parent.get_global_rect().position.x, event.position.y - parent.get_global_rect().position.y) + + var isReleased = isReleased(event) + if isReleased: + reset() + + get_tree().set_input_as_handled() + + +func reset(): + currentPointerIDX = INACTIVE_IDX + ##calculateForce(0, 0) + last_pointer_position = Vector2() + +func calculateForce(var x, var y): + var v : Vector2 = Vector2(x, y) + currentForce = last_pointer_position - v + last_pointer_position = v + + sendSignal2Listener() + +func sendSignal2Listener(): + if (listener != null): +# listener.analog_force_change(currentForce, self) + listener.queue_camera_rotation(currentForce) + +func isPressed(event): + if event is InputEventMouseMotion: + return (InputEventMouse.button_mask == 1) + elif event is InputEventScreenTouch: + return event.is_pressed() + +func isReleased(event): + if event is InputEventScreenTouch: + return !event.is_pressed() + elif event is InputEventMouseButton: + return !event.is_pressed() + diff --git a/game/ui/touch_pad/analog.gd b/game/ui/touch_pad/analog.gd new file mode 100644 index 0000000..2d8f5f1 --- /dev/null +++ b/game/ui/touch_pad/analog.gd @@ -0,0 +1,156 @@ +extends Node2D + +# This is by someone else TODO check! + +const INACTIVE_IDX = -1; +export var isDynamicallyShowing = false +export (String) var listenerNodePath : String = "../../../../../../.." +export var padname = "" + +var ball +var bg +var animation_player +var parent +var listenerNode + +var centerPoint = Vector2(0,0) +var currentForce = Vector2(0,0) +var halfSize = Vector2() +var ballPos = Vector2() +var squaredHalfSizeLength = 0 +var currentPointerIDX = INACTIVE_IDX; + +func _ready(): + set_process_input(true) + bg = get_node("bg") + ball = get_node("ball") + animation_player = get_node("AnimationPlayer") + parent = get_parent() + halfSize = bg.texture.get_size()/2 + squaredHalfSizeLength = halfSize.x * halfSize.y + + if (listenerNodePath != "" && listenerNodePath!=null): + listenerNode = get_node(listenerNodePath) + elif listenerNodePath=="": + listenerNode = null + +# isDynamicallyShowing = isDynamicallyShowing and parent extends Control + if isDynamicallyShowing: + modulate.a = 0 +# hide() + +func get_force(): + return currentForce + +func _unhandled_input(event): + + var incomingPointer = extractPointerIdx(event) + #print(incomingPointer) + + if incomingPointer == INACTIVE_IDX: + return + + if need2ChangeActivePointer(event): + if (currentPointerIDX != incomingPointer) and event.is_pressed(): + currentPointerIDX = incomingPointer; + showAtPos(Vector2(event.position.x, event.position.y)); + get_tree().set_input_as_handled() + + var theSamePointer = currentPointerIDX == incomingPointer + if isActive() and theSamePointer: + process_input(event) + +func need2ChangeActivePointer(event): #touch down inside analog + if event is InputEventMouseButton or event is InputEventScreenTouch: + if isDynamicallyShowing: + #print(get_parent().get_global_rect()) + return get_parent().get_global_rect().has_point(Vector2(event.position.x, event.position.y)) + else: + var length = (global_position - Vector2(event.position.x, event.position.y)).length_squared(); + return length < squaredHalfSizeLength + else: + return false + +func isActive(): + return currentPointerIDX != INACTIVE_IDX + +func extractPointerIdx(event): + var touch = event is InputEventScreenTouch + var drag = event is InputEventScreenDrag + var mouseButton = event is InputEventMouseButton + var mouseMove = event is InputEventMouseMotion + + #print(event) + if touch: + return event.index + + elif drag: + + + return event.index + elif mouseButton or mouseMove: + #plog("SOMETHING IS VERYWRONG??, I HAVE MOUSE ON TOUCH DEVICE") + return INACTIVE_IDX + else: + return INACTIVE_IDX + +func process_input(event): + calculateForce(event.position.x - global_position.x, event.position.y - global_position.y) + updateBallPos() + + var isReleased = isReleased(event) + if isReleased: + reset() + + get_tree().set_input_as_handled() + + +func reset(): + currentPointerIDX = INACTIVE_IDX + calculateForce(0, 0) + + if isDynamicallyShowing: + hide() + else: + updateBallPos() + +func showAtPos(pos): + if isDynamicallyShowing: + animation_player.play("alpha_in", 0.2) + global_position = pos + +func hide(): + animation_player.play("alpha_out", 0.2) + +func updateBallPos(): + ballPos.x = halfSize.x * currentForce.x #+ halfSize.x + ballPos.y = halfSize.y * -currentForce.y #+ halfSize.y + ball.position = Vector2(ballPos.x, ballPos.y) + +func calculateForce(var x, var y): + #get direction + currentForce.x = (x - centerPoint.x)/halfSize.x + currentForce.y = -(y - centerPoint.y)/halfSize.y + #print(currentForce.x, currentForce.y) + #limit + #print(currentForce.length_squared()) + if currentForce.length_squared()>1: + currentForce=currentForce/currentForce.length() + + sendSignal2Listener() + +func sendSignal2Listener(): + if (listenerNode != null): + listenerNode.analog_force_change(currentForce, self) + +func isPressed(event): + if event is InputEventMouseMotion: + return (InputEventMouse.button_mask == 1) + elif event is InputEventScreenTouch: + return event.is_pressed() + +func isReleased(event): + if event is InputEventScreenTouch: + return !event.is_pressed() + elif event is InputEventMouseButton: + return !event.is_pressed() diff --git a/game/ui/touch_pad/analog.tscn b/game/ui/touch_pad/analog.tscn new file mode 100644 index 0000000..a5187c5 --- /dev/null +++ b/game/ui/touch_pad/analog.tscn @@ -0,0 +1,94 @@ +[gd_scene load_steps=8 format=2] + +[ext_resource path="res://ui/touch_pad/analog.gd" type="Script" id=1] +[ext_resource path="res://ui/touch_pad/big_circle.png" type="Texture" id=2] +[ext_resource path="res://ui/touch_pad/small_circle.png" type="Texture" id=3] + +[sub_resource type="Animation" id=1] +length = 5.0 +tracks/0/type = "value" +tracks/0/path = NodePath(".:modulate") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Color( 1, 1, 1, 1 ) ] +} + +[sub_resource type="Animation" id=2] +step = 1.0 +tracks/0/type = "value" +tracks/0/path = NodePath(".:modulate") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 0 ), +"update": 0, +"values": [ Color( 0, 0, 0, 0 ) ] +} + +[sub_resource type="Animation" id=3] +tracks/0/type = "value" +tracks/0/path = NodePath("ball:rotation_degrees") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("ball:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 0, 0 ) ] +} + +[sub_resource type="Animation" id=4] +tracks/0/type = "value" +tracks/0/path = NodePath(".:modulate") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Color( 1, 1, 1, 1 ) ] +} + +[node name="Analog" type="Node2D"] +script = ExtResource( 1 ) +__meta__ = { +"__editor_plugin_screen__": "2D" +} +isDynamicallyShowing = true + +[node name="bg" type="Sprite" parent="."] +texture = ExtResource( 2 ) + +[node name="ball" type="Sprite" parent="."] +texture = ExtResource( 3 ) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +anims/alpha_in = SubResource( 1 ) +anims/alpha_out = SubResource( 2 ) +anims/ball_center = SubResource( 3 ) +anims/default = SubResource( 4 ) diff --git a/game/ui/touch_pad/analog.xml b/game/ui/touch_pad/analog.xml new file mode 100644 index 0000000..2152ca6 --- /dev/null +++ b/game/ui/touch_pad/analog.xml @@ -0,0 +1,313 @@ + + + + + + + + + + + 1 + False + 0.1 + "value" + ".:visibility/opacity" + 1 + + "cont" + True + "times" + 0 + "transitions" + 1 + "values" + + 1 + + + + + + 5 + False + 0.1 + "value" + ".:visibility/opacity" + 1 + + "cont" + True + "times" + 0 + "transitions" + 1 + "values" + + 1 + + + + + + 1 + False + 0.1 + "value" + "ball:transform/pos" + 1 + + "cont" + True + "times" + 0 + "transitions" + 1 + "values" + + 0, 0 + + + "value" + "ball:transform/rot" + 1 + + "cont" + True + "times" + 0 + "transitions" + 1 + "values" + + 0 + + + + + + 1 + False + 1 + "value" + ".:visibility/opacity" + 1 + + "cont" + True + "times" + 0 + "transitions" + 1 + "values" + + 0 + + + + + + + "conn_count" + 0 + "conns" + + "editable_instances" + + + "names" + + "Analog" + "transform/pos" + "script/script" + "__meta__" + "isDynamicallyShowing" + "listenerNodePath" + "name" + "Node2D" + "bg" + "texture" + "Sprite" + "ball" + "AnimationPlayer" + "playback/process_mode" + "playback/default_blend_time" + "root/root" + "anims/default" + "anims/alpha_in" + "anims/ball_center" + "anims/alpha_out" + "playback/active" + "playback/speed" + "blend_times" + "autoplay" + + "node_count" + 4 + "node_paths" + + + "nodes" + -1, -1, 7, 0, -1, 6, 1, 0, 2, 1, 3, 2, 4, 3, 5, 4, 6, 4, 0, 0, 0, 10, 8, -1, 1, 9, 5, 0, 0, 0, 10, 11, -1, 1, 9, 6, 0, 0, 0, 12, 12, -1, 11, 13, 7, 14, 8, 15, 9, 16, 10, 17, 11, 18, 12, 19, 13, 20, 14, 21, 15, 22, 16, 23, 4, 0 + "variants" + + 192.941, 221.425 + + + "__editor_plugin_screen__" + "2D" + "__editor_plugin_states__" + + "2D" + + "ofs" + -534.358, 78.6721 + "snap_grid" + True + "snap_offset" + 0, 0 + "snap_pixel" + False + "snap_relative" + False + "snap_rotation" + False + "snap_rotation_offset" + 0 + "snap_rotation_step" + 0.261799 + "snap_show_grid" + False + "snap_step" + 10, 10 + "zoom" + 0.814506 + + "3D" + + "ambient_light_color" + 0.15, 0.15, 0.15, 1 + "default_light" + True + "default_srgb" + False + "deflight_rot_x" + 0.942478 + "deflight_rot_y" + 0.628319 + "fov" + 45 + "show_grid" + True + "show_origin" + True + "viewport_mode" + 1 + "viewports" + + + "distance" + 4 + "listener" + True + "pos" + -0.972839, 5.12177, 4.10017 + "use_environment" + False + "use_orthogonal" + False + "x_rot" + 0 + "y_rot" + 0 + + + "distance" + 4 + "listener" + False + "pos" + 0, 0, 0 + "use_environment" + False + "use_orthogonal" + False + "x_rot" + 0 + "y_rot" + 0 + + + "distance" + 4 + "listener" + False + "pos" + 0, 0, 0 + "use_environment" + False + "use_orthogonal" + False + "x_rot" + 0 + "y_rot" + 0 + + + "distance" + 4 + "listener" + False + "pos" + 0, 0, 0 + "use_environment" + False + "use_orthogonal" + False + "x_rot" + 0 + "y_rot" + 0 + + + "zfar" + 500 + "znear" + 0.1 + + "Anim" + + "visible" + False + + + "__editor_run_settings__" + + "custom_args" + "-l $scene" + "run_mode" + 0 + + + False + "" + + + 1 + 0 + ".." + + + + + True + 1 + + + + "version" + 2 + + + + \ No newline at end of file diff --git a/game/ui/touch_pad/big_circle.png b/game/ui/touch_pad/big_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..f5e305bf2d2ec663b45da829f39435878b4aa7f1 GIT binary patch literal 3779 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 literal 0 HcmV?d00001 diff --git a/game/ui/touch_pad/big_circle.png.import b/game/ui/touch_pad/big_circle.png.import new file mode 100644 index 0000000..4fba719 --- /dev/null +++ b/game/ui/touch_pad/big_circle.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/big_circle.png-3e7d1c39c6dde9ffecb18aecfb2a2a19.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://ui/touch_pad/big_circle.png" +dest_files=[ "res://.import/big_circle.png-3e7d1c39c6dde9ffecb18aecfb2a2a19.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/game/ui/touch_pad/small_circle.png b/game/ui/touch_pad/small_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..5bc2c840cacadb8f648d101b0e2743b90850db97 GIT binary patch literal 834 zcmV-I1HJr-P)4Q_K~z|U#n;b^m1PtM@Xzy76D2bfq|r#Y5EO!JV~L@Q3fia` zL?EfH`Uiq+Wf|Biv|r1ZT1K^~FshZ1w5Tb|jU_~2MBoS-sna-?;A!!^Z}+*kxy-%H zeaG+Wobx>Q{eC&mbI)^5G9V)2c07*V*of6wQ!ih@Mf{9UaXh88FzC0JB3>5}??%LY z4357dVmc!3T@LZ8h&U1v3quh1;%Y>^T4!%jq(0XdfTT)8r|0ke6rxVyxhi>3?ygwvyFZSU%RJA{YM^j4I6hU~gAU7g%cn@zC z{#G1poWy^Z?icy|$Z3Ch1mq=N(K(KJY)C21HW@fnkYB>l5tG9aoqM!O&bTTfZo}SU z<22@45O4+W6#l-57^~#+I$j5_$$z!B@UdJ=U=oj2*ja4&0e`nBU;*D3{;mr56@i%+ z$s2rA*qbZ4gf=*@ef(P3>np4+0vA?5z@@^TtaO*-SOEcDsBo_E*Yw*sLfl!{mn->M zZ7`*MtS{`d70wiahgU$rw!%JD$&E*Y2jw!^7RGfqImap-*SVQv*wdnbJ-DT||HPM7 zO6fX2EH*u(yOS9eCb7TpKS(KEZ(hU0xLVs2c)kSz2Xx+?dHH$H4M|Gr9NsK8@50j~ zB;T*QHG89JP;W*{_AMT1TCzc#(xZm&5r%6@3laC@bF3@Em*r++Ic@oG*qKuLsodOe zFu5BaVSCR~GnjmhvpQKBmn+;hxt8<}CST#Hl+xgjT||sU#7hw|w~WzjE+P&_#H|Ap zFCt_r@}N2FaQb#c+_Tj87d?VLLdx;{0r`%su9q*$XM7sR3^AVn3qc^X=|5shGXMYp M07*qoM6N<$f`9&bzW@LL literal 0 HcmV?d00001 diff --git a/game/ui/touch_pad/small_circle.png.import b/game/ui/touch_pad/small_circle.png.import new file mode 100644 index 0000000..4b1aff8 --- /dev/null +++ b/game/ui/touch_pad/small_circle.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/small_circle.png-035ef8e6fee54222401287369836bd6a.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://ui/touch_pad/small_circle.png" +dest_files=[ "res://.import/small_circle.png-035ef8e6fee54222401287369836bd6a.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/game/ui/touch_target_controls/TouchTargetControls.tscn b/game/ui/touch_target_controls/TouchTargetControls.tscn new file mode 100644 index 0000000..8aea33b --- /dev/null +++ b/game/ui/touch_target_controls/TouchTargetControls.tscn @@ -0,0 +1,55 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/touch_pad/analog.tscn" type="PackedScene" id=1] +[ext_resource path="res://ui/touch_pad/analog.gd" type="Script" id=2] + +[node name="TouchTargetControls" type="MarginContainer"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +custom_constants/margin_right = 272 +custom_constants/margin_top = 481 +custom_constants/margin_left = 60 +custom_constants/margin_bottom = 41 +__meta__ = { +"_edit_group_": true +} + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +margin_left = 60.0 +margin_top = 481.0 +margin_right = 752.0 +margin_bottom = 559.0 +mouse_filter = 2 +size_flags_horizontal = 7 +size_flags_vertical = 7 + +[node name="Control" type="Control" parent="HBoxContainer"] +margin_right = 603.0 +margin_bottom = 78.0 +mouse_filter = 2 +size_flags_horizontal = 15 +size_flags_vertical = 15 +size_flags_stretch_ratio = 12.0 + +[node name="TargetPad" type="Control" parent="HBoxContainer"] +margin_left = 611.0 +margin_right = 692.0 +margin_bottom = 78.0 +mouse_filter = 2 +size_flags_horizontal = 15 +size_flags_vertical = 15 +size_flags_stretch_ratio = 1.6 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Analog" type="Node2D" parent="HBoxContainer/TargetPad" instance=ExtResource( 1 )] +position = Vector2( 40, 30 ) +script = ExtResource( 2 ) +__meta__ = { +"__editor_plugin_screen__": "2D" +} +isDynamicallyShowing = true +padname = "TargetPad" diff --git a/game/ui/touch_target_controls/game_module.tres b/game/ui/touch_target_controls/game_module.tres new file mode 100644 index 0000000..dc68a36 --- /dev/null +++ b/game/ui/touch_target_controls/game_module.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" load_steps=3 format=2] + +[ext_resource path="res://scripts/game_modules/ui_gui_child_module.gd" type="Script" id=1] +[ext_resource path="res://ui/touch_target_controls/TouchTargetControls.tscn" type="PackedScene" id=2] + +[resource] +script = ExtResource( 1 ) +enabled = true +scene = ExtResource( 2 ) +hide = false diff --git a/game/ui/trainer/TrainerWindow.gd b/game/ui/trainer/TrainerWindow.gd new file mode 100644 index 0000000..7b8bf55 --- /dev/null +++ b/game/ui/trainer/TrainerWindow.gd @@ -0,0 +1,227 @@ +extends Control + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(NodePath) var spell_entry_container_path : NodePath +export(NodePath) var learn_button_path : NodePath +export(NodePath) var cost_label_path : NodePath + +export(NodePath) var spell_icon_path : NodePath +export(NodePath) var spell_name_label_path : NodePath +export(NodePath) var spell_description_label_path : NodePath +export(NodePath) var spell_requirements_label_path : NodePath + +var _spell_entry_container : Node +var _spell_entries : Array + +var _learn_button : Button +var _cost_label : Label + +var _spell_icon : TextureRect +var _spell_name_label : Label +var _spell_description_label : Label +var _spell_requirements_label : Label + +var _player : Entity + +var _entity_data : EntityData +var _character_class : EntityClassData + +var _spells : Array + +var _spell_button_group : ButtonGroup + +func _ready() -> void: + _spell_button_group = ButtonGroup.new() + + _spell_entry_container = get_node(spell_entry_container_path) + + _spell_icon = get_node(spell_icon_path) as TextureRect + _spell_name_label = get_node(spell_name_label_path) as Label + _spell_description_label = get_node(spell_description_label_path) as Label + _spell_requirements_label = get_node(spell_requirements_label_path) as Label + + _learn_button = get_node(learn_button_path) + _cost_label = get_node(cost_label_path) + + _learn_button.connect("pressed", self, "learn") + + connect("visibility_changed", self, "_visibility_changed") + +func learn() -> void: + if _character_class == null: + return + + if _player == null: + return + + var b : Button = _spell_button_group.get_pressed_button() + + if b: + var spell : Spell = b.get_meta("spell") + + _player.spell_learn_requestc(spell.id) + + refresh_entries() + +func refresh_entries() -> void: + if _character_class == null or _player == null: + return + + for c in _spell_entry_container.get_children(): + c.queue_free() + + _spell_entries.clear() + + for s in _spells: + var spell : Spell = s + + if !spell: + continue + + if _player.spell_hasc(spell): + continue + + var b : Button = Button.new() + + b.text = spell.text_name + " (rank " + str(spell.rank) + ")" + b.set_meta("spell", spell) + b.group = _spell_button_group + b.toggle_mode = true + b.connect("pressed", self, "_button_pressed") + + _spell_entries.append(b) + _spell_entry_container.add_child(b) + + if _spell_entries.size() > 0: + _spell_entries[0].pressed = true + _button_pressed() + +func refresh_all() -> void: + if _player == null: + return + + if _character_class == null: + return + + refresh_entries() + + +func _visibility_changed() -> void: + if visible: + refresh_all() + +func set_player(p_player: Entity) -> void: + if _player != null: + _player.disconnect("centity_data_changed", self, "centity_data_changed") + _player.disconnect("onc_open_winow_request", self, "onc_open_winow_request") + + _player = p_player + + _player.connect("centity_data_changed", self, "centity_data_changed") + _player.connect("onc_open_winow_request", self, "onc_open_winow_request") + + if _player != null: + centity_data_changed(_player.centity_data) + else: + centity_data_changed(null) + +func centity_data_changed(data: EntityData): + _spells.clear() + + _entity_data = null + _character_class = null + + if data == null: + return + + _entity_data = _player.centity_data + _character_class = _entity_data.entity_class_data + + if _character_class == null: + return + + for i in range(_character_class.get_num_spells()): + _spells.append(_character_class.get_spell(i)) + + _spells.sort_custom(CustomSpellSorter, "sort") + + refresh_all() + +func _button_pressed(): + var b : Button = _spell_button_group.get_pressed_button() + + if b && b.has_meta("spell"): + var spell : Spell = b.get_meta("spell") + + _spell_icon.texture = spell.icon + _spell_name_label.text = spell.text_name + _spell_description_label.text = spell.text_description + + var req_str = "Required: " + + if spell.training_required_spell: + req_str += spell.training_required_spell.text_name + " (rank " + str(spell.training_required_spell.rank) + ") " + + if spell.level > 0: + req_str += "level " + str(spell.level) + + _spell_requirements_label.text = req_str + + _cost_label.text = str(spell.get_training_cost()) + + else: + _spell_icon.texture = null + _spell_name_label.text = "" + _spell_description_label.text = "" + _spell_requirements_label.text = "" + + _cost_label.text = "0" + + + +class CustomSpellSorter: + static func sort(a, b): + if a.level < b.level: + return true + elif a.level > b.level: + return false + else: + var res = a.text_name.casecmp_to(b.text_name) + + if res == 0: + if a.rank < b.rank: + return true + return false + elif res == 1: + return false + + return true + + +func onc_open_winow_request(window_id : int) -> void: + if window_id != EntityEnums.ENTITY_WINDOW_TRAINER: + return + + show() + +# if player.has_signal("player_moved") && !player.is_connected("player_moved", self, "on_player_moved"): +# player.connect("player_moved", self, "on_player_moved", [], CONNECT_ONESHOT) diff --git a/game/ui/trainer/TrainerWindow.tscn b/game/ui/trainer/TrainerWindow.tscn new file mode 100644 index 0000000..a92599b --- /dev/null +++ b/game/ui/trainer/TrainerWindow.tscn @@ -0,0 +1,157 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/trainer/TrainerWindow.gd" type="Script" id=1] +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=2] + +[node name="TrainerWindow" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme = ExtResource( 2 ) +script = ExtResource( 1 ) +spell_entry_container_path = NodePath("PanelContainer/VBoxContainer/PanelContainer3/ScrollContainer/Spells") +learn_button_path = NodePath("PanelContainer/VBoxContainer/HBoxContainer/Train") +cost_label_path = NodePath("PanelContainer/VBoxContainer/PanelContainer2/VBoxContainer/HBoxContainer2/Price") +spell_icon_path = NodePath("PanelContainer/VBoxContainer/PanelContainer2/VBoxContainer/HBoxContainer/VBoxContainer/Icon") +spell_name_label_path = NodePath("PanelContainer/VBoxContainer/PanelContainer2/VBoxContainer/HBoxContainer/VBoxContainer2/Name") +spell_description_label_path = NodePath("PanelContainer/VBoxContainer/PanelContainer2/VBoxContainer/HBoxContainer/VBoxContainer2/Description") +spell_requirements_label_path = NodePath("PanelContainer/VBoxContainer/PanelContainer2/VBoxContainer/HBoxContainer/VBoxContainer2/Requirements") + +[node name="PanelContainer" type="PanelContainer" parent="."] +margin_left = 49.0 +margin_top = 40.0 +margin_right = 436.0 +margin_bottom = 498.0 + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 383.0 +margin_bottom = 454.0 + +[node name="HBoxContainer2" type="HBoxContainer" parent="PanelContainer/VBoxContainer"] +margin_right = 379.0 +margin_bottom = 26.0 + +[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/HBoxContainer2"] +margin_top = 5.0 +margin_right = 345.0 +margin_bottom = 20.0 +size_flags_horizontal = 3 +text = "Trainer" + +[node name="Button" type="Button" parent="PanelContainer/VBoxContainer/HBoxContainer2"] +margin_left = 349.0 +margin_right = 379.0 +margin_bottom = 26.5702 +rect_min_size = Vector2( 30, 0 ) +text = "X" + +[node name="PanelContainer3" type="PanelContainer" parent="PanelContainer/VBoxContainer"] +margin_top = 34.0 +margin_right = 379.0 +margin_bottom = 221.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="ScrollContainer" type="ScrollContainer" parent="PanelContainer/VBoxContainer/PanelContainer3"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 375.0 +margin_bottom = 183.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +scroll_horizontal_enabled = false + +[node name="Spells" type="VBoxContainer" parent="PanelContainer/VBoxContainer/PanelContainer3/ScrollContainer"] +margin_right = 371.0 +size_flags_horizontal = 3 +custom_constants/separation = 2 + +[node name="PanelContainer2" type="PanelContainer" parent="PanelContainer/VBoxContainer"] +margin_top = 229.0 +margin_right = 379.0 +margin_bottom = 416.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer/PanelContainer2"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 375.0 +margin_bottom = 183.0 + +[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/VBoxContainer/PanelContainer2/VBoxContainer"] +margin_right = 371.0 +margin_bottom = 156.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer/PanelContainer2/VBoxContainer/HBoxContainer"] +margin_right = 60.0 +margin_bottom = 156.0 + +[node name="Icon" type="TextureRect" parent="PanelContainer/VBoxContainer/PanelContainer2/VBoxContainer/HBoxContainer/VBoxContainer"] +margin_right = 60.0 +margin_bottom = 60.0 +rect_min_size = Vector2( 60, 60 ) +expand = true + +[node name="VBoxContainer2" type="VBoxContainer" parent="PanelContainer/VBoxContainer/PanelContainer2/VBoxContainer/HBoxContainer"] +margin_left = 64.0 +margin_right = 371.0 +margin_bottom = 156.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Name" type="Label" parent="PanelContainer/VBoxContainer/PanelContainer2/VBoxContainer/HBoxContainer/VBoxContainer2"] +margin_right = 307.0 +margin_bottom = 15.0 +size_flags_horizontal = 3 +size_flags_vertical = 5 + +[node name="Requirements" type="Label" parent="PanelContainer/VBoxContainer/PanelContainer2/VBoxContainer/HBoxContainer/VBoxContainer2"] +margin_top = 23.0 +margin_right = 307.0 +margin_bottom = 38.0 +size_flags_horizontal = 3 +size_flags_vertical = 5 + +[node name="Description" type="Label" parent="PanelContainer/VBoxContainer/PanelContainer2/VBoxContainer/HBoxContainer/VBoxContainer2"] +margin_top = 46.0 +margin_right = 307.0 +margin_bottom = 156.0 +size_flags_horizontal = 3 +size_flags_vertical = 7 +autowrap = true + +[node name="HBoxContainer2" type="HBoxContainer" parent="PanelContainer/VBoxContainer/PanelContainer2/VBoxContainer"] +margin_top = 164.0 +margin_right = 371.0 +margin_bottom = 179.0 + +[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/PanelContainer2/VBoxContainer/HBoxContainer2"] +margin_right = 36.0 +margin_bottom = 15.0 +text = "Costs " + +[node name="Price" type="Label" parent="PanelContainer/VBoxContainer/PanelContainer2/VBoxContainer/HBoxContainer2"] +margin_left = 40.0 +margin_right = 40.0 +margin_bottom = 15.0 + +[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/VBoxContainer"] +margin_top = 424.0 +margin_right = 379.0 +margin_bottom = 450.0 +alignment = 2 + +[node name="Train" type="Button" parent="PanelContainer/VBoxContainer/HBoxContainer"] +margin_left = 279.0 +margin_right = 379.0 +margin_bottom = 26.5702 +rect_min_size = Vector2( 100, 0 ) +text = "Learn" +[connection signal="pressed" from="PanelContainer/VBoxContainer/HBoxContainer2/Button" to="." method="hide"] diff --git a/game/ui/trainer/game_module.tres b/game/ui/trainer/game_module.tres new file mode 100644 index 0000000..816bec2 --- /dev/null +++ b/game/ui/trainer/game_module.tres @@ -0,0 +1,11 @@ +[gd_resource type="Resource" load_steps=3 format=2] + +[ext_resource path="res://ui/trainer/TrainerWindow.tscn" type="PackedScene" id=1] +[ext_resource path="res://scripts/game_modules/ui_window_module.gd" type="Script" id=2] + +[resource] +script = ExtResource( 2 ) +enabled = true +scene = ExtResource( 1 ) +index = -1 +add_button = false diff --git a/game/ui/unitframes/TargetUnitframe.gd b/game/ui/unitframes/TargetUnitframe.gd new file mode 100644 index 0000000..e8bbc1c --- /dev/null +++ b/game/ui/unitframes/TargetUnitframe.gd @@ -0,0 +1,151 @@ +extends VBoxContainer + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export (PackedScene) var aura_entry_scene : PackedScene + +export (NodePath) var name_text_path : NodePath +export (NodePath) var health_range_path : NodePath +export (NodePath) var health_text_path : NodePath +export (NodePath) var resource_range_path : NodePath +export (NodePath) var resource_text_path : NodePath +export (NodePath) var aura_grid_path : NodePath + +var _name_text : Label +var _health_range : Range +var _health_text : Label +var _resource_range : Range +var _resource_text : Label +var _aura_grid : GridContainer + +var _player : Entity +var _mana : ManaResource +var _health : EntityResourceHealth + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + _name_text = get_node(name_text_path) as Label + _health_range = get_node(health_range_path) as Range + _health_text = get_node(health_text_path) as Label + _resource_range = get_node(resource_range_path) as Range + _resource_text = get_node(resource_text_path) as Label + _aura_grid = get_node(aura_grid_path) as GridContainer + +func set_player(p_player : Entity) -> void: + if not _player == null and is_instance_valid(_player): + _player.getc_health().disconnect("changed", self, "_on_player_health_changed") + _player.disconnect("notification_caura", self, "on_notification_caura") + _player.disconnect("diecd", self, "diecd") + _player.disconnect("centity_resource_added", self, "centity_resource_added") + + if _mana != null: + _mana.disconnect("changed", self, "_on_mana_changed") + _mana = null + + for a in _aura_grid.get_children(): + _aura_grid.remove_child(a) + a.queue_free(); + + _player = null + set_process(false) + + if p_player == null: + hide() + return + + _player = p_player + + for index in range(_player.aura_getc_count()): + var aura : AuraData = _player.aura_getc(index) + + on_notification_caura(SpellEnums.NOTIFICATION_AURA_ADDED, aura) + + _player.connect("notification_caura", self, "on_notification_caura") + _player.connect("diecd", self, "diecd", [], CONNECT_DEFERRED) + _player.connect("centity_resource_added", self, "centity_resource_added") + + for i in range(_player.resource_getc_count()): + centity_resource_added(_player.resource_getc_index(i)) + + _health = _player.getc_health() + _on_player_health_changed() + _health.connect("changed", self, "_on_player_health_changed") + + _name_text.text = _player.centity_name + + set_process(true) + show() + +func centity_resource_added(res : EntityResource): + if res is ManaResource: + _mana = res as ManaResource + _mana.connect("changed", self, "_on_mana_changed") + _on_mana_changed() + +func _on_mana_changed() -> void: + if _mana.max_value == 0: + _resource_range.min_value = 0 + _resource_range.max_value = 1 + _resource_range.value = 0 + + _resource_text.text = "" + + return + + _resource_range.min_value = 0 + _resource_range.max_value = _mana.max_value + _resource_range.value = _mana.current_value + + _resource_text.text = str(_mana.current_value) + "/" + str(_mana.max_value) + +func on_notification_caura(what : int, aura_data : AuraData) -> void: + if what == SpellEnums.NOTIFICATION_AURA_ADDED: + var created_node : Node = aura_entry_scene.instance() + + _aura_grid.add_child(created_node) + created_node.owner = _aura_grid + + created_node.set_aura_data(aura_data) + elif what == SpellEnums.NOTIFICATION_AURA_REMOVED: + for bn in _aura_grid.get_children(): + if bn.get_aura_data() == aura_data: + _aura_grid.remove_child(bn) + bn.queue_free() + return + +func _on_player_health_changed() -> void: + if _health.max_value == 0: + _health_range.min_value = 0 + _health_range.max_value = 1 + _health_range.value = 0 + + _health_text.text = "" + + return + + _health_range.min_value = 0 + _health_range.max_value = _health.max_value + _health_range.value = _health.current_value + + _health_text.text = str(_health.current_value) + "/" + str(_health.max_value) + +func diecd(entity : Entity) -> void: + set_player(null) diff --git a/game/ui/unitframes/TargetUnitframe.tscn b/game/ui/unitframes/TargetUnitframe.tscn new file mode 100644 index 0000000..17ad3b1 --- /dev/null +++ b/game/ui/unitframes/TargetUnitframe.tscn @@ -0,0 +1,98 @@ +[gd_scene load_steps=6 format=2] + +[ext_resource path="res://ui/unitframes/TargetUnitframe.gd" type="Script" id=1] +[ext_resource path="res://ui/auraframe/AuraEntry.tscn" type="PackedScene" id=2] +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=3] +[ext_resource path="res://ui/theme/scrollbar_grabber_red.tres" type="StyleBox" id=4] +[ext_resource path="res://ui/theme/scrollbar_grabber_blue.tres" type="StyleBox" id=5] + +[node name="TargetUnitframe" type="VBoxContainer"] +margin_left = 151.0 +margin_right = 300.0 +margin_bottom = 209.0 +theme = ExtResource( 3 ) +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +aura_entry_scene = ExtResource( 2 ) +name_text_path = NodePath("MarginContainer/VBoxContainer/Label") +health_range_path = NodePath("MarginContainer/VBoxContainer/MarginContainer/ProgressBar") +health_text_path = NodePath("MarginContainer/VBoxContainer/MarginContainer/Label") +resource_range_path = NodePath("MarginContainer/VBoxContainer/MarginContainer2/ProgressBar") +resource_text_path = NodePath("MarginContainer/VBoxContainer/MarginContainer2/Label") +aura_grid_path = NodePath("auras") + +[node name="MarginContainer" type="PanelContainer" parent="."] +margin_right = 149.0 +margin_bottom = 53.0 +size_flags_horizontal = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 145.0 +margin_bottom = 49.0 +size_flags_horizontal = 3 +custom_constants/separation = 0 + +[node name="Label" type="Label" parent="MarginContainer/VBoxContainer"] +margin_right = 141.0 +margin_bottom = 15.0 +size_flags_horizontal = 3 +valign = 1 + +[node name="MarginContainer" type="MarginContainer" parent="MarginContainer/VBoxContainer"] +margin_top = 15.0 +margin_right = 141.0 +margin_bottom = 30.0 +size_flags_horizontal = 3 +custom_constants/margin_top = 0 +custom_constants/margin_bottom = 0 + +[node name="ProgressBar" type="ProgressBar" parent="MarginContainer/VBoxContainer/MarginContainer"] +margin_right = 141.0 +margin_bottom = 15.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/fg = ExtResource( 4 ) +percent_visible = false + +[node name="Label" type="Label" parent="MarginContainer/VBoxContainer/MarginContainer"] +margin_right = 141.0 +margin_bottom = 15.0 +align = 1 +valign = 1 + +[node name="MarginContainer2" type="MarginContainer" parent="MarginContainer/VBoxContainer"] +margin_top = 30.0 +margin_right = 141.0 +margin_bottom = 45.0 +size_flags_horizontal = 3 +custom_constants/margin_top = 0 +custom_constants/margin_bottom = 0 + +[node name="ProgressBar" type="ProgressBar" parent="MarginContainer/VBoxContainer/MarginContainer2"] +margin_right = 141.0 +margin_bottom = 15.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/fg = ExtResource( 5 ) +percent_visible = false + +[node name="Label" type="Label" parent="MarginContainer/VBoxContainer/MarginContainer2"] +margin_right = 141.0 +margin_bottom = 15.0 +align = 1 +valign = 1 + +[node name="auras" type="GridContainer" parent="."] +margin_top = 61.0 +margin_right = 149.0 +margin_bottom = 209.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +columns = 9 +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/game/ui/unitframes/UnitframeBase.gd b/game/ui/unitframes/UnitframeBase.gd new file mode 100644 index 0000000..3776057 --- /dev/null +++ b/game/ui/unitframes/UnitframeBase.gd @@ -0,0 +1,150 @@ +extends Container + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export (NodePath) var name_text_path : NodePath +export (NodePath) var level_text_path : NodePath +export (NodePath) var health_range_path : NodePath +export (NodePath) var health_text_path : NodePath +export (NodePath) var resource_range_path : NodePath +export (NodePath) var resource_text_path : NodePath +export (NodePath) var xp_range_path : NodePath + +var _name_text : Label +var _level_text : Label +var _health_range : Range +var _health_text : Label +var _resource_range : Range +var _resource_text : Label +var _xp_range : Range + +var _player : Entity + +var _mana : ManaResource +var _health : EntityResourceHealth + +func _ready() -> void: + _name_text = get_node(name_text_path) + _level_text = get_node(level_text_path) + _health_range = get_node(health_range_path) + _health_text = get_node(health_text_path) + _resource_range = get_node(resource_range_path) + _resource_text = get_node(resource_text_path) + _xp_range = get_node(xp_range_path) + +func set_player(p_player: Entity) -> void: + if not _player == null: + _player.getc_health().disconnect("changed", self, "_on_player_health_changed") + _player.disconnect("cname_changed", self, "cname_changed") + _player.disconnect("con_level_up", self, "clevel_changed") + _player.disconnect("con_level_changed", self, "clevel_changed") + _player.disconnect("notification_cxp_gained", self, "notification_cxp_gained") + _player.disconnect("centity_resource_added", self, "centity_resource_added") + + if _mana != null: + _mana.disconnect("changed", self, "_on_mana_changed") + _mana = null + + _player = null + + if p_player == null: + return + + _player = p_player + + _player.connect("cname_changed", self, "cname_changed") + _player.connect("notification_clevel_up", self, "clevel_changed") + _player.connect("con_level_changed", self, "clevel_changed") + _player.connect("notification_cxp_gained", self, "notification_cxp_gained") + _player.connect("centity_resource_added", self, "centity_resource_added") + + for i in range(_player.resource_getc_count()): + centity_resource_added(_player.resource_getc_index(i)) + + _health = _player.getc_health() + _on_player_health_changed() + _health.connect("changed", self, "_on_player_health_changed") + + _name_text.text = _player.centity_name + _level_text.text = str(_player.clevel) + + clevel_changed(_player, 0) + notification_cxp_gained(_player, 0) + +func centity_resource_added(res : EntityResource): + if res is ManaResource: + _mana = res as ManaResource + + _mana.connect("changed", self, "_on_mana_changed") + _on_mana_changed() + +func _on_player_health_changed() -> void: + if _health.max_value == 0: + _health_range.min_value = 0 + _health_range.max_value = 1 + _health_range.value = 0 + + _health_text.text = "" + + return + + _health_range.min_value = 0 + _health_range.max_value = _health.max_value + _health_range.value = _health.current_value + + _health_text.text = str(_health.current_value) + "/" + str(_health.max_value) + +func _on_mana_changed() -> void: + if _mana.max_value == 0: + _resource_range.min_value = 0 + _resource_range.max_value = 1 + _resource_range.value = 0 + + _resource_text.text = "" + + return + + _resource_range.min_value = 0 + _resource_range.max_value = _mana.max_value + _resource_range.value = _mana.current_value + + _resource_text.text = str(_mana.current_value) + "/" + str(_mana.max_value) + +func cname_changed(entity: Entity) -> void: + _name_text.text = _player.centity_name + +func clevel_changed(entity: Entity, value : int) -> void: + _level_text.text = str(_player.clevel) + + var xpreq : int = ESS.get_character_xp(_player.clevel) + + if xpreq == 0: + _xp_range.value = 0 + _xp_range.min_value = 0 + _xp_range.max_value = 1 + return + + _xp_range.min_value = 0 + _xp_range.max_value = xpreq + +func notification_cxp_gained(entity: Entity, val: int) -> void: + _xp_range.value = _player.cxp + diff --git a/game/ui/unitframes/UnitframeBase.tscn b/game/ui/unitframes/UnitframeBase.tscn new file mode 100644 index 0000000..a3d6a38 --- /dev/null +++ b/game/ui/unitframes/UnitframeBase.tscn @@ -0,0 +1,97 @@ +[gd_scene load_steps=6 format=2] + +[ext_resource path="res://ui/unitframes/UnitframeBase.gd" type="Script" id=1] +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=2] +[ext_resource path="res://ui/theme/scrollbar_grabber_red.tres" type="StyleBox" id=3] +[ext_resource path="res://ui/theme/scrollbar_grabber_blue.tres" type="StyleBox" id=4] +[ext_resource path="res://ui/theme/scrollbar_grabber_blue_xp.tres" type="StyleBox" id=5] + +[node name="UnitFrame" type="PanelContainer"] +margin_right = 150.0 +margin_bottom = 61.0 +theme = ExtResource( 2 ) +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +name_text_path = NodePath("VBoxContainer/HBoxContainer/Label") +level_text_path = NodePath("VBoxContainer/HBoxContainer/Label2") +health_range_path = NodePath("VBoxContainer/MarginContainer/ProgressBar") +health_text_path = NodePath("VBoxContainer/MarginContainer/Label") +resource_range_path = NodePath("VBoxContainer/MarginContainer2/ResourceBar") +resource_text_path = NodePath("VBoxContainer/MarginContainer2/Label") +xp_range_path = NodePath("VBoxContainer/XPBar") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 146.0 +margin_bottom = 57.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_constants/separation = 1 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +margin_right = 142.0 +margin_bottom = 15.0 + +[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer"] +margin_right = 138.0 +margin_bottom = 15.0 +size_flags_horizontal = 3 + +[node name="Label2" type="Label" parent="VBoxContainer/HBoxContainer"] +margin_left = 142.0 +margin_right = 142.0 +margin_bottom = 15.0 + +[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer"] +margin_top = 16.0 +margin_right = 142.0 +margin_bottom = 31.0 + +[node name="ProgressBar" type="ProgressBar" parent="VBoxContainer/MarginContainer"] +margin_right = 142.0 +margin_bottom = 15.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/fg = ExtResource( 3 ) +percent_visible = false + +[node name="Label" type="Label" parent="VBoxContainer/MarginContainer"] +margin_right = 142.0 +margin_bottom = 15.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +align = 1 +valign = 1 + +[node name="MarginContainer2" type="MarginContainer" parent="VBoxContainer"] +margin_top = 32.0 +margin_right = 142.0 +margin_bottom = 47.0 + +[node name="ResourceBar" type="ProgressBar" parent="VBoxContainer/MarginContainer2"] +margin_right = 142.0 +margin_bottom = 15.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/fg = ExtResource( 4 ) +percent_visible = false + +[node name="Label" type="Label" parent="VBoxContainer/MarginContainer2"] +margin_right = 142.0 +margin_bottom = 15.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +align = 1 +valign = 1 + +[node name="XPBar" type="ProgressBar" parent="VBoxContainer"] +margin_top = 48.0 +margin_right = 142.0 +margin_bottom = 53.6018 +rect_min_size = Vector2( 20, 5 ) +size_flags_horizontal = 3 +custom_styles/fg = ExtResource( 5 ) +percent_visible = false diff --git a/game/ui/unitframes/Unitframes.tscn b/game/ui/unitframes/Unitframes.tscn new file mode 100644 index 0000000..9cb9175 --- /dev/null +++ b/game/ui/unitframes/Unitframes.tscn @@ -0,0 +1,24 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://player/Unitframes.gd" type="Script" id=2] +[ext_resource path="res://ui/unitframes/UnitframeBase.tscn" type="PackedScene" id=6] +[ext_resource path="res://ui/unitframes/TargetUnitframe.tscn" type="PackedScene" id=7] + +[node name="Unitframes" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 1.0 +margin_right = 1.0 +mouse_filter = 2 +script = ExtResource( 2 ) +__meta__ = { +"_edit_lock_": true +} +player_unit_frame_path = NodePath("PlayerUnitFrame") +target_unit_frame_path = NodePath("TargetUnitframe") + +[node name="PlayerUnitFrame" parent="." instance=ExtResource( 6 )] +margin_right = 151.0 + +[node name="TargetUnitframe" parent="." instance=ExtResource( 7 )] +visible = false diff --git a/game/ui/unitframes/game_module.tres b/game/ui/unitframes/game_module.tres new file mode 100644 index 0000000..8a6ca14 --- /dev/null +++ b/game/ui/unitframes/game_module.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" load_steps=3 format=2] + +[ext_resource path="res://scripts/game_modules/ui_gui_child_module.gd" type="Script" id=1] +[ext_resource path="res://ui/unitframes/Unitframes.tscn" type="PackedScene" id=2] + +[resource] +script = ExtResource( 1 ) +enabled = true +scene = ExtResource( 2 ) +hide = false diff --git a/game/ui/vendor_window/ItemContainer.gd b/game/ui/vendor_window/ItemContainer.gd new file mode 100644 index 0000000..cacb70f --- /dev/null +++ b/game/ui/vendor_window/ItemContainer.gd @@ -0,0 +1,89 @@ +extends Control + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(NodePath) var icon_path : NodePath +export(NodePath) var name_label_path : NodePath +#export(NodePath) var description_label_path : NodePath +export(NodePath) var quantity_spinbox_path : NodePath +export(NodePath) var learn_button_path : NodePath +export(NodePath) var spell_button_path : NodePath +export(NodePath) var popup_path : NodePath + +export(Color) var known_color : Color = Color.white +export(Color) var not_known_color : Color = Color.gray +export(Color) var unlearnable_color : Color = Color.gray + +var _icon : TextureRect +var _name_label : Label +#var _description_label : RichTextLabel +var _item_button : Button +var _popup : Popup +var _quantity_spinbox : SpinBox + +var _vendor_item_data_entry : VendorItemDataEntry +var _player : Entity +var _index : int + +func _ready() -> void: + _icon = get_node(icon_path) as TextureRect + _name_label = get_node(name_label_path) as Label +# _description_label = get_node(description_label_path) as RichTextLabel + _item_button = get_node(spell_button_path) as Button + _popup = get_node(popup_path) as Popup + _quantity_spinbox = get_node(quantity_spinbox_path) as SpinBox + +func set_vendor_item(p_player : Entity, p_vide: VendorItemDataEntry, index : int) -> void: + _vendor_item_data_entry = p_vide + _player = p_player + _index = index + +# _icon.set_spell(_spell) + _item_button.set_item(_vendor_item_data_entry) + _popup.set_item(_vendor_item_data_entry) + + if _vendor_item_data_entry != null && _vendor_item_data_entry.item != null: + + _icon.texture = _vendor_item_data_entry.item.icon + _name_label.text = _vendor_item_data_entry.item.text_name + else: + _icon.texture = null + + _name_label.text = "....." + + update_spell_indicators() + +func spell_button_pressed() -> void: + var pos : Vector2 = _item_button.rect_global_position + pos.x += _item_button.rect_size.x + + _popup.popup(Rect2(pos, _popup.rect_size)) + +func buy(): + if !_player: + return + + var count : int = _quantity_spinbox.value + + _player.vendor_item_sbuy(_index, count) + +func update_spell_indicators(): + pass diff --git a/game/ui/vendor_window/ItemContainer.tscn b/game/ui/vendor_window/ItemContainer.tscn new file mode 100644 index 0000000..8308cf2 --- /dev/null +++ b/game/ui/vendor_window/ItemContainer.tscn @@ -0,0 +1,165 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] +[ext_resource path="res://ui/vendor_window/VendorEntryPopup.gd" type="Script" id=2] +[ext_resource path="res://ui/vendor_window/ItemDragAndDropVendor.gd" type="Script" id=3] +[ext_resource path="res://ui/vendor_window/ItemContainer.gd" type="Script" id=4] + +[node name="ItemContainer" type="Control"] +margin_left = 290.0 +margin_top = 306.0 +margin_right = 576.0 +margin_bottom = 370.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme = ExtResource( 1 ) +script = ExtResource( 4 ) +__meta__ = { +"_edit_use_anchors_": false +} +icon_path = NodePath("PanelContainer/HBoxContainer/Button/CenterContainer/Icon") +name_label_path = NodePath("PanelContainer/HBoxContainer/Name") +quantity_spinbox_path = NodePath("EntryPopup/VBoxContainer/Container/VBoxContainer/HBoxContainer/SpinBox") +learn_button_path = NodePath("EntryPopup/VBoxContainer/HBoxContainer/Button") +spell_button_path = NodePath("../ItemContainer/PanelContainer/HBoxContainer/Button") +popup_path = NodePath("EntryPopup") +not_known_color = Color( 0.596078, 0.596078, 0.596078, 1 ) +unlearnable_color = Color( 0.772549, 0.192157, 0.192157, 1 ) + +[node name="PanelContainer" type="PanelContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 282.0 +margin_bottom = 60.0 + +[node name="Button" type="Button" parent="PanelContainer/HBoxContainer"] +margin_right = 55.0 +margin_bottom = 56.0 +rect_min_size = Vector2( 55, 55 ) +script = ExtResource( 3 ) + +[node name="CenterContainer" type="MarginContainer" parent="PanelContainer/HBoxContainer/Button"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 51.0 +margin_bottom = 51.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Icon" type="TextureRect" parent="PanelContainer/HBoxContainer/Button/CenterContainer"] +margin_right = 47.0 +margin_bottom = 47.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +expand = true + +[node name="Name" type="Label" parent="PanelContainer/HBoxContainer"] +margin_left = 59.0 +margin_top = 20.0 +margin_right = 278.0 +margin_bottom = 35.0 +size_flags_horizontal = 3 +text = "......" + +[node name="EntryPopup" type="PopupPanel" parent="."] +margin_left = 64.0 +margin_top = 4.0 +margin_right = 360.0 +margin_bottom = 207.0 +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} +label_path = NodePath("VBoxContainer/HBoxContainer/Label") +desc_label_path = NodePath("VBoxContainer/Container/VBoxContainer/RichTextLabel") +quantity_spinbox_path = NodePath("VBoxContainer/Container/VBoxContainer/HBoxContainer/SpinBox") + +[node name="VBoxContainer" type="VBoxContainer" parent="EntryPopup"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 4.0 +margin_right = -4.0 +margin_bottom = -4.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBoxContainer" type="HBoxContainer" parent="EntryPopup/VBoxContainer"] +margin_right = 288.0 +margin_bottom = 26.0 + +[node name="Label" type="Label" parent="EntryPopup/VBoxContainer/HBoxContainer"] +margin_top = 5.0 +margin_right = 254.0 +margin_bottom = 20.0 +size_flags_horizontal = 3 + +[node name="Button" type="Button" parent="EntryPopup/VBoxContainer/HBoxContainer"] +margin_left = 258.0 +margin_right = 288.0 +margin_bottom = 26.5702 +rect_min_size = Vector2( 30, 0 ) +text = "X" + +[node name="HSeparator2" type="HSeparator" parent="EntryPopup/VBoxContainer"] +margin_top = 34.0 +margin_right = 288.0 +margin_bottom = 38.0 + +[node name="Container" type="VBoxContainer" parent="EntryPopup/VBoxContainer"] +margin_top = 46.0 +margin_right = 288.0 +margin_bottom = 195.0 +rect_min_size = Vector2( 0, 20 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="EntryPopup/VBoxContainer/Container"] +margin_right = 288.0 +margin_bottom = 149.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="HBoxContainer" type="HBoxContainer" parent="EntryPopup/VBoxContainer/Container/VBoxContainer"] +margin_right = 288.0 +margin_bottom = 26.0 + +[node name="SpinBox" type="SpinBox" parent="EntryPopup/VBoxContainer/Container/VBoxContainer/HBoxContainer"] +margin_right = 169.47 +margin_bottom = 26.0 +min_value = 1.0 +value = 1.0 +rounded = true +align = 1 + +[node name="LearnButton" type="Button" parent="EntryPopup/VBoxContainer/Container/VBoxContainer/HBoxContainer"] +margin_left = 173.0 +margin_right = 288.0 +margin_bottom = 26.5702 +size_flags_horizontal = 3 +text = "Buy" + +[node name="RichTextLabel" type="RichTextLabel" parent="EntryPopup/VBoxContainer/Container/VBoxContainer"] +margin_top = 34.0 +margin_right = 288.0 +margin_bottom = 149.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +[connection signal="pressed" from="PanelContainer/HBoxContainer/Button" to="." method="spell_button_pressed"] +[connection signal="pressed" from="EntryPopup/VBoxContainer/HBoxContainer/Button" to="EntryPopup" method="hide"] +[connection signal="pressed" from="EntryPopup/VBoxContainer/Container/VBoxContainer/HBoxContainer/LearnButton" to="." method="buy"] diff --git a/game/ui/vendor_window/ItemDragAndDropVendor.gd b/game/ui/vendor_window/ItemDragAndDropVendor.gd new file mode 100644 index 0000000..37e5fd0 --- /dev/null +++ b/game/ui/vendor_window/ItemDragAndDropVendor.gd @@ -0,0 +1,45 @@ +extends Button + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +var item : VendorItemDataEntry + +func set_item(p_item): + item = p_item + +func get_drag_data(pos): + if item == null || item.item: + return null + + var tr = TextureRect.new() + tr.texture = item.item.icon + tr.expand = true + +# tr.rect_size = rect_size + tr.rect_size = Vector2(45, 45) + set_drag_preview(tr) + + var esd = ESDragAndDrop.new() + + esd.type = ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_ITEM + esd.item_path = item.item.resource_path + + return esd diff --git a/game/ui/vendor_window/VendorEntryPopup.gd b/game/ui/vendor_window/VendorEntryPopup.gd new file mode 100644 index 0000000..6e3d64e --- /dev/null +++ b/game/ui/vendor_window/VendorEntryPopup.gd @@ -0,0 +1,54 @@ +extends PopupPanel + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(NodePath) var label_path : NodePath +export(NodePath) var desc_label_path : NodePath +export(NodePath) var quantity_spinbox_path : NodePath + +var _label : Label +var _desc_label : RichTextLabel +var _quantity_spinbox : SpinBox + +var _item : ItemTemplate +var _item_data_entry : VendorItemDataEntry + +func _ready(): + _label = get_node(label_path) as Label + _desc_label = get_node(desc_label_path) as RichTextLabel + _quantity_spinbox = get_node(quantity_spinbox_path) as SpinBox + +func set_item(item_data_entry : VendorItemDataEntry) -> void: + _item_data_entry = item_data_entry + + if _item_data_entry == null: + return + + _item = _item_data_entry.item + + if _item == null: + return + + _label.text = _item.text_name + _desc_label.text = _item.get_description() + _quantity_spinbox.max_value = _item.stack_size + _quantity_spinbox.value = 1 + diff --git a/game/ui/vendor_window/VendorWindow.gd b/game/ui/vendor_window/VendorWindow.gd new file mode 100644 index 0000000..0fec5ca --- /dev/null +++ b/game/ui/vendor_window/VendorWindow.gd @@ -0,0 +1,161 @@ +extends Control + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +export(NodePath) var opener_button_path : NodePath +var opener_button : BaseButton + +export(NodePath) var spell_entry_container_path : NodePath +export(NodePath) var prev_button_path : NodePath +export(NodePath) var next_button_path : NodePath + +export(bool) var show_not_learned : bool = true +export(bool) var show_not_learnable : bool = false + +var _spell_entry_container : Node +var _item_entries : Array + +var _prev_button : Button +var _next_button : Button + +var _player : Entity + +var _page : int = 0 +var _max_pages : int = 0 + +var _vendor_item_data : VendorItemData + +func _ready() -> void: + opener_button = get_node_or_null(opener_button_path) as BaseButton + + _item_entries.clear() + + _spell_entry_container = get_node(spell_entry_container_path) + + for i in range(_spell_entry_container.get_child_count()): + _item_entries.append(_spell_entry_container.get_child(i)) + + _prev_button = get_node(prev_button_path) + _next_button = get_node(next_button_path) + + _prev_button.connect("pressed", self, "dec_page") + _next_button.connect("pressed", self, "inc_page") + + connect("visibility_changed", self, "_visibility_changed") + +func inc_page() -> void: + if _vendor_item_data == null: + return + + _page += 1 + + if _page > _max_pages: + _page = _max_pages + + refresh_entries() + +func dec_page() -> void: + if _vendor_item_data == null: + return + + _page -= 1 + + if _page < 0: + _page = 0 + + refresh_entries() + +func refresh_entries() -> void: + if _player == null || _vendor_item_data == null: + return + + var i : int = 0 + var n : int = 0 +# for n in range(len(_item_entries)): + while n < len(_item_entries): + var spindex : int = i + (_page * len(_item_entries)) + + if spindex >= _vendor_item_data.get_num_vendor_datas(): + _item_entries[n].set_vendor_item(_player, null, 0) + i += 1 + n += 1 + continue + + var vide : VendorItemDataEntry = _vendor_item_data.get_vendor_data(spindex) + + if !vide: + continue + + _item_entries[n].set_vendor_item(_player, vide, spindex) + i += 1 + n += 1 + + +func refresh_all() -> void: + if _player == null: + return + + if _vendor_item_data == null: + return + + _max_pages = int(_vendor_item_data.get_num_vendor_datas() / len(_item_entries)) + + if _page > _max_pages: + _page = _max_pages + + refresh_entries() + + +func _visibility_changed() -> void: + if visible: + if !_player: + return + + var t : Entity = _player.ctarget + + if !t: + return + + _vendor_item_data = t.getc_entity_data().entity_class_data.get_vendor_item_data() + + _page = 0 + refresh_all() + + + +func set_player(p_player: Entity) -> void: + if _player != null: + _player.disconnect("onc_open_winow_request", self, "onc_open_winow_request") + + _player = p_player + + _player.connect("onc_open_winow_request", self, "onc_open_winow_request") + + + +func onc_open_winow_request(window_id : int) -> void: + if window_id != EntityEnums.ENTITY_WINDOW_VENDOR: + return + + show() + +# if player.has_signal("player_moved") && !player.is_connected("player_moved", self, "on_player_moved"): +# player.connect("player_moved", self, "on_player_moved", [], CONNECT_ONESHOT) diff --git a/game/ui/vendor_window/VendorWindow.tscn b/game/ui/vendor_window/VendorWindow.tscn new file mode 100644 index 0000000..887493c --- /dev/null +++ b/game/ui/vendor_window/VendorWindow.tscn @@ -0,0 +1,175 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://ui/vendor_window/ItemContainer.tscn" type="PackedScene" id=1] +[ext_resource path="res://ui/vendor_window/VendorWindow.gd" type="Script" id=4] +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=5] + +[node name="VendorWindow" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +theme = ExtResource( 5 ) +script = ExtResource( 4 ) +__meta__ = { +"_edit_use_anchors_": false +} +spell_entry_container_path = NodePath("PanelContainer/PagedContent/GridContainer") +prev_button_path = NodePath("PanelContainer/PagedContent/Controls/HBoxContainer/Button2") +next_button_path = NodePath("PanelContainer/PagedContent/Controls/HBoxContainer/Button") +show_not_learned = false + +[node name="PanelContainer" type="PanelContainer" parent="."] +margin_left = 64.0 +margin_top = 39.0 +margin_right = 580.0 +margin_bottom = 507.0 + +[node name="PagedContent" type="VBoxContainer" parent="PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 512.0 +margin_bottom = 464.0 + +[node name="Header" type="HBoxContainer" parent="PanelContainer/PagedContent"] +margin_right = 508.0 +margin_bottom = 30.0 + +[node name="Label" type="Label" parent="PanelContainer/PagedContent/Header"] +margin_top = 7.0 +margin_right = 36.0 +margin_bottom = 22.0 +text = "Vendor" + +[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/PagedContent/Header"] +margin_left = 40.0 +margin_right = 464.0 +margin_bottom = 30.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +alignment = 1 + +[node name="Button" type="Button" parent="PanelContainer/PagedContent/Header"] +margin_left = 468.0 +margin_right = 508.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 40, 30 ) +text = "X" + +[node name="GridContainer" type="GridContainer" parent="PanelContainer/PagedContent"] +margin_top = 38.0 +margin_right = 508.0 +margin_bottom = 422.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +columns = 2 + +[node name="ItemContainer" parent="PanelContainer/PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 0.0 +margin_top = 0.0 +margin_right = 252.0 +margin_bottom = 60.0 + +[node name="ItemContainer2" parent="PanelContainer/PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 256.0 +margin_top = 0.0 +margin_right = 508.0 +margin_bottom = 60.0 + +[node name="ItemContainer3" parent="PanelContainer/PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 0.0 +margin_top = 64.0 +margin_right = 252.0 +margin_bottom = 124.0 + +[node name="ItemContainer4" parent="PanelContainer/PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 256.0 +margin_top = 64.0 +margin_right = 508.0 +margin_bottom = 124.0 + +[node name="ItemContainer5" parent="PanelContainer/PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 0.0 +margin_top = 128.0 +margin_right = 252.0 +margin_bottom = 188.0 + +[node name="ItemContainer6" parent="PanelContainer/PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 256.0 +margin_top = 128.0 +margin_right = 508.0 +margin_bottom = 188.0 + +[node name="ItemContainer7" parent="PanelContainer/PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 0.0 +margin_top = 192.0 +margin_right = 252.0 +margin_bottom = 252.0 + +[node name="ItemContainer8" parent="PanelContainer/PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 256.0 +margin_top = 192.0 +margin_right = 508.0 +margin_bottom = 252.0 + +[node name="ItemContainer9" parent="PanelContainer/PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 0.0 +margin_top = 256.0 +margin_right = 252.0 +margin_bottom = 316.0 + +[node name="ItemContainer10" parent="PanelContainer/PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 256.0 +margin_top = 256.0 +margin_right = 508.0 +margin_bottom = 316.0 + +[node name="ItemContainer11" parent="PanelContainer/PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 0.0 +margin_top = 320.0 +margin_right = 252.0 +margin_bottom = 380.0 + +[node name="ItemContainer12" parent="PanelContainer/PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 256.0 +margin_top = 320.0 +margin_right = 508.0 +margin_bottom = 380.0 + +[node name="Controls" type="MarginContainer" parent="PanelContainer/PagedContent"] +margin_top = 430.0 +margin_right = 508.0 +margin_bottom = 460.0 +custom_constants/margin_right = 2 +custom_constants/margin_top = 2 +custom_constants/margin_left = 2 +custom_constants/margin_bottom = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/PagedContent/Controls"] +margin_left = 2.0 +margin_top = 2.0 +margin_right = 506.0 +margin_bottom = 28.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Button2" type="Button" parent="PanelContainer/PagedContent/Controls/HBoxContainer"] +margin_right = 165.0 +margin_bottom = 26.5702 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "< Previous page" + +[node name="Spacer" type="Control" parent="PanelContainer/PagedContent/Controls/HBoxContainer"] +margin_left = 169.0 +margin_right = 334.0 +margin_bottom = 26.0 +size_flags_horizontal = 3 + +[node name="Button" type="Button" parent="PanelContainer/PagedContent/Controls/HBoxContainer"] +margin_left = 338.0 +margin_right = 504.0 +margin_bottom = 26.5702 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Next page >" +[connection signal="pressed" from="PanelContainer/PagedContent/Header/Button" to="." method="hide"] diff --git a/game/ui/vendor_window/game_module.tres b/game/ui/vendor_window/game_module.tres new file mode 100644 index 0000000..df5688e --- /dev/null +++ b/game/ui/vendor_window/game_module.tres @@ -0,0 +1,11 @@ +[gd_resource type="Resource" load_steps=3 format=2] + +[ext_resource path="res://ui/vendor_window/VendorWindow.tscn" type="PackedScene" id=1] +[ext_resource path="res://scripts/game_modules/ui_window_module.gd" type="Script" id=2] + +[resource] +script = ExtResource( 2 ) +enabled = true +scene = ExtResource( 1 ) +index = -1 +add_button = false diff --git a/game/ui/world_numbers_2d/Number.gd b/game/ui/world_numbers_2d/Number.gd new file mode 100644 index 0000000..4ce16a8 --- /dev/null +++ b/game/ui/world_numbers_2d/Number.gd @@ -0,0 +1,65 @@ +extends Label + +# Copyright (c) 2019 Péter Magyar +# +# 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. + +export(NodePath) var animation_player_path : NodePath = "AnimationPlayer" + +export(Color) var damage_color : Color = Color.yellow +export(Color) var heal_color : Color = Color.green + +var world_position : Vector2 = Vector2() +var animation_player : AnimationPlayer = null + +func _ready() -> void: + animation_player = get_node(animation_player_path) as AnimationPlayer + + animation_player.connect("animation_finished", self, "animation_finished") + + set_process(false) + +func _process(delta): + + var new_pos : Vector2 = Vector2(world_position.x + rect_position.x / 2.0 - 8, world_position.y + rect_position.y) + + set_position(new_pos) + + +func damage(pos : Vector2, value : int, crit : bool) -> void: + setup(pos, damage_color, value, crit) + +func heal(pos : Vector2, value : int, crit : bool) -> void: + setup(pos, heal_color, value, crit) + +func setup(pos : Vector2, color : Color, value : int, crit : bool) -> void: + world_position = pos + + text = str(value) + add_color_override("font_color", color) + + if crit: + animation_player.play("crit") + else: + animation_player.play("normal") + + set_process(true) + +func animation_finished(anim_name : String) -> void: + queue_free() diff --git a/game/ui/world_numbers_2d/Number.tscn b/game/ui/world_numbers_2d/Number.tscn new file mode 100644 index 0000000..f93c25c --- /dev/null +++ b/game/ui/world_numbers_2d/Number.tscn @@ -0,0 +1,94 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://ui/world_numbers_2d/Number.gd" type="Script" id=1] +[ext_resource path="res://ui/world_numbers_2d/number_font.tres" type="DynamicFont" id=2] + + +[sub_resource type="Animation" id=1] +resource_name = "crit" +length = 1.5 +tracks/0/type = "value" +tracks/0/path = NodePath(".:rect_scale") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.05, 0.3, 1.5 ), +"transitions": PoolRealArray( 1, 0.307786, 1, 1.36604 ), +"update": 0, +"values": [ Vector2( 0.1, 0.1 ), Vector2( 1.5, 1.5 ), Vector2( 1.3, 1.3 ), Vector2( 1.3, 1.3 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath(".:rect_position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0, 0.6, 1.5 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -50, 20 ), Vector2( -50, 20 ), Vector2( -50, 10 ) ] +} +tracks/2/type = "value" +tracks/2/path = NodePath(".:modulate") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/keys = { +"times": PoolRealArray( 0, 1.2, 1.5 ), +"transitions": PoolRealArray( 1, 1, 4 ), +"update": 0, +"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ] +} + +[sub_resource type="Animation" id=2] +resource_name = "normal" +length = 2.0 +tracks/0/type = "value" +tracks/0/path = NodePath(".:rect_position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 2 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Vector2( -50, 20 ), Vector2( -50, 0 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath(".:modulate") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 4 ), +"update": 0, +"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ] +} + +[node name="Number" type="Label"] +modulate = Color( 1, 1, 1, 0 ) +margin_left = -50.0 +margin_top = 10.0 +margin_right = 50.0 +margin_bottom = 50.0006 +rect_scale = Vector2( 1.3, 1.3 ) +rect_pivot_offset = Vector2( 50, 20 ) +custom_fonts/font = ExtResource( 2 ) +custom_colors/font_color = Color( 0.870588, 0.898039, 0.0117647, 1 ) +align = 1 +valign = 1 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +anims/crit = SubResource( 1 ) +anims/normal = SubResource( 2 ) diff --git a/game/ui/world_numbers_2d/WorldNumbers.gd b/game/ui/world_numbers_2d/WorldNumbers.gd new file mode 100644 index 0000000..bb6ac02 --- /dev/null +++ b/game/ui/world_numbers_2d/WorldNumbers.gd @@ -0,0 +1,53 @@ +extends Node + +# Copyright (c) 2019 Péter Magyar +# +# 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. + +export(PackedScene) var number_scene + +func damage(entity_position : Vector2, entity_height : float, value : int, crit : bool) -> void: + var scene : Node = number_scene.instance() + + add_child(scene) + scene.owner = self + + randomize() + entity_position.y -= entity_height + (0.2 * randf()) + entity_position.x += entity_height * 0.4 - entity_height * 0.8 * randf() + + scene.damage(entity_position, value, crit) + +func heal(entity_position : Vector2, entity_height : float, value : int, crit : bool) -> void: + var scene : Node = number_scene.instance() + + add_child(scene) + scene.owner = self + + randomize() + + #entity_position.y += entity_height + (0.3 * randf()) + #entity_position.x += entity_height * 0.4 - entity_height * 0.8 * randf() + + + scene.heal(entity_position, value, crit) + +func clear() -> void: + for child in get_children(): + child.queue_free() diff --git a/game/ui/world_numbers_2d/WorldNumbers.tscn b/game/ui/world_numbers_2d/WorldNumbers.tscn new file mode 100644 index 0000000..4fe4581 --- /dev/null +++ b/game/ui/world_numbers_2d/WorldNumbers.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/world_numbers_2d/WorldNumbers.gd" type="Script" id=1] +[ext_resource path="res://ui/world_numbers_2d/Number.tscn" type="PackedScene" id=2] + +[node name="WorldNumbers" type="Node"] +script = ExtResource( 1 ) +number_scene = ExtResource( 2 ) diff --git a/game/ui/world_numbers_2d/number_font.tres b/game/ui/world_numbers_2d/number_font.tres new file mode 100644 index 0000000..de5e337 --- /dev/null +++ b/game/ui/world_numbers_2d/number_font.tres @@ -0,0 +1,7 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://fonts/VT323-Regular.ttf" type="DynamicFontData" id=1] + +[resource] +size = 12 +font_data = ExtResource( 1 ) diff --git a/game/world/WorldLayer.gd b/game/world/WorldLayer.gd new file mode 100644 index 0000000..64a04bc --- /dev/null +++ b/game/world/WorldLayer.gd @@ -0,0 +1,31 @@ +extends Navigation2D + +# Copyright (c) 2019 Péter Magyar +# +# 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. + +var collision_layer : int + +func add_entity(entity : Entity) -> void: + entity.owner = self + entity.collision_layer = collision_layer + + +func get_collision_layer() -> int: + return collision_layer diff --git a/game/world/WorldLayer.tscn b/game/world/WorldLayer.tscn new file mode 100644 index 0000000..a590613 --- /dev/null +++ b/game/world/WorldLayer.tscn @@ -0,0 +1,14 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://tilesets/tileset.tres" type="TileSet" id=1] +[ext_resource path="res://world/WorldLayer.gd" type="Script" id=2] + + +[node name="WorldLayer" type="Navigation2D"] +script = ExtResource( 2 ) + +[node name="Terrarin" type="TileMap" parent="."] +tile_set = ExtResource( 1 ) +cell_size = Vector2( 32, 32 ) +format = 1 +tile_data = PoolIntArray( -1572897, 0, 0, -1572896, 0, 0, -1572895, 0, 0, -1572894, 0, 0, -1572893, 0, 0, -1572892, 0, 0, -1572891, 0, 0, -1572890, 0, 0, -1572889, 0, 0, -1572888, 0, 0, -1572887, 0, 0, -1572886, 0, 0, -1572885, 0, 0, -1572884, 0, 0, -1572883, 0, 0, -1572882, 0, 0, -1572881, 0, 0, -1572880, 0, 0, -1572879, 0, 0, -1572878, 0, 0, -1572877, 0, 0, -1572876, 0, 0, -1572875, 0, 0, -1572874, 0, 0, -1572873, 0, 0, -1572872, 0, 0, -1572871, 0, 0, -1572870, 0, 0, -1572869, 0, 0, -1572868, 0, 0, -1572867, 0, 0, -1572866, 0, 0, -1572865, 0, 0, -1638400, 0, 0, -1638399, 0, 0, -1507362, 0, 0, -1507361, 0, 0, -1507360, 0, 0, -1507359, 0, 0, -1507358, 0, 0, -1507357, 0, 0, -1507356, 0, 0, -1507355, 0, 0, -1507354, 0, 0, -1507353, 0, 0, -1507352, 0, 0, -1507351, 0, 0, -1507350, 0, 0, -1507349, 0, 0, -1507348, 0, 0, -1507347, 0, 0, -1507346, 0, 0, -1507345, 0, 0, -1507344, 0, 0, -1507343, 0, 0, -1507342, 0, 0, -1507341, 0, 0, -1507340, 0, 0, -1507339, 0, 0, -1507338, 0, 0, -1507337, 0, 0, -1507336, 0, 0, -1507335, 0, 0, -1507334, 0, 0, -1507333, 0, 0, -1507332, 0, 0, -1507331, 0, 0, -1507330, 0, 0, -1507329, 0, 0, -1572864, 0, 0, -1572863, 0, 0, -1572862, 0, 0, -1572861, 0, 0, -1572860, 0, 0, -1572859, 0, 0, -1572858, 0, 0, -1572857, 0, 0, -1572856, 0, 0, -1572855, 0, 0, -1572820, 0, 0, -1441826, 0, 0, -1441825, 0, 0, -1441824, 0, 0, -1441823, 0, 0, -1441822, 0, 0, -1441821, 0, 0, -1441820, 0, 0, -1441819, 0, 0, -1441818, 0, 0, -1441817, 0, 0, -1441816, 0, 0, -1441815, 0, 0, -1441814, 0, 0, -1441813, 0, 0, -1441812, 0, 0, -1441811, 0, 0, -1441810, 0, 0, -1441809, 0, 0, -1441808, 0, 0, -1441807, 0, 0, -1441806, 0, 0, -1441805, 0, 0, -1441804, 0, 0, -1441803, 0, 0, -1441802, 0, 0, -1441801, 0, 0, -1441800, 0, 0, -1441799, 0, 0, -1441798, 0, 0, -1441797, 0, 0, -1441796, 0, 0, -1441795, 0, 0, -1441794, 0, 0, -1441793, 0, 0, -1507328, 0, 0, -1507327, 0, 0, -1507326, 0, 0, -1507325, 0, 0, -1507324, 0, 0, -1507323, 0, 0, -1507322, 0, 0, -1507321, 0, 0, -1507320, 0, 0, -1507319, 0, 0, -1507318, 0, 0, -1507317, 0, 0, -1507316, 0, 0, -1507315, 0, 0, -1507314, 0, 0, -1507313, 0, 0, -1507312, 0, 0, -1507311, 0, 0, -1507310, 0, 0, -1507309, 0, 0, -1507308, 0, 0, -1507307, 0, 0, -1507306, 0, 0, -1507305, 0, 0, -1507304, 0, 0, -1507303, 0, 0, -1507284, 0, 0, -1507272, 0, 0, -1507271, 0, 0, -1507270, 0, 0, -1507269, 0, 0, -1507268, 0, 0, -1376291, 0, 0, -1376290, 0, 0, -1376289, 0, 0, -1376288, 0, 0, -1376287, 0, 0, -1376286, 0, 0, -1376285, 0, 0, -1376284, 0, 0, -1376283, 0, 0, -1376282, 0, 0, -1376281, 0, 0, -1376280, 0, 0, -1376279, 0, 0, -1376278, 0, 0, -1376277, 0, 0, -1376276, 0, 0, -1376275, 0, 0, -1376274, 0, 0, -1376273, 0, 0, -1376272, 0, 0, -1376271, 0, 0, -1376270, 0, 0, -1376269, 0, 0, -1376268, 0, 0, -1376267, 0, 0, -1376266, 0, 0, -1376265, 0, 0, -1376264, 0, 0, -1376263, 0, 0, -1376262, 0, 0, -1376261, 0, 0, -1376260, 0, 0, -1376259, 0, 0, -1376258, 0, 0, -1376257, 0, 0, -1441792, 0, 0, -1441791, 0, 0, -1441790, 0, 0, -1441789, 0, 0, -1441788, 0, 0, -1441787, 0, 0, -1441786, 0, 0, -1441785, 0, 0, -1441784, 0, 0, -1441783, 0, 0, -1441782, 0, 0, -1441781, 0, 0, -1441780, 0, 0, -1441779, 0, 0, -1441778, 0, 0, -1441777, 0, 0, -1441776, 0, 0, -1441775, 0, 0, -1441774, 0, 0, -1441773, 0, 0, -1441772, 0, 0, -1441771, 0, 0, -1441770, 0, 0, -1441769, 0, 0, -1441768, 0, 0, -1441767, 0, 0, -1441766, 0, 0, -1441765, 0, 0, -1441764, 0, 0, -1441763, 0, 0, -1441762, 0, 0, -1441761, 0, 0, -1441760, 0, 0, -1441759, 0, 0, -1441758, 0, 0, -1441757, 0, 0, -1441756, 0, 0, -1441755, 0, 0, -1441754, 0, 0, -1441753, 0, 0, -1441752, 0, 0, -1441751, 0, 0, -1441750, 0, 0, -1441749, 0, 0, -1441748, 0, 0, -1441747, 0, 0, -1441746, 0, 0, -1441745, 0, 0, -1441744, 0, 0, -1441743, 0, 0, -1441742, 0, 0, -1441741, 0, 0, -1441740, 0, 0, -1441739, 0, 0, -1441738, 0, 0, -1441737, 0, 0, -1441736, 0, 0, -1441735, 0, 0, -1441734, 0, 0, -1441733, 0, 0, -1310755, 0, 0, -1310754, 0, 0, -1310753, 0, 0, -1310752, 0, 0, -1310751, 0, 0, -1310750, 0, 0, -1310749, 0, 0, -1310748, 0, 0, -1310747, 0, 0, -1310746, 0, 0, -1310745, 0, 0, -1310744, 0, 0, -1310743, 0, 0, -1310742, 0, 0, -1310741, 0, 0, -1310740, 0, 0, -1310739, 0, 0, -1310738, 0, 0, -1310737, 0, 0, -1310736, 0, 0, -1310735, 0, 0, -1310734, 0, 0, -1310733, 0, 0, -1310732, 0, 0, -1310731, 0, 0, -1310730, 0, 0, -1310729, 0, 0, -1310728, 0, 0, -1310727, 0, 0, -1310726, 0, 0, -1310725, 0, 0, -1310724, 0, 0, -1310723, 0, 0, -1310722, 0, 0, -1310721, 0, 0, -1376256, 0, 0, -1376255, 0, 0, -1376254, 0, 0, -1376253, 0, 0, -1376252, 0, 0, -1376251, 0, 0, -1376250, 0, 0, -1376249, 0, 0, -1376248, 0, 0, -1376247, 0, 0, -1376246, 0, 0, -1376245, 0, 0, -1376244, 0, 0, -1376243, 0, 0, -1376242, 0, 0, -1376241, 0, 0, -1376240, 0, 0, -1376239, 0, 0, -1376238, 0, 0, -1376237, 0, 0, -1376236, 0, 0, -1376235, 0, 0, -1376234, 0, 0, -1376233, 0, 0, -1376232, 0, 0, -1376231, 0, 0, -1376230, 0, 0, -1376229, 0, 0, -1376228, 0, 0, -1376227, 0, 0, -1376226, 0, 0, -1376225, 0, 0, -1376224, 0, 0, -1376223, 0, 0, -1376222, 0, 0, -1376221, 0, 0, -1376220, 0, 0, -1376219, 0, 0, -1376218, 0, 0, -1376217, 0, 0, -1376216, 0, 0, -1376215, 0, 0, -1376214, 0, 0, -1376213, 0, 0, -1376212, 0, 0, -1376211, 0, 0, -1376210, 0, 0, -1376209, 0, 0, -1376208, 0, 0, -1376207, 0, 0, -1376206, 0, 0, -1376205, 0, 0, -1376204, 0, 0, -1376203, 0, 0, -1376202, 0, 0, -1376201, 0, 0, -1376200, 0, 0, -1376199, 0, 0, -1376198, 0, 0, -1376197, 0, 0, -1245219, 0, 0, -1245218, 0, 0, -1245217, 0, 0, -1245216, 0, 0, -1245215, 0, 0, -1245214, 0, 0, -1245213, 0, 0, -1245212, 0, 0, -1245211, 0, 0, -1245210, 0, 0, -1245209, 0, 0, -1245208, 0, 0, -1245207, 0, 0, -1245206, 0, 0, -1245205, 0, 0, -1245204, 0, 0, -1245203, 0, 0, -1245202, 0, 0, -1245201, 0, 0, -1245200, 0, 0, -1245199, 0, 0, -1245198, 0, 0, -1245197, 0, 0, -1245196, 0, 0, -1245195, 0, 0, -1245194, 0, 0, -1245193, 0, 0, -1245192, 0, 0, -1245191, 0, 0, -1245190, 0, 0, -1245189, 0, 0, -1245188, 0, 0, -1245187, 0, 0, -1245186, 0, 0, -1245185, 0, 0, -1310720, 0, 0, -1310719, 0, 0, -1310718, 0, 0, -1310717, 0, 0, -1310716, 0, 0, -1310715, 0, 0, -1310714, 0, 0, -1310713, 0, 0, -1310712, 0, 0, -1310711, 0, 0, -1310710, 0, 0, -1310709, 0, 0, -1310708, 0, 0, -1310707, 0, 0, -1310706, 0, 0, -1310705, 0, 0, -1310704, 0, 0, -1310703, 0, 0, -1310702, 0, 0, -1310701, 0, 0, -1310700, 0, 0, -1310699, 0, 0, -1310698, 0, 0, -1310697, 0, 0, -1310696, 0, 0, -1310695, 0, 0, -1310694, 0, 0, -1310693, 0, 0, -1310692, 0, 0, -1310691, 0, 0, -1310690, 0, 0, -1310689, 0, 0, -1310688, 0, 0, -1310687, 0, 0, -1310686, 0, 0, -1310685, 0, 0, -1310684, 0, 0, -1310683, 0, 0, -1310682, 0, 0, -1310681, 0, 0, -1310680, 0, 0, -1310679, 0, 0, -1310678, 0, 0, -1310677, 0, 0, -1310676, 0, 0, -1310675, 0, 0, -1310674, 0, 0, -1310673, 0, 0, -1310672, 0, 0, -1310671, 0, 0, -1310670, 0, 0, -1310669, 0, 0, -1310668, 0, 0, -1310667, 0, 0, -1310666, 0, 0, -1310665, 0, 0, -1310664, 0, 0, -1310663, 0, 0, -1310662, 0, 0, -1310661, 0, 0, -1179683, 0, 0, -1179682, 0, 0, -1179681, 0, 0, -1179680, 0, 0, -1179679, 0, 0, -1179678, 0, 0, -1179677, 0, 0, -1179676, 0, 0, -1179675, 0, 0, -1179674, 0, 0, -1179673, 0, 0, -1179672, 0, 0, -1179671, 0, 0, -1179670, 0, 0, -1179669, 0, 0, -1179668, 0, 0, -1179667, 0, 0, -1179666, 0, 0, -1179665, 0, 0, -1179664, 0, 0, -1179663, 0, 0, -1179662, 0, 0, -1179661, 0, 0, -1179660, 0, 0, -1179659, 0, 0, -1179658, 0, 0, -1179657, 0, 0, -1179656, 0, 0, -1179655, 0, 0, -1179654, 0, 0, -1179653, 0, 0, -1179652, 0, 0, -1179651, 0, 0, -1179650, 0, 0, -1179649, 0, 0, -1245184, 0, 0, -1245183, 0, 0, -1245182, 0, 0, -1245181, 0, 0, -1245180, 0, 0, -1245179, 0, 0, -1245178, 0, 0, -1245177, 0, 0, -1245176, 0, 0, -1245175, 0, 0, -1245174, 0, 0, -1245173, 0, 0, -1245172, 0, 0, -1245171, 0, 0, -1245170, 0, 0, -1245169, 0, 0, -1245168, 0, 0, -1245167, 0, 0, -1245166, 0, 0, -1245165, 0, 0, -1245164, 0, 0, -1245163, 0, 0, -1245162, 0, 0, -1245161, 0, 0, -1245160, 0, 0, -1245159, 0, 0, -1245158, 0, 0, -1245157, 0, 0, -1245156, 0, 0, -1245155, 0, 0, -1245154, 0, 0, -1245153, 0, 0, -1245152, 0, 0, -1245151, 0, 0, -1245150, 0, 0, -1245149, 0, 0, -1245148, 0, 0, -1245147, 0, 0, -1245146, 0, 0, -1245145, 0, 0, -1245144, 0, 0, -1245143, 0, 0, -1245142, 0, 0, -1245141, 0, 0, -1245140, 0, 0, -1245139, 0, 0, -1245138, 0, 0, -1245137, 0, 0, -1245136, 0, 0, -1245135, 0, 0, -1245134, 0, 0, -1245133, 0, 0, -1245132, 0, 0, -1245131, 0, 0, -1245130, 0, 0, -1245129, 0, 0, -1245128, 0, 0, -1245127, 0, 0, -1245126, 0, 0, -1114148, 0, 0, -1114147, 0, 0, -1114146, 0, 0, -1114145, 0, 0, -1114144, 0, 0, -1114143, 0, 0, -1114142, 0, 0, -1114141, 0, 0, -1114140, 0, 0, -1114139, 0, 0, -1114138, 0, 0, -1114137, 0, 0, -1114136, 0, 0, -1114135, 0, 0, -1114134, 0, 0, -1114133, 0, 0, -1114132, 0, 0, -1114131, 0, 0, -1114130, 0, 0, -1114129, 0, 0, -1114128, 0, 0, -1114127, 0, 0, -1114126, 0, 0, -1114125, 0, 0, -1114124, 0, 0, -1114123, 0, 0, -1114122, 0, 0, -1114121, 0, 0, -1114120, 0, 0, -1114119, 0, 0, -1114118, 0, 0, -1114117, 0, 0, -1114116, 0, 0, -1114115, 0, 0, -1114114, 0, 0, -1114113, 0, 0, -1179648, 0, 0, -1179647, 0, 0, -1179646, 0, 0, -1179645, 0, 0, -1179644, 0, 0, -1179643, 0, 0, -1179642, 0, 0, -1179641, 0, 0, -1179640, 0, 0, -1179639, 0, 0, -1179638, 2, 0, -1179637, 2, 0, -1179636, 0, 0, -1179635, 0, 0, -1179634, 0, 0, -1179633, 0, 0, -1179632, 0, 0, -1179631, 2, 0, -1179630, 2, 0, -1179629, 0, 0, -1179628, 0, 0, -1179627, 0, 0, -1179626, 0, 0, -1179625, 0, 0, -1179624, 0, 0, -1179623, 0, 0, -1179622, 0, 0, -1179621, 0, 0, -1179620, 0, 0, -1179619, 0, 0, -1179618, 0, 0, -1179617, 0, 0, -1179616, 0, 0, -1179615, 0, 0, -1179614, 0, 0, -1179613, 0, 0, -1179612, 0, 0, -1179611, 0, 0, -1179610, 0, 0, -1179609, 0, 0, -1179608, 0, 0, -1179607, 0, 0, -1179606, 0, 0, -1179605, 0, 0, -1179604, 0, 0, -1179603, 0, 0, -1179602, 0, 0, -1179601, 0, 0, -1179600, 0, 0, -1179599, 0, 0, -1179598, 0, 0, -1179597, 0, 0, -1179596, 0, 0, -1179595, 0, 0, -1179594, 0, 0, -1179593, 0, 0, -1179592, 0, 0, -1179591, 0, 0, -1048612, 0, 0, -1048611, 0, 0, -1048610, 0, 0, -1048609, 0, 0, -1048608, 0, 0, -1048607, 0, 0, -1048606, 0, 0, -1048605, 0, 0, -1048604, 0, 0, -1048603, 0, 0, -1048602, 0, 0, -1048601, 0, 0, -1048600, 0, 0, -1048599, 0, 0, -1048598, 0, 0, -1048597, 0, 0, -1048596, 0, 0, -1048595, 0, 0, -1048594, 0, 0, -1048593, 0, 0, -1048592, 0, 0, -1048591, 0, 0, -1048590, 0, 0, -1048589, 0, 0, -1048588, 0, 0, -1048587, 0, 0, -1048586, 0, 0, -1048585, 0, 0, -1048584, 0, 0, -1048583, 0, 0, -1048582, 0, 0, -1048581, 0, 0, -1048580, 0, 0, -1048579, 0, 0, -1048578, 0, 0, -1048577, 0, 0, -1114112, 0, 0, -1114111, 0, 0, -1114110, 0, 0, -1114109, 0, 0, -1114108, 0, 0, -1114107, 0, 0, -1114106, 0, 0, -1114105, 0, 0, -1114104, 0, 0, -1114103, 0, 0, -1114102, 2, 0, -1114101, 0, 0, -1114100, 0, 0, -1114099, 0, 0, -1114098, 0, 0, -1114097, 0, 0, -1114096, 0, 0, -1114095, 0, 0, -1114094, 0, 0, -1114093, 0, 0, -1114092, 2, 0, -1114091, 2, 0, -1114090, 2, 0, -1114089, 0, 0, -1114088, 0, 0, -1114087, 0, 0, -1114086, 0, 0, -1114085, 0, 0, -1114084, 0, 0, -1114083, 0, 0, -1114082, 0, 0, -1114081, 0, 0, -1114080, 0, 0, -1114079, 0, 0, -1114078, 0, 0, -1114077, 0, 0, -1114076, 0, 0, -1114075, 0, 0, -1114074, 0, 0, -1114073, 0, 0, -1114072, 0, 0, -1114071, 0, 0, -1114070, 0, 0, -1114069, 0, 0, -1114068, 0, 0, -1114067, 0, 0, -1114066, 0, 0, -1114065, 0, 0, -1114064, 0, 0, -1114063, 0, 0, -1114062, 0, 0, -1114061, 0, 0, -1114060, 0, 0, -1114059, 0, 0, -1114058, 0, 0, -1114057, 0, 0, -1114056, 0, 0, -1114055, 0, 0, -983076, 0, 0, -983075, 0, 0, -983074, 0, 0, -983073, 0, 0, -983072, 0, 0, -983071, 0, 0, -983070, 0, 0, -983069, 0, 0, -983068, 0, 0, -983067, 0, 0, -983066, 0, 0, -983065, 0, 0, -983064, 0, 0, -983063, 0, 0, -983062, 0, 0, -983061, 0, 0, -983060, 0, 0, -983059, 0, 0, -983058, 0, 0, -983057, 0, 0, -983056, 0, 0, -983055, 0, 0, -983054, 0, 0, -983053, 0, 0, -983052, 0, 0, -983051, 0, 0, -983050, 0, 0, -983049, 0, 0, -983048, 0, 0, -983047, 0, 0, -983046, 0, 0, -983045, 0, 0, -983044, 0, 0, -983043, 0, 0, -983042, 0, 0, -983041, 0, 0, -1048576, 0, 0, -1048575, 0, 0, -1048574, 0, 0, -1048573, 0, 0, -1048572, 0, 0, -1048571, 0, 0, -1048570, 0, 0, -1048569, 0, 0, -1048568, 0, 0, -1048567, 0, 0, -1048566, 2, 0, -1048565, 0, 0, -1048564, 0, 0, -1048563, 0, 0, -1048562, 0, 0, -1048561, 0, 0, -1048560, 0, 0, -1048559, 0, 0, -1048558, 2, 0, -1048557, 2, 0, -1048556, 2, 0, -1048555, 2, 0, -1048554, 2, 0, -1048553, 0, 0, -1048552, 0, 0, -1048551, 0, 0, -1048550, 0, 0, -1048549, 0, 0, -1048548, 0, 0, -1048547, 0, 0, -1048546, 0, 0, -1048545, 0, 0, -1048544, 0, 0, -1048543, 0, 0, -1048542, 0, 0, -1048541, 0, 0, -1048540, 0, 0, -1048539, 0, 0, -1048538, 0, 0, -1048537, 0, 0, -1048536, 0, 0, -1048535, 0, 0, -1048534, 0, 0, -1048533, 0, 0, -1048532, 0, 0, -1048531, 0, 0, -1048530, 0, 0, -1048529, 0, 0, -1048528, 0, 0, -1048527, 0, 0, -1048526, 0, 0, -1048525, 0, 0, -1048524, 0, 0, -1048523, 0, 0, -1048522, 0, 0, -1048521, 0, 0, -1048520, 0, 0, -1048519, 0, 0, -917540, 0, 0, -917539, 0, 0, -917538, 0, 0, -917537, 0, 0, -917536, 0, 0, -917535, 0, 0, -917534, 0, 0, -917533, 0, 0, -917532, 0, 0, -917531, 0, 0, -917530, 0, 0, -917529, 0, 0, -917528, 0, 0, -917527, 0, 0, -917526, 0, 0, -917525, 0, 0, -917524, 0, 0, -917523, 0, 0, -917522, 0, 0, -917521, 0, 0, -917520, 0, 0, -917519, 0, 0, -917518, 0, 0, -917517, 0, 0, -917516, 0, 0, -917515, 0, 0, -917514, 0, 0, -917513, 0, 0, -917512, 0, 0, -917511, 0, 0, -917510, 0, 0, -917509, 0, 0, -917508, 0, 0, -917507, 0, 0, -917506, 0, 0, -917505, 0, 0, -983040, 0, 0, -983039, 0, 0, -983038, 0, 0, -983037, 0, 0, -983036, 0, 0, -983035, 0, 0, -983034, 0, 0, -983033, 0, 0, -983032, 0, 0, -983031, 0, 0, -983030, 0, 0, -983029, 0, 0, -983028, 0, 0, -983027, 0, 0, -983026, 0, 0, -983025, 0, 0, -983024, 0, 0, -983023, 0, 0, -983022, 2, 0, -983021, 1, 0, -983020, 1, 0, -983019, 2, 0, -983018, 2, 0, -983017, 0, 0, -983016, 0, 0, -983015, 0, 0, -983014, 0, 0, -983013, 0, 0, -983012, 0, 0, -983011, 0, 0, -983010, 0, 0, -983009, 0, 0, -983008, 0, 0, -983007, 0, 0, -983006, 0, 0, -983005, 0, 0, -983004, 0, 0, -983003, 0, 0, -983002, 0, 0, -983001, 0, 0, -983000, 0, 0, -982999, 0, 0, -982998, 0, 0, -982997, 0, 0, -982996, 0, 0, -982995, 0, 0, -982994, 0, 0, -982993, 0, 0, -982992, 0, 0, -982991, 0, 0, -982990, 0, 0, -982989, 0, 0, -982988, 0, 0, -982987, 0, 0, -982986, 0, 0, -982985, 0, 0, -982984, 0, 0, -982983, 0, 0, -852004, 0, 0, -852003, 0, 0, -852002, 0, 0, -852001, 0, 0, -852000, 0, 0, -851999, 0, 0, -851998, 0, 0, -851997, 0, 0, -851996, 0, 0, -851995, 0, 0, -851994, 0, 0, -851993, 0, 0, -851992, 0, 0, -851991, 0, 0, -851990, 0, 0, -851989, 0, 0, -851988, 0, 0, -851987, 0, 0, -851986, 0, 0, -851985, 0, 0, -851984, 0, 0, -851983, 0, 0, -851982, 0, 0, -851981, 0, 0, -851980, 0, 0, -851979, 0, 0, -851978, 0, 0, -851977, 0, 0, -851976, 0, 0, -851975, 0, 0, -851974, 0, 0, -851973, 0, 0, -851972, 0, 0, -851971, 0, 0, -851970, 0, 0, -851969, 0, 0, -917504, 0, 0, -917503, 0, 0, -917502, 0, 0, -917501, 0, 0, -917500, 0, 0, -917499, 0, 0, -917498, 0, 0, -917497, 0, 0, -917496, 0, 0, -917495, 0, 0, -917494, 0, 0, -917493, 0, 0, -917492, 0, 0, -917491, 0, 0, -917490, 0, 0, -917489, 2, 0, -917488, 2, 0, -917487, 2, 0, -917486, 2, 0, -917485, 1, 0, -917484, 1, 0, -917483, 2, 0, -917482, 2, 0, -917481, 0, 0, -917480, 2, 0, -917479, 0, 0, -917478, 0, 0, -917477, 0, 0, -917476, 0, 0, -917475, 0, 0, -917474, 0, 0, -917473, 0, 0, -917472, 0, 0, -917471, 0, 0, -917470, 0, 0, -917469, 0, 0, -917468, 0, 0, -917467, 0, 0, -917466, 0, 0, -917465, 0, 0, -917464, 0, 0, -917463, 0, 0, -917462, 0, 0, -917461, 0, 0, -917460, 0, 0, -917459, 0, 0, -917458, 0, 0, -917457, 0, 0, -917456, 0, 0, -917455, 0, 0, -917454, 0, 0, -917453, 0, 0, -917452, 0, 0, -917451, 0, 0, -917450, 0, 0, -917449, 0, 0, -917448, 0, 0, -917447, 0, 0, -786468, 0, 0, -786467, 0, 0, -786466, 0, 0, -786465, 0, 0, -786464, 0, 0, -786463, 0, 0, -786462, 0, 0, -786461, 0, 0, -786460, 0, 0, -786459, 0, 0, -786458, 0, 0, -786457, 0, 0, -786456, 0, 0, -786455, 0, 0, -786454, 0, 0, -786453, 0, 0, -786452, 0, 0, -786451, 0, 0, -786450, 0, 0, -786449, 0, 0, -786448, 0, 0, -786447, 0, 0, -786446, 0, 0, -786445, 0, 0, -786444, 0, 0, -786443, 0, 0, -786442, 0, 0, -786441, 0, 0, -786440, 0, 0, -786439, 0, 0, -786438, 0, 0, -786437, 0, 0, -786436, 0, 0, -786435, 0, 0, -786434, 0, 0, -786433, 0, 0, -851968, 0, 0, -851967, 0, 0, -851966, 0, 0, -851965, 0, 0, -851964, 0, 0, -851963, 0, 0, -851962, 0, 0, -851961, 0, 0, -851960, 0, 0, -851959, 0, 0, -851958, 0, 0, -851957, 0, 0, -851956, 0, 0, -851955, 0, 0, -851954, 0, 0, -851953, 2, 0, -851952, 2, 0, -851951, 0, 0, -851950, 2, 0, -851949, 2, 0, -851948, 1, 0, -851947, 1, 0, -851946, 2, 0, -851945, 2, 0, -851944, 2, 0, -851943, 0, 0, -851942, 0, 0, -851941, 0, 0, -851940, 0, 0, -851939, 0, 0, -851938, 0, 0, -851937, 0, 0, -851936, 0, 0, -851935, 0, 0, -851934, 0, 0, -851933, 0, 0, -851932, 0, 0, -851931, 0, 0, -851930, 0, 0, -851929, 0, 0, -851928, 0, 0, -851927, 0, 0, -851926, 0, 0, -851925, 0, 0, -851924, 0, 0, -851923, 0, 0, -851922, 0, 0, -851921, 0, 0, -851920, 0, 0, -851919, 0, 0, -851918, 0, 0, -851917, 0, 0, -851916, 0, 0, -851915, 0, 0, -851914, 0, 0, -851913, 0, 0, -851912, 0, 0, -851911, 0, 0, -720933, 0, 0, -720932, 0, 0, -720931, 0, 0, -720930, 0, 0, -720929, 0, 0, -720928, 0, 0, -720927, 0, 0, -720926, 0, 0, -720925, 0, 0, -720924, 0, 0, -720923, 0, 0, -720922, 0, 0, -720921, 0, 0, -720920, 0, 0, -720919, 0, 0, -720918, 0, 0, -720917, 0, 0, -720916, 0, 0, -720915, 0, 0, -720914, 0, 0, -720913, 0, 0, -720912, 0, 0, -720911, 0, 0, -720910, 0, 0, -720909, 0, 0, -720908, 0, 0, -720907, 0, 0, -720906, 0, 0, -720905, 0, 0, -720904, 0, 0, -720903, 0, 0, -720902, 0, 0, -720901, 0, 0, -720900, 0, 0, -720899, 0, 0, -720898, 0, 0, -720897, 0, 0, -786432, 0, 0, -786431, 0, 0, -786430, 0, 0, -786429, 0, 0, -786428, 0, 0, -786427, 0, 0, -786426, 0, 0, -786425, 0, 0, -786424, 0, 0, -786423, 0, 0, -786422, 0, 0, -786421, 0, 0, -786420, 0, 0, -786419, 2, 0, -786418, 0, 0, -786417, 0, 0, -786416, 0, 0, -786415, 0, 0, -786414, 0, 0, -786413, 2, 0, -786412, 1, 0, -786411, 1, 0, -786410, 2, 0, -786409, 2, 0, -786408, 2, 0, -786407, 0, 0, -786406, 0, 0, -786405, 0, 0, -786404, 0, 0, -786403, 0, 0, -786402, 0, 0, -786401, 0, 0, -786400, 0, 0, -786399, 0, 0, -786398, 0, 0, -786397, 0, 0, -786396, 0, 0, -786395, 0, 0, -786394, 0, 0, -786393, 0, 0, -786392, 0, 0, -786391, 0, 0, -786390, 0, 0, -786389, 0, 0, -786388, 0, 0, -786387, 0, 0, -786386, 0, 0, -786385, 0, 0, -786384, 0, 0, -786383, 0, 0, -786382, 0, 0, -786381, 0, 0, -786380, 0, 0, -786379, 0, 0, -786378, 0, 0, -786377, 0, 0, -786376, 0, 0, -655397, 0, 0, -655396, 0, 0, -655395, 0, 0, -655394, 0, 0, -655393, 0, 0, -655392, 0, 0, -655391, 0, 0, -655390, 0, 0, -655389, 0, 0, -655388, 0, 0, -655387, 0, 0, -655386, 0, 0, -655385, 0, 0, -655384, 0, 0, -655383, 0, 0, -655382, 0, 0, -655381, 0, 0, -655380, 0, 0, -655379, 0, 0, -655378, 0, 0, -655377, 0, 0, -655376, 0, 0, -655375, 0, 0, -655374, 0, 0, -655373, 0, 0, -655372, 0, 0, -655371, 0, 0, -655370, 0, 0, -655369, 0, 0, -655368, 0, 0, -655367, 0, 0, -655366, 0, 0, -655365, 0, 0, -655364, 0, 0, -655363, 0, 0, -655362, 0, 0, -655361, 0, 0, -720896, 0, 0, -720895, 0, 0, -720894, 0, 0, -720893, 0, 0, -720892, 0, 0, -720891, 0, 0, -720890, 0, 0, -720889, 0, 0, -720888, 0, 0, -720887, 0, 0, -720886, 2, 0, -720885, 0, 0, -720884, 0, 0, -720883, 2, 0, -720882, 2, 0, -720881, 2, 0, -720880, 0, 0, -720879, 0, 0, -720878, 0, 0, -720877, 2, 0, -720876, 2, 0, -720875, 2, 0, -720874, 2, 0, -720873, 2, 0, -720872, 0, 0, -720871, 0, 0, -720870, 0, 0, -720869, 0, 0, -720868, 0, 0, -720867, 0, 0, -720866, 0, 0, -720865, 0, 0, -720864, 0, 0, -720863, 0, 0, -720862, 0, 0, -720861, 0, 0, -720860, 0, 0, -720859, 0, 0, -720858, 0, 0, -720857, 0, 0, -720856, 0, 0, -720855, 0, 0, -720854, 0, 0, -720853, 0, 0, -720852, 0, 0, -720851, 0, 0, -720850, 0, 0, -720849, 0, 0, -720848, 0, 0, -720847, 0, 0, -720846, 0, 0, -720845, 0, 0, -720844, 0, 0, -720843, 0, 0, -720842, 0, 0, -720841, 0, 0, -720840, 0, 0, -589861, 0, 0, -589860, 0, 0, -589859, 0, 0, -589858, 0, 0, -589857, 0, 0, -589856, 0, 0, -589855, 0, 0, -589854, 0, 0, -589853, 0, 0, -589852, 0, 0, -589851, 0, 0, -589850, 0, 0, -589849, 0, 0, -589848, 0, 0, -589847, 0, 0, -589846, 0, 0, -589845, 0, 0, -589844, 0, 0, -589843, 0, 0, -589842, 0, 0, -589841, 0, 0, -589840, 0, 0, -589839, 0, 0, -589838, 0, 0, -589837, 0, 0, -589836, 0, 0, -589835, 0, 0, -589834, 0, 0, -589833, 2, 0, -589832, 2, 0, -589831, 0, 0, -589830, 0, 0, -589829, 0, 0, -589828, 0, 0, -589827, 0, 0, -589826, 0, 0, -589825, 0, 0, -655360, 0, 0, -655359, 0, 0, -655358, 2, 0, -655357, 2, 0, -655356, 2, 0, -655355, 2, 0, -655354, 0, 0, -655353, 0, 0, -655352, 0, 0, -655351, 0, 0, -655350, 2, 0, -655349, 2, 0, -655348, 2, 0, -655347, 0, 0, -655346, 0, 0, -655345, 0, 0, -655344, 0, 0, -655343, 0, 0, -655342, 0, 0, -655341, 0, 0, -655340, 2, 0, -655339, 2, 0, -655338, 2, 0, -655337, 0, 0, -655336, 0, 0, -655335, 0, 0, -655334, 0, 0, -655333, 0, 0, -655332, 0, 0, -655331, 0, 0, -655330, 0, 0, -655329, 0, 0, -655328, 0, 0, -655327, 0, 0, -655326, 0, 0, -655325, 0, 0, -655324, 0, 0, -655323, 0, 0, -655322, 0, 0, -655321, 0, 0, -655320, 0, 0, -655319, 0, 0, -655318, 0, 0, -655317, 0, 0, -655316, 0, 0, -655315, 0, 0, -655314, 0, 0, -655313, 0, 0, -655312, 0, 0, -655311, 0, 0, -655310, 0, 0, -655309, 0, 0, -655308, 0, 0, -655307, 0, 0, -655306, 0, 0, -655305, 0, 0, -655304, 0, 0, -524325, 0, 0, -524324, 0, 0, -524323, 0, 0, -524322, 0, 0, -524321, 0, 0, -524320, 0, 0, -524319, 0, 0, -524318, 0, 0, -524317, 0, 0, -524316, 0, 0, -524315, 0, 0, -524314, 0, 0, -524313, 0, 0, -524312, 0, 0, -524311, 0, 0, -524310, 0, 0, -524309, 0, 0, -524308, 0, 0, -524307, 0, 0, -524306, 0, 0, -524305, 0, 0, -524304, 0, 0, -524303, 0, 0, -524302, 0, 0, -524301, 0, 0, -524300, 0, 0, -524299, 0, 0, -524298, 0, 0, -524297, 2, 0, -524296, 2, 0, -524295, 0, 0, -524294, 0, 0, -524293, 0, 0, -524292, 0, 0, -524291, 0, 0, -524290, 0, 0, -524289, 0, 0, -589824, 0, 0, -589823, 0, 0, -589822, 2, 0, -589821, 2, 0, -589820, 2, 0, -589819, 2, 0, -589818, 0, 0, -589817, 2, 0, -589816, 0, 0, -589815, 0, 0, -589814, 0, 0, -589813, 0, 0, -589812, 0, 0, -589811, 0, 0, -589810, 0, 0, -589809, 0, 0, -589808, 0, 0, -589807, 0, 0, -589806, 0, 0, -589805, 0, 0, -589804, 0, 0, -589803, 2, 0, -589802, 2, 0, -589801, 2, 0, -589800, 0, 0, -589799, 0, 0, -589798, 0, 0, -589797, 0, 0, -589796, 0, 0, -589795, 0, 0, -589794, 0, 0, -589793, 0, 0, -589792, 0, 0, -589791, 0, 0, -589790, 0, 0, -589789, 0, 0, -589788, 0, 0, -589787, 0, 0, -589786, 0, 0, -589785, 0, 0, -589784, 0, 0, -589783, 0, 0, -589782, 0, 0, -589781, 0, 0, -589780, 0, 0, -589779, 0, 0, -589778, 0, 0, -589777, 0, 0, -589776, 0, 0, -589775, 0, 0, -589774, 0, 0, -589773, 0, 0, -589772, 0, 0, -589771, 0, 0, -589770, 0, 0, -589769, 0, 0, -589768, 0, 0, -458788, 0, 0, -458787, 0, 0, -458786, 0, 0, -458785, 0, 0, -458784, 0, 0, -458783, 0, 0, -458782, 0, 0, -458781, 0, 0, -458780, 0, 0, -458779, 0, 0, -458778, 0, 0, -458777, 0, 0, -458776, 0, 0, -458775, 0, 0, -458774, 0, 0, -458773, 0, 0, -458772, 0, 0, -458771, 0, 0, -458770, 0, 0, -458769, 0, 0, -458768, 0, 0, -458767, 0, 0, -458766, 0, 0, -458765, 0, 0, -458764, 0, 0, -458763, 2, 0, -458762, 2, 0, -458761, 0, 0, -458760, 0, 0, -458759, 2, 0, -458758, 2, 0, -458757, 0, 0, -458756, 0, 0, -458755, 2, 0, -458754, 0, 0, -458753, 0, 0, -524288, 2, 0, -524287, 0, 0, -524286, 2, 0, -524285, 2, 0, -524284, 2, 0, -524283, 2, 0, -524282, 0, 0, -524281, 2, 0, -524280, 0, 0, -524279, 0, 0, -524278, 0, 0, -524277, 0, 0, -524276, 0, 0, -524275, 0, 0, -524274, 2, 0, -524273, 0, 0, -524272, 0, 0, -524271, 0, 0, -524270, 0, 0, -524269, 0, 0, -524268, 0, 0, -524267, 0, 0, -524266, 0, 0, -524265, 0, 0, -524264, 0, 0, -524263, 0, 0, -524262, 0, 0, -524261, 0, 0, -524260, 0, 0, -524259, 0, 0, -524258, 0, 0, -524257, 0, 0, -524256, 0, 0, -524255, 0, 0, -524254, 0, 0, -524253, 0, 0, -524252, 0, 0, -524251, 0, 0, -524250, 0, 0, -524249, 0, 0, -524248, 0, 0, -524247, 0, 0, -524246, 0, 0, -524245, 0, 0, -524244, 0, 0, -524243, 0, 0, -524242, 0, 0, -524241, 0, 0, -524240, 0, 0, -524239, 0, 0, -524238, 0, 0, -524237, 0, 0, -524236, 0, 0, -524235, 0, 0, -524234, 0, 0, -524233, 0, 0, -524232, 0, 0, -393252, 0, 0, -393251, 0, 0, -393250, 0, 0, -393249, 0, 0, -393248, 0, 0, -393247, 0, 0, -393246, 0, 0, -393245, 0, 0, -393244, 0, 0, -393243, 0, 0, -393242, 0, 0, -393241, 0, 0, -393240, 0, 0, -393239, 0, 0, -393238, 0, 0, -393237, 0, 0, -393236, 0, 0, -393235, 0, 0, -393234, 0, 0, -393233, 0, 0, -393232, 0, 0, -393231, 0, 0, -393230, 0, 0, -393229, 0, 0, -393228, 0, 0, -393227, 0, 0, -393226, 0, 0, -393225, 2, 0, -393224, 2, 0, -393223, 2, 0, -393222, 2, 0, -393221, 2, 0, -393220, 2, 0, -393219, 2, 0, -393218, 2, 0, -393217, 0, 0, -458752, 2, 0, -458751, 2, 0, -458750, 2, 0, -458749, 2, 0, -458748, 2, 0, -458747, 0, 0, -458746, 2, 0, -458745, 0, 0, -458744, 0, 0, -458743, 0, 0, -458742, 0, 0, -458741, 0, 0, -458740, 0, 0, -458739, 0, 0, -458738, 0, 0, -458737, 2, 0, -458736, 2, 0, -458735, 0, 0, -458734, 0, 0, -458733, 0, 0, -458732, 0, 0, -458731, 0, 0, -458730, 0, 0, -458729, 0, 0, -458728, 0, 0, -458727, 0, 0, -458726, 0, 0, -458725, 0, 0, -458724, 0, 0, -458723, 0, 0, -458722, 0, 0, -458721, 0, 0, -458720, 0, 0, -458719, 0, 0, -458718, 0, 0, -458717, 0, 0, -458716, 0, 0, -458715, 0, 0, -458714, 0, 0, -458713, 0, 0, -458712, 0, 0, -458711, 0, 0, -458710, 0, 0, -458709, 0, 0, -458708, 0, 0, -458707, 0, 0, -458706, 0, 0, -458705, 0, 0, -458704, 0, 0, -458703, 0, 0, -458702, 0, 0, -458701, 0, 0, -458700, 0, 0, -458699, 0, 0, -458698, 0, 0, -458697, 0, 0, -458696, 0, 0, -327716, 0, 0, -327715, 0, 0, -327714, 0, 0, -327713, 0, 0, -327712, 0, 0, -327711, 0, 0, -327710, 0, 0, -327709, 0, 0, -327708, 0, 0, -327707, 0, 0, -327706, 0, 0, -327705, 0, 0, -327704, 0, 0, -327703, 0, 0, -327702, 0, 0, -327701, 0, 0, -327700, 0, 0, -327699, 0, 0, -327698, 0, 0, -327697, 0, 0, -327696, 0, 0, -327695, 0, 0, -327694, 0, 0, -327693, 0, 0, -327692, 0, 0, -327691, 0, 0, -327690, 2, 0, -327689, 2, 0, -327688, 2, 0, -327687, 1, 0, -327686, 1, 0, -327685, 2, 0, -327684, 2, 0, -327683, 2, 0, -327682, 2, 0, -327681, 0, 0, -393216, 0, 0, -393215, 2, 0, -393214, 2, 0, -393213, 1, 0, -393212, 2, 0, -393211, 2, 0, -393210, 0, 0, -393209, 0, 0, -393208, 0, 0, -393207, 2, 0, -393206, 2, 0, -393205, 0, 0, -393204, 0, 0, -393203, 0, 0, -393202, 0, 0, -393201, 0, 0, -393200, 0, 0, -393199, 0, 0, -393198, 0, 0, -393197, 0, 0, -393196, 0, 0, -393195, 0, 0, -393194, 0, 0, -393193, 0, 0, -393192, 0, 0, -393191, 0, 0, -393190, 0, 0, -393189, 0, 0, -393188, 0, 0, -393187, 0, 0, -393186, 0, 0, -393185, 0, 0, -393184, 0, 0, -393183, 0, 0, -393182, 0, 0, -393181, 0, 0, -393180, 0, 0, -393179, 0, 0, -393178, 0, 0, -393177, 0, 0, -393176, 0, 0, -393175, 0, 0, -393174, 0, 0, -393173, 0, 0, -393172, 0, 0, -393171, 0, 0, -393170, 0, 0, -393169, 0, 0, -393168, 0, 0, -393167, 0, 0, -393166, 0, 0, -393165, 0, 0, -393164, 0, 0, -393163, 0, 0, -393162, 0, 0, -393161, 0, 0, -262180, 0, 0, -262179, 0, 0, -262178, 0, 0, -262177, 0, 0, -262176, 0, 0, -262175, 0, 0, -262174, 0, 0, -262173, 0, 0, -262172, 0, 0, -262171, 0, 0, -262170, 0, 0, -262169, 0, 0, -262168, 0, 0, -262167, 0, 0, -262166, 0, 0, -262165, 0, 0, -262164, 0, 0, -262163, 0, 0, -262162, 0, 0, -262161, 0, 0, -262160, 0, 0, -262159, 2, 0, -262158, 0, 0, -262157, 0, 0, -262156, 0, 0, -262155, 0, 0, -262154, 0, 0, -262153, 2, 0, -262152, 2, 0, -262151, 1, 0, -262150, 1, 0, -262149, 1, 0, -262148, 2, 0, -262147, 0, 0, -262146, 0, 0, -262145, 0, 0, -327680, 2, 0, -327679, 2, 0, -327678, 2, 0, -327677, 1, 0, -327676, 2, 0, -327675, 2, 0, -327674, 0, 0, -327673, 0, 0, -327672, 2, 0, -327671, 1, 0, -327670, 1, 0, -327669, 2, 0, -327668, 0, 0, -327667, 0, 0, -327666, 0, 0, -327665, 0, 0, -327664, 0, 0, -327663, 0, 0, -327662, 0, 0, -327661, 0, 0, -327660, 0, 0, -327659, 0, 0, -327658, 0, 0, -327657, 0, 0, -327656, 0, 0, -327655, 0, 0, -327654, 0, 0, -327653, 0, 0, -327652, 0, 0, -327651, 0, 0, -327650, 0, 0, -327649, 0, 0, -327648, 0, 0, -327647, 0, 0, -327646, 0, 0, -327645, 0, 0, -327644, 0, 0, -327643, 0, 0, -327642, 0, 0, -327641, 0, 0, -327640, 0, 0, -327639, 0, 0, -327638, 0, 0, -327637, 0, 0, -327636, 0, 0, -327635, 0, 0, -327634, 0, 0, -327633, 0, 0, -327632, 0, 0, -327631, 0, 0, -327630, 0, 0, -327629, 0, 0, -327628, 0, 0, -327627, 0, 0, -327626, 0, 0, -327625, 0, 0, -196644, 0, 0, -196643, 0, 0, -196642, 0, 0, -196641, 0, 0, -196640, 0, 0, -196639, 0, 0, -196638, 0, 0, -196637, 0, 0, -196636, 0, 0, -196635, 0, 0, -196634, 0, 0, -196633, 0, 0, -196632, 0, 0, -196631, 0, 0, -196630, 0, 0, -196629, 0, 0, -196628, 0, 0, -196627, 0, 0, -196626, 0, 0, -196625, 2, 0, -196624, 2, 0, -196623, 2, 0, -196622, 2, 0, -196621, 0, 0, -196620, 0, 0, -196619, 0, 0, -196618, 0, 0, -196617, 2, 0, -196616, 2, 0, -196615, 1, 0, -196614, 1, 0, -196613, 1, 0, -196612, 2, 0, -196611, 0, 0, -196610, 0, 0, -196609, 0, 0, -262144, 2, 0, -262143, 0, 0, -262142, 2, 0, -262141, 1, 0, -262140, 2, 0, -262139, 0, 0, -262138, 0, 0, -262137, 2, 0, -262136, 1, 0, -262135, 1, 0, -262134, 1, 0, -262133, 1, 0, -262132, 2, 0, -262131, 2, 0, -262130, 0, 0, -262129, 0, 0, -262128, 0, 0, -262127, 0, 0, -262126, 0, 0, -262125, 0, 0, -262124, 0, 0, -262123, 0, 0, -262122, 0, 0, -262121, 0, 0, -262120, 0, 0, -262119, 0, 0, -262118, 0, 0, -262117, 0, 0, -262116, 0, 0, -262115, 0, 0, -262114, 0, 0, -262113, 0, 0, -262112, 0, 0, -262111, 0, 0, -262110, 0, 0, -262109, 0, 0, -262108, 0, 0, -262107, 0, 0, -262106, 0, 0, -262105, 0, 0, -262104, 0, 0, -262103, 0, 0, -262102, 0, 0, -262101, 0, 0, -262100, 0, 0, -262099, 0, 0, -262098, 0, 0, -262097, 0, 0, -262096, 0, 0, -262095, 0, 0, -262094, 0, 0, -262093, 0, 0, -262092, 0, 0, -262091, 0, 0, -262090, 0, 0, -131108, 0, 0, -131107, 0, 0, -131106, 0, 0, -131105, 0, 0, -131104, 0, 0, -131103, 0, 0, -131102, 0, 0, -131101, 0, 0, -131100, 0, 0, -131099, 0, 0, -131098, 0, 0, -131097, 0, 0, -131096, 0, 0, -131095, 0, 0, -131094, 0, 0, -131093, 0, 0, -131092, 0, 0, -131091, 0, 0, -131090, 0, 0, -131089, 2, 0, -131088, 2, 0, -131087, 2, 0, -131086, 2, 0, -131085, 0, 0, -131084, 0, 0, -131083, 2, 0, -131082, 0, 0, -131081, 2, 0, -131080, 2, 0, -131079, 2, 0, -131078, 2, 0, -131077, 2, 0, -131076, 2, 0, -131075, 0, 0, -131074, 2, 0, -131073, 0, 0, -196608, 0, 0, -196607, 0, 0, -196606, 2, 0, -196605, 2, 0, -196604, 2, 0, -196603, 0, 0, -196602, 2, 0, -196601, 2, 0, -196600, 1, 0, -196599, 1, 0, -196598, 1, 0, -196597, 1, 0, -196596, 1, 0, -196595, 2, 0, -196594, 0, 0, -196593, 0, 0, -196592, 0, 0, -196591, 0, 0, -196590, 0, 0, -196589, 0, 0, -196588, 0, 0, -196587, 0, 0, -196586, 0, 0, -196585, 0, 0, -196584, 0, 0, -196583, 0, 0, -196582, 0, 0, -196581, 0, 0, -196580, 0, 0, -196579, 0, 0, -196578, 0, 0, -196577, 0, 0, -196576, 0, 0, -196575, 0, 0, -196574, 0, 0, -196573, 0, 0, -196572, 0, 0, -196571, 0, 0, -196570, 0, 0, -196569, 0, 0, -196568, 0, 0, -196567, 0, 0, -196566, 0, 0, -196565, 0, 0, -196564, 0, 0, -196563, 0, 0, -196562, 0, 0, -196561, 0, 0, -196560, 0, 0, -196559, 0, 0, -196558, 0, 0, -196557, 0, 0, -196556, 0, 0, -196555, 0, 0, -196554, 0, 0, -65572, 0, 0, -65571, 0, 0, -65570, 0, 0, -65569, 0, 0, -65568, 0, 0, -65567, 0, 0, -65566, 0, 0, -65565, 0, 0, -65564, 0, 0, -65563, 0, 0, -65562, 0, 0, -65561, 0, 0, -65560, 0, 0, -65559, 0, 0, -65558, 0, 0, -65557, 0, 0, -65556, 0, 0, -65555, 0, 0, -65554, 2, 0, -65553, 2, 0, -65552, 2, 0, -65551, 2, 0, -65550, 2, 0, -65549, 2, 0, -65548, 2, 0, -65547, 2, 0, -65546, 0, 0, -65545, 0, 0, -65544, 2, 0, -65543, 2, 0, -65542, 2, 0, -65541, 2, 0, -65540, 0, 0, -65539, 0, 0, -65538, 2, 0, -65537, 2, 0, -131072, 0, 0, -131071, 0, 0, -131070, 0, 0, -131069, 0, 0, -131068, 0, 0, -131067, 0, 0, -131066, 2, 0, -131065, 2, 0, -131064, 2, 0, -131063, 2, 0, -131062, 2, 0, -131061, 2, 0, -131060, 2, 0, -131059, 2, 0, -131058, 0, 0, -131057, 0, 0, -131056, 0, 0, -131055, 0, 0, -131054, 0, 0, -131053, 0, 0, -131052, 0, 0, -131051, 0, 0, -131050, 0, 0, -131049, 0, 0, -131048, 0, 0, -131047, 0, 0, -131046, 0, 0, -131045, 0, 0, -131044, 0, 0, -131043, 0, 0, -131042, 0, 0, -131041, 0, 0, -131040, 0, 0, -131039, 0, 0, -131038, 0, 0, -131037, 0, 0, -131036, 0, 0, -131035, 0, 0, -131034, 0, 0, -131033, 0, 0, -131032, 0, 0, -131031, 0, 0, -131030, 0, 0, -131029, 0, 0, -131028, 0, 0, -131027, 0, 0, -131026, 0, 0, -131025, 0, 0, -131024, 0, 0, -131023, 0, 0, -131022, 0, 0, -131021, 0, 0, -131020, 0, 0, -131019, 0, 0, -131018, 0, 0, -36, 0, 0, -35, 0, 0, -34, 0, 0, -33, 0, 0, -32, 0, 0, -31, 0, 0, -30, 0, 0, -29, 0, 0, -28, 0, 0, -27, 0, 0, -26, 0, 0, -25, 0, 0, -24, 0, 0, -23, 0, 0, -22, 0, 0, -21, 0, 0, -20, 0, 0, -19, 0, 0, -18, 2, 0, -17, 2, 0, -16, 2, 0, -15, 1, 0, -14, 1, 0, -13, 2, 0, -12, 2, 0, -11, 0, 0, -10, 0, 0, -9, 0, 0, -8, 0, 0, -7, 0, 0, -6, 0, 0, -5, 0, 0, -4, 0, 0, -3, 0, 0, -2, 0, 0, -1, 0, 0, -65536, 2, 0, -65535, 0, 0, -65534, 2, 0, -65533, 0, 0, -65532, 0, 0, -65531, 0, 0, -65530, 0, 0, -65529, 0, 0, -65528, 0, 0, -65527, 0, 0, -65526, 0, 0, -65525, 0, 0, -65524, 0, 0, -65523, 0, 0, -65522, 0, 0, -65521, 0, 0, -65520, 0, 0, -65519, 0, 0, -65518, 0, 0, -65517, 0, 0, -65516, 0, 0, -65515, 0, 0, -65514, 0, 0, -65513, 0, 0, -65512, 0, 0, -65511, 0, 0, -65510, 0, 0, -65509, 0, 0, -65508, 0, 0, -65507, 0, 0, -65506, 0, 0, -65505, 0, 0, -65504, 0, 0, -65503, 0, 0, -65502, 0, 0, -65501, 0, 0, -65500, 0, 0, -65499, 0, 0, -65498, 0, 0, -65497, 0, 0, -65496, 0, 0, -65495, 0, 0, -65494, 0, 0, -65493, 0, 0, -65492, 0, 0, -65491, 0, 0, -65490, 0, 0, -65489, 0, 0, -65488, 0, 0, -65487, 0, 0, -65486, 0, 0, -65485, 0, 0, -65484, 0, 0, -65483, 0, 0, -65482, 0, 0, 65500, 0, 0, 65501, 0, 0, 65502, 0, 0, 65503, 0, 0, 65504, 0, 0, 65505, 0, 0, 65506, 0, 0, 65507, 0, 0, 65508, 0, 0, 65509, 0, 0, 65510, 0, 0, 65511, 0, 0, 65512, 0, 0, 65513, 0, 0, 65514, 0, 0, 65515, 0, 0, 65516, 0, 0, 65517, 0, 0, 65518, 2, 0, 65519, 2, 0, 65520, 2, 0, 65521, 1, 0, 65522, 1, 0, 65523, 2, 0, 65524, 2, 0, 65525, 2, 0, 65526, 0, 0, 65527, 0, 0, 65528, 0, 0, 65529, 0, 0, 65530, 0, 0, 65531, 0, 0, 65532, 2, 0, 65533, 2, 0, 65534, 0, 0, 65535, 0, 0, 0, 0, 0, 1, 0, 0, 2, 2, 0, 3, 2, 0, 4, 2, 0, 5, 0, 0, 6, 0, 0, 7, 0, 0, 8, 0, 0, 9, 0, 0, 10, 0, 0, 11, 0, 0, 12, 0, 0, 13, 0, 0, 14, 0, 0, 15, 0, 0, 16, 0, 0, 17, 0, 0, 18, 0, 0, 19, 0, 0, 20, 0, 0, 21, 0, 0, 22, 0, 0, 23, 0, 0, 24, 0, 0, 25, 0, 0, 26, 0, 0, 27, 0, 0, 28, 0, 0, 29, 0, 0, 30, 0, 0, 31, 0, 0, 32, 0, 0, 33, 0, 0, 34, 0, 0, 35, 0, 0, 36, 0, 0, 37, 0, 0, 38, 0, 0, 39, 0, 0, 40, 0, 0, 41, 0, 0, 42, 0, 0, 43, 0, 0, 44, 0, 0, 45, 0, 0, 46, 0, 0, 47, 0, 0, 48, 0, 0, 49, 0, 0, 50, 0, 0, 51, 0, 0, 52, 0, 0, 53, 0, 0, 131036, 0, 0, 131037, 0, 0, 131038, 0, 0, 131039, 0, 0, 131040, 0, 0, 131041, 0, 0, 131042, 0, 0, 131043, 0, 0, 131044, 0, 0, 131045, 0, 0, 131046, 0, 0, 131047, 0, 0, 131048, 0, 0, 131049, 0, 0, 131050, 0, 0, 131051, 0, 0, 131052, 0, 0, 131053, 0, 0, 131054, 2, 0, 131055, 2, 0, 131056, 2, 0, 131057, 1, 0, 131058, 1, 0, 131059, 2, 0, 131060, 2, 0, 131061, 2, 0, 131062, 2, 0, 131063, 0, 0, 131064, 0, 0, 131065, 2, 0, 131066, 0, 0, 131067, 0, 0, 131068, 0, 0, 131069, 2, 0, 131070, 2, 0, 131071, 2, 0, 65536, 2, 0, 65537, 0, 0, 65538, 0, 0, 65539, 0, 0, 65540, 0, 0, 65541, 0, 0, 65542, 2, 0, 65543, 0, 0, 65544, 0, 0, 65545, 0, 0, 65546, 0, 0, 65547, 0, 0, 65548, 0, 0, 65549, 0, 0, 65550, 0, 0, 65551, 0, 0, 65552, 0, 0, 65553, 0, 0, 65554, 0, 0, 65555, 0, 0, 65556, 0, 0, 65557, 0, 0, 65558, 0, 0, 65559, 0, 0, 65560, 0, 0, 65561, 0, 0, 65562, 0, 0, 65563, 0, 0, 65564, 0, 0, 65565, 0, 0, 65566, 0, 0, 65567, 0, 0, 65568, 0, 0, 65569, 0, 0, 65570, 0, 0, 65571, 0, 0, 65572, 0, 0, 65573, 0, 0, 65574, 0, 0, 65575, 0, 0, 65576, 0, 0, 65577, 0, 0, 65578, 0, 0, 65579, 0, 0, 65580, 0, 0, 65581, 0, 0, 65582, 0, 0, 65583, 0, 0, 65584, 0, 0, 65585, 0, 0, 65586, 0, 0, 65587, 0, 0, 65588, 0, 0, 65589, 0, 0, 196572, 0, 0, 196573, 0, 0, 196574, 0, 0, 196575, 0, 0, 196576, 0, 0, 196577, 0, 0, 196578, 0, 0, 196579, 0, 0, 196580, 0, 0, 196581, 0, 0, 196582, 0, 0, 196583, 0, 0, 196584, 0, 0, 196585, 0, 0, 196586, 0, 0, 196587, 0, 0, 196588, 0, 0, 196589, 0, 0, 196590, 2, 0, 196591, 2, 0, 196592, 2, 0, 196593, 2, 0, 196594, 2, 0, 196595, 2, 0, 196596, 0, 0, 196597, 0, 0, 196598, 0, 0, 196599, 2, 0, 196600, 0, 0, 196601, 0, 0, 196602, 2, 0, 196603, 2, 0, 196604, 2, 0, 196605, 2, 0, 196606, 2, 0, 196607, 2, 0, 131072, 2, 0, 131073, 2, 0, 131074, 2, 0, 131075, 0, 0, 131076, 0, 0, 131077, 0, 0, 131078, 0, 0, 131079, 0, 0, 131080, 0, 0, 131081, 2, 0, 131082, 2, 0, 131083, 0, 0, 131084, 0, 0, 131085, 2, 0, 131086, 2, 0, 131087, 2, 0, 131088, 0, 0, 131089, 0, 0, 131090, 0, 0, 131091, 0, 0, 131092, 0, 0, 131093, 0, 0, 131094, 0, 0, 131095, 0, 0, 131096, 0, 0, 131097, 0, 0, 131098, 0, 0, 131099, 0, 0, 131100, 0, 0, 131101, 0, 0, 131102, 0, 0, 131103, 0, 0, 131104, 0, 0, 131105, 0, 0, 131106, 0, 0, 131107, 0, 0, 131108, 0, 0, 131109, 0, 0, 131110, 0, 0, 131111, 0, 0, 131112, 0, 0, 131113, 0, 0, 131114, 0, 0, 131115, 0, 0, 131116, 0, 0, 131117, 0, 0, 131118, 0, 0, 131119, 0, 0, 131120, 0, 0, 131121, 0, 0, 131122, 0, 0, 131123, 0, 0, 131124, 0, 0, 131125, 0, 0, 262108, 0, 0, 262109, 0, 0, 262110, 0, 0, 262111, 0, 0, 262112, 0, 0, 262113, 0, 0, 262114, 0, 0, 262115, 0, 0, 262116, 0, 0, 262117, 0, 0, 262118, 0, 0, 262119, 0, 0, 262120, 0, 0, 262121, 0, 0, 262122, 0, 0, 262123, 0, 0, 262124, 0, 0, 262125, 0, 0, 262126, 0, 0, 262127, 0, 0, 262128, 0, 0, 262129, 2, 0, 262130, 0, 0, 262131, 0, 0, 262132, 0, 0, 262133, 0, 0, 262134, 0, 0, 262135, 0, 0, 262136, 0, 0, 262137, 0, 0, 262138, 0, 0, 262139, 2, 0, 262140, 1, 0, 262141, 1, 0, 262142, 1, 0, 262143, 1, 0, 196608, 1, 0, 196609, 2, 0, 196610, 2, 0, 196611, 2, 0, 196612, 0, 0, 196613, 0, 0, 196614, 2, 0, 196615, 0, 0, 196616, 0, 0, 196617, 0, 0, 196618, 0, 0, 196619, 0, 0, 196620, 0, 0, 196621, 0, 0, 196622, 0, 0, 196623, 0, 0, 196624, 0, 0, 196625, 0, 0, 196626, 2, 0, 196627, 2, 0, 196628, 0, 0, 196629, 0, 0, 196630, 0, 0, 196631, 0, 0, 196632, 0, 0, 196633, 0, 0, 196634, 0, 0, 196635, 0, 0, 196636, 0, 0, 196637, 0, 0, 196638, 0, 0, 196639, 0, 0, 196640, 0, 0, 196641, 0, 0, 196642, 0, 0, 196643, 0, 0, 196644, 0, 0, 196645, 0, 0, 196646, 0, 0, 196647, 0, 0, 196648, 0, 0, 196649, 0, 0, 196650, 0, 0, 196651, 0, 0, 196652, 0, 0, 196653, 0, 0, 196654, 0, 0, 196655, 0, 0, 196656, 0, 0, 196657, 0, 0, 196658, 0, 0, 196659, 0, 0, 196660, 0, 0, 327644, 0, 0, 327645, 0, 0, 327646, 0, 0, 327647, 0, 0, 327648, 0, 0, 327649, 0, 0, 327650, 0, 0, 327651, 0, 0, 327652, 0, 0, 327653, 0, 0, 327654, 0, 0, 327655, 0, 0, 327656, 0, 0, 327657, 0, 0, 327658, 0, 0, 327659, 0, 0, 327660, 0, 0, 327661, 0, 0, 327662, 2, 0, 327663, 2, 0, 327664, 2, 0, 327665, 2, 0, 327666, 2, 0, 327667, 2, 0, 327668, 2, 0, 327669, 2, 0, 327670, 2, 0, 327671, 2, 0, 327672, 0, 0, 327673, 0, 0, 327674, 0, 0, 327675, 2, 0, 327676, 2, 0, 327677, 1, 0, 327678, 1, 0, 327679, 1, 0, 262144, 1, 0, 262145, 2, 0, 262146, 2, 0, 262147, 2, 0, 262148, 0, 0, 262149, 0, 0, 262150, 2, 0, 262151, 0, 0, 262152, 0, 0, 262153, 0, 0, 262154, 2, 0, 262155, 0, 0, 262156, 0, 0, 262157, 0, 0, 262158, 0, 0, 262159, 0, 0, 262160, 0, 0, 262161, 0, 0, 262162, 2, 0, 262163, 0, 0, 262164, 0, 0, 262165, 0, 0, 262166, 0, 0, 262167, 0, 0, 262168, 2, 0, 262169, 0, 0, 262170, 0, 0, 262171, 0, 0, 262172, 0, 0, 262173, 0, 0, 262174, 0, 0, 262175, 0, 0, 262176, 0, 0, 262177, 0, 0, 262178, 0, 0, 262179, 0, 0, 262180, 0, 0, 262181, 0, 0, 262182, 0, 0, 262183, 0, 0, 262184, 0, 0, 262185, 0, 0, 262186, 0, 0, 262187, 0, 0, 262188, 0, 0, 262189, 0, 0, 262190, 0, 0, 262191, 0, 0, 262192, 0, 0, 262193, 0, 0, 262194, 0, 0, 262195, 0, 0, 262196, 0, 0, 393180, 0, 0, 393181, 0, 0, 393182, 0, 0, 393183, 0, 0, 393184, 0, 0, 393185, 0, 0, 393186, 0, 0, 393187, 0, 0, 393188, 0, 0, 393189, 0, 0, 393190, 0, 0, 393191, 0, 0, 393192, 0, 0, 393193, 0, 0, 393194, 0, 0, 393195, 0, 0, 393196, 0, 0, 393197, 0, 0, 393198, 2, 0, 393199, 2, 0, 393200, 2, 0, 393201, 2, 0, 393202, 2, 0, 393203, 2, 0, 393204, 2, 0, 393205, 2, 0, 393206, 2, 0, 393207, 2, 0, 393208, 0, 0, 393209, 0, 0, 393210, 0, 0, 393211, 2, 0, 393212, 2, 0, 393213, 2, 0, 393214, 2, 0, 393215, 2, 0, 327680, 2, 0, 327681, 2, 0, 327682, 2, 0, 327683, 2, 0, 327684, 0, 0, 327685, 0, 0, 327686, 0, 0, 327687, 0, 0, 327688, 0, 0, 327689, 0, 0, 327690, 2, 0, 327691, 0, 0, 327692, 2, 0, 327693, 0, 0, 327694, 0, 0, 327695, 0, 0, 327696, 0, 0, 327697, 0, 0, 327698, 0, 0, 327699, 2, 0, 327700, 2, 0, 327701, 2, 0, 327702, 0, 0, 327703, 2, 0, 327704, 2, 0, 327705, 0, 0, 327706, 0, 0, 327707, 0, 0, 327708, 0, 0, 327709, 0, 0, 327710, 0, 0, 327711, 0, 0, 327712, 0, 0, 327713, 0, 0, 327714, 0, 0, 327715, 0, 0, 327716, 0, 0, 327717, 0, 0, 327718, 0, 0, 327719, 0, 0, 327720, 0, 0, 327721, 0, 0, 327722, 0, 0, 327723, 0, 0, 327724, 0, 0, 327725, 0, 0, 327726, 0, 0, 327727, 0, 0, 327728, 0, 0, 327729, 0, 0, 327730, 0, 0, 327731, 0, 0, 458716, 0, 0, 458717, 0, 0, 458718, 0, 0, 458719, 0, 0, 458720, 0, 0, 458721, 0, 0, 458722, 0, 0, 458723, 0, 0, 458724, 0, 0, 458725, 0, 0, 458726, 0, 0, 458727, 0, 0, 458728, 0, 0, 458729, 0, 0, 458730, 0, 0, 458731, 0, 0, 458732, 0, 0, 458733, 2, 0, 458734, 2, 0, 458735, 2, 0, 458736, 1, 0, 458737, 1, 0, 458738, 1, 0, 458739, 1, 0, 458740, 1, 0, 458741, 1, 0, 458742, 2, 0, 458743, 2, 0, 458744, 2, 0, 458745, 0, 0, 458746, 0, 0, 458747, 0, 0, 458748, 2, 0, 458749, 2, 0, 458750, 2, 0, 458751, 2, 0, 393216, 2, 0, 393217, 2, 0, 393218, 2, 0, 393219, 0, 0, 393220, 0, 0, 393221, 0, 0, 393222, 0, 0, 393223, 0, 0, 393224, 0, 0, 393225, 0, 0, 393226, 0, 0, 393227, 0, 0, 393228, 0, 0, 393229, 0, 0, 393230, 0, 0, 393231, 0, 0, 393232, 2, 0, 393233, 2, 0, 393234, 0, 0, 393235, 0, 0, 393236, 0, 0, 393237, 0, 0, 393238, 0, 0, 393239, 0, 0, 393240, 2, 0, 393241, 0, 0, 393242, 0, 0, 393243, 0, 0, 393244, 0, 0, 393245, 0, 0, 393246, 0, 0, 393247, 0, 0, 393248, 0, 0, 393249, 0, 0, 393250, 0, 0, 393251, 0, 0, 393252, 0, 0, 393253, 0, 0, 393254, 0, 0, 393255, 0, 0, 393256, 0, 0, 393257, 0, 0, 393258, 0, 0, 393259, 0, 0, 393260, 0, 0, 393261, 0, 0, 393262, 0, 0, 393263, 0, 0, 393264, 0, 0, 393265, 0, 0, 393266, 0, 0, 393267, 0, 0, 524252, 0, 0, 524253, 0, 0, 524254, 0, 0, 524255, 0, 0, 524256, 0, 0, 524257, 0, 0, 524258, 0, 0, 524259, 0, 0, 524260, 0, 0, 524261, 0, 0, 524262, 0, 0, 524263, 0, 0, 524264, 0, 0, 524265, 0, 0, 524266, 0, 0, 524267, 0, 0, 524268, 0, 0, 524269, 2, 0, 524270, 2, 0, 524271, 2, 0, 524272, 1, 0, 524273, 1, 0, 524274, 1, 0, 524275, 1, 0, 524276, 1, 0, 524277, 1, 0, 524278, 1, 0, 524279, 2, 0, 524280, 2, 0, 524281, 0, 0, 524282, 0, 0, 524283, 0, 0, 524284, 0, 0, 524285, 0, 0, 524286, 0, 0, 524287, 0, 0, 458752, 0, 0, 458753, 0, 0, 458754, 0, 0, 458755, 0, 0, 458756, 0, 0, 458757, 2, 0, 458758, 2, 0, 458759, 2, 0, 458760, 2, 0, 458761, 2, 0, 458762, 2, 0, 458763, 2, 0, 458764, 0, 0, 458765, 0, 0, 458766, 0, 0, 458767, 0, 0, 458768, 0, 0, 458769, 2, 0, 458770, 0, 0, 458771, 0, 0, 458772, 0, 0, 458773, 0, 0, 458774, 0, 0, 458775, 2, 0, 458776, 2, 0, 458777, 0, 0, 458778, 0, 0, 458779, 0, 0, 458780, 0, 0, 458781, 0, 0, 458782, 0, 0, 458783, 0, 0, 458784, 0, 0, 458785, 0, 0, 458786, 0, 0, 458787, 0, 0, 458788, 0, 0, 458789, 0, 0, 458790, 0, 0, 458791, 0, 0, 458792, 0, 0, 458793, 0, 0, 458794, 0, 0, 458795, 0, 0, 458796, 0, 0, 458797, 0, 0, 458798, 0, 0, 458799, 0, 0, 458800, 0, 0, 458801, 0, 0, 458802, 0, 0, 458803, 0, 0, 589788, 0, 0, 589789, 0, 0, 589790, 0, 0, 589791, 0, 0, 589792, 0, 0, 589793, 0, 0, 589794, 0, 0, 589795, 0, 0, 589796, 0, 0, 589797, 0, 0, 589798, 0, 0, 589799, 0, 0, 589800, 0, 0, 589801, 0, 0, 589802, 0, 0, 589803, 0, 0, 589804, 0, 0, 589805, 2, 0, 589806, 2, 0, 589807, 2, 0, 589808, 1, 0, 589809, 1, 0, 589810, 1, 0, 589811, 1, 0, 589812, 1, 0, 589813, 2, 0, 589814, 2, 0, 589815, 2, 0, 589816, 2, 0, 589817, 0, 0, 589818, 0, 0, 589819, 0, 0, 589820, 2, 0, 589821, 0, 0, 589822, 0, 0, 589823, 0, 0, 524288, 0, 0, 524289, 0, 0, 524290, 0, 0, 524291, 0, 0, 524292, 2, 0, 524293, 2, 0, 524294, 1, 0, 524295, 1, 0, 524296, 1, 0, 524297, 1, 0, 524298, 2, 0, 524299, 2, 0, 524300, 0, 0, 524301, 0, 0, 524302, 0, 0, 524303, 0, 0, 524304, 0, 0, 524305, 0, 0, 524306, 2, 0, 524307, 0, 0, 524308, 0, 0, 524309, 0, 0, 524310, 2, 0, 524311, 2, 0, 524312, 0, 0, 524313, 0, 0, 524314, 0, 0, 524315, 0, 0, 524316, 0, 0, 524317, 0, 0, 524318, 0, 0, 524319, 0, 0, 524320, 0, 0, 524321, 0, 0, 524322, 0, 0, 524323, 0, 0, 524324, 0, 0, 524325, 0, 0, 524326, 0, 0, 524327, 0, 0, 524328, 0, 0, 524329, 0, 0, 524330, 0, 0, 524331, 0, 0, 524332, 0, 0, 524333, 0, 0, 524334, 0, 0, 524335, 0, 0, 524336, 0, 0, 524337, 0, 0, 524338, 0, 0, 524339, 0, 0, 655324, 0, 0, 655325, 0, 0, 655326, 0, 0, 655327, 0, 0, 655328, 0, 0, 655329, 0, 0, 655330, 0, 0, 655331, 0, 0, 655332, 0, 0, 655333, 0, 0, 655334, 0, 0, 655335, 0, 0, 655336, 0, 0, 655337, 0, 0, 655338, 0, 0, 655339, 0, 0, 655340, 0, 0, 655341, 2, 0, 655342, 2, 0, 655343, 2, 0, 655344, 2, 0, 655345, 2, 0, 655346, 2, 0, 655347, 2, 0, 655348, 2, 0, 655349, 2, 0, 655350, 2, 0, 655351, 2, 0, 655352, 2, 0, 655353, 0, 0, 655354, 0, 0, 655355, 0, 0, 655356, 2, 0, 655357, 2, 0, 655358, 0, 0, 655359, 0, 0, 589824, 0, 0, 589825, 0, 0, 589826, 0, 0, 589827, 0, 0, 589828, 2, 0, 589829, 2, 0, 589830, 1, 0, 589831, 1, 0, 589832, 1, 0, 589833, 2, 0, 589834, 2, 0, 589835, 2, 0, 589836, 0, 0, 589837, 0, 0, 589838, 0, 0, 589839, 0, 0, 589840, 0, 0, 589841, 0, 0, 589842, 2, 0, 589843, 2, 0, 589844, 0, 0, 589845, 0, 0, 589846, 2, 0, 589847, 0, 0, 589848, 0, 0, 589849, 0, 0, 589850, 0, 0, 589851, 0, 0, 589852, 0, 0, 589853, 0, 0, 589854, 0, 0, 589855, 0, 0, 589856, 0, 0, 589857, 0, 0, 589858, 0, 0, 589859, 0, 0, 589860, 0, 0, 589861, 0, 0, 589862, 0, 0, 589863, 0, 0, 589864, 0, 0, 589865, 0, 0, 589866, 0, 0, 589867, 0, 0, 589868, 0, 0, 589869, 0, 0, 589870, 0, 0, 589871, 0, 0, 589872, 0, 0, 589873, 0, 0, 589874, 0, 0, 720860, 0, 0, 720861, 0, 0, 720862, 0, 0, 720863, 0, 0, 720864, 0, 0, 720865, 0, 0, 720866, 0, 0, 720867, 0, 0, 720868, 0, 0, 720869, 0, 0, 720870, 0, 0, 720871, 0, 0, 720872, 0, 0, 720873, 0, 0, 720874, 0, 0, 720875, 0, 0, 720876, 0, 0, 720877, 2, 0, 720878, 2, 0, 720879, 2, 0, 720880, 2, 0, 720881, 2, 0, 720882, 2, 0, 720883, 2, 0, 720884, 2, 0, 720885, 2, 0, 720886, 2, 0, 720887, 2, 0, 720888, 2, 0, 720889, 2, 0, 720890, 0, 0, 720891, 0, 0, 720892, 0, 0, 720893, 2, 0, 720894, 2, 0, 720895, 0, 0, 655360, 0, 0, 655361, 0, 0, 655362, 0, 0, 655363, 0, 0, 655364, 2, 0, 655365, 2, 0, 655366, 2, 0, 655367, 2, 0, 655368, 2, 0, 655369, 2, 0, 655370, 2, 0, 655371, 2, 0, 655372, 0, 0, 655373, 0, 0, 655374, 0, 0, 655375, 0, 0, 655376, 0, 0, 655377, 2, 0, 655378, 2, 0, 655379, 0, 0, 655380, 0, 0, 655381, 0, 0, 655382, 0, 0, 655383, 0, 0, 655384, 0, 0, 655385, 0, 0, 655386, 0, 0, 655387, 0, 0, 655388, 0, 0, 655389, 0, 0, 655390, 0, 0, 655391, 0, 0, 655392, 0, 0, 655393, 0, 0, 655394, 0, 0, 655395, 0, 0, 655396, 0, 0, 655397, 0, 0, 655398, 0, 0, 655399, 0, 0, 655400, 0, 0, 655401, 0, 0, 655402, 0, 0, 655403, 0, 0, 655404, 0, 0, 655405, 0, 0, 655406, 0, 0, 655407, 0, 0, 655408, 0, 0, 655409, 0, 0, 655410, 0, 0, 786396, 0, 0, 786397, 0, 0, 786398, 0, 0, 786399, 0, 0, 786400, 0, 0, 786401, 0, 0, 786402, 0, 0, 786403, 0, 0, 786404, 0, 0, 786405, 0, 0, 786406, 0, 0, 786407, 0, 0, 786408, 0, 0, 786409, 0, 0, 786410, 0, 0, 786411, 0, 0, 786412, 0, 0, 786413, 0, 0, 786414, 2, 0, 786415, 2, 0, 786416, 2, 0, 786417, 2, 0, 786418, 2, 0, 786419, 0, 0, 786420, 2, 0, 786421, 2, 0, 786422, 2, 0, 786423, 2, 0, 786424, 0, 0, 786425, 0, 0, 786426, 0, 0, 786427, 0, 0, 786428, 2, 0, 786429, 0, 0, 786430, 2, 0, 786431, 0, 0, 720896, 0, 0, 720897, 0, 0, 720898, 0, 0, 720899, 0, 0, 720900, 2, 0, 720901, 2, 0, 720902, 2, 0, 720903, 2, 0, 720904, 2, 0, 720905, 2, 0, 720906, 2, 0, 720907, 2, 0, 720908, 2, 0, 720909, 0, 0, 720910, 0, 0, 720911, 0, 0, 720912, 0, 0, 720913, 0, 0, 720914, 0, 0, 720915, 0, 0, 720916, 0, 0, 720917, 0, 0, 720918, 0, 0, 720919, 0, 0, 720920, 0, 0, 720921, 0, 0, 720922, 0, 0, 720923, 0, 0, 720924, 0, 0, 720925, 0, 0, 720926, 0, 0, 720927, 0, 0, 720928, 0, 0, 720929, 0, 0, 720930, 0, 0, 720931, 0, 0, 720932, 0, 0, 720933, 0, 0, 720934, 0, 0, 720935, 0, 0, 720936, 0, 0, 720937, 0, 0, 720938, 0, 0, 720939, 0, 0, 720940, 0, 0, 720941, 0, 0, 720942, 0, 0, 720943, 0, 0, 720944, 0, 0, 720945, 0, 0, 720946, 0, 0, 851932, 0, 0, 851933, 0, 0, 851934, 0, 0, 851935, 0, 0, 851936, 0, 0, 851937, 0, 0, 851938, 0, 0, 851939, 0, 0, 851940, 0, 0, 851941, 0, 0, 851942, 0, 0, 851943, 0, 0, 851944, 0, 0, 851945, 0, 0, 851946, 0, 0, 851947, 0, 0, 851948, 0, 0, 851949, 0, 0, 851950, 0, 0, 851951, 0, 0, 851952, 0, 0, 851953, 0, 0, 851954, 0, 0, 851955, 0, 0, 851956, 0, 0, 851957, 0, 0, 851958, 0, 0, 851959, 0, 0, 851960, 0, 0, 851961, 0, 0, 851962, 0, 0, 851963, 0, 0, 851964, 2, 0, 851965, 2, 0, 851966, 2, 0, 851967, 0, 0, 786432, 0, 0, 786433, 0, 0, 786434, 0, 0, 786435, 0, 0, 786436, 0, 0, 786437, 0, 0, 786438, 0, 0, 786439, 0, 0, 786440, 0, 0, 786441, 0, 0, 786442, 0, 0, 786443, 0, 0, 786444, 0, 0, 786445, 0, 0, 786446, 0, 0, 786447, 0, 0, 786448, 0, 0, 786449, 0, 0, 786450, 0, 0, 786451, 0, 0, 786452, 0, 0, 786453, 0, 0, 786454, 0, 0, 786455, 0, 0, 786456, 0, 0, 786457, 0, 0, 786458, 0, 0, 786459, 0, 0, 786460, 0, 0, 786461, 0, 0, 786462, 0, 0, 786463, 0, 0, 786464, 0, 0, 786465, 0, 0, 786466, 0, 0, 786467, 0, 0, 786468, 0, 0, 786469, 0, 0, 786470, 0, 0, 786471, 0, 0, 786472, 0, 0, 786473, 0, 0, 786474, 0, 0, 786475, 0, 0, 786476, 0, 0, 786477, 0, 0, 786478, 0, 0, 786479, 0, 0, 786480, 0, 0, 786481, 0, 0, 786482, 0, 0, 917468, 0, 0, 917469, 0, 0, 917470, 0, 0, 917471, 0, 0, 917472, 0, 0, 917473, 0, 0, 917474, 0, 0, 917475, 0, 0, 917476, 0, 0, 917477, 0, 0, 917478, 0, 0, 917479, 0, 0, 917480, 0, 0, 917481, 0, 0, 917482, 0, 0, 917483, 0, 0, 917484, 0, 0, 917485, 0, 0, 917486, 0, 0, 917487, 0, 0, 917488, 0, 0, 917489, 0, 0, 917490, 0, 0, 917491, 0, 0, 917492, 0, 0, 917493, 0, 0, 917494, 0, 0, 917495, 0, 0, 917496, 0, 0, 917497, 0, 0, 917498, 0, 0, 917499, 0, 0, 917500, 0, 0, 917501, 2, 0, 917502, 2, 0, 917503, 2, 0, 851968, 0, 0, 851969, 0, 0, 851970, 0, 0, 851971, 0, 0, 851972, 0, 0, 851973, 0, 0, 851974, 0, 0, 851975, 0, 0, 851976, 0, 0, 851977, 0, 0, 851978, 0, 0, 851979, 0, 0, 851980, 0, 0, 851981, 0, 0, 851982, 0, 0, 851983, 0, 0, 851984, 0, 0, 851985, 0, 0, 851986, 0, 0, 851987, 0, 0, 851988, 0, 0, 851989, 0, 0, 851990, 0, 0, 851991, 0, 0, 851992, 0, 0, 851993, 0, 0, 851994, 0, 0, 851995, 0, 0, 851996, 0, 0, 851997, 0, 0, 851998, 0, 0, 851999, 0, 0, 852000, 0, 0, 852001, 0, 0, 852002, 0, 0, 852003, 0, 0, 852004, 0, 0, 852005, 0, 0, 852006, 0, 0, 852007, 0, 0, 852008, 0, 0, 852009, 0, 0, 852010, 0, 0, 852011, 0, 0, 852012, 0, 0, 852013, 0, 0, 852014, 0, 0, 852015, 0, 0, 852016, 0, 0, 852017, 0, 0, 852018, 0, 0, 983004, 0, 0, 983005, 0, 0, 983006, 0, 0, 983007, 0, 0, 983008, 0, 0, 983009, 0, 0, 983010, 0, 0, 983011, 0, 0, 983012, 0, 0, 983013, 0, 0, 983014, 0, 0, 983015, 0, 0, 983016, 0, 0, 983017, 0, 0, 983018, 0, 0, 983019, 0, 0, 983020, 0, 0, 983021, 0, 0, 983022, 0, 0, 983023, 0, 0, 983024, 0, 0, 983025, 0, 0, 983026, 0, 0, 983027, 0, 0, 983028, 0, 0, 983029, 0, 0, 983030, 0, 0, 983031, 0, 0, 983032, 0, 0, 983033, 0, 0, 983034, 0, 0, 983035, 0, 0, 983036, 2, 0, 983037, 2, 0, 983038, 2, 0, 983039, 0, 0, 917504, 0, 0, 917505, 0, 0, 917506, 0, 0, 917507, 0, 0, 917508, 0, 0, 917509, 0, 0, 917510, 0, 0, 917511, 0, 0, 917512, 0, 0, 917513, 0, 0, 917514, 0, 0, 917515, 0, 0, 917516, 0, 0, 917517, 0, 0, 917518, 0, 0, 917519, 0, 0, 917520, 0, 0, 917521, 0, 0, 917522, 2, 0, 917523, 0, 0, 917524, 0, 0, 917525, 0, 0, 917526, 0, 0, 917527, 0, 0, 917528, 0, 0, 917529, 0, 0, 917530, 0, 0, 917531, 0, 0, 917532, 0, 0, 917533, 0, 0, 917534, 0, 0, 917535, 0, 0, 917536, 0, 0, 917537, 0, 0, 917538, 0, 0, 917539, 0, 0, 917540, 0, 0, 917541, 0, 0, 917542, 0, 0, 917543, 0, 0, 917544, 0, 0, 917545, 0, 0, 917546, 0, 0, 917547, 0, 0, 917548, 0, 0, 917549, 0, 0, 917550, 0, 0, 917551, 0, 0, 917552, 0, 0, 917553, 0, 0, 917554, 0, 0, 1048540, 0, 0, 1048541, 0, 0, 1048542, 0, 0, 1048543, 0, 0, 1048544, 0, 0, 1048545, 0, 0, 1048546, 0, 0, 1048547, 0, 0, 1048548, 0, 0, 1048549, 0, 0, 1048550, 0, 0, 1048551, 0, 0, 1048552, 0, 0, 1048553, 0, 0, 1048554, 0, 0, 1048555, 0, 0, 1048556, 0, 0, 1048557, 0, 0, 1048558, 0, 0, 1048559, 0, 0, 1048560, 0, 0, 1048561, 0, 0, 1048562, 0, 0, 1048563, 0, 0, 1048564, 0, 0, 1048565, 0, 0, 1048566, 0, 0, 1048567, 0, 0, 1048568, 0, 0, 1048569, 0, 0, 1048570, 0, 0, 1048571, 0, 0, 1048572, 0, 0, 1048573, 2, 0, 1048574, 2, 0, 1048575, 0, 0, 983040, 0, 0, 983041, 0, 0, 983042, 0, 0, 983043, 0, 0, 983044, 0, 0, 983045, 0, 0, 983046, 0, 0, 983047, 0, 0, 983048, 0, 0, 983049, 0, 0, 983050, 0, 0, 983051, 0, 0, 983052, 0, 0, 983053, 0, 0, 983054, 0, 0, 983055, 2, 0, 983056, 2, 0, 983057, 2, 0, 983058, 2, 0, 983059, 0, 0, 983060, 0, 0, 983061, 0, 0, 983062, 0, 0, 983063, 0, 0, 983064, 0, 0, 983065, 0, 0, 983066, 0, 0, 983067, 0, 0, 983068, 0, 0, 983069, 0, 0, 983070, 0, 0, 983071, 0, 0, 983072, 0, 0, 983073, 0, 0, 983074, 0, 0, 983075, 0, 0, 983076, 0, 0, 983077, 0, 0, 983078, 0, 0, 983079, 0, 0, 983080, 0, 0, 983081, 0, 0, 983082, 0, 0, 983083, 0, 0, 983084, 0, 0, 983085, 0, 0, 983086, 0, 0, 983087, 0, 0, 983088, 0, 0, 983089, 0, 0, 983090, 0, 0, 1114076, 0, 0, 1114077, 0, 0, 1114078, 0, 0, 1114079, 0, 0, 1114080, 0, 0, 1114081, 0, 0, 1114082, 0, 0, 1114083, 0, 0, 1114084, 0, 0, 1114085, 0, 0, 1114086, 0, 0, 1114087, 0, 0, 1114088, 0, 0, 1114089, 0, 0, 1114090, 0, 0, 1114091, 0, 0, 1114092, 0, 0, 1114093, 0, 0, 1114094, 0, 0, 1114095, 0, 0, 1114096, 0, 0, 1114097, 0, 0, 1114098, 0, 0, 1114099, 0, 0, 1114100, 0, 0, 1114101, 0, 0, 1114102, 0, 0, 1114103, 0, 0, 1114104, 0, 0, 1114105, 0, 0, 1114106, 0, 0, 1114107, 0, 0, 1114108, 0, 0, 1114109, 0, 0, 1114110, 0, 0, 1114111, 0, 0, 1048576, 0, 0, 1048577, 2, 0, 1048578, 2, 0, 1048579, 0, 0, 1048580, 0, 0, 1048581, 0, 0, 1048582, 0, 0, 1048583, 0, 0, 1048584, 0, 0, 1048585, 0, 0, 1048586, 0, 0, 1048587, 0, 0, 1048588, 0, 0, 1048589, 0, 0, 1048590, 2, 0, 1048591, 0, 0, 1048592, 0, 0, 1048593, 2, 0, 1048594, 0, 0, 1048595, 0, 0, 1048596, 0, 0, 1048597, 0, 0, 1048598, 0, 0, 1048599, 0, 0, 1048600, 0, 0, 1048601, 0, 0, 1048602, 0, 0, 1048603, 0, 0, 1048604, 0, 0, 1048605, 0, 0, 1048606, 0, 0, 1048607, 0, 0, 1048608, 0, 0, 1048609, 0, 0, 1048610, 0, 0, 1048611, 0, 0, 1048612, 0, 0, 1048613, 0, 0, 1048614, 0, 0, 1048615, 0, 0, 1048616, 0, 0, 1048617, 0, 0, 1048618, 0, 0, 1048619, 0, 0, 1048620, 0, 0, 1048621, 0, 0, 1048622, 0, 0, 1048623, 0, 0, 1048624, 0, 0, 1048625, 0, 0, 1048626, 0, 0, 1179613, 0, 0, 1179614, 0, 0, 1179615, 0, 0, 1179616, 0, 0, 1179617, 0, 0, 1179618, 0, 0, 1179619, 0, 0, 1179620, 0, 0, 1179621, 0, 0, 1179622, 0, 0, 1179623, 0, 0, 1179624, 0, 0, 1179625, 0, 0, 1179626, 0, 0, 1179627, 0, 0, 1179628, 0, 0, 1179629, 0, 0, 1179630, 0, 0, 1179631, 0, 0, 1179632, 0, 0, 1179633, 0, 0, 1179634, 0, 0, 1179635, 0, 0, 1179636, 0, 0, 1179637, 0, 0, 1179638, 0, 0, 1179639, 0, 0, 1179640, 0, 0, 1179641, 0, 0, 1179642, 0, 0, 1179643, 0, 0, 1179644, 0, 0, 1179645, 0, 0, 1179646, 0, 0, 1179647, 0, 0, 1114112, 0, 0, 1114113, 0, 0, 1114114, 2, 0, 1114115, 2, 0, 1114116, 2, 0, 1114117, 2, 0, 1114118, 0, 0, 1114119, 0, 0, 1114120, 0, 0, 1114121, 0, 0, 1114122, 0, 0, 1114123, 0, 0, 1114124, 0, 0, 1114125, 0, 0, 1114126, 0, 0, 1114127, 2, 0, 1114128, 0, 0, 1114129, 2, 0, 1114130, 2, 0, 1114131, 0, 0, 1114132, 0, 0, 1114133, 0, 0, 1114134, 0, 0, 1114135, 0, 0, 1114136, 0, 0, 1114137, 0, 0, 1114138, 0, 0, 1114139, 0, 0, 1114140, 0, 0, 1114141, 0, 0, 1114142, 0, 0, 1114143, 0, 0, 1114144, 0, 0, 1114145, 0, 0, 1114146, 0, 0, 1114147, 0, 0, 1114148, 0, 0, 1114149, 0, 0, 1114150, 0, 0, 1114151, 0, 0, 1114152, 0, 0, 1114153, 0, 0, 1114154, 0, 0, 1114155, 0, 0, 1114156, 0, 0, 1114157, 0, 0, 1114158, 0, 0, 1114159, 0, 0, 1114160, 0, 0, 1114161, 0, 0, 1114162, 0, 0, 1245149, 0, 0, 1245150, 0, 0, 1245151, 0, 0, 1245152, 0, 0, 1245153, 0, 0, 1245154, 0, 0, 1245155, 0, 0, 1245156, 0, 0, 1245157, 0, 0, 1245158, 0, 0, 1245159, 0, 0, 1245160, 0, 0, 1245161, 0, 0, 1245162, 0, 0, 1245163, 0, 0, 1245164, 0, 0, 1245165, 0, 0, 1245166, 0, 0, 1245167, 0, 0, 1245168, 0, 0, 1245169, 0, 0, 1245170, 0, 0, 1245171, 0, 0, 1245172, 0, 0, 1245173, 0, 0, 1245174, 0, 0, 1245175, 0, 0, 1245176, 0, 0, 1245177, 0, 0, 1245178, 0, 0, 1245179, 0, 0, 1245180, 0, 0, 1245181, 0, 0, 1245182, 0, 0, 1245183, 0, 0, 1179648, 0, 0, 1179649, 0, 0, 1179650, 0, 0, 1179651, 0, 0, 1179652, 2, 0, 1179653, 2, 0, 1179654, 2, 0, 1179655, 0, 0, 1179656, 0, 0, 1179657, 0, 0, 1179658, 0, 0, 1179659, 0, 0, 1179660, 0, 0, 1179661, 0, 0, 1179662, 0, 0, 1179663, 0, 0, 1179664, 2, 0, 1179665, 2, 0, 1179666, 2, 0, 1179667, 0, 0, 1179668, 0, 0, 1179669, 0, 0, 1179670, 0, 0, 1179671, 0, 0, 1179672, 0, 0, 1179673, 0, 0, 1179674, 0, 0, 1179675, 0, 0, 1179676, 0, 0, 1179677, 0, 0, 1179678, 0, 0, 1179679, 0, 0, 1179680, 0, 0, 1179681, 0, 0, 1179682, 0, 0, 1179683, 0, 0, 1179684, 0, 0, 1179685, 0, 0, 1179686, 0, 0, 1179687, 0, 0, 1179688, 0, 0, 1179689, 0, 0, 1179690, 0, 0, 1179691, 0, 0, 1179692, 0, 0, 1179693, 0, 0, 1179694, 0, 0, 1179695, 0, 0, 1179696, 0, 0, 1179697, 0, 0, 1310685, 0, 0, 1310686, 0, 0, 1310687, 0, 0, 1310688, 0, 0, 1310689, 0, 0, 1310690, 0, 0, 1310691, 0, 0, 1310692, 0, 0, 1310693, 0, 0, 1310694, 0, 0, 1310695, 0, 0, 1310696, 0, 0, 1310697, 0, 0, 1310698, 0, 0, 1310699, 0, 0, 1310700, 0, 0, 1310701, 0, 0, 1310702, 0, 0, 1310703, 0, 0, 1310704, 0, 0, 1310705, 0, 0, 1310706, 0, 0, 1310707, 0, 0, 1310708, 0, 0, 1310709, 0, 0, 1310710, 0, 0, 1310711, 0, 0, 1310712, 0, 0, 1310713, 0, 0, 1310714, 0, 0, 1310715, 0, 0, 1310716, 0, 0, 1310717, 0, 0, 1310718, 0, 0, 1310719, 0, 0, 1245184, 0, 0, 1245185, 0, 0, 1245186, 0, 0, 1245187, 0, 0, 1245188, 0, 0, 1245189, 2, 0, 1245190, 0, 0, 1245191, 0, 0, 1245192, 0, 0, 1245193, 0, 0, 1245194, 0, 0, 1245195, 0, 0, 1245196, 0, 0, 1245197, 0, 0, 1245198, 0, 0, 1245199, 0, 0, 1245200, 2, 0, 1245201, 0, 0, 1245202, 0, 0, 1245203, 0, 0, 1245204, 0, 0, 1245205, 0, 0, 1245206, 0, 0, 1245207, 0, 0, 1245208, 0, 0, 1245209, 0, 0, 1245210, 0, 0, 1245211, 0, 0, 1245212, 0, 0, 1245213, 0, 0, 1245214, 0, 0, 1245215, 0, 0, 1245216, 0, 0, 1245217, 0, 0, 1245218, 0, 0, 1245219, 0, 0, 1245220, 0, 0, 1245221, 0, 0, 1245222, 0, 0, 1245223, 0, 0, 1245224, 0, 0, 1245225, 0, 0, 1245226, 0, 0, 1245227, 0, 0, 1245228, 0, 0, 1245229, 0, 0, 1245230, 0, 0, 1245231, 0, 0, 1245232, 0, 0, 1376221, 0, 0, 1376222, 0, 0, 1376223, 0, 0, 1376224, 0, 0, 1376225, 0, 0, 1376226, 0, 0, 1376227, 0, 0, 1376228, 0, 0, 1376229, 0, 0, 1376230, 0, 0, 1376231, 0, 0, 1376232, 0, 0, 1376233, 0, 0, 1376234, 0, 0, 1376235, 0, 0, 1376236, 0, 0, 1376237, 0, 0, 1376238, 0, 0, 1376239, 0, 0, 1376240, 0, 0, 1376241, 0, 0, 1376242, 0, 0, 1376243, 0, 0, 1376244, 0, 0, 1376245, 0, 0, 1376246, 0, 0, 1376247, 0, 0, 1376248, 0, 0, 1376249, 0, 0, 1376250, 0, 0, 1376251, 0, 0, 1376252, 0, 0, 1376253, 0, 0, 1376254, 0, 0, 1376255, 0, 0, 1310720, 0, 0, 1310721, 0, 0, 1310722, 0, 0, 1310723, 0, 0, 1310724, 2, 0, 1310725, 2, 0, 1310726, 0, 0, 1310727, 0, 0, 1310728, 0, 0, 1310729, 0, 0, 1310730, 0, 0, 1310731, 0, 0, 1310732, 0, 0, 1310733, 0, 0, 1310734, 0, 0, 1310735, 0, 0, 1310736, 0, 0, 1310737, 0, 0, 1310738, 0, 0, 1310739, 0, 0, 1310740, 0, 0, 1310741, 0, 0, 1310742, 0, 0, 1310743, 0, 0, 1310744, 0, 0, 1310745, 0, 0, 1310746, 0, 0, 1310747, 0, 0, 1310748, 0, 0, 1310749, 0, 0, 1310750, 0, 0, 1310751, 0, 0, 1310752, 0, 0, 1310753, 0, 0, 1310754, 0, 0, 1310755, 0, 0, 1310756, 0, 0, 1310757, 0, 0, 1310758, 0, 0, 1310759, 0, 0, 1310760, 0, 0, 1310761, 0, 0, 1310762, 0, 0, 1310763, 0, 0, 1310764, 0, 0, 1310765, 0, 0, 1310766, 0, 0, 1310767, 0, 0, 1310768, 0, 0, 1441757, 0, 0, 1441758, 0, 0, 1441759, 0, 0, 1441760, 0, 0, 1441761, 0, 0, 1441762, 0, 0, 1441763, 0, 0, 1441764, 0, 0, 1441765, 0, 0, 1441766, 0, 0, 1441767, 0, 0, 1441768, 0, 0, 1441769, 0, 0, 1441770, 0, 0, 1441771, 0, 0, 1441772, 0, 0, 1441773, 0, 0, 1441774, 0, 0, 1441775, 0, 0, 1441776, 0, 0, 1441777, 0, 0, 1441778, 0, 0, 1441779, 0, 0, 1441780, 0, 0, 1441781, 0, 0, 1441782, 0, 0, 1441783, 0, 0, 1441784, 0, 0, 1441785, 0, 0, 1441786, 0, 0, 1441787, 0, 0, 1441788, 0, 0, 1441789, 0, 0, 1441790, 0, 0, 1441791, 0, 0, 1376256, 0, 0, 1376257, 0, 0, 1376258, 0, 0, 1376259, 0, 0, 1376260, 0, 0, 1376261, 0, 0, 1376262, 0, 0, 1376263, 0, 0, 1376264, 0, 0, 1376265, 0, 0, 1376266, 0, 0, 1376267, 0, 0, 1376268, 0, 0, 1376269, 0, 0, 1376270, 0, 0, 1376271, 0, 0, 1376272, 0, 0, 1376273, 0, 0, 1376274, 0, 0, 1376275, 0, 0, 1376276, 0, 0, 1376277, 0, 0, 1376278, 0, 0, 1376279, 0, 0, 1376280, 0, 0, 1376281, 0, 0, 1376282, 0, 0, 1376283, 0, 0, 1376284, 0, 0, 1376285, 0, 0, 1376286, 0, 0, 1376287, 0, 0, 1376288, 0, 0, 1376289, 0, 0, 1376290, 0, 0, 1376291, 0, 0, 1376292, 0, 0, 1376293, 0, 0, 1376294, 0, 0, 1376295, 0, 0, 1376296, 0, 0, 1376297, 0, 0, 1376298, 0, 0, 1376299, 0, 0, 1376300, 0, 0, 1376301, 0, 0, 1376302, 0, 0, 1376303, 0, 0, 1376304, 0, 0, 1507293, 0, 0, 1507294, 0, 0, 1507295, 0, 0, 1507296, 0, 0, 1507297, 0, 0, 1507298, 0, 0, 1507299, 0, 0, 1507300, 0, 0, 1507301, 0, 0, 1507302, 0, 0, 1507303, 0, 0, 1507304, 0, 0, 1507305, 0, 0, 1507306, 0, 0, 1507307, 0, 0, 1507308, 0, 0, 1507309, 0, 0, 1507310, 0, 0, 1507311, 0, 0, 1507312, 0, 0, 1507313, 0, 0, 1507314, 0, 0, 1507315, 0, 0, 1507316, 0, 0, 1507317, 0, 0, 1507318, 0, 0, 1507319, 0, 0, 1507320, 0, 0, 1507321, 0, 0, 1507322, 0, 0, 1507323, 0, 0, 1507324, 0, 0, 1507325, 0, 0, 1507326, 0, 0, 1507327, 0, 0, 1441792, 0, 0, 1441793, 0, 0, 1441794, 0, 0, 1441795, 0, 0, 1441796, 0, 0, 1441797, 0, 0, 1441798, 0, 0, 1441799, 0, 0, 1441800, 0, 0, 1441801, 0, 0, 1441802, 0, 0, 1441803, 0, 0, 1441804, 0, 0, 1441805, 0, 0, 1441806, 0, 0, 1441807, 0, 0, 1441808, 0, 0, 1441809, 0, 0, 1441810, 0, 0, 1441811, 0, 0, 1441812, 0, 0, 1441813, 0, 0, 1441814, 0, 0, 1441815, 0, 0, 1441816, 0, 0, 1441817, 0, 0, 1441818, 0, 0, 1441819, 0, 0, 1441820, 0, 0, 1441821, 0, 0, 1441822, 0, 0, 1441823, 0, 0, 1441824, 0, 0, 1441825, 0, 0, 1441826, 0, 0, 1441827, 0, 0, 1441828, 0, 0, 1441829, 0, 0, 1441830, 0, 0, 1441831, 0, 0, 1441832, 0, 0, 1441833, 0, 0, 1441834, 0, 0, 1441835, 0, 0, 1441836, 0, 0, 1441837, 0, 0, 1441838, 0, 0, 1441839, 0, 0, 1441840, 0, 0, 1572829, 0, 0, 1572830, 0, 0, 1572831, 0, 0, 1572832, 0, 0, 1572833, 0, 0, 1572834, 0, 0, 1572835, 0, 0, 1572836, 0, 0, 1572837, 0, 0, 1572838, 0, 0, 1572839, 0, 0, 1572840, 0, 0, 1572841, 0, 0, 1572842, 0, 0, 1572843, 0, 0, 1572844, 0, 0, 1572845, 0, 0, 1572846, 0, 0, 1572847, 0, 0, 1572848, 0, 0, 1572849, 0, 0, 1572850, 0, 0, 1572851, 0, 0, 1572852, 0, 0, 1572853, 0, 0, 1572854, 0, 0, 1572855, 0, 0, 1572856, 0, 0, 1572857, 0, 0, 1572858, 0, 0, 1572859, 0, 0, 1572860, 0, 0, 1572861, 0, 0, 1572862, 0, 0, 1572863, 0, 0, 1507328, 0, 0, 1507329, 0, 0, 1507330, 0, 0, 1507331, 0, 0, 1507332, 0, 0, 1507333, 0, 0, 1507334, 0, 0, 1507335, 0, 0, 1507336, 0, 0, 1507337, 0, 0, 1507338, 0, 0, 1507339, 0, 0, 1507340, 0, 0, 1507341, 0, 0, 1507342, 0, 0, 1507343, 0, 0, 1507344, 0, 0, 1507345, 0, 0, 1507346, 0, 0, 1507347, 0, 0, 1507348, 0, 0, 1507349, 0, 0, 1507350, 0, 0, 1507351, 0, 0, 1507352, 0, 0, 1507353, 0, 0, 1507354, 0, 0, 1507355, 0, 0, 1507356, 0, 0, 1507357, 0, 0, 1507358, 0, 0, 1507359, 0, 0, 1507360, 0, 0, 1507361, 0, 0, 1507362, 0, 0, 1507363, 0, 0, 1507364, 0, 0, 1507365, 0, 0, 1507366, 0, 0, 1507367, 0, 0, 1507368, 0, 0, 1507369, 0, 0, 1507370, 0, 0, 1507371, 0, 0, 1507372, 0, 0, 1507373, 0, 0, 1507374, 0, 0, 1507375, 0, 0, 1507376, 0, 0, 1638365, 0, 0, 1638366, 0, 0, 1638367, 0, 0, 1638368, 0, 0, 1638369, 0, 0, 1638370, 0, 0, 1638371, 0, 0, 1638372, 0, 0, 1638373, 0, 0, 1638374, 0, 0, 1638375, 0, 0, 1638376, 0, 0, 1638377, 0, 0, 1638378, 0, 0, 1638379, 0, 0, 1638380, 0, 0, 1638381, 0, 0, 1638382, 0, 0, 1638383, 0, 0, 1638384, 0, 0, 1638385, 0, 0, 1638386, 0, 0, 1638387, 0, 0, 1638388, 0, 0, 1638389, 0, 0, 1638390, 0, 0, 1638391, 0, 0, 1638392, 0, 0, 1638393, 0, 0, 1638394, 0, 0, 1638395, 0, 0, 1638396, 0, 0, 1638397, 0, 0, 1638398, 0, 0, 1638399, 0, 0, 1572864, 0, 0, 1572865, 0, 0, 1572866, 0, 0, 1572867, 0, 0, 1572868, 0, 0, 1572869, 0, 0, 1572870, 0, 0, 1572871, 0, 0, 1572872, 0, 0, 1572873, 0, 0, 1572874, 0, 0, 1572875, 0, 0, 1572876, 0, 0, 1572877, 0, 0, 1572878, 0, 0, 1572879, 0, 0, 1572880, 0, 0, 1572881, 0, 0, 1572882, 0, 0, 1572883, 0, 0, 1572884, 0, 0, 1572885, 0, 0, 1572886, 0, 0, 1572887, 0, 0, 1572888, 0, 0, 1572889, 0, 0, 1572890, 0, 0, 1572891, 0, 0, 1572892, 0, 0, 1572893, 0, 0, 1572894, 0, 0, 1572895, 0, 0, 1572896, 0, 0, 1572897, 0, 0, 1572898, 0, 0, 1572899, 0, 0, 1572900, 0, 0, 1572901, 0, 0, 1572902, 0, 0, 1572903, 0, 0, 1572904, 0, 0, 1572905, 0, 0, 1572906, 0, 0, 1572907, 0, 0, 1572908, 0, 0, 1572909, 0, 0, 1572910, 0, 0, 1572911, 0, 0, 1572912, 0, 0, 1703902, 0, 0, 1703903, 0, 0, 1703904, 0, 0, 1703905, 0, 0, 1703906, 0, 0, 1703907, 0, 0, 1703908, 0, 0, 1703909, 0, 0, 1703910, 0, 0, 1703911, 0, 0, 1703912, 0, 0, 1703913, 0, 0, 1703914, 0, 0, 1703915, 0, 0, 1703916, 0, 0, 1703917, 0, 0, 1703918, 0, 0, 1703919, 0, 0, 1703920, 0, 0, 1703921, 0, 0, 1703922, 0, 0, 1703923, 0, 0, 1703924, 0, 0, 1703925, 0, 0, 1703926, 0, 0, 1703927, 0, 0, 1703928, 0, 0, 1703929, 0, 0, 1703930, 0, 0, 1703931, 0, 0, 1703932, 0, 0, 1703933, 0, 0, 1703934, 0, 0, 1703935, 0, 0, 1638400, 0, 0, 1638401, 0, 0, 1638402, 0, 0, 1638403, 0, 0, 1638404, 0, 0, 1638405, 0, 0, 1638406, 0, 0, 1638407, 0, 0, 1638408, 0, 0, 1638409, 0, 0, 1638410, 0, 0, 1638411, 0, 0, 1638412, 0, 0, 1638413, 0, 0, 1638414, 0, 0, 1638415, 0, 0, 1638416, 0, 0, 1638417, 0, 0, 1638418, 0, 0, 1638419, 0, 0, 1638420, 0, 0, 1638421, 0, 0, 1638422, 0, 0, 1638423, 0, 0, 1638424, 0, 0, 1638425, 0, 0, 1638426, 0, 0, 1638427, 0, 0, 1638428, 0, 0, 1638429, 0, 0, 1638430, 0, 0, 1638431, 0, 0, 1638432, 0, 0, 1638433, 0, 0, 1638434, 0, 0, 1638435, 0, 0, 1638436, 0, 0, 1638437, 0, 0, 1638438, 0, 0, 1638439, 0, 0, 1638440, 0, 0, 1638441, 0, 0, 1638442, 0, 0, 1638443, 0, 0, 1638444, 0, 0, 1638445, 0, 0, 1638446, 0, 0, 1638447, 0, 0, 1638448, 0, 0, 1769438, 0, 0, 1769439, 0, 0, 1769440, 0, 0, 1769441, 0, 0, 1769442, 0, 0, 1769443, 0, 0, 1769444, 0, 0, 1769445, 0, 0, 1769446, 0, 0, 1769447, 0, 0, 1769448, 0, 0, 1769449, 0, 0, 1769450, 0, 0, 1769451, 0, 0, 1769452, 0, 0, 1769453, 0, 0, 1769454, 0, 0, 1769455, 0, 0, 1769456, 0, 0, 1769457, 0, 0, 1769458, 0, 0, 1769459, 0, 0, 1769460, 0, 0, 1769461, 0, 0, 1769462, 0, 0, 1769463, 0, 0, 1769464, 0, 0, 1769465, 0, 0, 1769466, 0, 0, 1769467, 0, 0, 1769468, 0, 0, 1769469, 0, 0, 1769470, 0, 0, 1769471, 0, 0, 1703936, 0, 0, 1703937, 0, 0, 1703938, 0, 0, 1703939, 0, 0, 1703940, 0, 0, 1703941, 0, 0, 1703942, 0, 0, 1703943, 0, 0, 1703944, 0, 0, 1703945, 0, 0, 1703946, 0, 0, 1703947, 0, 0, 1703948, 0, 0, 1703949, 0, 0, 1703950, 0, 0, 1703951, 0, 0, 1703952, 0, 0, 1703953, 0, 0, 1703954, 0, 0, 1703955, 0, 0, 1703956, 0, 0, 1703957, 0, 0, 1703958, 0, 0, 1703959, 0, 0, 1703960, 0, 0, 1703961, 0, 0, 1703962, 0, 0, 1703963, 0, 0, 1703964, 0, 0, 1703965, 0, 0, 1703966, 0, 0, 1703967, 0, 0, 1703968, 0, 0, 1703969, 0, 0, 1703970, 0, 0, 1703971, 0, 0, 1703972, 0, 0, 1703973, 0, 0, 1703974, 0, 0, 1703975, 0, 0, 1703976, 0, 0, 1703977, 0, 0, 1703978, 0, 0, 1703979, 0, 0, 1703980, 0, 0, 1703981, 0, 0, 1703982, 0, 0, 1703983, 0, 0, 1703984, 0, 0, 1834974, 0, 0, 1834975, 0, 0, 1834976, 0, 0, 1834977, 0, 0, 1834978, 0, 0, 1834979, 0, 0, 1834980, 0, 0, 1834981, 0, 0, 1834982, 0, 0, 1834983, 0, 0, 1834984, 0, 0, 1834985, 0, 0, 1834986, 0, 0, 1834987, 0, 0, 1834988, 0, 0, 1834989, 0, 0, 1834990, 0, 0, 1834991, 0, 0, 1834992, 0, 0, 1834993, 0, 0, 1834994, 0, 0, 1834995, 0, 0, 1834996, 0, 0, 1834997, 0, 0, 1834998, 0, 0, 1834999, 0, 0, 1835000, 0, 0, 1835001, 0, 0, 1835002, 0, 0, 1835003, 0, 0, 1835004, 0, 0, 1835005, 0, 0, 1835006, 0, 0, 1835007, 0, 0, 1769472, 0, 0, 1769473, 0, 0, 1769474, 0, 0, 1769475, 0, 0, 1769476, 0, 0, 1769477, 0, 0, 1769478, 0, 0, 1769479, 0, 0, 1769480, 0, 0, 1769481, 0, 0, 1769482, 0, 0, 1769483, 0, 0, 1769484, 0, 0, 1769485, 0, 0, 1769486, 0, 0, 1769487, 0, 0, 1769488, 0, 0, 1769489, 0, 0, 1769490, 0, 0, 1769491, 0, 0, 1769492, 0, 0, 1769493, 0, 0, 1769494, 0, 0, 1769495, 0, 0, 1769496, 0, 0, 1769497, 0, 0, 1769498, 0, 0, 1769499, 0, 0, 1769500, 0, 0, 1769501, 0, 0, 1769502, 0, 0, 1769503, 0, 0, 1769504, 0, 0, 1769505, 0, 0, 1769506, 0, 0, 1769507, 0, 0, 1769508, 0, 0, 1769509, 0, 0, 1769510, 0, 0, 1769511, 0, 0, 1769512, 0, 0, 1769513, 0, 0, 1769514, 0, 0, 1769515, 0, 0, 1769516, 0, 0, 1769517, 0, 0, 1769518, 0, 0, 1769519, 0, 0, 1900511, 0, 0, 1900512, 0, 0, 1900513, 0, 0, 1900514, 0, 0, 1900515, 0, 0, 1900516, 0, 0, 1900517, 0, 0, 1900518, 0, 0, 1900519, 0, 0, 1900520, 0, 0, 1900521, 0, 0, 1900522, 0, 0, 1900523, 0, 0, 1900524, 0, 0, 1900525, 0, 0, 1900526, 0, 0, 1900527, 0, 0, 1900528, 0, 0, 1900529, 0, 0, 1900530, 0, 0, 1900531, 0, 0, 1900532, 0, 0, 1900533, 0, 0, 1900534, 0, 0, 1900535, 0, 0, 1900536, 0, 0, 1900537, 0, 0, 1900538, 0, 0, 1900539, 0, 0, 1900540, 0, 0, 1900541, 0, 0, 1900542, 0, 0, 1900543, 0, 0, 1835008, 0, 0, 1835009, 0, 0, 1835010, 0, 0, 1835011, 0, 0, 1835012, 0, 0, 1835013, 0, 0, 1835014, 0, 0, 1835015, 0, 0, 1835016, 0, 0, 1835017, 0, 0, 1835018, 0, 0, 1835019, 0, 0, 1835020, 0, 0, 1835021, 0, 0, 1835022, 0, 0, 1835023, 0, 0, 1835024, 0, 0, 1835025, 0, 0, 1835026, 0, 0, 1835027, 0, 0, 1835028, 0, 0, 1835029, 0, 0, 1835030, 0, 0, 1835031, 0, 0, 1835032, 0, 0, 1835033, 0, 0, 1835034, 0, 0, 1835035, 0, 0, 1835036, 0, 0, 1835037, 0, 0, 1835038, 0, 0, 1835039, 0, 0, 1835040, 0, 0, 1835041, 0, 0, 1835042, 0, 0, 1835043, 0, 0, 1835044, 0, 0, 1835045, 0, 0, 1835046, 0, 0, 1835047, 0, 0, 1835048, 0, 0, 1835049, 0, 0, 1835050, 0, 0, 1835051, 0, 0, 1835052, 0, 0, 1835053, 0, 0, 1835054, 0, 0, 1835055, 0, 0, 1966047, 0, 0, 1966048, 0, 0, 1966049, 0, 0, 1966050, 0, 0, 1966051, 0, 0, 1966052, 0, 0, 1966053, 0, 0, 1966054, 0, 0, 1966055, 0, 0, 1966056, 0, 0, 1966057, 0, 0, 1966058, 0, 0, 1966059, 0, 0, 1966060, 0, 0, 1966061, 0, 0, 1966062, 0, 0, 1966063, 0, 0, 1966064, 0, 0, 1966065, 0, 0, 1966066, 0, 0, 1966067, 0, 0, 1966068, 0, 0, 1966069, 0, 0, 1966070, 0, 0, 1966071, 0, 0, 1966072, 0, 0, 1966073, 0, 0, 1966074, 0, 0, 1966075, 0, 0, 1966076, 0, 0, 1966077, 0, 0, 1966078, 0, 0, 1966079, 0, 0, 1900544, 0, 0, 1900545, 0, 0, 1900546, 0, 0, 1900547, 0, 0, 1900548, 0, 0, 1900549, 0, 0, 1900550, 0, 0, 1900551, 0, 0, 1900552, 0, 0, 1900553, 0, 0, 1900554, 0, 0, 1900555, 0, 0, 1900556, 0, 0, 1900557, 0, 0, 1900558, 0, 0, 1900559, 0, 0, 1900560, 0, 0, 1900561, 0, 0, 1900562, 0, 0, 1900563, 0, 0, 1900564, 0, 0, 1900565, 0, 0, 1900566, 0, 0, 1900567, 0, 0, 1900568, 0, 0, 1900569, 0, 0, 1900570, 0, 0, 1900571, 0, 0, 1900572, 0, 0, 1900573, 0, 0, 1900574, 0, 0, 1900575, 0, 0, 1900576, 0, 0, 1900577, 0, 0, 1900578, 0, 0, 1900579, 0, 0, 1900580, 0, 0, 1900581, 0, 0, 1900582, 0, 0, 1900583, 0, 0, 1900584, 0, 0, 1900585, 0, 0, 1900586, 0, 0, 1900587, 0, 0, 1900588, 0, 0, 1900589, 0, 0, 1900590, 0, 0, 1900591, 0, 0, 2031583, 0, 0, 2031584, 0, 0, 2031585, 0, 0, 2031586, 0, 0, 2031587, 0, 0, 2031588, 0, 0, 2031589, 0, 0, 2031590, 0, 0, 2031591, 0, 0, 2031592, 0, 0, 2031593, 0, 0, 2031594, 0, 0, 2031595, 0, 0, 2031596, 0, 0, 2031597, 0, 0, 2031598, 0, 0, 2031599, 0, 0, 2031600, 0, 0, 2031601, 0, 0, 2031602, 0, 0, 2031603, 0, 0, 2031604, 0, 0, 2031605, 0, 0, 2031606, 0, 0, 2031607, 0, 0, 2031608, 0, 0, 2031609, 0, 0, 2031610, 0, 0, 2031611, 0, 0, 2031612, 0, 0, 2031613, 0, 0, 2031614, 0, 0, 2031615, 0, 0, 1966080, 0, 0, 1966081, 0, 0, 1966082, 0, 0, 1966083, 0, 0, 1966084, 0, 0, 1966085, 0, 0, 1966086, 0, 0, 1966087, 0, 0, 1966088, 0, 0, 1966089, 0, 0, 1966090, 0, 0, 1966091, 0, 0, 1966092, 0, 0, 1966093, 0, 0, 1966094, 0, 0, 1966095, 0, 0, 1966096, 0, 0, 1966097, 0, 0, 1966098, 0, 0, 1966099, 0, 0, 1966100, 0, 0, 1966101, 0, 0, 1966102, 0, 0, 1966103, 0, 0, 1966104, 0, 0, 1966105, 0, 0, 1966106, 0, 0, 1966107, 0, 0, 1966108, 0, 0, 1966109, 0, 0, 1966110, 0, 0, 1966111, 0, 0, 1966112, 0, 0, 1966113, 0, 0, 1966114, 0, 0, 1966115, 0, 0, 1966116, 0, 0, 1966117, 0, 0, 1966118, 0, 0, 1966119, 0, 0, 1966120, 0, 0, 1966121, 0, 0, 1966122, 0, 0, 1966123, 0, 0, 1966124, 0, 0, 1966125, 0, 0, 1966126, 0, 0, 1966127, 0, 0, 2097119, 0, 0, 2097120, 0, 0, 2097121, 0, 0, 2097122, 0, 0, 2097123, 0, 0, 2097124, 0, 0, 2097125, 0, 0, 2097126, 0, 0, 2097127, 0, 0, 2097128, 0, 0, 2097129, 0, 0, 2097130, 0, 0, 2097131, 0, 0, 2097132, 0, 0, 2097133, 0, 0, 2097134, 0, 0, 2097135, 0, 0, 2097136, 0, 0, 2097137, 0, 0, 2097138, 0, 0, 2097139, 0, 0, 2097140, 0, 0, 2097141, 0, 0, 2097142, 0, 0, 2097143, 0, 0, 2097144, 0, 0, 2097145, 0, 0, 2097146, 0, 0, 2097147, 0, 0, 2097148, 0, 0, 2097149, 0, 0, 2097150, 0, 0, 2097151, 0, 0, 2031616, 0, 0, 2031617, 0, 0, 2031618, 0, 0, 2031619, 0, 0, 2031620, 0, 0, 2031621, 0, 0, 2031622, 0, 0, 2031623, 0, 0, 2031624, 0, 0, 2031625, 0, 0, 2031626, 0, 0, 2031627, 0, 0, 2031628, 0, 0, 2031629, 0, 0, 2031630, 0, 0, 2031631, 0, 0, 2031632, 0, 0, 2031633, 0, 0, 2031634, 0, 0, 2031635, 0, 0, 2031636, 0, 0, 2031637, 0, 0, 2031638, 0, 0, 2031639, 0, 0, 2031640, 0, 0, 2031641, 0, 0, 2031642, 0, 0, 2031643, 0, 0, 2031644, 0, 0, 2031645, 0, 0, 2031646, 0, 0, 2031647, 0, 0, 2031648, 0, 0, 2031649, 0, 0, 2031650, 0, 0, 2031651, 0, 0, 2031652, 0, 0, 2031653, 0, 0, 2031654, 0, 0, 2031655, 0, 0, 2031656, 0, 0, 2031657, 0, 0, 2031658, 0, 0, 2031659, 0, 0, 2031660, 0, 0, 2031661, 0, 0, 2031662, 0, 0, 2031663, 0, 0, 2162655, 0, 0, 2162656, 0, 0, 2162657, 0, 0, 2162658, 0, 0, 2162659, 0, 0, 2162660, 0, 0, 2162661, 0, 0, 2162662, 0, 0, 2162663, 0, 0, 2162664, 0, 0, 2162665, 0, 0, 2162666, 0, 0, 2162667, 0, 0, 2162668, 0, 0, 2162669, 0, 0, 2162670, 0, 0, 2162671, 0, 0, 2162672, 0, 0, 2162673, 0, 0, 2162674, 0, 0, 2162675, 0, 0, 2162676, 0, 0, 2162677, 0, 0, 2162678, 0, 0, 2162679, 0, 0, 2162680, 0, 0, 2162681, 0, 0, 2162682, 0, 0, 2162683, 0, 0, 2162684, 0, 0, 2162685, 0, 0, 2162686, 0, 0, 2162687, 0, 0, 2097152, 0, 0, 2097153, 0, 0, 2097154, 0, 0, 2097155, 0, 0, 2097156, 0, 0, 2097157, 0, 0, 2097158, 0, 0, 2097159, 0, 0, 2097160, 0, 0, 2097161, 0, 0, 2097162, 0, 0, 2097163, 0, 0, 2097164, 0, 0, 2097165, 0, 0, 2097166, 0, 0, 2097167, 0, 0, 2097168, 0, 0, 2097169, 0, 0, 2097170, 0, 0, 2097171, 0, 0, 2097172, 0, 0, 2097173, 0, 0, 2097174, 0, 0, 2097175, 0, 0, 2097176, 0, 0, 2097177, 0, 0, 2097178, 0, 0, 2097179, 0, 0, 2097180, 0, 0, 2097181, 0, 0, 2097182, 0, 0, 2097183, 0, 0, 2097184, 0, 0, 2097185, 0, 0, 2097186, 0, 0, 2097187, 0, 0, 2097188, 0, 0, 2097189, 0, 0, 2097190, 0, 0, 2097191, 0, 0, 2097192, 0, 0, 2097193, 0, 0, 2097194, 0, 0, 2097195, 0, 0, 2097196, 0, 0, 2097197, 0, 0, 2097198, 0, 0, 2097199, 0, 0, 2097200, 0, 0, 2228191, 0, 0, 2228192, 0, 0, 2228193, 0, 0, 2228194, 0, 0, 2228195, 0, 0, 2228196, 0, 0, 2228197, 0, 0, 2228198, 0, 0, 2228199, 0, 0, 2228200, 0, 0, 2228201, 0, 0, 2228202, 0, 0, 2228203, 0, 0, 2228204, 0, 0, 2228205, 0, 0, 2228206, 0, 0, 2228207, 0, 0, 2228208, 0, 0, 2228209, 0, 0, 2228210, 0, 0, 2228219, 0, 0, 2228220, 0, 0, 2228221, 0, 0, 2228222, 0, 0, 2228223, 0, 0, 2162688, 0, 0, 2162689, 0, 0, 2162690, 0, 0, 2162691, 0, 0, 2162692, 0, 0, 2162693, 0, 0, 2162694, 0, 0, 2162695, 0, 0, 2162696, 0, 0, 2162697, 0, 0, 2162698, 0, 0, 2162699, 0, 0, 2162700, 0, 0, 2162701, 0, 0, 2162702, 0, 0, 2162703, 0, 0, 2162704, 0, 0, 2162705, 0, 0, 2162706, 0, 0, 2162707, 0, 0, 2162708, 0, 0, 2162709, 0, 0, 2162710, 0, 0, 2162711, 0, 0, 2162712, 0, 0, 2162713, 0, 0, 2162714, 0, 0, 2162715, 0, 0, 2162716, 0, 0, 2162717, 0, 0, 2162718, 0, 0, 2162719, 0, 0, 2162720, 0, 0, 2162721, 0, 0, 2162722, 0, 0, 2162723, 0, 0, 2162724, 0, 0, 2162725, 0, 0, 2162726, 0, 0, 2162727, 0, 0, 2162728, 0, 0, 2162729, 0, 0, 2162730, 0, 0, 2162731, 0, 0, 2162732, 0, 0, 2162733, 0, 0, 2162734, 0, 0, 2162735, 0, 0, 2162736, 0, 0, 2293727, 0, 0, 2293728, 0, 0, 2293729, 0, 0, 2293730, 0, 0, 2293731, 0, 0, 2293732, 0, 0, 2293733, 0, 0, 2293734, 0, 0, 2293735, 0, 0, 2293736, 0, 0, 2293737, 0, 0, 2293738, 0, 0, 2293739, 0, 0, 2293740, 0, 0, 2293741, 0, 0, 2293742, 0, 0, 2228225, 0, 0, 2228226, 0, 0, 2228227, 0, 0, 2228228, 0, 0, 2228229, 0, 0, 2228230, 0, 0, 2228231, 0, 0, 2228232, 0, 0, 2228233, 0, 0, 2228234, 0, 0, 2228235, 0, 0, 2228236, 0, 0, 2228237, 0, 0, 2228238, 0, 0, 2228239, 0, 0, 2228240, 0, 0, 2228241, 0, 0, 2228242, 0, 0, 2228243, 0, 0, 2228244, 0, 0, 2228245, 0, 0, 2228246, 0, 0, 2228247, 0, 0, 2228248, 0, 0, 2228249, 0, 0, 2228250, 0, 0, 2228251, 0, 0, 2228252, 0, 0, 2228253, 0, 0, 2228254, 0, 0, 2228255, 0, 0, 2228256, 0, 0, 2228257, 0, 0, 2228258, 0, 0, 2228259, 0, 0, 2228260, 0, 0, 2228261, 0, 0, 2228262, 0, 0, 2228263, 0, 0, 2228264, 0, 0, 2228265, 0, 0, 2228266, 0, 0, 2228267, 0, 0, 2228268, 0, 0, 2228269, 0, 0, 2228270, 0, 0, 2228271, 0, 0, 2228272, 0, 0, 2359263, 0, 0, 2359264, 0, 0, 2359265, 0, 0, 2359266, 0, 0, 2359267, 0, 0, 2359268, 0, 0, 2359269, 0, 0, 2359270, 0, 0, 2359271, 0, 0, 2359272, 0, 0, 2293773, 0, 0, 2293774, 0, 0, 2293775, 0, 0, 2293776, 0, 0, 2293777, 0, 0, 2293778, 0, 0, 2293779, 0, 0, 2293780, 0, 0, 2293781, 0, 0, 2293782, 0, 0, 2293783, 0, 0, 2293784, 0, 0, 2293785, 0, 0, 2293786, 0, 0, 2293787, 0, 0, 2293788, 0, 0, 2293789, 0, 0, 2293790, 0, 0, 2293791, 0, 0, 2293792, 0, 0, 2293793, 0, 0, 2293794, 0, 0, 2293795, 0, 0, 2293796, 0, 0, 2293797, 0, 0, 2293798, 0, 0, 2293799, 0, 0, 2293800, 0, 0, 2293801, 0, 0, 2293802, 0, 0, 2293803, 0, 0, 2293804, 0, 0, 2293805, 0, 0, 2293806, 0, 0, 2293807, 0, 0, 2293808, 0, 0, 2424799, 0, 0, 2424800, 0, 0, 2424801, 0, 0, 2424802, 0, 0, 2424803, 0, 0, 2359323, 0, 0, 2359324, 0, 0, 2359325, 0, 0, 2359326, 0, 0, 2359327, 0, 0, 2359328, 0, 0, 2359329, 0, 0, 2359330, 0, 0, 2359331, 0, 0, 2359332, 0, 0, 2359333, 0, 0, 2359334, 0, 0, 2359335, 0, 0, 2359336, 0, 0, 2359337, 0, 0, 2359338, 0, 0, 2359339, 0, 0, 2359340, 0, 0, 2359341, 0, 0, 2359342, 0, 0, 2359343, 0, 0, 2359344, 0, 0, 2424866, 0, 0, 2424867, 0, 0, 2424868, 0, 0, 2424869, 0, 0, 2424870, 0, 0, 2424871, 0, 0, 2424872, 0, 0, 2424873, 0, 0, 2424874, 0, 0, 2424875, 0, 0, 2424876, 0, 0 ) diff --git a/ged.sh b/ged.sh new file mode 100755 index 0000000..ae20bae --- /dev/null +++ b/ged.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +cp -u ./engine/bin/godot.x11.opt.tools.64 ./engine/bin/run.godot.x11.opt.tools.64 + +export LD_LIBRARY_PATH=`pwd`/engine/bin/ +./engine/bin/run.godot.x11.opt.tools.64 -v -e --path ./game/ diff --git a/make_release.sh b/make_release.sh new file mode 100755 index 0000000..89181bd --- /dev/null +++ b/make_release.sh @@ -0,0 +1,34 @@ +#!/bin/bash +set -e + +project_root=$(pwd) + +rm -Rf ./release + +mkdir release + +cd export + +rm -Rf broken_seals_full_source +rm -Rf broken_seals_game_source + +mkdir broken_seals_full_source +mkdir broken_seals_game_source + +python ../tools/copy_repos.py ../ ./broken_seals_full_source +python ../tools/copy_repos.py ../game/ ./broken_seals_game_source + +zip ../release/broken_seals_android_debug.zip ./broken_seals_android_debug/* +zip ../release/broken_seals_android_release.zip ./broken_seals_android_release/* +zip ../release/broken_seals_javascript.zip ./broken_seals_javascript/* +zip ../release/broken_seals_linux.zip ./broken_seals_linux/* +zip ../release/broken_seals_windows.zip ./broken_seals_windows/* + +zip ../release/editor_windows.zip ./godot.bs.windows.opt.tools.64.exe +zip ../release/editor_linux.zip ./godot.bs.x11.opt.tools.64 + +zip -r ../release/broken_seals_full_source.zip ./broken_seals_full_source/* +zip -r ../release/broken_seals_game_source.zip ./broken_seals_game_source/* + +cd .. + diff --git a/pictures/screen.jpg b/pictures/screen.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c87a3eeb60079ffdee2620c25602170b72ac0adc GIT binary patch literal 253182 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ℜy*gl=J-{c`5vcFiXwI7Q=AaWQs;klwzpccmB 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 W^7RvhMGk6IPO4y9cd%#U|C<1mXHHrG literal 0 HcmV?d00001 diff --git a/play.sh b/play.sh new file mode 100755 index 0000000..6f916f0 --- /dev/null +++ b/play.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +cp -u ./engine/bin/godot.x11.opt.tools.64 ./engine/bin/run.godot.x11.opt.tools.64 + +export LD_LIBRARY_PATH=`pwd`/engine/bin/ +./engine/bin/run.godot.x11.opt.tools.64 -v --path ./game/ diff --git a/podman_build_all.sh b/podman_build_all.sh new file mode 100755 index 0000000..b8f7a5e --- /dev/null +++ b/podman_build_all.sh @@ -0,0 +1,34 @@ +#!/bin/bash +set -e + +podman=`which podman || true` + +if [ -z $podman ]; then + echo "podman needs to be in PATH for this script to work." + exit 1 +fi + +project_root=$(pwd)/ +img_version=bs + +mkdir -p logs + +$podman run -v ${project_root}:/root/project -w /root/project godot-windows:${img_version} scons bew -j4 . 2>&1 | tee logs/bew.log +$podman run -v ${project_root}:/root/project -w /root/project godot-windows:${img_version} scons bewd -j4 . 2>&1 | tee logs/bewd.log +$podman run -v ${project_root}:/root/project -w /root/project godot-windows:${img_version} scons bw -j4 . 2>&1 | tee logs/bw.log +$podman run -v ${project_root}:/root/project -w /root/project godot-windows:${img_version} scons bwr -j4 . 2>&1 | tee logs/bwr.log + +$podman run -v ${project_root}:/root/project -w /root/project godot-linux:${img_version} scons bel -j4 . 2>&1 | tee logs/bel.log +$podman run -v ${project_root}:/root/project -w /root/project godot-linux:${img_version} scons beld -j4 . 2>&1 | tee logs/beld.log +$podman run -v ${project_root}:/root/project -w /root/project godot-linux:${img_version} scons bl -j4 . 2>&1 | tee logs/bl.log +$podman run -v ${project_root}:/root/project -w /root/project godot-linux:${img_version} scons blr -j4 . 2>&1 | tee logs/blr.log + + +$podman run -v ${project_root}:/root/project -w /root/project godot-javascript:${img_version} scons bj -j4 . 2>&1 | tee logs/bj.log +$podman run -v ${project_root}:/root/project -w /root/project godot-javascript:${img_version} scons bjr -j4 . 2>&1 | tee logs/bjr.log + +$podman run -v ${project_root}:/root/project -w /root/project godot-android:${img_version} scons ba -j4 . 2>&1 | tee logs/ba.log +$podman run -v ${project_root}:/root/project -w /root/project godot-android:${img_version} scons bar -j4 . 2>&1 | tee logs/bar.log + +# $podman run -v ${project_root}:/root/project -i -w /root/project -t godot-windows:${img_version} scons bew -j4 + diff --git a/tools/build-containers/.gitignore b/tools/build-containers/.gitignore new file mode 100644 index 0000000..f9d8f5a --- /dev/null +++ b/tools/build-containers/.gitignore @@ -0,0 +1,12 @@ +*.tar +*.tar.gz +*.tar.bz2 +*.tar.xz +*.exe +*.swp +*.dmg +*.zip +*.xip + +files/mono-*/ +logs/ diff --git a/tools/build-containers/Dockerfile.android b/tools/build-containers/Dockerfile.android new file mode 100644 index 0000000..8d45863 --- /dev/null +++ b/tools/build-containers/Dockerfile.android @@ -0,0 +1,16 @@ +ARG img_version +FROM godot-fedora:${img_version} + +RUN dnf -y install --setopt=install_weak_deps=False \ + gcc gcc-c++ java-1.8.0-openjdk-devel ncurses-compat-libs && \ + mkdir sdk && cd sdk && \ + curl -LO https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip && \ + unzip sdk-tools-linux-4333796.zip && \ + rm sdk-tools-linux-4333796.zip && \ + yes | tools/bin/sdkmanager --licenses && \ + tools/bin/sdkmanager ndk-bundle 'build-tools;28.0.3' 'platforms;android-28' 'cmake;3.10.2.4988404' + +ENV ANDROID_HOME=/root/sdk/ +ENV ANDROID_NDK_ROOT=/root/sdk/ndk-bundle/ + +CMD /bin/bash diff --git a/tools/build-containers/Dockerfile.base b/tools/build-containers/Dockerfile.base new file mode 100644 index 0000000..d9a5525 --- /dev/null +++ b/tools/build-containers/Dockerfile.base @@ -0,0 +1,9 @@ +FROM fedora:31 + +WORKDIR /root + +RUN dnf -y upgrade --setopt=install_weak_deps=False && \ + dnf -y install --setopt=install_weak_deps=False \ + bash bzip2 curl git make patch pkgconfig python3 scons unzip which xz + +CMD /bin/bash diff --git a/tools/build-containers/Dockerfile.ios b/tools/build-containers/Dockerfile.ios new file mode 100644 index 0000000..36f6ba0 --- /dev/null +++ b/tools/build-containers/Dockerfile.ios @@ -0,0 +1,30 @@ +ARG img_version +FROM godot-osx:${img_version} + +RUN dnf -y install --setopt=install_weak_deps=False \ + automake autoconf clang gcc gcc-c++ gcc-objc gcc-objc++ cmake libicu-devel libtool libxml2-devel llvm-devel openssl-devel perl python yasm && \ + git clone --progress https://github.com/tpoechtrager/cctools-port.git && \ + cd /root/cctools-port && \ + git checkout 8239a5211bcf07d6b9d359782e1a889ec1d7cce5 && \ + sed -i 's#./autogen.sh#libtoolize -c -i --force\n./autogen.sh#' usage_examples/ios_toolchain/build.sh && \ + usage_examples/ios_toolchain/build.sh /root/files/iPhoneOS12.4.sdk.tar.xz arm64 && \ + mkdir -p /root/ioscross/arm64 && \ + mv usage_examples/ios_toolchain/target/* /root/ioscross/arm64 && \ + mkdir /root/ioscross/arm64/usr && \ + ln -s /root/ioscross/arm64/bin /root/ioscross/arm64/usr/bin && \ + sed -i 's#^TRIPLE=.*#TRIPLE="x86_64-apple-darwin11"#' usage_examples/ios_toolchain/build.sh && \ + usage_examples/ios_toolchain/build.sh /root/files/iPhoneSimulator12.4.sdk.tar.xz x86_64 && \ + mkdir -p /root/ioscross/x86_64 && \ + mv usage_examples/ios_toolchain/target/* /root/ioscross/x86_64 && \ + mkdir /root/ioscross/x86_64/usr && \ + ln -s /root/ioscross/x86_64/bin /root/ioscross/x86_64/usr/bin + +ENV OSXCROSS_IOS=not_nothing +ENV IOSCROSS_ROOT=/root/ioscross +ENV PATH="/root/ioscross/arm64/bin:/root/ioscross/x86_64/bin:${PATH}" + +# Until we can build the cross-compiler, we include a pre-made build in the container. +RUN mkdir -p /root/aot-compilers/iphone-arm64 && \ + tar xvf /root/files/aarch64-apple-darwin-mono-sgen.tar.xz -C /root/aot-compilers/iphone-arm64 + +CMD /bin/bash diff --git a/tools/build-containers/Dockerfile.javascript b/tools/build-containers/Dockerfile.javascript new file mode 100644 index 0000000..18ae029 --- /dev/null +++ b/tools/build-containers/Dockerfile.javascript @@ -0,0 +1,13 @@ +ARG img_version +FROM godot-fedora:${img_version} + +RUN dnf -y install --setopt=install_weak_deps=False \ + gcc gcc-c++ java-openjdk yasm && \ + git clone --progress https://github.com/emscripten-core/emsdk && \ + cd emsdk && \ + git checkout a5082b232617c762cb65832429f896c838df2483 && \ + ./emsdk install 1.38.47-upstream && \ + ./emsdk activate 1.38.47-upstream && \ + echo "source /root/emsdk/emsdk_env.sh" >> /root/.bashrc + +CMD /bin/bash diff --git a/tools/build-containers/Dockerfile.linux b/tools/build-containers/Dockerfile.linux new file mode 100644 index 0000000..3c0ef6d --- /dev/null +++ b/tools/build-containers/Dockerfile.linux @@ -0,0 +1,8 @@ +ARG img_version +FROM godot-fedora:${img_version} + +RUN dnf -y install --setopt=install_weak_deps=False \ + gcc-c++ xorg-x11-server-Xvfb libX11-devel libXcursor-devel libXrandr-devel libXinerama-devel libXi-devel alsa-lib-devel pulseaudio-libs-devel libudev-devel mesa-libGL-devel mesa-libGLU-devel mesa-dri-drivers yasm + + +CMD /bin/bash diff --git a/tools/build-containers/Dockerfile.msvc b/tools/build-containers/Dockerfile.msvc new file mode 100644 index 0000000..5ca6f09 --- /dev/null +++ b/tools/build-containers/Dockerfile.msvc @@ -0,0 +1,29 @@ +ARG img_version +FROM godot-fedora:${img_version} + +ENV WINEDEBUG=-all + +RUN dnf -y install --setopt=install_weak_deps=False \ + wine winetricks xorg-x11-server-Xvfb p7zip-plugins findutils && \ + curl -LO https://github.com/GodotBuilder/godot-builds/releases/download/_tools/angle.7z && \ + curl -LO https://www.python.org/ftp/python/3.7.2/python-3.7.2-amd64.exe && \ + xvfb-run sh -c "winetricks -q vcrun2017; wineserver -w" ;\ + xvfb-run sh -c "winetricks -q dotnet461; wineserver -w" ;\ + xvfb-run sh -c "wine /root/python-3.7.2-amd64.exe /quiet InstallAllUsers=1 PrependPath=1 Include_test=0; wineserver -w" ;\ + rm /root/python-3.7.2-amd64.exe && \ + wine python -m pip install --upgrade pip ; wineserver -w ; \ + wine pip install -U setuptools ; wineserver -w ; \ + wine pip install -U wheel ; wineserver -w ; \ + wine pip install scons pywin32 ; wineserver -w ; \ + cd /root/.wine/drive_c && \ + 7z x /root/angle.7z && \ + rm /root/angle.7z && \ + cd "/root/.wine/drive_c/Program Files (x86)" && \ + tar xf /root/files/msvc2017.tar && \ + cd /root && \ + bash /root/files/msvc-fixup.sh && \ + find /root/.wine -name vctip.exe -delete && \ + rm -rf /root/.wine/drive_c/users/root/Temp/* && \ + rm -rf /root/.cache + +CMD /bin/bash diff --git a/tools/build-containers/Dockerfile.osx b/tools/build-containers/Dockerfile.osx new file mode 100644 index 0000000..041ae82 --- /dev/null +++ b/tools/build-containers/Dockerfile.osx @@ -0,0 +1,15 @@ +ARG img_version +FROM godot-fedora:${img_version} + +RUN dnf -y install --setopt=install_weak_deps=False \ + automake autoconf bzip2-devel clang libicu-devel libtool libxml2-devel llvm-devel openssl-devel yasm && \ + git clone --progress https://github.com/tpoechtrager/osxcross.git && \ + cd /root/osxcross && \ + git checkout 542acc2ef6c21aeb3f109c03748b1015a71fed63 && \ + ln -s /root/files/MacOSX10.14.sdk.tar.xz /root/osxcross/tarballs && \ + UNATTENDED=1 ./build.sh + +ENV OSXCROSS_ROOT=/root/osxcross +ENV PATH="/root/osxcross/target/bin:${PATH}" + +CMD /bin/bash diff --git a/tools/build-containers/Dockerfile.windows b/tools/build-containers/Dockerfile.windows new file mode 100644 index 0000000..6012ad2 --- /dev/null +++ b/tools/build-containers/Dockerfile.windows @@ -0,0 +1,7 @@ +ARG img_version +FROM godot-fedora:${img_version} + +RUN dnf -y install --setopt=install_weak_deps=False \ + mingw32-gcc mingw32-gcc-c++ mingw32-winpthreads-static mingw64-gcc mingw64-gcc-c++ mingw64-winpthreads-static + +CMD /bin/bash diff --git a/tools/build-containers/Dockerfile.xcode b/tools/build-containers/Dockerfile.xcode new file mode 100644 index 0000000..ad7391a --- /dev/null +++ b/tools/build-containers/Dockerfile.xcode @@ -0,0 +1,43 @@ +ARG img_version +FROM godot-fedora:${img_version} + +RUN dnf -y install --setopt=install_weak_deps=False \ + autoconf automake libtool clang cmake fuse fuse-devel libxml2-devel libicu-devel compat-openssl10-devel bzip2-devel kmod cpio && \ + git clone --progress https://github.com/mackyle/xar.git && \ + cd xar/xar && \ + git checkout 66d451dab1ef859dd0c83995f2379335d35e53c9 && \ + ./autogen.sh --prefix=/usr && \ + make -j && make install && \ + cd /root && \ + git clone --progress https://github.com/NiklasRosenstein/pbzx && \ + cd pbzx && \ + git checkout 2a4d7c3300c826d918def713a24d25c237c8ed53 && \ + clang -O3 -llzma -lxar -I /usr/local/include pbzx.c -o pbzx + +CMD mkdir -p /root/xcode && \ + cd /root/xcode && \ + xar -xf /root/files/Xcode_10.3.xip && \ + /root/pbzx/pbzx -n Content | cpio -i && \ + cp -r Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk /tmp/MacOSX10.14.sdk && \ + mkdir -p /tmp/MacOSX10.14.sdk/usr/include/c++ && \ + cp -r Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1 /tmp/MacOSX10.14.sdk/usr/include/c++/ && \ + mkdir -p mkdir -p /tmp/MacOSX10.14.sdk/usr/share/man && \ + cp -rf Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/share/man/man1 \ + Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/share/man/man3 \ + Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/share/man/man5 /tmp/MacOSX10.14.sdk/usr/share/man/ && \ + cd /tmp && \ + tar -cJf /root/files/MacOSX10.14.sdk.tar.xz MacOSX10.14.sdk && \ + rm -rf MacOSX10.14 && \ + cd /root/xcode && \ + cp -r Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk /tmp/iPhoneOS12.4.sdk && \ + mkdir -p /tmp/iPhoneOS12.4.sdk/usr/include/c++ && \ + cp -r Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1 /tmp/iPhoneOS12.4.sdk/usr/include/c++/ && \ + cd /tmp && \ + tar -cJf /root/files/iPhoneOS12.4.sdk.tar.xz iPhoneOS12.4.sdk && \ + rm -rf iPhoneOS12.4.sdk && \ + cd /root/xcode && \ + cp -r Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk /tmp/iPhoneOS12.4.sdk && \ + mkdir -p /tmp/iPhoneOS12.4.sdk/usr/include/c++ && \ + cp -r Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1 /tmp/iPhoneOS12.4.sdk/usr/include/c++/ && \ + cd /tmp && \ + tar -cJf /root/files/iPhoneSimulator12.4.sdk.tar.xz iPhoneOS12.4.sdk diff --git a/tools/build-containers/README.md b/tools/build-containers/README.md new file mode 100644 index 0000000..8b98f87 --- /dev/null +++ b/tools/build-containers/README.md @@ -0,0 +1,10 @@ +# Godot engine build containers + +Based on https://github.com/godotengine/build-containers + +This repository contains the Dockerfiles for the official Godot engine builds. These containers should help you build Godot for all platforms supported on any machine that can run Docker containers. + +## Building + +There is a 'build.sh' script included to build the containers themselves. The in-container build scripts will follow shortly. + diff --git a/tools/build-containers/build_containers.sh b/tools/build-containers/build_containers.sh new file mode 100755 index 0000000..7c84930 --- /dev/null +++ b/tools/build-containers/build_containers.sh @@ -0,0 +1,53 @@ +#!/bin/bash +set -e + +podman=`which podman || true` + +if [ -z $podman ]; then + echo "podman needs to be in PATH for this script to work." + exit 1 +fi + +files_root=$(pwd)/files +img_version=bs + +mkdir -p logs + +export podman_build="$podman build --build-arg img_version=${img_version}" + +$podman build -v ${files_root}:/root/files -t godot-fedora:${img_version} -f Dockerfile.base . 2>&1 | tee logs/base.log +$podman_build -t godot-linux:${img_version} -f Dockerfile.linux . 2>&1 | tee logs/linux.log + +$podman_build -t godot-mono:${img_version} -f Dockerfile.mono . 2>&1 | tee logs/mono.log +$podman_build -t godot-mono-glue:${img_version} -f Dockerfile.mono-glue . 2>&1 | tee logs/mono-glue.log +$podman_build -t godot-windows:${img_version} -f Dockerfile.windows --ulimit nofile=65536 . 2>&1 | tee logs/windows.log +$podman_build -t godot-javascript:${img_version} -f Dockerfile.javascript . 2>&1 | tee logs/javascript.log +$podman_build -t godot-android:${img_version} -f Dockerfile.android . 2>&1 | tee logs/android.log + +if [ ! -e files/MacOSX10.14.sdk.tar.xz ] || [ ! -e files/iPhoneOS12.4.sdk.tar.xz ] || [ ! -e files/iPhoneSimulator12.4.sdk.tar.xz ]; then + if [ ! -e files/Xcode_10.3.xip ]; then + echo "files/Xcode_10.3.xip is required. It can be downloaded from https://developer.apple.com/download/more/ with a valid apple ID" + exit 1 + fi + + echo "Building OSX and iOS SDK packages. This will take a while" + $podman_build -t godot-xcode-packer:${img_version} -f Dockerfile.xcode -v ${files_root}:/root/files . 2>&1 | tee logs/xcode.log + $podman run -it --rm -v ${files_root}:/root/files godot-xcode-packer:${img_version} 2>&1 | tee logs/xcode_packer.logw +fi + +$podman_build -t godot-osx:${img_version} -f Dockerfile.osx . 2>&1 | tee logs/osx.log +$podman_build -t godot-ios:${img_version} -f Dockerfile.ios . 2>&1 | tee logs/ios.log + +if [ ! -e files/msvc2017.tar ]; then + echo + echo "files/msvc2017.tar is missing. This file can be created on a Windows 7 or 10 machine by downloading the 'Visual Studio Tools' installer." + echo "here: https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2017" + echo "The required components can be installed by running" + echo "vs_buildtools.exe --add Microsoft.VisualStudio.Workload.UniversalBuildTools --add Microsoft.VisualStudio.Workload.VCTools --add Microsoft.VisualStudio.Component.Windows10SDK.16299.Desktop --add Microsoft.VisualStudio.Component.Windows10SDK.16299.UWP.Native --passive" + echo "after that create a zipfile of C:/Program Files (x86)/Microsoft Visual Studio" + echo "tar -cf msvc2017.tar -C \"c:/Program Files (x86)/ Microsoft Visual Studio\"" + echo + exit 1 +fi + +$podman_build -t godot-msvc:${img_version} -f Dockerfile.msvc -v ${files_root}:/root/files . 2>&1 | tee logs/msvc.log diff --git a/tools/build-containers/files/msvc-fixup.sh b/tools/build-containers/files/msvc-fixup.sh new file mode 100644 index 0000000..95dd799 --- /dev/null +++ b/tools/build-containers/files/msvc-fixup.sh @@ -0,0 +1,24 @@ +cp /root/.wine/drive_c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx64/x64/msobj140.dll /root/.wine/drive_c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx64/arm/ +cp /root/.wine/drive_c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx64/x64/msobj140.dll /root/.wine/drive_c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx64/x86/ + +cp /root/.wine/drive_c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx64/x64/mspdbcore.dll /root/.wine/drive_c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx64/arm/ +cp /root/.wine/drive_c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx64/x64/mspdbcore.dll /root/.wine/drive_c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx64/x86/ + +cp /root/.wine/drive_c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x86/mspdb140.dll /root/.wine/drive_c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x64/ +cp /root/.wine/drive_c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x86/mspdb140.dll /root/.wine/drive_c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx86/arm/ + +cp /root/.wine/drive_c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x86/msobj140.dll /root/.wine/drive_c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x64/ +cp /root/.wine/drive_c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x86/msobj140.dll /root/.wine/drive_c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx86/arm/ + +cp /root/.wine/drive_c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x86/mspdbcore.dll /root/.wine/drive_c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x64/ +cp /root/.wine/drive_c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x86/mspdbcore.dll /root/.wine/drive_c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx86/arm/ + +cp /root/.wine/drive_c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x86/mspdbsrv.exe /root/.wine/drive_c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x64/ +cp /root/.wine/drive_c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x86/mspdbsrv.exe /root/.wine/drive_c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx86/arm/ + +cp /root/.wine/drive_c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx64/x64/msvcdis140.dll /root/.wine/drive_c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio/2017/BuildTools/VC/Tools/MSVC/14.16.27023/bin/Hostx64/arm/ + +pushd /root/.wine/drive_c/Program\ Files\ \(x86\)/Microsoft\ SDKs/ +rm -rf ClickOnce\ Bootstrapper/ Portable/ Windows NuGetPackages/ UWPNuGetPackages/ +popd + diff --git a/tools/build-containers/files/patches/fix-fuse-check.diff b/tools/build-containers/files/patches/fix-fuse-check.diff new file mode 100644 index 0000000..7691d57 --- /dev/null +++ b/tools/build-containers/files/patches/fix-fuse-check.diff @@ -0,0 +1,27 @@ +diff -u a/tools/gen_sdk_package_darling_dmg.sh b/tools/gen_sdk_package_darling_dmg.sh +--- a/tools/gen_sdk_package_darling_dmg.sh 2018-12-20 16:06:04.744507679 +0000 ++++ b/tools/gen_sdk_package_darling_dmg.sh 2018-12-20 16:06:39.000379232 +0000 +@@ -33,22 +33,6 @@ + [ -n "$CC" ] && require $CC + [ -n "$CXX" ] && require $CXX + +-set +e +- +-command -v lsb_release 2>&1 > /dev/null +- +-if [[ $? -eq 0 ]] && [[ -n $(lsb_release -a 2>&1 | grep -i ubuntu) ]]; then +- echo "Using ubuntu, skipping fuse module check" +-else +- modinfo fuse &>/dev/null +-fi +- +-if [ $? -ne 0 ]; then +- echo "Required kernel module 'fuse' not loaded" 1>&2 +- echo "Please run 'insmod fuse' as root" 1>&2 +- exit 1 +-fi +- + set -e + + pushd $BUILD_DIR &>/dev/null + diff --git a/tools/build-containers/upload.sh b/tools/build-containers/upload.sh new file mode 100644 index 0000000..919de5b --- /dev/null +++ b/tools/build-containers/upload.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +set -e + +podman=podman +if ! which $podman; then + podman=docker +fi + +registry=$1 + +if [ -z "${registry}" ]; then + registry=registry.prehensile-tales.com +fi + +$podman push godot-export:latest ${registry}/godot/export +$podman push godot-mono-glue:latest ${registry}/godot/mono-glue +$podman push godot-windows:latest ${registry}/godot/windows +$podman push godot-ubuntu-32:latest ${registry}/godot/ubuntu-32 +$podman push godot-ubuntu-64:latest ${registry}/godot/ubuntu-64 +$podman push godot-javascript:latest ${registry}/godot/javascript +$podman push godot-xcode-packer:latest ${registry}/godot/xcode-packer + +$podman push godot-android:latest ${registry}/godot-private/android +$podman push godot-ios:latest ${registry}/godot-private/ios +$podman push godot-osx:latest ${registry}/godot-private/macosx +$podman push godot-msvc:latest ${registry}/godot-private/uwp diff --git a/tools/copy_repos.py b/tools/copy_repos.py new file mode 100644 index 0000000..4d87339 --- /dev/null +++ b/tools/copy_repos.py @@ -0,0 +1,100 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright (c) 2019-2020 Péter Magyar +# +# 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. + +import sys +import os +import subprocess +import json +import shutil +import traceback + +def onerror(func, path, exc_info): + """ + https://stackoverflow.com/questions/2656322/shutil-rmtree-fails-on-windows-with-access-is-denied + + Because Windows. + + Error handler for ``shutil.rmtree``. + + If the error is due to an access error (read only file) + it attempts to add write permission and then retries. + + If the error is for another reason it re-raises the error. + + Usage : ``shutil.rmtree(path, onerror=onerror)`` + """ + import stat + if not os.access(path, os.W_OK): + # Is the error an access error ? + os.chmod(path, stat.S_IWUSR) + func(path) + else: + raise + +def copytree(src, dst): + for item in os.listdir(src): + + sp = os.path.join(src, item) + dp = os.path.join(dst, item) + + if os.path.isdir(sp): + if item == ".git" or item == "bin" or item == "__pycache__" or item == ".import" or item == "logs" or item == "release" or item == "export" or item == "build" or item == "libs": + continue + + #print(item) + + if os.path.isdir(dp): + shutil.rmtree(dp, onerror=onerror) + + copytree(sp, dp) + else: + if item.endswith(".a") or item.endswith(".class") or item.endswith(".dex") or item.endswith(".pyc") or item.endswith(".o") or item.endswith(".bc") or item.endswith(".so") or item == "export_presets.cfg" or item.endswith(".gen.h") or item.endswith(".os") or item.endswith(".dblite") or item == ".scons_node_count" or item == ".scons_env.json" or item == "compile_commands.json" or item == "config.log" or item.endswith(".gen.inc") or item.endswith(".gen.cpp") : + continue + + #print(item) + + if not os.path.isdir(dst): + os.makedirs(dst) + + shutil.copy2(sp, dp) + +def copy_repository(data, target_folder, clone_path): + copytree(os.path.abspath(clone_path + data[1] + '/' + data[2]), os.path.abspath(target_folder + data[1])) + + +#copy_repository(rep, './game/addons/', '.' + module_clone_path) + +#print(sys.argv) + +if len(sys.argv) == 3: + src_dir = sys.argv[1] + dst_dir = sys.argv[2] + + src_dir = os.path.abspath(src_dir) + dst_dir = os.path.abspath(dst_dir) + + copytree(src_dir, dst_dir) + + +else: + print("Usange: python copy_repos.py source_dir target_dir") diff --git a/tools/export_presets.cfg.example b/tools/export_presets.cfg.example new file mode 100644 index 0000000..58ea1a9 --- /dev/null +++ b/tools/export_presets.cfg.example @@ -0,0 +1,482 @@ +[preset.0] + +name="Android" +platform="Android" +runnable=true +custom_features="" +export_filter="all_resources" +include_filter="*.xml" +exclude_filter="" +export_path="../../_bs_export/0.3.1/android_debug/BrokenSeals.apk" +patch_list=PoolStringArray( ) +script_export_mode=1 +script_encryption_key="" + +[preset.0.options] + +graphics/32_bits_framebuffer=true +xr_features/xr_mode=0 +xr_features/degrees_of_freedom=0 +xr_features/hand_tracking=0 +xr_features/focus_awareness=false +one_click_deploy/clear_previous_install=false +custom_template/use_custom_build=false +command_line/extra_args="" +version/code=2 +version/name="0.3.2" +package/unique_name="net.relintai.$genname" +package/name="Broken Seals" +package/signed=true +screen/immersive_mode=true +screen/orientation=0 +screen/support_small=true +screen/support_normal=true +screen/support_large=true +screen/support_xlarge=true +screen/opengl_debug=false +launcher_icons/main_192x192="res://icon.png" +launcher_icons/adaptive_foreground_432x432="res://icon.png" +launcher_icons/adaptive_background_432x432="res://icon.png" +keystore/debug="" +keystore/debug_user="" +keystore/debug_password="" +keystore/release="" +keystore/release_user="" +keystore/release_password="" +apk_expansion/enable=false +apk_expansion/SALT="" +apk_expansion/public_key="" +architectures/armeabi-v7a=true +architectures/arm64-v8a=true +architectures/x86=false +architectures/x86_64=false +permissions/custom_permissions=PoolStringArray( ) +permissions/access_checkin_properties=false +permissions/access_coarse_location=false +permissions/access_fine_location=false +permissions/access_location_extra_commands=false +permissions/access_mock_location=false +permissions/access_network_state=false +permissions/access_surface_flinger=false +permissions/access_wifi_state=false +permissions/account_manager=false +permissions/add_voicemail=false +permissions/authenticate_accounts=false +permissions/battery_stats=false +permissions/bind_accessibility_service=false +permissions/bind_appwidget=false +permissions/bind_device_admin=false +permissions/bind_input_method=false +permissions/bind_nfc_service=false +permissions/bind_notification_listener_service=false +permissions/bind_print_service=false +permissions/bind_remoteviews=false +permissions/bind_text_service=false +permissions/bind_vpn_service=false +permissions/bind_wallpaper=false +permissions/bluetooth=false +permissions/bluetooth_admin=false +permissions/bluetooth_privileged=false +permissions/brick=false +permissions/broadcast_package_removed=false +permissions/broadcast_sms=false +permissions/broadcast_sticky=false +permissions/broadcast_wap_push=false +permissions/call_phone=false +permissions/call_privileged=false +permissions/camera=false +permissions/capture_audio_output=false +permissions/capture_secure_video_output=false +permissions/capture_video_output=false +permissions/change_component_enabled_state=false +permissions/change_configuration=false +permissions/change_network_state=false +permissions/change_wifi_multicast_state=false +permissions/change_wifi_state=false +permissions/clear_app_cache=false +permissions/clear_app_user_data=false +permissions/control_location_updates=false +permissions/delete_cache_files=false +permissions/delete_packages=false +permissions/device_power=false +permissions/diagnostic=false +permissions/disable_keyguard=false +permissions/dump=false +permissions/expand_status_bar=false +permissions/factory_test=false +permissions/flashlight=false +permissions/force_back=false +permissions/get_accounts=false +permissions/get_package_size=false +permissions/get_tasks=false +permissions/get_top_activity_info=false +permissions/global_search=false +permissions/hardware_test=false +permissions/inject_events=false +permissions/install_location_provider=false +permissions/install_packages=false +permissions/install_shortcut=false +permissions/internal_system_window=false +permissions/internet=false +permissions/kill_background_processes=false +permissions/location_hardware=false +permissions/manage_accounts=false +permissions/manage_app_tokens=false +permissions/manage_documents=false +permissions/master_clear=false +permissions/media_content_control=false +permissions/modify_audio_settings=false +permissions/modify_phone_state=false +permissions/mount_format_filesystems=false +permissions/mount_unmount_filesystems=false +permissions/nfc=false +permissions/persistent_activity=false +permissions/process_outgoing_calls=false +permissions/read_calendar=false +permissions/read_call_log=false +permissions/read_contacts=false +permissions/read_external_storage=false +permissions/read_frame_buffer=false +permissions/read_history_bookmarks=false +permissions/read_input_state=false +permissions/read_logs=false +permissions/read_phone_state=false +permissions/read_profile=false +permissions/read_sms=false +permissions/read_social_stream=false +permissions/read_sync_settings=false +permissions/read_sync_stats=false +permissions/read_user_dictionary=false +permissions/reboot=false +permissions/receive_boot_completed=false +permissions/receive_mms=false +permissions/receive_sms=false +permissions/receive_wap_push=false +permissions/record_audio=false +permissions/reorder_tasks=false +permissions/restart_packages=false +permissions/send_respond_via_message=false +permissions/send_sms=false +permissions/set_activity_watcher=false +permissions/set_alarm=false +permissions/set_always_finish=false +permissions/set_animation_scale=false +permissions/set_debug_app=false +permissions/set_orientation=false +permissions/set_pointer_speed=false +permissions/set_preferred_applications=false +permissions/set_process_limit=false +permissions/set_time=false +permissions/set_time_zone=false +permissions/set_wallpaper=false +permissions/set_wallpaper_hints=false +permissions/signal_persistent_processes=false +permissions/status_bar=false +permissions/subscribed_feeds_read=false +permissions/subscribed_feeds_write=false +permissions/system_alert_window=false +permissions/transmit_ir=false +permissions/uninstall_shortcut=false +permissions/update_device_stats=false +permissions/use_credentials=false +permissions/use_sip=false +permissions/vibrate=false +permissions/wake_lock=false +permissions/write_apn_settings=false +permissions/write_calendar=false +permissions/write_call_log=false +permissions/write_contacts=false +permissions/write_external_storage=false +permissions/write_gservices=false +permissions/write_history_bookmarks=false +permissions/write_profile=false +permissions/write_secure_settings=false +permissions/write_settings=false +permissions/write_sms=false +permissions/write_social_stream=false +permissions/write_sync_settings=false +permissions/write_user_dictionary=false + +[preset.1] + +name="Linux/X11" +platform="Linux/X11" +runnable=true +custom_features="" +export_filter="all_resources" +include_filter="*.xml" +exclude_filter="" +export_path="../../_bs_export/BrokenSeals.x86_64" +patch_list=PoolStringArray( ) +script_export_mode=1 +script_encryption_key="" + +[preset.1.options] + +texture_format/bptc=false +texture_format/s3tc=true +texture_format/etc=false +texture_format/etc2=false +texture_format/no_bptc_fallbacks=true +binary_format/64_bits=true +binary_format/embed_pck=false + +[preset.2] + +name="HTML5" +platform="HTML5" +runnable=true +custom_features="" +export_filter="all_resources" +include_filter="*.xml" +exclude_filter="" +export_path="../../_bs_export/0.3.1/html/BrokenSeals.x86_64.html" +patch_list=PoolStringArray( ) +script_export_mode=1 +script_encryption_key="" + +[preset.2.options] + +vram_texture_compression/for_desktop=true +vram_texture_compression/for_mobile=true +html/custom_html_shell="" +html/head_include="" + +[preset.3] + +name="Windows Desktop" +platform="Windows Desktop" +runnable=true +custom_features="" +export_filter="all_resources" +include_filter="*.xml" +exclude_filter="" +export_path="../../_bs_export/0.3.1/windows/BrokenSeals.x86_64.exe" +patch_list=PoolStringArray( ) +script_export_mode=1 +script_encryption_key="" + +[preset.3.options] + +texture_format/bptc=false +texture_format/s3tc=true +texture_format/etc=false +texture_format/etc2=false +texture_format/no_bptc_fallbacks=true +binary_format/64_bits=true +binary_format/embed_pck=false +codesign/enable=false +codesign/identity="" +codesign/password="" +codesign/timestamp=true +codesign/timestamp_server_url="" +codesign/digest_algorithm=1 +codesign/description="" +codesign/custom_options=PoolStringArray( ) +application/icon="" +application/file_version="" +application/product_version="" +application/company_name="" +application/product_name="" +application/file_description="" +application/copyright="" +application/trademarks="" + +[preset.4] + +name="Android-Release" +platform="Android" +runnable=false +custom_features="" +export_filter="all_resources" +include_filter="*.xml" +exclude_filter="" +export_path="" +patch_list=PoolStringArray( ) +script_export_mode=1 +script_encryption_key="" + +[preset.4.options] + +graphics/32_bits_framebuffer=true +xr_features/xr_mode=0 +xr_features/degrees_of_freedom=0 +xr_features/hand_tracking=0 +xr_features/focus_awareness=false +one_click_deploy/clear_previous_install=false +custom_template/use_custom_build=false +command_line/extra_args="" +version/code=2 +version/name="0.3.2" +package/unique_name="net.relintai.$genname" +package/name="Broken Seals" +package/signed=true +screen/immersive_mode=true +screen/orientation=0 +screen/support_small=true +screen/support_normal=true +screen/support_large=true +screen/support_xlarge=true +screen/opengl_debug=false +launcher_icons/main_192x192="res://icon.png" +launcher_icons/adaptive_foreground_432x432="res://icon.png" +launcher_icons/adaptive_background_432x432="res://icon.png" +keystore/debug="" +keystore/debug_user="" +keystore/debug_password="" +keystore/release="" +keystore/release_user="" +keystore/release_password="" +apk_expansion/enable=false +apk_expansion/SALT="" +apk_expansion/public_key="" +architectures/armeabi-v7a=true +architectures/arm64-v8a=true +architectures/x86=false +architectures/x86_64=false +permissions/custom_permissions=PoolStringArray( ) +permissions/access_checkin_properties=false +permissions/access_coarse_location=false +permissions/access_fine_location=false +permissions/access_location_extra_commands=false +permissions/access_mock_location=false +permissions/access_network_state=false +permissions/access_surface_flinger=false +permissions/access_wifi_state=false +permissions/account_manager=false +permissions/add_voicemail=false +permissions/authenticate_accounts=false +permissions/battery_stats=false +permissions/bind_accessibility_service=false +permissions/bind_appwidget=false +permissions/bind_device_admin=false +permissions/bind_input_method=false +permissions/bind_nfc_service=false +permissions/bind_notification_listener_service=false +permissions/bind_print_service=false +permissions/bind_remoteviews=false +permissions/bind_text_service=false +permissions/bind_vpn_service=false +permissions/bind_wallpaper=false +permissions/bluetooth=false +permissions/bluetooth_admin=false +permissions/bluetooth_privileged=false +permissions/brick=false +permissions/broadcast_package_removed=false +permissions/broadcast_sms=false +permissions/broadcast_sticky=false +permissions/broadcast_wap_push=false +permissions/call_phone=false +permissions/call_privileged=false +permissions/camera=false +permissions/capture_audio_output=false +permissions/capture_secure_video_output=false +permissions/capture_video_output=false +permissions/change_component_enabled_state=false +permissions/change_configuration=false +permissions/change_network_state=false +permissions/change_wifi_multicast_state=false +permissions/change_wifi_state=false +permissions/clear_app_cache=false +permissions/clear_app_user_data=false +permissions/control_location_updates=false +permissions/delete_cache_files=false +permissions/delete_packages=false +permissions/device_power=false +permissions/diagnostic=false +permissions/disable_keyguard=false +permissions/dump=false +permissions/expand_status_bar=false +permissions/factory_test=false +permissions/flashlight=false +permissions/force_back=false +permissions/get_accounts=false +permissions/get_package_size=false +permissions/get_tasks=false +permissions/get_top_activity_info=false +permissions/global_search=false +permissions/hardware_test=false +permissions/inject_events=false +permissions/install_location_provider=false +permissions/install_packages=false +permissions/install_shortcut=false +permissions/internal_system_window=false +permissions/internet=false +permissions/kill_background_processes=false +permissions/location_hardware=false +permissions/manage_accounts=false +permissions/manage_app_tokens=false +permissions/manage_documents=false +permissions/master_clear=false +permissions/media_content_control=false +permissions/modify_audio_settings=false +permissions/modify_phone_state=false +permissions/mount_format_filesystems=false +permissions/mount_unmount_filesystems=false +permissions/nfc=false +permissions/persistent_activity=false +permissions/process_outgoing_calls=false +permissions/read_calendar=false +permissions/read_call_log=false +permissions/read_contacts=false +permissions/read_external_storage=false +permissions/read_frame_buffer=false +permissions/read_history_bookmarks=false +permissions/read_input_state=false +permissions/read_logs=false +permissions/read_phone_state=false +permissions/read_profile=false +permissions/read_sms=false +permissions/read_social_stream=false +permissions/read_sync_settings=false +permissions/read_sync_stats=false +permissions/read_user_dictionary=false +permissions/reboot=false +permissions/receive_boot_completed=false +permissions/receive_mms=false +permissions/receive_sms=false +permissions/receive_wap_push=false +permissions/record_audio=false +permissions/reorder_tasks=false +permissions/restart_packages=false +permissions/send_respond_via_message=false +permissions/send_sms=false +permissions/set_activity_watcher=false +permissions/set_alarm=false +permissions/set_always_finish=false +permissions/set_animation_scale=false +permissions/set_debug_app=false +permissions/set_orientation=false +permissions/set_pointer_speed=false +permissions/set_preferred_applications=false +permissions/set_process_limit=false +permissions/set_time=false +permissions/set_time_zone=false +permissions/set_wallpaper=false +permissions/set_wallpaper_hints=false +permissions/signal_persistent_processes=false +permissions/status_bar=false +permissions/subscribed_feeds_read=false +permissions/subscribed_feeds_write=false +permissions/system_alert_window=false +permissions/transmit_ir=false +permissions/uninstall_shortcut=false +permissions/update_device_stats=false +permissions/use_credentials=false +permissions/use_sip=false +permissions/vibrate=false +permissions/wake_lock=false +permissions/write_apn_settings=false +permissions/write_calendar=false +permissions/write_call_log=false +permissions/write_contacts=false +permissions/write_external_storage=false +permissions/write_gservices=false +permissions/write_history_bookmarks=false +permissions/write_profile=false +permissions/write_secure_settings=false +permissions/write_settings=false +permissions/write_sms=false +permissions/write_social_stream=false +permissions/write_sync_settings=false +permissions/write_user_dictionary=false diff --git a/tools/vscode-setup/launch.json b/tools/vscode-setup/launch.json new file mode 100644 index 0000000..985eb3e --- /dev/null +++ b/tools/vscode-setup/launch.json @@ -0,0 +1,67 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "build and debug", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/bin/godot.x11.opt.tools.64", + "args": [ + "--path", + "${workspaceFolder}/../game/" + ], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "environment": [ + { + "name": "LD_LIBRARY_PATH", + "value": "${workspaceFolder}/bin/" + } + ], + "externalConsole": false, + "MIMode": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ], + "preLaunchTask": "build", + //"miDebuggerPath": "/usr/bin/gdb" + }, + { + "name": "debug", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/bin/godot.x11.opt.tools.64", + //"args": ["-e"], + "args": [ + "--path", + "${workspaceFolder}/../game/", + ], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "environment": [ + { + "name": "LD_LIBRARY_PATH", + "value": "${workspaceFolder}/bin/" + } + ], + "externalConsole": false, + "MIMode": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ], + //"preLaunchTask": "build", + //"miDebuggerPath": "/usr/bin/gdb" + } + ] +} \ No newline at end of file diff --git a/tools/vscode-setup/settings.json b/tools/vscode-setup/settings.json new file mode 100644 index 0000000..9ce7b68 --- /dev/null +++ b/tools/vscode-setup/settings.json @@ -0,0 +1,6 @@ +{ + "files.associations": { + "functional": "cpp", + }, + "editor.formatOnSave": true +} \ No newline at end of file diff --git a/tools/vscode-setup/tasks.json b/tools/vscode-setup/tasks.json new file mode 100644 index 0000000..e53957c --- /dev/null +++ b/tools/vscode-setup/tasks.json @@ -0,0 +1,26 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "type": "shell", + "command": "scons", + "group": "build", + "args": [ + "platform=x11", + "custom_modules_shared=yes", + "target=release_debug", + //"bin/libess.x11.opt.tools.64.so", + //"bin/libtexture_packer.x11.opt.tools.64.so", + "bin/libvoxelman.x11.opt.tools.64.so", + //"bin/libworld_generator.x11.opt.tools.64.so", + //"bin/libprocedural_animations.x11.opt.tools.64.so", + //"bin/libfqms.x11.opt.tools.64.so", + "-j3" + ], + "problemMatcher": "$msCompile" + } + ] +} \ No newline at end of file